main.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "__virtualmath.h"
  2. #include <getopt.h>
  3. static const struct option long_option[]={
  4. {"input",required_argument,NULL,'i'},
  5. {"stdout",no_argument,NULL,'s'},
  6. #if OUT_LOG
  7. {"log",required_argument,NULL,'l'},
  8. {"debug",no_argument,&args.level,DEBUG},
  9. {"ddebug",no_argument,&args.level,DEEP_DEBUG},
  10. {"ldebug",no_argument,&args.level,LEXICAL_DEBUG},
  11. {"lcdebug",no_argument,&args.level,LEXICAL_CHECKOUT_DEBUG},
  12. {"info",no_argument,&args.level,INFO},
  13. #endif
  14. // 最后一个元素应该全为0
  15. {NULL,0,NULL,0}
  16. };
  17. #if OUT_LOG
  18. static const char *short_option = "si:l:";
  19. #else
  20. static const char *short_option = "si:";
  21. #endif
  22. int getArgs(int argc, char *argv[]);
  23. void freeArgs();
  24. int main(int argc, char *argv[]) {
  25. printf("[start VirtualMath]\n");
  26. if (getArgs(argc, argv)){
  27. goto args_error_;
  28. }
  29. Inter *global_iter = makeInter(args.log_file);
  30. ParserMessage *pm = makeParserMessage(args.file, args.log_file);
  31. printf("[start to lexical]\n");
  32. pasersCommandList(pm, global_iter, true, global_iter->statement);
  33. if (pm->status != success){
  34. writeLog(pm->paser_debug, ERROR, "Syntax Error: %s\n", pm->status_message);
  35. writeLog(stderr, ERROR, "Syntax Error: %s\n", pm->status_message);
  36. goto return_;
  37. }
  38. printf("[start to run]\n");
  39. Result tmp;
  40. tmp = globalIterStatement(global_iter);
  41. if (tmp.type == error_return){
  42. writeLog(global_iter->debug, ERROR, "Run Error\n", NULL);
  43. writeLog(stderr, ERROR, "Run Error\n", NULL);
  44. }
  45. return_:
  46. freePasersMessage(pm, true);
  47. freeInter(global_iter, true);
  48. freeArgs();
  49. printf("[exit Virtual [0]]\n");
  50. return 0;
  51. args_error_:
  52. freeArgs();
  53. printf("[exit Virtual [1]]\n");
  54. return 1;
  55. }
  56. /**
  57. * 参数设置, args是全局结构体, 保存全局的参数设置
  58. * @param argc
  59. * @param argv
  60. * @return
  61. */
  62. int getArgs(int argc, char *argv[])
  63. {
  64. args.file = NULL;
  65. args.log_file = NULL;
  66. args.level = LEXICAL_CHECKOUT_DEBUG;
  67. args.stdout_inter = false;
  68. opterr = false;
  69. int opt;
  70. while((opt=getopt_long(argc,argv,short_option ,long_option,NULL))!=-1)
  71. {
  72. switch(opt)
  73. {
  74. case 0:
  75. break;
  76. case 'i':
  77. args.file = memStrcpy(optarg, 0, false, false);
  78. break;
  79. case 'l':
  80. args.log_file = memStrcpy(optarg, 0, false, false);
  81. break;
  82. case 's':
  83. args.stdout_inter = true;
  84. break;
  85. case '?':
  86. printf("[Error]: get not success args : -%c\n", (char)optopt);
  87. return -1;
  88. default:
  89. break;
  90. }
  91. }
  92. if (args.file == NULL){
  93. if (argc > optind){
  94. args.file = memStrcpy(argv[optind], 0, false, false);
  95. }
  96. else{
  97. return -1;
  98. }
  99. }
  100. return 0;
  101. }
  102. /**
  103. * 释放args的成员而不包括其本身
  104. */
  105. void freeArgs(){
  106. memFree(args.file);
  107. memFree(args.file);
  108. }