Annotation of 43BSDReno/contrib/emacs-18.55/etc/sorted-doc.c, revision 1.1

1.1     ! root        1: /* Give this program DOCSTR.mm.nn as standard input
        !             2:    and it outputs to standard output
        !             3:    a file of texinfo input containing the doc strings.
        !             4:    
        !             5:    This version sorts the output by function name.
        !             6:    */
        !             7: 
        !             8: #include <stdio.h>
        !             9: #include <ctype.h>
        !            10: 
        !            11: extern char *malloc ();
        !            12: char *xmalloc ();
        !            13: 
        !            14: #define NUL    '\0'
        !            15: #define MARKER '\037'
        !            16: 
        !            17: #define DEBUG 0
        !            18: 
        !            19: typedef struct line LINE;
        !            20: 
        !            21: struct line
        !            22: {
        !            23:   LINE *next;                  /* ptr to next or NULL */
        !            24:   char *line;                  /* text of the line */
        !            25: };
        !            26: 
        !            27: typedef struct docstr DOCSTR;
        !            28: 
        !            29: struct docstr                  /* Allocated thing for an entry. */
        !            30: {
        !            31:   DOCSTR *next;                        /* next in the chain */
        !            32:   char *name;                  /* name of the function or var */
        !            33:   LINE *first;                 /* first line of doc text. */
        !            34:   char type;                   /* 'F' for function, 'V' for variable */
        !            35: };
        !            36: 
        !            37: 
        !            38: /* Print error message and exit.  */
        !            39: 
        !            40: fatal (s1, s2)
        !            41:      char *s1, *s2;
        !            42: {
        !            43:   error (s1, s2);
        !            44:   exit (1);
        !            45: }
        !            46: 
        !            47: /* Print error message.  `s1' is printf control string, `s2' is arg for it. */
        !            48: 
        !            49: error (s1, s2)
        !            50:      char *s1, *s2;
        !            51: {
        !            52:   fprintf (stderr, "sorted-doc: ");
        !            53:   fprintf (stderr, s1, s2);
        !            54:   fprintf (stderr, "\n");
        !            55: }
        !            56: 
        !            57: /* Like malloc but get fatal error if memory is exhausted.  */
        !            58: 
        !            59: char *
        !            60: xmalloc (size)
        !            61:      int size;
        !            62: {
        !            63:   char *result = malloc ((unsigned)size);
        !            64:   if (result == NULL)
        !            65:     fatal ("%s", "virtual memory exhausted");
        !            66:   return result;
        !            67: }
        !            68: 
        !            69: char *
        !            70: strsav (str)
        !            71:      char * str;
        !            72: {
        !            73:   char *buf = xmalloc (strlen (str) + 1);
        !            74:   (void) strcpy (buf, str);
        !            75:   return (buf);
        !            76: }
        !            77: 
        !            78: /* Comparison function for qsort to call.  */
        !            79: 
        !            80: int
        !            81: cmpdoc (a, b)
        !            82:      DOCSTR **a;
        !            83:      DOCSTR **b;
        !            84: {
        !            85:   register int val = strcmp ((*a)->name, (*b)->name);
        !            86:   if (val) return val;
        !            87:   return (*a)->type - (*b)->type;
        !            88: }
        !            89: 
        !            90: 
        !            91: enum state
        !            92: {
        !            93:   WAITING, BEG_NAME, NAME_GET, BEG_DESC, DESC_GET
        !            94: };
        !            95: 
        !            96: char *states[] =
        !            97: {
        !            98:   "WAITING", "BEG_NAME", "NAME_GET", "BEG_DESC", "DESC_GET"
        !            99: };
        !           100:     
        !           101: main ()
        !           102: {
        !           103:   register DOCSTR *dp = NULL;  /* allocated DOCSTR */
        !           104:   register LINE *lp = NULL;    /* allocated line */
        !           105:   register char *bp;           /* ptr inside line buffer */
        !           106:   int notfirst = 0;            /* set after read something */
        !           107:   register enum state state = WAITING; /* state at start */
        !           108:   int cnt = 0;                 /* number of DOCSTRs read */
        !           109: 
        !           110:   DOCSTR *docs;                        /* chain of allocated DOCSTRS */
        !           111:   char buf[512];               /* line buffer */
        !           112:     
        !           113:   while (1)                    /* process one char at a time */
        !           114:     {
        !           115:       /* this char from the DOCSTR file */
        !           116:       register int ch = getchar ();
        !           117: 
        !           118:       /* Beginnings */
        !           119: 
        !           120:       if (state == WAITING)
        !           121:        {
        !           122:          if (ch == MARKER)
        !           123:            state = BEG_NAME;
        !           124:        }
        !           125:       else if (state == BEG_NAME)
        !           126:        {
        !           127:          cnt++;
        !           128:          if (dp == NULL)       /* first dp allocated */
        !           129:            {
        !           130:              docs = dp = (DOCSTR*) xmalloc (sizeof (DOCSTR));
        !           131:            }
        !           132:          else                  /* all the rest */
        !           133:            {
        !           134:              dp->next = (DOCSTR*) xmalloc (sizeof (DOCSTR));
        !           135:              dp = dp->next;
        !           136:            }
        !           137:          lp = NULL;
        !           138:          dp->next = NULL;
        !           139:          bp = buf;
        !           140:          state = NAME_GET;
        !           141:          /* Record whether function or variable.  */
        !           142:          dp->type = ch;
        !           143:          ch = getchar ();
        !           144:        }
        !           145:       else if (state == BEG_DESC)
        !           146:        {
        !           147:          if (lp == NULL)       /* first line for dp */
        !           148:            {
        !           149:              dp->first = lp = (LINE*)xmalloc (sizeof (LINE));
        !           150:            }
        !           151:          else                  /* continuing lines */
        !           152:            {
        !           153:              lp->next = (LINE*)xmalloc (sizeof (LINE));
        !           154:              lp = lp->next;
        !           155:            }
        !           156:          lp->next = NULL;
        !           157:          bp = buf;
        !           158:          state = DESC_GET;
        !           159:        }
        !           160:        
        !           161:       /* process gets */
        !           162: 
        !           163:       if (state == NAME_GET || state == DESC_GET)
        !           164:        {
        !           165:          if (ch != MARKER && ch != '\n' && ch != EOF)
        !           166:            {
        !           167:              *bp++ = ch;
        !           168:            }
        !           169:          else                  /* saving and changing state */
        !           170:            {
        !           171:              *bp = NUL;
        !           172:              bp = strsav (buf);
        !           173: 
        !           174:              if (state == NAME_GET)
        !           175:                dp->name = bp;
        !           176:              else
        !           177:                lp->line = bp;
        !           178: 
        !           179:              bp = buf;
        !           180:              state =  (ch == MARKER) ? BEG_NAME : BEG_DESC;
        !           181:            }
        !           182:        }                       /* NAME_GET || DESC_GET */
        !           183:       if (ch == EOF)
        !           184:        break;
        !           185:     }
        !           186: 
        !           187:   {
        !           188:     DOCSTR **array;
        !           189:     register int i;            /* counter */
        !           190: 
        !           191:     /* build array of ptrs to DOCSTRs */
        !           192: 
        !           193:     array = (DOCSTR**)xmalloc (cnt * sizeof (*array));
        !           194:     for (dp = docs, i = 0; dp != NULL ; dp = dp->next)
        !           195:       array[i++] = dp;
        !           196: 
        !           197:     /* sort the array by name; within each name, by type */
        !           198: 
        !           199:     qsort ((char*)array, cnt, sizeof (DOCSTR*), cmpdoc);
        !           200: 
        !           201:     /* write the output header */
        !           202: 
        !           203:     printf ("\\input texinfo  @c -*-texinfo-*-\n");
        !           204:     printf ("@setfilename ../info/summary\n");
        !           205:     printf ("@settitle Command Summary for GNU Emacs\n");
        !           206:     printf ("@unnumbered Command Summary for GNU Emacs\n");
        !           207:     printf ("@table @asis\n");
        !           208: 
        !           209:     /* print each function from the array */
        !           210: 
        !           211:     for (i = 0; i < cnt; i++)
        !           212:       {
        !           213:        printf ("\n@item %s @code{%s}\n@display\n",
        !           214:                array[i]->type == 'F' ? "Function" : "Variable",
        !           215:                array[i]->name);
        !           216: 
        !           217:        for (lp = array[i]->first; lp != NULL ; lp = lp->next)
        !           218:          {
        !           219:            for (bp = lp->line; *bp; bp++)
        !           220:              {
        !           221:                /* the characters "@{}" need special treatment */
        !           222:                if (*bp == '@' || *bp == '{' || *bp == '}')
        !           223:                  {
        !           224:                    putchar('@');
        !           225:                  }
        !           226:                putchar(*bp);
        !           227:              }
        !           228:            putchar ('\n');
        !           229:          }
        !           230:        printf("@end display\n");
        !           231:       }
        !           232: 
        !           233:     printf ("@end table\n");
        !           234:     printf ("@bye\n");
        !           235:   }
        !           236: 
        !           237:   return 0;
        !           238: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.