int *formatargs;
int formatcount = 0;
int outputpos = 0, outputsize = 0;
- char *output;
+ zend_string *output;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &argv, &num_args) == FAILURE) {
return;
}
}
- output = emalloc(outputsize + 1);
+ output = zend_string_alloc(outputsize, 0);
outputpos = 0;
currentarg = 1;
zend_string *str = zval_get_string(&argv[currentarg++]);
- memset(&output[outputpos], (code == 'a' || code == 'Z') ? '\0' : ' ', arg);
- memcpy(&output[outputpos], ZSTR_VAL(str),
+ memset(&ZSTR_VAL(output)[outputpos], (code == 'a' || code == 'Z') ? '\0' : ' ', arg);
+ memcpy(&ZSTR_VAL(output)[outputpos], ZSTR_VAL(str),
(ZSTR_LEN(str) < arg_cp) ? ZSTR_LEN(str) : arg_cp);
outputpos += arg;
}
if (first--) {
- output[++outputpos] = 0;
+ ZSTR_VAL(output)[++outputpos] = 0;
} else {
first = 1;
}
- output[outputpos] |= (n << nibbleshift);
+ ZSTR_VAL(output)[outputpos] |= (n << nibbleshift);
nibbleshift = (nibbleshift + 4) & 7;
}
case 'c':
case 'C':
while (arg-- > 0) {
- php_pack(&argv[currentarg++], 1, byte_map, &output[outputpos]);
+ php_pack(&argv[currentarg++], 1, byte_map, &ZSTR_VAL(output)[outputpos]);
outputpos++;
}
break;
}
while (arg-- > 0) {
- php_pack(&argv[currentarg++], 2, map, &output[outputpos]);
+ php_pack(&argv[currentarg++], 2, map, &ZSTR_VAL(output)[outputpos]);
outputpos += 2;
}
break;
case 'i':
case 'I':
while (arg-- > 0) {
- php_pack(&argv[currentarg++], sizeof(int), int_map, &output[outputpos]);
+ php_pack(&argv[currentarg++], sizeof(int), int_map, &ZSTR_VAL(output)[outputpos]);
outputpos += sizeof(int);
}
break;
}
while (arg-- > 0) {
- php_pack(&argv[currentarg++], 4, map, &output[outputpos]);
+ php_pack(&argv[currentarg++], 4, map, &ZSTR_VAL(output)[outputpos]);
outputpos += 4;
}
break;
}
while (arg-- > 0) {
- php_pack(&argv[currentarg++], 8, map, &output[outputpos]);
+ php_pack(&argv[currentarg++], 8, map, &ZSTR_VAL(output)[outputpos]);
outputpos += 8;
}
break;
case 'f': {
while (arg-- > 0) {
float v = (float) zval_get_double(&argv[currentarg++]);
- memcpy(&output[outputpos], &v, sizeof(v));
+ memcpy(&ZSTR_VAL(output)[outputpos], &v, sizeof(v));
outputpos += sizeof(v);
}
break;
case 'd': {
while (arg-- > 0) {
double v = (double) zval_get_double(&argv[currentarg++]);
- memcpy(&output[outputpos], &v, sizeof(v));
+ memcpy(&ZSTR_VAL(output)[outputpos], &v, sizeof(v));
outputpos += sizeof(v);
}
break;
}
case 'x':
- memset(&output[outputpos], '\0', arg);
+ memset(&ZSTR_VAL(output)[outputpos], '\0', arg);
outputpos += arg;
break;
case '@':
if (arg > outputpos) {
- memset(&output[outputpos], '\0', arg - outputpos);
+ memset(&ZSTR_VAL(output)[outputpos], '\0', arg - outputpos);
}
outputpos = arg;
break;
efree(formatcodes);
efree(formatargs);
- output[outputpos] = '\0';
- RETVAL_STRINGL(output, outputpos);
- efree(output);
+ ZSTR_VAL(output)[outputpos] = '\0';
+ ZSTR_LEN(output) = outputpos;
+ RETURN_NEW_STR(output);
}
/* }}} */