imapext-2007

diff tools/uahelper.c @ 0:ada5e610ab86

imap-2007e
author yuuji@gentei.org
date Mon, 14 Sep 2009 15:17:45 +0900
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/tools/uahelper.c	Mon Sep 14 15:17:45 2009 +0900
     1.3 @@ -0,0 +1,262 @@
     1.4 +/* ========================================================================
     1.5 + * Copyright 1988-2006 University of Washington
     1.6 + *
     1.7 + * Licensed under the Apache License, Version 2.0 (the "License");
     1.8 + * you may not use this file except in compliance with the License.
     1.9 + * You may obtain a copy of the License at
    1.10 + *
    1.11 + *     http://www.apache.org/licenses/LICENSE-2.0
    1.12 + *
    1.13 + * 
    1.14 + * ========================================================================
    1.15 + */
    1.16 +
    1.17 +/*
    1.18 + * Program:	unANSIify
    1.19 + *
    1.20 + * Author:	Mark Crispin
    1.21 + *		Networks and Distributed Computing
    1.22 + *		Computing & Communications
    1.23 + *		University of Washington
    1.24 + *		4545 15th Ave NE
    1.25 + *		Seattle, WA  98105-4527
    1.26 + *		Internet: MRC@CAC.Washington.EDU
    1.27 + *
    1.28 + * Date:	1 June 1995
    1.29 + * Last Edited:	30 August 2006
    1.30 + */
    1.31 +
    1.32 +
    1.33 +/* This program is designed to make traditional C sources out of my source
    1.34 + * files which use ANSI syntax.  This program depends heavily upon knowledge
    1.35 + * of the way I write code, and is not a general purpose tool.  I hope that
    1.36 + * someday someone will provide a general purpose tool...
    1.37 + */
    1.38 +
    1.39 +#include <stdio.h>
    1.40 +
    1.41 +#define LINELENGTH 1000
    1.42 +
    1.43 +
    1.44 +/* Find first non-whitespace
    1.45 + * Accepts: string
    1.46 + * Returns: 0 if no non-whitespace found, or pointer to non-whitespace
    1.47 + */
    1.48 +
    1.49 +char *fndnws (s)
    1.50 +     char *s;
    1.51 +{
    1.52 +  while ((*s == ' ') || (*s == '\t'))
    1.53 +    if ((*s++ == '\n') || !*s) return (char *) 0;
    1.54 +  return s;
    1.55 +}
    1.56 +
    1.57 +
    1.58 +/* Find first whitespace
    1.59 + * Accepts: string
    1.60 + * Returns: 0 if no whitespace found, or pointer to whitespace
    1.61 + */
    1.62 +
    1.63 +char *fndws (s)
    1.64 +     char *s;
    1.65 +{
    1.66 +  while ((*s != ' ') && (*s != '\t'))
    1.67 +    if ((*s++ == '\n') || !*s) return (char *) 0;
    1.68 +  return s;
    1.69 +}
    1.70 +
    1.71 +
    1.72 +/* Find end of commend
    1.73 + * Accepts: string
    1.74 + * Returns: -1 if end of comment found, else 0
    1.75 + */
    1.76 +
    1.77 +int fndcmt (s)
    1.78 +     char *s;
    1.79 +{
    1.80 +  while (*s && (*s != '\n'))
    1.81 +    if ((*s++ == '*') && (*s == '/')) return -1;
    1.82 +  return 0;
    1.83 +}
    1.84 +
    1.85 +/* Output a line
    1.86 + * Accepts: string
    1.87 + */
    1.88 +
    1.89 +void poot (s)
    1.90 +     char *s;
    1.91 +{
    1.92 +  if (s) fputs (s,stdout);
    1.93 +}
    1.94 +
    1.95 +
    1.96 +/* Skip prefix
    1.97 + * Accepts: string
    1.98 + * Returns: updated string
    1.99 + */
   1.100 +
   1.101 +char *skipfx (s)
   1.102 +     char *s;
   1.103 +{
   1.104 +  char c,*t = s,*tt;
   1.105 +				/* skip leading whitespace too */
   1.106 +  while ((*s == ' ') || (*s == '\t')) *s++;
   1.107 +  if (s != t) {
   1.108 +    c = *s;			/* save character */
   1.109 +    *s = '\0';			/* tie off prefix */
   1.110 +    poot (t);			/* output prefix */
   1.111 +    *s = c;			/* restore character */
   1.112 +  }
   1.113 +				/* a typedef? */
   1.114 +  if (((s[0] == 't') && (s[1] == 'y') && (s[2] == 'p') && (s[3] == 'e') &&
   1.115 +       (s[4] == 'd') && (s[5] == 'e') && (s[6] == 'f')) &&
   1.116 +      (t = fndws (s)) && (t = fndnws (t))) {
   1.117 +    if ((t[0] == 'u') && (t[1] == 'n') && (t[2] == 's') && (t[3] == 'i') &&
   1.118 +	(t[4] == 'g') && (t[5] == 'n') && (t[6] == 'e') && (t[7] == 'd') &&
   1.119 +	(tt = fndws (t+7)) && (tt = fndnws (tt))) t = tt;
   1.120 +    c = *t;			/* save character */
   1.121 +    *t = '\0';			/* tie off prefix */
   1.122 +    poot (s);			/* output prefix */
   1.123 +    *t = c;			/* restore character */
   1.124 +    s = t;			/* new string pointer */
   1.125 +  }
   1.126 +				/* static with known prefix */
   1.127 +  else if (((s[0] == 's') && (s[1] == 't') && (s[2] == 'a') &&
   1.128 +	    (s[3] == 't') && (s[4] == 'i') && (s[5] == 'c') &&
   1.129 +	    (s[6] == ' ')) &&
   1.130 +	   (((s[7] == 'u') && (s[8] == 'n') && (s[9] == 's') &&
   1.131 +	     (s[10] == 'i') && (s[11] == 'g') && (s[12] == 'n') &&
   1.132 +	     (s[13] == 'e') && (s[14] == 'd')) ||
   1.133 +	    ((s[7] == 's') && (s[8] == 't') && (s[9] == 'r') &&
   1.134 +	     (s[10] == 'u') && (s[11] == 'c') && (s[12] == 't')) ||
   1.135 +	    ((s[7] == 'd') && (s[8] == 'o')) ||
   1.136 +	    ((s[9] == 'e') && (s[10] == 'l') && (s[11] == 's') &&
   1.137 +	     (s[12] == 'e'))) &&
   1.138 +	   (t = fndws (s)) && (t = fndnws (t)) &&
   1.139 +	   (t = fndws (t)) && (t = fndnws (t))) {
   1.140 +    c = *t;			/* save character */
   1.141 +    *t = '\0';			/* tie off prefix */
   1.142 +    poot (s);			/* output prefix */
   1.143 +    *t = c;			/* restore character */
   1.144 +    s = t;			/* new string pointer */
   1.145 +  }
   1.146 +				/* one of the known prefixes? */
   1.147 +  else if ((((s[0] == 'u') && (s[1] == 'n') && (s[2] == 's') &&
   1.148 +	     (s[3] == 'i') && (s[4] == 'g') && (s[5] == 'n') &&
   1.149 +	     (s[6] == 'e') && (s[7] == 'd')) ||
   1.150 +	    ((s[0] == 's') && (s[1] == 't') && (s[2] == 'r') &&
   1.151 +	     (s[3] == 'u') && (s[4] == 'c') && (s[5] == 't')) ||
   1.152 +	    ((s[0] == 's') && (s[1] == 't') && (s[2] == 'a') &&
   1.153 +	     (s[3] == 't') && (s[4] == 'i') && (s[5] == 'c')) ||
   1.154 +	    ((s[0] == 'd') && (s[1] == 'o')) ||
   1.155 +	    ((s[0] == 'e') && (s[1] == 'l') && (s[2] == 's') &&
   1.156 +	     (s[3] == 'e'))) &&
   1.157 +	   (t = fndws (s)) && (t = fndnws (t))) {
   1.158 +    c = *t;			/* save character */
   1.159 +    *t = '\0';			/* tie off prefix */
   1.160 +    poot (s);			/* output prefix */
   1.161 +    *t = c;			/* restore character */
   1.162 +    s = t;			/* new string pointer */
   1.163 +  }
   1.164 +				/* may look like a proto, but isn't */
   1.165 +  else if ((s[0] == 'r') && (s[1] == 'e') && (s[2] == 't') && (s[3] == 'u') &&
   1.166 +	   (s[4] == 'r') && (s[5] == 'n')) {
   1.167 +    poot (s);
   1.168 +    return 0;
   1.169 +  }
   1.170 +  return s;
   1.171 +}
   1.172 +
   1.173 +/* UnANSI a line
   1.174 + * Accepts: string
   1.175 + */
   1.176 +
   1.177 +void unansi (s)
   1.178 +     char *s;
   1.179 +{
   1.180 +  char c,*t = s,*u,*v;
   1.181 +  while (t[1] && (t[1] != '\n')) t++;
   1.182 +  switch (*t) {
   1.183 +  case ',':			/* continued on next line? */
   1.184 +				/* slurp remainder of line */
   1.185 +    fgets (t + 1,LINELENGTH - (t + 1 - s),stdin);
   1.186 +    unansi (s);			/* try again */
   1.187 +    break;
   1.188 +  case ';':			/* function prototype? */
   1.189 +				/* yes, tie it off */
   1.190 +    *(fndws (fndnws (fndws (fndnws (s))))) = '\0';
   1.191 +    printf ("%s ();\n",s);	/* and output non-ANSI form */
   1.192 +    break;
   1.193 +  case ')':
   1.194 +    *t = '\0';			/* tie off args */
   1.195 +    if (*(t = fndnws (fndws (fndnws (fndws (fndnws (s)))))) == '(') {
   1.196 +      *t++ = '\0';		/* tie off */
   1.197 +      while ((*t == ' ') || (*t == '\t')) t++;
   1.198 +      if ((t[0] == 'v') && (t[1] == 'o') && (t[2] == 'i') && (t[3] == 'd') &&
   1.199 +	  !t[4]) *t = '\0';	/* make void be same as null */
   1.200 +      printf ("%s(",s);		/* output start of function */
   1.201 +      s = t;
   1.202 +      while (*s) {		/* for each argument */
   1.203 +	while ((*s == ' ') || (*s == '\t')) s++;
   1.204 +	for (u = v = s; (*u && (*u != ',') && (*u != '[')); u++)
   1.205 +	  if ((*u == ' ') || (*u == '\t')) v = u;
   1.206 +	c = *u;			/* remember delimiter */
   1.207 +	*u = '\0';		/* tie off argument name */
   1.208 +	while (*++v == '*');	/* remove leading pointer indication */
   1.209 +	fputs (v,stdout);	/* write variable name */
   1.210 +	*(s = u) = c;		/* restore delimiter */
   1.211 +	while (*s && (*s != ',')) *s++;
   1.212 +	if (*s) fputc (*s++,stdout);
   1.213 +      }
   1.214 +      puts (")");		/* end of function */
   1.215 +      while (*t) {		/* for each argument */
   1.216 +	fputs ("     ",stdout);
   1.217 +	while ((*t == ' ') || (*t == '\t')) t++;
   1.218 +	while (*t && (*t != ',')) fputc (*t++,stdout);
   1.219 +	puts (";");
   1.220 +	if (*t == ',') t++;
   1.221 +      }
   1.222 +    }
   1.223 +    else printf ("%s)",s);	/* say what?? */
   1.224 +    break;
   1.225 +  default:			/* doesn't look like a function */
   1.226 +    poot (s);
   1.227 +  }
   1.228 +}
   1.229 +
   1.230 +main ()
   1.231 +{
   1.232 +  char *s,*t,line[LINELENGTH];
   1.233 +  int c;
   1.234 +  while (s = fgets (line,LINELENGTH,stdin)) switch (line[0]) {
   1.235 +  case '/':			/* comment */
   1.236 +    if ((s[1] != '*') || fndcmt (s+2)) poot (line);
   1.237 +    else do poot (line);
   1.238 +    while (!fndcmt (line) && (s = fgets (line,LINELENGTH,stdin)));
   1.239 +    break;
   1.240 +  case '{':			/* open function */
   1.241 +  case '}':			/* close function */
   1.242 +  case '\f':			/* formfeed */
   1.243 +  case '\n':			/* newline */
   1.244 +  case '#':			/* preprocessor command */
   1.245 +    poot (line);
   1.246 +    break;
   1.247 +  case '\t':			/* whitespace */
   1.248 +  case ' ':
   1.249 +				/* look like function arg def in structure? */
   1.250 +    if ((t = skipfx (line)) && (s = fndws (t)) && (s = fndnws (s)) &&
   1.251 +	(((*s == '(') && (s[1] == '*')) ||
   1.252 +	 ((*s == '*') && (s[1] == '(') && (s[2] == '*'))) &&
   1.253 +	(s = fndws (s)) && (s[-1] == ')') && (s = fndnws (s)) && (*s == '('))
   1.254 +      unansi (t);
   1.255 +    else poot (t);
   1.256 +    break;
   1.257 +  default:			/* begins with anything else */
   1.258 +				/* look like function proto or def? */
   1.259 +    if ((t = skipfx (line)) && (s = fndws (t)) && (s = fndnws (s)) &&
   1.260 +	(s = fndws (s)) && (s = fndnws (s)) && (*s == '('))
   1.261 +      unansi (t);
   1.262 +    else poot (t);
   1.263 +    break;
   1.264 +  }
   1.265 +}

UW-IMAP'd extensions by yuuji