【易语言刷车源码】【node require源码】【mavn下载源码】strtoul 源码

时间:2024-12-23 04:05:56 编辑:microsoft开放源码 来源:精品app源码商城

1.如何用c语言在windows平台上开发php extension
2.C语言 printf和scanf的实现

strtoul 源码

如何用c语言在windows平台上开发php extension

       ã€€ä½•ä½¿ç”¨C语言发PHP扩展

       ã€€ã€€å‡½æ•°åŠŸèƒ½ï¼šphp面整数符号数其内部实现其实longunsigned long于位机器说php能表示整数2^-1般应用碰于2^-1于2^数能用字符串表示于mixed int_ext(string in)说字符串in表示整数于2^-1返整数于返字符串

       ã€€ã€€å‘扩展步骤:(首先需要载php源码载php-5.3.)

       ã€€ã€€1建立扩展骨架

       ã€€ã€€[plain] view plaincopyprint?易语言刷车源码

       ã€€ã€€.cd php-5.3./ext

       ã€€ã€€../ext_skel --extname=int_ext

       ã€€ã€€cd php-5.3./ext

       ã€€ã€€./ext_skel --extname=int_ext

       ã€€ã€€2修改编译参数

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.cd php-5.3./ext/int_ext

       ã€€ã€€.vi config.m4

       ã€€ã€€cd php-5.3./ext/int_ext

       ã€€ã€€vi config.m4掉 PHP_ARG_ENABLE(int_ext, whether to enable int_ext support

       ã€€ã€€[ --enable-int_ext Enable int_ext support]) 两行前面dnl 修改:

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.1. dnl Otherwise use enable:

       ã€€ã€€.2. PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,

       ã€€ã€€.3. dnl Make sure that the comment is aligned:

       ã€€ã€€.4. [ --enable-int_ext Enable int_ext support])

       ã€€ã€€1. dnl Otherwise use enable:

       ã€€ã€€2. PHP_ARG_ENABLE(int_ext, whether to enable int_ext support,

       ã€€ã€€3. dnl Make sure that the comment is aligned:

       ã€€ã€€4. [ --enable-int_ext Enable int_ext support])

       ã€€ã€€3编写C代码

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.cd php-5.3./ext/int_ext

       ã€€ã€€.vi php_int_ext.h

       ã€€ã€€.# PHP_FUNCTION(confirm_int_ext_compiled); 面新增行 PHP_FUNCTION(int_ext);

       ã€€ã€€cd php-5.3./ext/int_ext

       ã€€ã€€vi php_int_ext.h

       ã€€ã€€# PHP_FUNCTION(confirm_int_ext_compiled); 面新增行 PHP_FUNCTION(int_ext);[plain] view plaincopyprint?

       ã€€ã€€.cd php-5.3./ext/int_ext

       ã€€ã€€.vi int_ext.c

       ã€€ã€€.#PHP_FE(confirm_int_ext_compiled, NULL) 面添加 PHP_FE(int_ext, NULL)添加:

       ã€€ã€€.1. zend_function_entry int_ext_functions[] = {

       ã€€ã€€.2. PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */

       ã€€ã€€.3. PHP_FE(int_ext, NULL) /* For testing, remove later. */

       ã€€ã€€.4. { NULL, NULL, NULL} /* Must be the last line in int_ext_functions[] */

       ã€€ã€€.5. };

       ã€€ã€€cd php-5.3./ext/int_ext

       ã€€ã€€vi int_ext.c

       ã€€ã€€#PHP_FE(confirm_int_ext_compiled, NULL) 面添加 PHP_FE(int_ext, NULL)添加:

       ã€€ã€€1. zend_function_entry int_ext_functions[] = {

       ã€€ã€€2. PHP_FE(confirm_int_ext_compiled, NULL) /* For testing, remove later. */

       ã€€ã€€3. PHP_FE(int_ext, NULL) /* For testing, remove later. */

       ã€€ã€€4. { NULL, NULL, NULL} /* Must be the last line in int_ext_functions[] */

       ã€€ã€€5. };

       ã€€ã€€æ ¸ä»£ç ï¼š

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.PHP_FUNCTION(int_ext)

       ã€€ã€€.{

       ã€€ã€€. char * str = NULL;

       ã€€ã€€. int str_len;

       ã€€ã€€. int argc = ZEND_NUM_ARGS();

       ã€€ã€€. if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)

       ã€€ã€€. return ;

       ã€€ã€€. char * result;

       ã€€ã€€. int result_length = str_len;

       ã€€ã€€. result = (char *) emalloc(result_length + 1);

       ã€€ã€€. memcpy(result,str,result_length);

       ã€€ã€€. unsigned long result_num = strtoul(result, NULL, );

       ã€€ã€€. int sizeoflong sizeof(long);

       ã€€ã€€. unsigned long max_long = 1 << (sizeoflong * 8 -1);

       ã€€ã€€. if(result_num < max_long)

       ã€€ã€€. {

       ã€€ã€€. RETURN_LONG(result_num);

       ã€€ã€€. }

       ã€€ã€€. else

       ã€€ã€€. {

       ã€€ã€€. RESULT_STRINGL(result, result_length, 0);

       ã€€ã€€. }

       ã€€ã€€.}

       ã€€ã€€PHP_FUNCTION(int_ext)

       ã€€ã€€{

       ã€€ã€€char * str = NULL;

       ã€€ã€€int str_len;

       ã€€ã€€int argc = ZEND_NUM_ARGS();

       ã€€ã€€if(zend_parse_parameters(argc TSRMLS_CC,"s",&str,&str_len) == FAILURE)

       ã€€ã€€return ;

       ã€€ã€€char * result;

       ã€€ã€€int result_length = str_len;

       ã€€ã€€result = (char *) emalloc(result_length + 1);

       ã€€ã€€memcpy(result,str,result_length);

       ã€€ã€€unsigned long result_num = strtoul(result, NULL, );

       ã€€ã€€int sizeoflong sizeof(long);

       ã€€ã€€unsigned long max_long = 1 << (sizeoflong * 8 -1);

       ã€€ã€€if(result_num < max_long)

       ã€€ã€€{

       ã€€ã€€RETURN_LONG(result_num);

       ã€€ã€€}

       ã€€ã€€else

       ã€€ã€€{

       ã€€ã€€RESULT_STRINGL(result, result_length, 0);

       ã€€ã€€}

       ã€€ã€€}

       ã€€ã€€4编译

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.cd php-5.3./ext/int_ext

       ã€€ã€€./usr/local/php/bin/pphpize

       ã€€ã€€../configure --with-php-config=/usr/local/php/bin/php-config

       ã€€ã€€.make

       ã€€ã€€.make install

       ã€€ã€€cd php-5.3./ext/int_ext

       ã€€ã€€/usr/local/php/bin/pphpize

       ã€€ã€€./configure --with-php-config=/usr/local/php/bin/php-config

       ã€€ã€€make

       ã€€ã€€make install

       ã€€ã€€äº§so文件: /usr/local/php/lib/php/extensions/no-debug-non-zts-/int_ext.so

       ã€€ã€€ä¿®æ”¹php.ini 添加扩展extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-/"

       ã€€ã€€[int_ext]

       ã€€ã€€extension = int_ext.so

       ã€€ã€€5测试

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.$a = int_ext("");

       ã€€ã€€.var_dump($a);

       ã€€ã€€.$a = int_ext("");

       ã€€ã€€.var_dump($a);

       ã€€ã€€$a = int_ext("");

       ã€€ã€€var_dump($a);

       ã€€ã€€$a = int_ext("");

       ã€€ã€€var_dump($a);

       ã€€ã€€ç»“输:

       ã€€ã€€[plain] view plaincopyprint?

       ã€€ã€€.string() ""

       ã€€ã€€.int()

