uahelper.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:7k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: unANSIify
  3.  *
  4.  * Author: Mark Crispin
  5.  * Networks and Distributed Computing
  6.  * Computing & Communications
  7.  * University of Washington
  8.  * 4545 15th Ave NE
  9.  * Seattle, WA  98105-4527
  10.  * Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date: 1 June 1995
  13.  * Last Edited: 8 June 1996
  14.  *
  15.  * Copyright 1997 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made
  24.  * available "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35. /* This program is designed to make traditional C sources out of my source
  36.  * files which use ANSI syntax.  This program depends heavily upon knowledge
  37.  * of the way I write code, and is not a general purpose tool.  I hope that
  38.  * someday someone will provide a general purpose tool...
  39.  */
  40. #include <stdio.h>
  41. #define LINELENGTH 1000
  42. /* Find first non-whitespace
  43.  * Accepts: string
  44.  * Returns: 0 if no non-whitespace found, or pointer to non-whitespace
  45.  */
  46. char *fndnws (s)
  47.      char *s;
  48. {
  49.   while ((*s == ' ') || (*s == 't'))
  50.     if ((*s++ == 'n') || !*s) return (char *) 0;
  51.   return s;
  52. }
  53. /* Find first whitespace
  54.  * Accepts: string
  55.  * Returns: 0 if no whitespace found, or pointer to whitespace
  56.  */
  57. char *fndws (s)
  58.      char *s;
  59. {
  60.   while ((*s != ' ') && (*s != 't'))
  61.     if ((*s++ == 'n') || !*s) return (char *) 0;
  62.   return s;
  63. }
  64. /* Find end of commend
  65.  * Accepts: string
  66.  * Returns: -1 if end of comment found, else 0
  67.  */
  68. int fndcmt (s)
  69.      char *s;
  70. {
  71.   while (*s && (*s != 'n'))
  72.     if ((*s++ == '*') && (*s == '/')) return -1;
  73.   return 0;
  74. }
  75. /* Output a line
  76.  * Accepts: string
  77.  */
  78. void poot (s)
  79.      char *s;
  80. {
  81.   if (s) fputs (s,stdout);
  82. }
  83. /* Skip prefix
  84.  * Accepts: string
  85.  * Returns: updated string
  86.  */
  87. char *skipfx (s)
  88.      char *s;
  89. {
  90.   char c,*t = s,*tt;
  91. /* skip leading whitespace too */
  92.   while ((*s == ' ') || (*s == 't')) *s++;
  93.   if (s != t) {
  94.     c = *s; /* save character */
  95.     *s = ''; /* tie off prefix */
  96.     poot (t); /* output prefix */
  97.     *s = c; /* restore character */
  98.   }
  99. /* a typedef? */
  100.   if (((s[0] == 't') && (s[1] == 'y') && (s[2] == 'p') && (s[3] == 'e') &&
  101.        (s[4] == 'd') && (s[5] == 'e') && (s[6] == 'f')) &&
  102.       (t = fndws (s)) && (t = fndnws (t))) {
  103.     if ((t[0] == 'u') && (t[1] == 'n') && (t[2] == 's') && (t[3] == 'i') &&
  104. (t[4] == 'g') && (t[5] == 'n') && (t[6] == 'e') && (t[7] == 'd') &&
  105. (tt = fndws (t+7)) && (tt = fndnws (tt))) t = tt;
  106.     c = *t; /* save character */
  107.     *t = ''; /* tie off prefix */
  108.     poot (s); /* output prefix */
  109.     *t = c; /* restore character */
  110.     s = t; /* new string pointer */
  111.   }
  112. /* one of the known prefixes? */
  113.   else if ((((s[0] == 'u') && (s[1] == 'n') && (s[2] == 's') &&
  114.      (s[3] == 'i') && (s[4] == 'g') && (s[5] == 'n') &&
  115.      (s[6] == 'e') && (s[7] == 'd')) ||
  116.     ((s[0] == 's') && (s[1] == 't') && (s[2] == 'r') &&
  117.      (s[3] == 'u') && (s[4] == 'c') && (s[5] == 't')) ||
  118.     ((s[0] == 's') && (s[1] == 't') && (s[2] == 'a') &&
  119.      (s[3] == 't') && (s[4] == 'i') && (s[5] == 'c')) ||
  120.     ((s[0] == 'd') && (s[1] == 'o')) ||
  121.     ((s[0] == 'e') && (s[1] == 'l') && (s[2] == 's') &&
  122.      (s[3] == 'e'))) &&
  123.    (t = fndws (s)) && (t = fndnws (t))) {
  124.     c = *t; /* save character */
  125.     *t = ''; /* tie off prefix */
  126.     poot (s); /* output prefix */
  127.     *t = c; /* restore character */
  128.     s = t; /* new string pointer */
  129.   }
  130. /* may look like a proto, but isn't */
  131.   else if ((s[0] == 'r') && (s[1] == 'e') && (s[2] == 't') && (s[3] == 'u') &&
  132.    (s[4] == 'r') && (s[5] == 'n')) {
  133.     poot (s);
  134.     return 0;
  135.   }
  136.   return s;
  137. }
  138. /* UnANSI a line
  139.  * Accepts: string
  140.  */
  141. void unansi (s)
  142.      char *s;
  143. {
  144.   char c,*t = s,*u,*v;
  145.   while (t[1] && (t[1] != 'n')) t++;
  146.   switch (*t) {
  147.   case ',': /* continued on next line? */
  148. /* slurp remainder of line */
  149.     fgets (t + 1,LINELENGTH - (t + 1 - s),stdin);
  150.     unansi (s); /* try again */
  151.     break;
  152.   case ';': /* function prototype? */
  153. /* yes, tie it off */
  154.     *(fndws (fndnws (fndws (fndnws (s))))) = '';
  155.     printf ("%s ();n",s); /* and output non-ANSI form */
  156.     break;
  157.   case ')':
  158.     *t = ''; /* tie off args */
  159.     if (*(t = fndnws (fndws (fndnws (fndws (fndnws (s)))))) == '(') {
  160.       *t++ = ''; /* tie off */
  161.       while ((*t == ' ') || (*t == 't')) t++;
  162.       if ((t[0] == 'v') && (t[1] == 'o') && (t[2] == 'i') && (t[3] == 'd') &&
  163.   !t[4]) *t = ''; /* make void be same as null */
  164.       printf ("%s(",s); /* output start of function */
  165.       s = t;
  166.       while (*s) { /* for each argument */
  167. while ((*s == ' ') || (*s == 't')) s++;
  168. for (u = v = s; (*u && (*u != ',') && (*u != '[')); u++)
  169.   if ((*u == ' ') || (*u == 't')) v = u;
  170. c = *u; /* remember delimiter */
  171. *u = ''; /* tie off argument name */
  172. while (*++v == '*'); /* remove leading pointer indication */
  173. fputs (v,stdout); /* write variable name */
  174. *(s = u) = c; /* restore delimiter */
  175. while (*s && (*s != ',')) *s++;
  176. if (*s) fputc (*s++,stdout);
  177.       }
  178.       puts (")"); /* end of function */
  179.       while (*t) { /* for each argument */
  180. fputs ("     ",stdout);
  181. while ((*t == ' ') || (*t == 't')) t++;
  182. while (*t && (*t != ',')) fputc (*t++,stdout);
  183. puts (";");
  184. if (*t == ',') t++;
  185.       }
  186.     }
  187.     else printf ("%s)",s); /* say what?? */
  188.     break;
  189.   default: /* doesn't look like a function */
  190.     poot (s);
  191.   }
  192. }
  193. main ()
  194. {
  195.   char *s,*t,line[LINELENGTH];
  196.   int c;
  197.   while (s = fgets (line,LINELENGTH,stdin)) switch (line[0]) {
  198.   case '/': /* comment */
  199.     if ((s[1] != '*') || fndcmt (s+2)) poot (line);
  200.     else do poot (line);
  201.     while (!fndcmt (line) && (s = fgets (line,LINELENGTH,stdin)));
  202.     break;
  203.   case '{': /* open function */
  204.   case '}': /* close function */
  205.   case 'f': /* formfeed */
  206.   case 'n': /* newline */
  207.   case '#': /* preprocessor command */
  208.     poot (line);
  209.     break;
  210.   case 't': /* whitespace */
  211.   case ' ':
  212. /* look like function arg def in structure? */
  213.     if ((t = skipfx (line)) && (s = fndws (t)) && (s = fndnws (s)) &&
  214. (((*s == '(') && (s[1] == '*')) ||
  215.  ((*s == '*') && (s[1] == '(') && (s[2] == '*'))) &&
  216. (s = fndws (s)) && (s[-1] == ')') && (s = fndnws (s)) && (*s == '('))
  217.       unansi (t);
  218.     else poot (t);
  219.     break;
  220.   default: /* begins with anything else */
  221. /* look like function proto or def? */
  222.     if ((t = skipfx (line)) && (s = fndws (t)) && (s = fndnws (s)) &&
  223. (s = fndws (s)) && (s = fndnws (s)) && (*s == '('))
  224.       unansi (t);
  225.     else poot (t);
  226.     break;
  227.   }
  228. }