zengl v1.3.2 , 修复字符串脚本解析时可能出现的结尾字符死循环问题,将用户自定义的函数指针在用户API接口部分统一设置为void *指针类型,这样一方面可以解决v1.3.1所产生的函数指针兼容问题,另一方面有利于以后扩展和调整用户自定义函数的参数 ,linux中的makefile添加静态编译...
char * run_str = "//this is a test for zenglApi_RunStr \n" "inc 'test2.zl';\n" "a = 135; \n" "b=2;\n" "print 'a-b is '+(a-b); \n" "bltLoadScript('test3.zl'); a"; |
/* 从文件或字符串脚本中获取下一个字符 */ ZL_CHAR zengl_getNextchar(ZL_VOID * VM_ARG) { ...................... else //字符串脚本 { if(source->cur >= source->run_str_len) { source->cur++; return ZL_FILE_EOF; } else tmpch = source->run_str[source->cur++]; } ...................... } |
...................... typedef struct _ZENGL_EXPORT_VM_MAIN_ARGS{ ZL_EXP_VOID * userdef_info; //用户自定义的显示普通信息的函数,用户可以自定义信息的打印和输出方式。 ZL_EXP_VOID * userdef_compile_error; //用户自定义的显示错误信息的函数。 ZL_EXP_VOID * userdef_run_info; //用户自定义的解释器中显示普通信息的函数,用户可以自定义信息的打印和输出方式。 ZL_EXP_VOID * userdef_run_print; //用户自定义的解释器PRINT之类的指令对应的打印输出方式。 ZL_EXP_VOID * userdef_run_error; //用户自定义的解释器中显示错误信息的函数。 ZL_EXP_VOID * userdef_module_init; //用户自定义的全局模块初始化函数,在run解释器入口处会被调用 ZL_EXP_INT flags; //用户自定义的一些编译器或解释器的选项 }ZENGL_EXPORT_VM_MAIN_ARGS; ...................... |
/*编译器初始化*/ ZL_VOID zengl_init(ZL_VOID * VM_ARG,ZL_CHAR * script_file,ZENGL_EXPORT_VM_MAIN_ARGS * vm_main_args) { ............................. compile->userdef_info = (ZL_VM_API_INFO_FUN_HANDLE)vm_main_args->userdef_info; compile->userdef_compile_error = (ZL_VM_API_INFO_FUN_HANDLE)vm_main_args->userdef_compile_error; ............................. } |
#makefile for zengl language CC = gcc AR = ar ARFLAGS = rc CFLAGS = -g3 -ggdb -O0 -std=c99 CDEFINES = -D ZL_LANG_EN_WITH_CH SHARED_CFLAGS = $(CFLAGS) -shared -fvisibility=hidden -fPIC STATIC_CFLAGS = $(CFLAGS) -fvisibility=hidden -fPIC ZENGL_LIB_CFLAGS_LIB = -lzengl SRCS = zengl_main.c zengl_parser.c zengl_symbol.c zengl_locals.c zengl_assemble.c zengl_ld.c zenglrun_main.c zenglrun_func.c zenglApi.c zenglApi_BltModFuns.c OBJS = zengl_main.o zengl_parser.o zengl_symbol.o zengl_locals.o zengl_assemble.o zengl_ld.o zenglrun_main.o zenglrun_func.o zenglApi.o zenglApi_BltModFuns.o RUNOBJS = main.o zengl: $(RUNOBJS) encrypt.o libzengl.so $(CC) $(CFLAGS) -o zengl $(RUNOBJS) $(ZENGL_LIB_CFLAGS_LIB) $(CC) $(CFLAGS) -o encrypt encrypt.o $(ZENGL_LIB_CFLAGS_LIB) st_zengl: $(RUNOBJS) encrypt.o libzengl.a $(CC) $(CFLAGS) -o zengl $(RUNOBJS) libzengl.a $(CC) $(CFLAGS) -o encrypt encrypt.o libzengl.a libzengl.a: $(OBJS) $(AR) $(ARFLAGS) libzengl.a $(OBJS) $(OBJS): $(SRCS) zengl_global.h zengl_locals.h zengl_exportfuns.h $(CC) $(CDEFINES) $(STATIC_CFLAGS) -c $(SRCS) libzengl.so : $(SRCS) zengl_global.h zengl_locals.h zengl_exportfuns.h $(CC) $(CDEFINES) $(SHARED_CFLAGS) -o libzengl.so $(SRCS) cp libzengl.so /usr/lib main.o: main.c zengl_exportfuns.h $(CC) $(CFLAGS) -c main.c encrypt.o: encrypt.c zengl_exportfuns.h $(CC) $(CFLAGS) -c encrypt.c clean: rm -fv libzengl.so rm -fv zengl rm -fv encrypt rm -fv main.o rm -fv encrypt.o rm -fv libzengl.a rm -fv *.o all: zengl libzengl.so static: st_zengl |