2

ac プログラムで、z シェルが提供する関数を使用して glob を実行するにはどうすればよいですか?

これまでの探索の README を作成しました。これは、オープン ソース ライブラリで使用するためのものです。

https://bitbucket.org/sentimental/zsh_source_experimentation/src/master/README

ここにコピーします:


始める

ソースを入手しましょう

apt-get source zsh
apt-get source zsh-dev

ldd を使用して、zsh がライブラリ ファイルを生成しないことを発見しました::

#ldd /bin/zsh4

        linux-gate.so.1 =>  (0xb7775000)
        libcap.so.2 => /lib/i386-linux-gnu/libcap.so.2 (0xb7751000)
        libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb774c000)
        libtinfo.so.5 => /lib/i386-linux-gnu/libtinfo.so.5 (0xb772c000)
        libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7700000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb755b000)

ソースファイルを直接使用する必要があると思います。

拡張グロブリングへの参照を含むファイルを見つけてみましょう (シェルとして zsh を使用しています)::

grep -ir EXTENDEDGLOB . |  egrep "\.(c|h):"  | cut -d: -f1 | sort -u

./README
./zsh-4.3.17/Etc/ChangeLog-3.0
./zsh-4.3.17/Src/glob.c
./zsh-4.3.17/Src/Modules/zutil.c
./zsh-4.3.17/Src/options.c
./zsh-4.3.17/Src/pattern.c
./zsh-4.3.17/Src/utils.c
./zsh-4.3.17/Src/Zle/complist.c
./zsh-4.3.17/Src/Zle/zle_tricky.c
./zsh-4.3.17/Src/zsh.h

これらのファイルのいくつかを考えてみましょう

zsh.h

ここで、EXTENDEDGLOB は匿名列挙の一部として定義されています

出版物があります

ここ http://publications.gbdirect.co.uk/c_book/chapter6/enums.html

そしてここ http://bytes.com/topic/c/answers/63891-enum-within-function-standard

cでのenumの使用の詳細

その使用例は、おそらく関数のメソッド引数です.......

 static int
    bin_zregexparse(char *nam, char **args, Options ops, UNUSED(int func))

ファイルで見つかった
..................................

./zsh-4.3.17/Src/Modules/zutil.c

その関数を呼び出しているものを見てみましょう。うーん、呼び出しは 1 つだけです。その呼び出しへの唯一の参照は、そのファイルにあります。

grep -r  bin_zregexparse . |  egrep "\.(c|h):"  | cut -d: -f1 | sort -u

./zsh-4.3.17/Src/Modules/zutil.c

うーん....この関数を呼び出すものがない場合、どのように機能しますか?

このコードを何らかの方法でセットアップまたはエイリアスする条件付き構成があるかどうか見てみましょう。

 grep -i regex ./**/conf*

/zsh-4.3.17/config.h.in :/* Define to 1 if you have the `regexec' function. */
./zsh-4.3.17/config.h.in :#undef HAVE_REGEXEC
./zsh-4.3.17/config.h.in :/* Define to 1 if you have the `regexec' function. */
./zsh-4.3.17/config.h.in :#undef HAVE_REGEXEC
./zsh-4.3.17/configure :       regcomp regexecc regerror regfree \
./zsh-4.3.17/configure :       regcomp regexec regexecerror regfree \
./zsh-4.3.17/configure.ac :       regcomp regexec regerrorror regfree \

これらのファイルを調べてみましょう。

 config.h.in

存在しないようですが、おそらく生成されていますか?

中にブロックがありそう

 configure


 8148 for ac_func in strftime strptime mktime timelocal \     
 8149          difftime gettimeofday clock_gettime \          
 8150          select poll \                                  
 8151          readlink faccessx fchdir ftruncate \           

 etc etc etc ..

 8178          htons ntohs \                                   
 8179          regcomp regexec regerror regfree \              
 8180          gdbm_open getxattr \                            
 8181          realpath canonicalize_file_name \               
 8182          symlink getcwd                                  
 8183 do :                                                     
 8184   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` 
 8185 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"     
 8186 if eval test \"x\$"$as_ac_var"\" = x"yes"; then :        
 8187   cat >>confdefs.h <<_ACEOF                              
 8188 #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1        
 8189 _ACEOF                                                   
 8190                                                          
 8191 fi                                                       
 8192 done                                                     

}}}

私はそれが何をしているのか分かりません。TODO: 調査してください!

  ./zsh-4.3.17/configure.ac 

  1167 dnl ---------------
  1168 dnl CHECK FUNCTIONS
  1169 dnl ---------------
  1170                                                                                                                                                                                  |     rglobdata.gd_gf_noglobdot
  1171 dnl need to integrate this function
  1172 dnl AC_FUNC_STRFTIME
  1173                                                                                                                                                                                  |     rglobdata.gd_gf_listtypes
  1174 AC_CHECK_FUNCS(strftime strptime mktime timelocal \
  1175          difftime gettimeofday clock_gettime \
  1176          select poll \

  etc etc etc 


  1205          regcomp regexec regerror regfree \                                 
  1206          gdbm_open getxattr \                                               
  1207          realpath canonicalize_file_name \                                  
  1208          symlink getcwd)                                                    
  1209 AC_FUNC_STRCOLL

この段階では、これを行う方法がよくわかりません。おそらくその機能を単体テストしたいと考えていますが、どうすればよいでしょうか?

4

1 に答える 1

1

関数は、モジュールによって提供されるビルトインbin_zregexparseの実装です。の定義の下で使用されますzregexparsezsh/zutilzutil.c

static struct builtin bintab[] = {
    …
    BUILTIN("zregexparse", 0, bin_zregexparse, 3, -1, 0, "c", NULL),
    …
};

zregexparseの実装で使用することを意図しています_regex_arguments。これは、最も有望なエントリ ポイントではありません。

zsh のグロビング機能を実装したい場合は、グロブ パターンに任意の埋め込みコードを含めることができるため、ほとんどすべての zsh コードをプログラムに取り込む必要があります。ビルド中に行エディターを除外できますが、それだけです。

別の zsh バイナリを使用し、パイプのペアを介してリクエストを供給することをお勧めします。

setopt extended_glob null_glob
print -Nr -- **/*(.Om+my_predicate) ''
于 2012-06-03T15:59:09.903 に答える