- 首先需要下载编译
下载mbuilov/gawk-windows,按照说明编译成功。
https://github.com/mbuilov/gawk-windows
步骤:
-
下载依赖
https://github.com/mbuilov/mscrtx.git
https://github.com/mbuilov/libutf16.git
https://github.com/mbuilov/unicode_ctype.git -
打开”x64 Native Tools Command Prompt for VS 20XX"
set "MSCRTX=\path\to\mscrtx-master"
set "LIBUTF16=\path\to\libutf16-master"
set "UNICODE_CTYPE=\path\to\unicode_ctype-master"
- cd \path\to\gawk-windows-new-master
- build.bat all
这里有一些自带的extension可以提供参考。
- 实现myawkext.c
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <inttypes.h>
#include "gawkapi.h"
GAWK_PLUGIN_GPL_COMPATIBLE
GAWK_PLUGIN("my awk extension: version 1.0");
static awk_value_t *
do_mystrlen(int nargs, awk_value_t *result, struct awk_ext_func *unused)
{
int ret = 0;
awk_value_t file_param, array_param;
const char *name;
if (! get_argument(0, AWK_STRING, & file_param)) {
return make_number(-1, result);
}
name = file_param.str_value.str;
ret = strlen(name);
return make_number(ret, result);
}
static awk_bool_t
init_myawkext(void)
{
int errors = 0;
return (awk_bool_t) (errors == 0);
}
static awk_ext_func_t myawkext_funcs[] = {
{ "mystrlen", do_mystrlen, 3, 1, awk_false, NULL },
};
dl_load_func(init_myawkext, myawkext_funcs, myawkext, "")
定义了myawkext.c文件,提供一个函数:"mystrlen"返回字符串的长度。
注意这里用到的两个头文件,"config.h"和"gawkapi.h"都是gawk生成的。
- 编译
rm -f myawkext.obj
rm -f myawkext.dll
rm -f myawkext.exp
rm -f myawkext.lib
set GAWKWINHOME=c:/path/to/gawk-windows-new-master
cl.exe /LD /DHAVE_CONFIG_H -I%GAWKWINHOME% -I%GAWKWINHOME%/pc myawkext.c
REM Or
REM cl.exe /c /DHAVE_CONFIG_H -I%GAWKWINHOME% -I%GAWKWINHOME%/pc /Fomyawkext.obj myawkext.c
REM link.exe /DLL /OUT:myawkext.dll myawkext.obj
- 运行
> cat test.awk
@load "myawkext"
BEGIN {
printf "len=%d\n", mystrlen("1234567")
}
> awk -f test.awk
7













网友评论