PHP_FUNCTION(str_pad)
{
/* Input arguments */
zend_string *input; /* Input string 输入字符串*/
zend_long pad_length; /* Length to pad to 填充到多长.*/ /* Helper variables */
size_t num_pad_chars; /* Number of padding characters (total - input size) 要填充进去的字符个数*/
char *pad_str = " "; /* Pointer to padding string */
size_t pad_str_len = 1; // 填充字符的个数
zend_long pad_type_val = STR_PAD_RIGHT; /* The padding type value 填充类型,左填充、右填充、左右填充。默认右填充*/
size_t i, left_pad=0, right_pad=0;
zend_string *result = NULL; /* Resulting string 返回值*/ if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sl|sl", &input, &pad_length, &pad_str, &pad_str_len, &pad_type_val) == FAILURE) {
return;
} /* If resulting string turns out to be shorter than input string,
we simply copy the input and return. */
/* 如果pad_length(参数2)小于等于输入字符串的长度,则返回原始的输入字符串。*/
if (pad_length < 0 || (size_t)pad_length <= ZSTR_LEN(input)) {
RETURN_STRINGL(ZSTR_VAL(input), ZSTR_LEN(input));
} /* 填充字符串长度为0,如:str_pad("abc", 10, ""),则Warning级别的错误。
填充字符串的默认长度为1,即str_pad("abc", 10),的情况下pad_str_len=1。*/
if (pad_str_len == 0) {
php_error_docref(NULL, E_WARNING, "Padding string cannot be empty");
return;
} /*pad_type只能为STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH 或 0, 1, 2*/
if (pad_type_val < STR_PAD_LEFT || pad_type_val > STR_PAD_BOTH) {
php_error_docref(NULL, E_WARNING, "Padding type has to be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH");
return;
} num_pad_chars = pad_length - ZSTR_LEN(input); // 需要被填充进去的字符的数量
if (num_pad_chars >= INT_MAX) { // num_pad_chars的最大值是2147483647。#define INT_MAX 2147483647
php_error_docref(NULL, E_WARNING, "Padding length is too long");
return;
} result = zend_string_safe_alloc(1, ZSTR_LEN(input), num_pad_chars, 0);
ZSTR_LEN(result) = 0; /* We need to figure out the left/right padding lengths. */
switch (pad_type_val) {
case STR_PAD_RIGHT:
left_pad = 0;
right_pad = num_pad_chars;
break; case STR_PAD_LEFT:
left_pad = num_pad_chars;
right_pad = 0;
break; // 左填充数量小于右,left_pad <= right_pad
case STR_PAD_BOTH:
left_pad = num_pad_chars / 2;
right_pad = num_pad_chars - left_pad;
break;
} /* First we pad on the left. */
/* 左填充:循环添加字符 */
for (i = 0; i < left_pad; i++)
ZSTR_VAL(result)[ZSTR_LEN(result)++] = pad_str[i % pad_str_len]; /* Then we copy the input string. */
/* 左填充完成后,附加输入字符串 */
memcpy(ZSTR_VAL(result) + ZSTR_LEN(result), ZSTR_VAL(input), ZSTR_LEN(input));
ZSTR_LEN(result) += ZSTR_LEN(input); /* Finally, we pad on the right. */
/* 右填充:循环添加字符串 */
for (i = 0; i < right_pad; i++)
ZSTR_VAL(result)[ZSTR_LEN(result)++] = pad_str[i % pad_str_len]; // 添加字符串结束标志'\0'
ZSTR_VAL(result)[ZSTR_LEN(result)] = '\0'; // 返回新字符串
RETURN_NEW_STR(result);
}

最新文章

  1. 【已解决】Https请求——基础连接已经关闭 发送时发生错误
  2. logstash5.x配置
  3. AJAX-----01远古时期的ajax
  4. IOS开发UI基础UIPageControl的属性
  5. 如何设置word里的代码格式,使之有底纹的效果
  6. Verilog中的specify block和timing check
  7. 再次回首 TCP Socket服务器编程
  8. python绝技 — 搜寻蓝牙设备
  9. AWS Organizations
  10. 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况
  11. php数据分页显示基础
  12. (七十三)iOS本地推送通知的实现
  13. Android 异步框架 RxJava2
  14. TestNg 4.组测试中的方法分组测试
  15. 【maven】maven源码打包
  16. 传输层——UDP报文头介绍
  17. rancher 2 webhook 格式
  18. 使用C语言操作InfluxDB
  19. 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)
  20. Python 2.7和3.6爬取妹子图网站单页测试图片

热门文章

  1. Python2.7-netrc
  2. jsp el的内置对象
  3. 在ROS中使用QT界面
  4. scapy学习笔记(1)
  5. 蓝桥杯之大臣的旅费(两次dfs)
  6. jqgrid 加入右键菜单按钮管理
  7. free命令(buffer与cache区别/linux查看空闲内存)
  8. ADO.NET TransactionScope使用说明(转载)
  9. spark-windows(含eclipse配置)下本地开发环境搭建
  10. 【arm学习】我的第一个裸板程序