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

数据库系统

开发平台:

Unix_Linux

  1. /*
  2. ** entab.c - add tabs to a text file
  3. ** by Bruce Momjian (root@candle.pha.pa.us)
  4. **
  5. ** version 1.3
  6. **
  7. ** tabsize = 4
  8. **
  9. */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #define NUL ''
  14. #ifndef TRUE
  15. #define TRUE 1
  16. #endif
  17. #ifndef FALSE
  18. #define FALSE 0
  19. #endif
  20. void halt();
  21. extern char *optarg;
  22. extern int optind;
  23. int
  24. main(argc, argv)
  25. int argc;
  26. char   **argv;
  27. {
  28. int tab_size = 8,
  29. min_spaces = 2,
  30. protect_quotes = FALSE,
  31. del_tabs = FALSE,
  32. clip_lines = FALSE,
  33. prv_spaces,
  34. col_in_tab,
  35. escaped,
  36. nxt_spaces;
  37. char in_line[BUFSIZ],
  38. out_line[BUFSIZ],
  39.    *src,
  40.    *dst,
  41. quote_char,
  42. ch,
  43.    *cp;
  44. FILE    *in_file;
  45. if ((cp = strrchr(argv[0], '/')) != NULL)
  46. ++cp;
  47. else
  48. cp = argv[0];
  49. if (strcmp(cp, "detab") == 0)
  50. del_tabs = 1;
  51. while ((ch = getopt(argc, argv, "cdhqs:t:")) != -1)
  52. switch (ch)
  53. {
  54. case 'c':
  55. clip_lines = TRUE;
  56. break;
  57. case 'd':
  58. del_tabs = TRUE;
  59. break;
  60. case 'q':
  61. protect_quotes = TRUE;
  62. break;
  63. case 's':
  64. min_spaces = atoi(optarg);
  65. break;
  66. case 't':
  67. tab_size = atoi(optarg);
  68. break;
  69. case 'h':
  70. case '?':
  71. halt("USAGE: %s [ -cdqst ] [file ...]n
  72. -c (clip trailing whitespace)n
  73. -d (delete tabs)n
  74. -q (protect quotes)n
  75. -s minimum_spacesn
  76. -t tab_widthn",
  77.  cp);
  78. }
  79. argv += optind;
  80. argc -= optind;
  81. do
  82. {
  83. if (argc < 1)
  84. in_file = stdin;
  85. else
  86. {
  87. #ifndef __CYGWIN32__
  88. if ((in_file = fopen(*argv, "r")) == NULL)
  89. #else
  90. if ((in_file = fopen(*argv, "rb")) == NULL)
  91. #endif
  92. halt("PERROR:  Can not open file %sn", argv[0]);
  93. argv++;
  94. }
  95. escaped = FALSE;
  96. while (fgets(in_line, BUFSIZ, in_file) != NULL)
  97. {
  98. col_in_tab = 0;
  99. prv_spaces = 0;
  100. src = in_line; /* points to current processed char */
  101. dst = out_line; /* points to next unallocated char */
  102. if (escaped == FALSE)
  103. quote_char = ' ';
  104. escaped = FALSE;
  105. while (*src != NUL)
  106. {
  107. col_in_tab++;
  108. if (quote_char == ' ' && (*src == ' ' || *src == 't'))
  109. {
  110. if (*src == 't')
  111. {
  112. prv_spaces += tab_size - col_in_tab + 1;
  113. col_in_tab = tab_size;
  114. }
  115. else
  116. prv_spaces++;
  117. if (col_in_tab == tab_size)
  118. {
  119. /*
  120.  * Is the next character going to be a tab? Needed
  121.  * to do tab replacement in current spot if next
  122.  * char is going to be a tab, ignoring min_spaces
  123.  */
  124. nxt_spaces = 0;
  125. while (1)
  126. {
  127. if (*(src + nxt_spaces + 1) == NUL ||
  128. (*(src + nxt_spaces + 1) != ' ' &&
  129.  *(src + nxt_spaces + 1) != 't'))
  130. break;
  131. if (*(src + nxt_spaces + 1) == ' ')
  132. ++nxt_spaces;
  133. if (*(src + nxt_spaces + 1) == 't' ||
  134. nxt_spaces == tab_size)
  135. {
  136. nxt_spaces = tab_size;
  137. break;
  138. }
  139. }
  140. if ((prv_spaces >= min_spaces ||
  141.  nxt_spaces == tab_size) &&
  142. del_tabs == FALSE)
  143. {
  144. *(dst++) = 't';
  145. prv_spaces = 0;
  146. }
  147. else
  148. {
  149. for (; prv_spaces > 0; prv_spaces--)
  150. *(dst++) = ' ';
  151. }
  152. }
  153. }
  154. else
  155. {
  156. for (; prv_spaces > 0; prv_spaces--)
  157. *(dst++) = ' ';
  158. if (*src == 't') /* only when in quote */
  159. col_in_tab = 0;
  160. if (*src == 'b')
  161. col_in_tab -= 2;
  162. if (escaped == FALSE && protect_quotes == TRUE)
  163. {
  164. if (*src == '\')
  165. escaped = TRUE;
  166. if (*src == '"' || *src == ''')
  167. if (quote_char == ' ')
  168. quote_char = *src;
  169. else if (*src == quote_char)
  170. quote_char = ' ';
  171. }
  172. else if (*src != 'r' && *src != 'n')
  173. escaped = FALSE;
  174. if ((*src == 'r' || *src == 'n') &&
  175. quote_char == ' ' &&
  176. clip_lines == TRUE &&
  177. escaped == FALSE)
  178. {
  179. while (dst > out_line &&
  180.    (*(dst - 1) == ' ' || *(dst - 1) == 't'))
  181. dst--;
  182. prv_spaces = 0;
  183. }
  184. *(dst++) = *src;
  185. }
  186. col_in_tab %= tab_size;
  187. ++src;
  188. }
  189. /* for cases where the last line of file has no newline */
  190. if (clip_lines == TRUE && escaped == FALSE)
  191. {
  192. while (dst > out_line &&
  193.    (*(dst - 1) == ' ' || *(dst - 1) == 't'))
  194. dst--;
  195. prv_spaces = 0;
  196. }
  197. for (; prv_spaces > 0; prv_spaces--)
  198. *(dst++) = ' ';
  199. *dst = NUL;
  200. if (fputs(out_line, stdout) == EOF)
  201. halt("PERROR:  Error writing output.n");
  202. }
  203. } while (--argc > 0);
  204. return 0;
  205. }