ecpg.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
  2. /* (C) Michael Meskes <meskes@debian.org> Feb 5th, 1998 */
  3. /* Placed under the same copyright as PostgresSQL */
  4. #include "postgres.h"
  5. #include <stdio.h>
  6. #if HAVE_GETOPT_H
  7. #include <getopt.h>
  8. #else
  9. #include <unistd.h>
  10. extern int optind;
  11. extern char *optarg;
  12. #endif
  13. #include <stdlib.h>
  14. #if defined(HAVE_STRING_H)
  15. #include <string.h>
  16. #else
  17. #include <strings.h>
  18. #endif
  19. #include "extern.h"
  20. struct _include_path *include_paths;
  21. int autocommit = 0;
  22. struct cursor *cur = NULL;
  23. struct typedefs *types = NULL;
  24. static void
  25. usage(char *progname)
  26. {
  27. fprintf(stderr, "ecpg - the postgresql preprocessor, version: %d.%d.%dn", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
  28. fprintf(stderr, "Usage: %s: [-v] [-t] [-I include path] [ -o output file name] file1 [file2] ...n", progname);
  29. }
  30. static void
  31. add_include_path(char *path)
  32. {
  33. struct _include_path *ip = include_paths;
  34. include_paths = mm_alloc(sizeof(struct _include_path));
  35. include_paths->path = path;
  36. include_paths->next = ip;
  37. }
  38. int
  39. main(int argc, char *const argv[])
  40. {
  41. int fnr,
  42. c,
  43. out_option = 0;
  44. struct _include_path *ip;
  45. add_include_path("/usr/include");
  46. add_include_path(INCLUDE_PATH);
  47. add_include_path("/usr/local/include");
  48. add_include_path(".");
  49. while ((c = getopt(argc, argv, "vo:I:t")) != EOF)
  50. {
  51. switch (c)
  52. {
  53. case 'o':
  54. #ifndef __CYGWIN32__
  55. yyout = fopen(optarg, "w");
  56. #else
  57. yyout = fopen(optarg, "wb");
  58. #endif
  59. if (yyout == NULL)
  60. perror(optarg);
  61. else
  62. out_option = 1;
  63. break;
  64. case 'I':
  65. add_include_path(optarg);
  66. break;
  67. case 't':
  68. autocommit = 1;
  69. break;
  70. case 'v':
  71. fprintf(stderr, "ecpg - the postgresql preprocessor, version: %d.%d.%dn", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
  72. fprintf(stderr, "exec sql include ... search starts here:n");
  73. for (ip = include_paths; ip != NULL; ip = ip->next)
  74. fprintf(stderr, " %sn", ip->path);
  75. fprintf(stderr, "End of search list.n");
  76. return OK;
  77. default:
  78. usage(argv[0]);
  79. return ILLEGAL_OPTION;
  80. }
  81. }
  82. if (optind >= argc) /* no files specified */
  83. {
  84. usage(argv[0]);
  85. return (ILLEGAL_OPTION);
  86. }
  87. else
  88. {
  89. /* after the options there must not be anything but filenames */
  90. for (fnr = optind; fnr < argc; fnr++)
  91. {
  92. char    *output_filename = NULL,
  93.    *ptr2ext;
  94. input_filename = mm_alloc(strlen(argv[fnr]) + 5);
  95. strcpy(input_filename, argv[fnr]);
  96. ptr2ext = strrchr(input_filename, '.');
  97. /* no extension? */
  98. if (ptr2ext == NULL)
  99. {
  100. ptr2ext = input_filename + strlen(input_filename);
  101. /* no extension => add .pgc */
  102. ptr2ext[0] = '.';
  103. ptr2ext[1] = 'p';
  104. ptr2ext[2] = 'g';
  105. ptr2ext[3] = 'c';
  106. ptr2ext[4] = '';
  107. }
  108. if (out_option == 0)/* calculate the output name */
  109. {
  110. output_filename = strdup(input_filename);
  111. ptr2ext = strrchr(output_filename, '.');
  112. /* make extension = .c */
  113. ptr2ext[1] = 'c';
  114. ptr2ext[2] = '';
  115. #ifndef __CYGWIN32__
  116. yyout = fopen(output_filename, "w");
  117. #else
  118. yyout = fopen(output_filename, "wb");
  119. #endif
  120. if (yyout == NULL)
  121. {
  122. perror(output_filename);
  123. free(output_filename);
  124. free(input_filename);
  125. continue;
  126. }
  127. }
  128. #ifndef __CYGWIN32__
  129. yyin = fopen(input_filename, "r");
  130. #else
  131. yyin = fopen(input_filename, "rb");
  132. #endif
  133. if (yyin == NULL)
  134. perror(argv[fnr]);
  135. else
  136. {
  137. struct cursor *ptr;
  138. struct _defines *defptr;
  139. struct typedefs *typeptr;
  140. /* remove old cursor definitions if any are still there */
  141. for (ptr = cur; ptr != NULL;)
  142. {
  143. struct cursor *this = ptr;
  144. struct arguments *l1,
  145.    *l2;
  146. free(ptr->command);
  147. free(ptr->connection);
  148. free(ptr->name);
  149. for (l1 = ptr->argsinsert; l1; l1 = l2)
  150. {
  151. l2 = l1->next;
  152. free(l1);
  153. }
  154. for (l1 = ptr->argsresult; l1; l1 = l2)
  155. {
  156. l2 = l1->next;
  157. free(l1);
  158. }
  159. ptr = ptr->next;
  160. free(this);
  161. }
  162. /* remove old defines as well */
  163. for (defptr = defines; defptr != NULL;)
  164. {
  165. struct _defines *this = defptr;
  166. free(defptr->new);
  167. free(defptr->old);
  168. defptr = defptr->next;
  169. free(this);
  170. }
  171. /* and old typedefs */
  172. for (typeptr = types; typeptr != NULL;)
  173. {
  174. struct typedefs *this = typeptr;
  175. free(typeptr->name);
  176. free(typeptr->type);
  177. ECPGfree_struct_member(typeptr->struct_member_list);
  178. typeptr = typeptr->next;
  179. free(this);
  180. }
  181. /* initialize lex */
  182. lex_init();
  183. /* we need two includes */
  184. fprintf(yyout, "/* Processed by ecpg (%d.%d.%d) */n/* These two include files are added by the preprocessor */n#include <ecpgtype.h>n#include <ecpglib.h>nn", MAJOR_VERSION, MINOR_VERSION, PATCHLEVEL);
  185. /* and parse the source */
  186. yyparse();
  187. if (yyin != NULL)
  188. fclose(yyin);
  189. if (out_option == 0)
  190. fclose(yyout);
  191. }
  192. if (output_filename)
  193. free(output_filename);
  194. free(input_filename);
  195. }
  196. }
  197. return OK;
  198. }