diff options
| author | Stefan Monnier | 2010-12-10 19:13:08 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2010-12-10 19:13:08 -0500 |
| commit | 2c302df3a13236bfbf8ea1b771d13618fcda8d71 (patch) | |
| tree | f26dc9f22861dc37610de319d05255de058c221b /lib-src/sorted-doc.c | |
| parent | 0c747cb143fa227e78f350ac353d703f489209df (diff) | |
| parent | 175069efeb080517afefdd44a06f7a779ea8c25c (diff) | |
| download | emacs-2c302df3a13236bfbf8ea1b771d13618fcda8d71.tar.gz emacs-2c302df3a13236bfbf8ea1b771d13618fcda8d71.zip | |
Merge from trunk
Diffstat (limited to 'lib-src/sorted-doc.c')
| -rw-r--r-- | lib-src/sorted-doc.c | 296 |
1 files changed, 0 insertions, 296 deletions
diff --git a/lib-src/sorted-doc.c b/lib-src/sorted-doc.c deleted file mode 100644 index 4fe830e4013..00000000000 --- a/lib-src/sorted-doc.c +++ /dev/null | |||
| @@ -1,296 +0,0 @@ | |||
| 1 | /* Give this program DOC-mm.nn.oo as standard input and it outputs to | ||
| 2 | standard output a file of texinfo input containing the doc strings. | ||
| 3 | |||
| 4 | Copyright (C) 1989, 1992, 1994, 1996, 1999, 2000, 2001, 2002, 2003, | ||
| 5 | 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. | ||
| 6 | |||
| 7 | This file is part of GNU Emacs. | ||
| 8 | |||
| 9 | GNU Emacs is free software: you can redistribute it and/or modify | ||
| 10 | it under the terms of the GNU General Public License as published by | ||
| 11 | the Free Software Foundation, either version 3 of the License, or | ||
| 12 | (at your option) any later version. | ||
| 13 | |||
| 14 | GNU Emacs is distributed in the hope that it will be useful, | ||
| 15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | GNU General Public License for more details. | ||
| 18 | |||
| 19 | You should have received a copy of the GNU General Public License | ||
| 20 | along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | ||
| 21 | |||
| 22 | |||
| 23 | /* This version sorts the output by function name. */ | ||
| 24 | |||
| 25 | #ifdef HAVE_CONFIG_H | ||
| 26 | #include <config.h> | ||
| 27 | #endif | ||
| 28 | |||
| 29 | #include <stdio.h> | ||
| 30 | #include <ctype.h> | ||
| 31 | #ifdef DOS_NT | ||
| 32 | #include <fcntl.h> /* for O_BINARY */ | ||
| 33 | #include <io.h> /* for setmode */ | ||
| 34 | #endif | ||
| 35 | #ifndef HAVE_STDLIB_H /* config.h includes stdlib. */ | ||
| 36 | #ifndef WINDOWSNT /* src/s/ms-w32.h includes stdlib.h */ | ||
| 37 | extern char *malloc (); | ||
| 38 | #endif | ||
| 39 | #endif | ||
| 40 | |||
| 41 | #define NUL '\0' | ||
| 42 | #define MARKER '\037' | ||
| 43 | |||
| 44 | #define DEBUG 0 | ||
| 45 | |||
| 46 | typedef struct line LINE; | ||
| 47 | |||
| 48 | struct line | ||
| 49 | { | ||
| 50 | LINE *next; /* ptr to next or NULL */ | ||
| 51 | char *line; /* text of the line */ | ||
| 52 | }; | ||
| 53 | |||
| 54 | typedef struct docstr DOCSTR; | ||
| 55 | |||
| 56 | struct docstr /* Allocated thing for an entry. */ | ||
| 57 | { | ||
| 58 | DOCSTR *next; /* next in the chain */ | ||
| 59 | char *name; /* name of the function or var */ | ||
| 60 | LINE *first; /* first line of doc text. */ | ||
| 61 | char type; /* 'F' for function, 'V' for variable */ | ||
| 62 | }; | ||
| 63 | |||
| 64 | |||
| 65 | /* Print error message. `s1' is printf control string, `s2' is arg for it. */ | ||
| 66 | |||
| 67 | void | ||
| 68 | error (const char *s1, const char *s2) | ||
| 69 | { | ||
| 70 | fprintf (stderr, "sorted-doc: "); | ||
| 71 | fprintf (stderr, s1, s2); | ||
| 72 | fprintf (stderr, "\n"); | ||
| 73 | } | ||
| 74 | |||
| 75 | /* Print error message and exit. */ | ||
| 76 | |||
| 77 | void | ||
| 78 | fatal (const char *s1, const char *s2) | ||
| 79 | { | ||
| 80 | error (s1, s2); | ||
| 81 | exit (EXIT_FAILURE); | ||
| 82 | } | ||
| 83 | |||
| 84 | /* Like malloc but get fatal error if memory is exhausted. */ | ||
| 85 | |||
| 86 | char * | ||
| 87 | xmalloc (int size) | ||
| 88 | { | ||
| 89 | char *result = malloc ((unsigned)size); | ||
| 90 | if (result == NULL) | ||
| 91 | fatal ("%s", "virtual memory exhausted"); | ||
| 92 | return result; | ||
| 93 | } | ||
| 94 | |||
| 95 | char * | ||
| 96 | xstrdup (const char *str) | ||
| 97 | { | ||
| 98 | char *buf = xmalloc (strlen (str) + 1); | ||
| 99 | (void) strcpy (buf, str); | ||
| 100 | return (buf); | ||
| 101 | } | ||
| 102 | |||
| 103 | /* Comparison function for qsort to call. */ | ||
| 104 | |||
| 105 | int | ||
| 106 | cmpdoc (const void *va, const void *vb) | ||
| 107 | { | ||
| 108 | DOCSTR *const *a = va; | ||
| 109 | DOCSTR *const *b = vb; | ||
| 110 | register int val = strcmp ((*a)->name, (*b)->name); | ||
| 111 | if (val) return val; | ||
| 112 | return (*a)->type - (*b)->type; | ||
| 113 | } | ||
| 114 | |||
| 115 | enum state | ||
| 116 | { | ||
| 117 | WAITING, BEG_NAME, NAME_GET, BEG_DESC, DESC_GET | ||
| 118 | }; | ||
| 119 | |||
| 120 | const char *states[] = | ||
| 121 | { | ||
| 122 | "WAITING", "BEG_NAME", "NAME_GET", "BEG_DESC", "DESC_GET" | ||
| 123 | }; | ||
| 124 | |||
| 125 | int | ||
| 126 | main (void) | ||
| 127 | { | ||
| 128 | register DOCSTR *dp = NULL; /* allocated DOCSTR */ | ||
| 129 | register LINE *lp = NULL; /* allocated line */ | ||
| 130 | register char *bp; /* ptr inside line buffer */ | ||
| 131 | register enum state state = WAITING; /* state at start */ | ||
| 132 | int cnt = 0; /* number of DOCSTRs read */ | ||
| 133 | |||
| 134 | DOCSTR *docs = NULL; /* chain of allocated DOCSTRS */ | ||
| 135 | char buf[512]; /* line buffer */ | ||
| 136 | |||
| 137 | #ifdef DOS_NT | ||
| 138 | /* DOC is a binary file. */ | ||
| 139 | if (!isatty (fileno (stdin))) | ||
| 140 | setmode (fileno (stdin), O_BINARY); | ||
| 141 | #endif | ||
| 142 | |||
| 143 | bp = buf; | ||
| 144 | |||
| 145 | while (1) /* process one char at a time */ | ||
| 146 | { | ||
| 147 | /* this char from the DOCSTR file */ | ||
| 148 | register int ch = getchar (); | ||
| 149 | |||
| 150 | /* Beginnings */ | ||
| 151 | |||
| 152 | if (state == WAITING) | ||
| 153 | { | ||
| 154 | if (ch == MARKER) | ||
| 155 | state = BEG_NAME; | ||
| 156 | } | ||
| 157 | else if (state == BEG_NAME) | ||
| 158 | { | ||
| 159 | cnt++; | ||
| 160 | if (dp == NULL) /* first dp allocated */ | ||
| 161 | { | ||
| 162 | docs = dp = (DOCSTR*) xmalloc (sizeof (DOCSTR)); | ||
| 163 | } | ||
| 164 | else /* all the rest */ | ||
| 165 | { | ||
| 166 | dp->next = (DOCSTR*) xmalloc (sizeof (DOCSTR)); | ||
| 167 | dp = dp->next; | ||
| 168 | } | ||
| 169 | lp = NULL; | ||
| 170 | dp->next = NULL; | ||
| 171 | bp = buf; | ||
| 172 | state = NAME_GET; | ||
| 173 | /* Record whether function or variable. */ | ||
| 174 | dp->type = ch; | ||
| 175 | ch = getchar (); | ||
| 176 | } | ||
| 177 | else if (state == BEG_DESC) | ||
| 178 | { | ||
| 179 | if (lp == NULL) /* first line for dp */ | ||
| 180 | { | ||
| 181 | dp->first = lp = (LINE*)xmalloc (sizeof (LINE)); | ||
| 182 | } | ||
| 183 | else /* continuing lines */ | ||
| 184 | { | ||
| 185 | lp->next = (LINE*)xmalloc (sizeof (LINE)); | ||
| 186 | lp = lp->next; | ||
| 187 | } | ||
| 188 | lp->next = NULL; | ||
| 189 | bp = buf; | ||
| 190 | state = DESC_GET; | ||
| 191 | } | ||
| 192 | |||
| 193 | /* process gets */ | ||
| 194 | |||
| 195 | if (state == NAME_GET || state == DESC_GET) | ||
| 196 | { | ||
| 197 | if (ch != MARKER && ch != '\n' && ch != EOF) | ||
| 198 | { | ||
| 199 | *bp++ = ch; | ||
| 200 | } | ||
| 201 | else /* saving and changing state */ | ||
| 202 | { | ||
| 203 | *bp = NUL; | ||
| 204 | bp = xstrdup (buf); | ||
| 205 | |||
| 206 | if (state == NAME_GET) | ||
| 207 | dp->name = bp; | ||
| 208 | else | ||
| 209 | lp->line = bp; | ||
| 210 | |||
| 211 | bp = buf; | ||
| 212 | state = (ch == MARKER) ? BEG_NAME : BEG_DESC; | ||
| 213 | } | ||
| 214 | } /* NAME_GET || DESC_GET */ | ||
| 215 | if (ch == EOF) | ||
| 216 | break; | ||
| 217 | } | ||
| 218 | |||
| 219 | { | ||
| 220 | DOCSTR **array; | ||
| 221 | register int i; /* counter */ | ||
| 222 | |||
| 223 | /* build array of ptrs to DOCSTRs */ | ||
| 224 | |||
| 225 | array = (DOCSTR**)xmalloc (cnt * sizeof (*array)); | ||
| 226 | for (dp = docs, i = 0; dp != NULL ; dp = dp->next) | ||
| 227 | array[i++] = dp; | ||
| 228 | |||
| 229 | /* sort the array by name; within each name, by type */ | ||
| 230 | |||
| 231 | qsort ((char*)array, cnt, sizeof (DOCSTR*), cmpdoc); | ||
| 232 | |||
| 233 | /* write the output header */ | ||
| 234 | |||
| 235 | printf ("\\input texinfo @c -*-texinfo-*-\n"); | ||
| 236 | printf ("@setfilename ../info/summary\n"); | ||
| 237 | printf ("@settitle Command Summary for GNU Emacs\n"); | ||
| 238 | printf ("@finalout\n"); | ||
| 239 | printf ("@unnumbered Command Summary for GNU Emacs\n"); | ||
| 240 | printf ("@table @asis\n"); | ||
| 241 | printf ("\n"); | ||
| 242 | printf ("@iftex\n"); | ||
| 243 | printf ("@global@let@ITEM@item\n"); | ||
| 244 | printf ("@def@item{@filbreak@vskip5pt@ITEM}\n"); | ||
| 245 | printf ("@font@tensy cmsy10 scaled @magstephalf\n"); | ||
| 246 | printf ("@font@teni cmmi10 scaled @magstephalf\n"); | ||
| 247 | printf ("@def\\{{@tensy@char110}}\n"); /* this backslash goes with cmr10 */ | ||
| 248 | printf ("@def|{{@tensy@char106}}\n"); | ||
| 249 | printf ("@def@{{{@tensy@char102}}\n"); | ||
| 250 | printf ("@def@}{{@tensy@char103}}\n"); | ||
| 251 | printf ("@def<{{@teni@char62}}\n"); | ||
| 252 | printf ("@def>{{@teni@char60}}\n"); | ||
| 253 | printf ("@chardef@@64\n"); | ||
| 254 | printf ("@catcode43=12\n"); | ||
| 255 | printf ("@tableindent-0.2in\n"); | ||
| 256 | printf ("@end iftex\n"); | ||
| 257 | |||
| 258 | /* print each function from the array */ | ||
| 259 | |||
| 260 | for (i = 0; i < cnt; i++) | ||
| 261 | { | ||
| 262 | printf ("\n@item %s @code{%s}\n@display\n", | ||
| 263 | array[i]->type == 'F' ? "Function" : "Variable", | ||
| 264 | array[i]->name); | ||
| 265 | |||
| 266 | for (lp = array[i]->first; lp != NULL ; lp = lp->next) | ||
| 267 | { | ||
| 268 | for (bp = lp->line; *bp; bp++) | ||
| 269 | { | ||
| 270 | /* the characters "@{}" need special treatment */ | ||
| 271 | if (*bp == '@' || *bp == '{' || *bp == '}') | ||
| 272 | { | ||
| 273 | putchar('@'); | ||
| 274 | } | ||
| 275 | putchar(*bp); | ||
| 276 | } | ||
| 277 | putchar ('\n'); | ||
| 278 | } | ||
| 279 | printf("@end display\n"); | ||
| 280 | /* Try to avoid a save size overflow in the TeX output | ||
| 281 | routine. */ | ||
| 282 | if (i%100 == 0 && i > 0 && i != cnt) | ||
| 283 | printf("\n@end table\n@table @asis\n"); | ||
| 284 | } | ||
| 285 | |||
| 286 | printf ("@end table\n"); | ||
| 287 | printf ("@bye\n"); | ||
| 288 | } | ||
| 289 | |||
| 290 | return EXIT_SUCCESS; | ||
| 291 | } | ||
| 292 | |||
| 293 | /* arch-tag: ce28f204-1e70-4b34-8210-3d54a5662071 | ||
| 294 | (do not change this comment) */ | ||
| 295 | |||
| 296 | /* sorted-doc.c ends here */ | ||