main.c 2.4 KB

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