c - 单元测试 zsh extendedglob 功能

标签 c unit-testing makefile zsh glob

如何在 c 程序中使用 z shell 提供的函数执行 glob?

到目前为止,我已经为我的探索创建了一个自述文件。它用于开源库。

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 作为我的 shell)。::

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中的使用

它的一个使用示例可能是函数的方法参数 ...................

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

在文件中找到
.....................

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

让我们看看是什么在调用该函数。嗯,只有一个电话。对该调用的唯一引用是在该文件中。

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

好像不存在,也许是生成的?

似乎有一个 block

 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

在这个阶段我不太确定我该怎么做,考虑到我可能想对该功能进行单元测试,我该怎么做?

最佳答案

函数bin_zregexparsezsh/zutil module 提供的zregexparse 内置函数的实现。 .它在其定义下方使用 in zutil.c :

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

zregexparse 旨在用于 _regex_arguments 的实现。 .这不是最有希望的切入点。

如果你想实现 zsh 的 globbing 特性,你必须将几乎所有的 zsh 代码引入你的程序,因为 glob 模式可以包含任意嵌入代码。您可以在构建期间排除行编辑器,仅此而已。

我建议使用单独的 zsh 二进制文件并通过一对管道向其提供请求。

setopt extended_glob null_glob
print -Nr -- **/*(.Om+my_predicate) ''

关于c - 单元测试 zsh extendedglob 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10865767/

相关文章:

c - 如何正确地将数组指针传递给 C 中的函数

objective-c - 将具有相同类名、接口(interface)和实现的两个框架(或包)加载到运行时中。会发生什么?

c - 为什么 sqlite3_exec 失败并出现类似回调中止的症状?

javascript - 测试 React Modal 组件

c - NMAKE : fatal error U1077: 'cc' : return code '0x1'

c - Makefile C 子目录规则来制作 obj

c++ - 是否可以在浏览器中嵌入编译器

自定义函数的 JavaScript 单元测试

unit-testing - 如何比较/匹配模拟中的闭包?

c++ - 非常简单的应用程序失败,来自 Eclipse 的 "multiple target patterns"