ます’s Blog - どうでもいい記事100選

どうでもいい記事100選

params

shimookaさんのトコで紹介があったので、少し試してみようかと思ったのですが。。。

% cd /usr/local/src
% gzip -dc ./php-4.4.7.tar.gz | gtar xf -
% cd  ./php-4.4.7/ext
% gzip -dc ../../params-1.0.tgz | gtar xf -
% mv ./params-1.0 ./params
% cd ../
% rm ./configure
% ./buildconf --force
% ./configure --disable-all --enable-params
% make
ext/params/php_params.o: In function `zif_params_parse':
/usr/local/src/php-4.4.7/ext/params/php_params.c:131: undefined reference to `STR_EMPTY_ALLOC'
collect2: ld returned 1 exit status
make: *** [sapi/cgi/php] Error 1

「STR_EMPTY_ALLOC」って何ですか。。。_| ̄|○
そろそろサポート終了になるような環境で試すなよ、という事ですか。
でもね。「PHP Version: PHP 4.0.0 or newer」って書いてあったんです。ぐすん。
このまま終わるのも悔しかったので、ちょっとだけ深追い(現実逃避とも言う)。ハマってる証拠ですね。
5.2.5を対象に「STR_EMPTY_ALLOC」の定義を確認してみました。

% grep -rn STR_EMPTY_ALLOC /usr/local/src/php-5.2.5
/usr/local/src/php-5.2.5/ext/sybase_ct/php_sybase_ct.c:464:     SybCtG(server_message) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/sybase_ct/php_sybase_ct.c:1338:            result->fields[i].column_source = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/reg.c:462:                        pattern = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/reg.c:474:                        replace = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/reg.c:486:                string = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/html.c:1143:                      return STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/math.c:760:               return STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/math.c:787:               return STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/standard/math.c:798:                       return STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/wddx/wddx.c:707:           Z_STRVAL_P(ent.data) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/wddx/wddx.c:717:           Z_STRVAL_P(ent.data) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/sqlite/sess_sqlite.c:118:                                  *val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/sybase/php_sybase_db.c:289:        php_sybase_module.server_message = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/sybase/php_sybase_db.c:883:                        result->fields[i].column_source = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/session/session.c:1205:            REGISTER_STRINGL_CONSTANT("SID", STR_EMPTY_ALLOC(), 0, 0);
/usr/local/src/php-5.2.5/ext/session/session.c:1561:            old = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/session/mod_files.c:370:           *val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/pcre/php_pcre.c:1173:      /* FIXME: This might need to be changed to STR_EMPTY_ALLOC(). Check if this zval could be dtor()'ed somehow */
/usr/local/src/php-5.2.5/ext/mssql/php_mssql.c:1101:                            result->fields[i].column_source = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/pgsql/pgsql.c:1684:                        return STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1428:                                      Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1434:                                      Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1587:                                      Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/ext/odbc/php_odbc.c:1593:                                      Z_STRVAL_P(tmp) = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/sapi/isapi/php5isapi.c:375:    return STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend_API.h:480:           (z)->value.str.val = STR_EMPTY_ALLOC(); \
/usr/local/src/php-5.2.5/Zend/zend_operators.c:543:                     op->value.str.val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend_operators.c:553:                             op->value.str.val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend_alloc.h:124:#define safe_estrdup(ptr)  ((ptr)?(estrdup(ptr)):STR_EMPTY_ALLOC())
/usr/local/src/php-5.2.5/Zend/zend_alloc.h:125:#define safe_estrndup(ptr, len) ((ptr)?(estrndup((ptr), (len))):STR_EMPTY_ALLOC())
/usr/local/src/php-5.2.5/Zend/zend_execute.c:187:                       ptr->value.str.val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend.c:205:                       expr_copy->value.str.val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend.c:213:                               expr_copy->value.str.val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend.c:254:                               expr_copy->value.str.val = STR_EMPTY_ALLOC();
/usr/local/src/php-5.2.5/Zend/zend.h:498:#define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1)

最後の行に注目。なる程ねぇ。
「STR_EMPTY_ALLOC」の定義がいつから入ったのか調べてみましたが、5.1.0からのようです(5.0.5・5.1.0<>)。
params側で(丁度良い感じに)バージョンを判定している箇所があったので、その位置に埋め込んでみました。

--- params-1.0,orig/php_params.c	2007-11-13 20:46:00.000000000 +0900
+++ params-1.0/php_params.c	2007-11-16 17:46:53.000000000 +0900
@@ -61,6 +61,7 @@
 # define PHP_PARAMS_INT_CAST (int)(zend_uintptr_t)
 #else
 # define PHP_PARAMS_INT_CAST (ulong)
+# define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1)
 #endif
 
 static inline int php_params_get_args(int *pargc, zval ***pargv TSRMLS_DC)

このパッチを適用する事でビルド&実行できるようになりました。わーい。
4.4.7、5.0.4、5.1.0、5.1.1、5.2.3、5.2.5で確認済みです。適用してもらうのも微妙だけど、一応報告だけはしておこうかな。。。
ただ、shimookaさんも仰っているようにグレイトな用途が思いつかない。。。(w