C语言 printf和scanf的实现

       /* Write formatted output to stdout from the format string FORMAT. */

       /* VARARGS1 */

       int

       __printf (const char *format, ...)

       {

        va_list arg;

        int done;

        va_start (arg, format);

        done = vfprintf (stdout, format, arg);

        va_end (arg);

        return done;

       }

       int _scanf(char (*get)(void), void (*unget)(char), CONST char *fmt, va_list va)

        {

        int is_long, c, base;

        char *vp;

        char s[MAX+1];

        int converted = 0;

        while (c = *fmt++)

        {

        if (c == '%')

        {

        if (*fmt == 'l')

        {

        is_long = 1;

        fmt++;

        }

        else

        is_long = 0;

        vp = va_arg(va, void *);

        switch (*fmt)

        {

        case 'c':

        *(char *)vp = get();

        converted++;

        break;

        case 'o': base = 8; goto read_strtoul;

        case 'u': base = ; goto read_strtoul;

        case 'X':

        case 'x': base = ;

        read_strtoul:

        converted++;

        ReadInteger(s, get, unget, base);

        if (is_long)

        *(unsigned long *)vp = strtoul(s, 0, base);

        else

        *(unsigned *)vp = strtoul(s, 0, base);

        break;

        case 'd':

        converted++;

        ReadInteger(s, get, unget, );

        if (is_long)

        *(long *)vp = strtol(s, 0, );

        else

        *(int *)vp = strtol(s, 0, );

        break;

        case 's':

        converted++;

        ReadString(vp, get, unget);

        break;

        default:

        puts("unsupported format");

        break;

        }

        fmt++;

        }

        else if (isspace(c))

        {

        while ((c = get()) && isspace(c))

        ;

        unget(c);

        }

        else if (get() != c)

        break;

        }

        return converted;

        }