Mercurial > emacs
view lib-src/sorted-doc.c @ 72873:b42e98d06749
* allout.el (allout-regexp, allout-line-boundary-regexp)
(allout-bob-regexp): Correct grouping and boundaries to fix
backwards traversal.
(allout-depth-specific-regexp, allout-depth-one-regexp): New
versions that exploit \\{M\\} regexp syntax, to avoid geometric or
worse time in allout-ascend.
(allout-doublecheck-at-and-shallower): Identify depth threshold
below which topics are checked for and disqualified by containment
discontinuities.
(allout-hotspot-key-handler): Correctly handle multiple-key
strokes. Remove some unused variables.
(allout-mode-leaders): Clarify that mode-specific comment-start
will be used
(set-allout-regexp): Correctly regexp-quote allout regexps to
properly accept alternative header-leads and primary bullets with
regexp-specific characters (eg, C "/*", mathematica "(*").
Include new regular expressions among those configured.
(allout-infer-header-lead-and-primary-bullet): Rename
allout-infer-header-lead.
(allout-recent-depth): Manifest as a variable as well as a function.
(allout-prefix-data): Simplify into an inline instead of a macro,
assuming current match data rather than being explicitly passed it.
Establish allout-recent-depth value as well as
allout-recent-prefix-beginning and allout-recent-prefix-end.
(allout-aberrant-container-p): True when an item's immediate
offspring discontinuously contained. Useful for disqualifying
unintended topic prefixes, likely at low depths.
(allout-goto-prefix-doublechecked): Elaborated version of
allout-goto-prefix which disqualifies aberrant pseudo-items.
(allout-end-of-prefix, allout-pre-next-prefix)
(allout-end-of-subtree): Disqualify aberrant containers.
(allout-beginning-of-current-entry): Position at start of buffer
when in container (depth 0) entry.
(nullify-allout-prefix-data): Invalidate allout-recent-* prefix data.
(allout-current-bullet): Strip text properties.
(allout-get-prefix-bullet): Use right match groups.
(allout-beginning-of-line, allout-next-heading): Disqualify
aberrant containers.
(allout-previous-heading): Disqualify aberrant containers.
(allout-get-invisibility-overlay): Increment so progress is made
when the first overlay is not the sought one.
(allout-end-of-prefix): Disqualify aberrant containers.
(allout-end-of-line): Cycle something like allout-beginning-of-line.
(allout-mode): Make allout-old-style-prefixes (ie, enabling use with
outline.el outlines) functional again. Change the primary bullet
along with the header-lead - level 1 new-style bullets now work.
Engage allout-before-change-handler in mainline emacs, not just
xemacs, to do undo handling.
(allout-before-change-handler): Expose undo changes occurring in
hidden regions. Use allout-get-invisibility-overlay instead of
reimplementing it inline.
(allout-chart-subtree): Use start rather than end of prefix in
charts. Use allout-recent-depth variable.
(allout-chart-siblings): Disqualify aberrant topics.
(allout-beginning-of-current-entry): Position correctly.
(allout-ascend): Use new allout-depth-specific-regexp and
allout-depth-one-regexp for linear instead of O(N^2) or worse behavior.
(allout-ascend-to-depth, allout-up-current-level): Depend on
allout-ascend, rather than reimplementing an algorithm.
(allout-descend-to-depth): Use allout-recent-depth var instead of fun.
(allout-next-sibling): On traversal of numerous intervening
topics, resort to economical allout-next-sibling-leap.
(allout-next-sibling-leap): Specialized version of
allout-next-sibling that uses allout-ascend cleverly, to depend on
a regexp search to leap large numbers of contained topics, rather
than arbitrarily many one-by-one traversals.
(allout-next-visible-heading): Disqualify aberrant topics.
(allout-previous-visible-heading): Position consistently when interactive.
(allout-forward-current-level): Base on allout-previous-sibling
rather than reimplmenting the algorithm. Remove unused vars.
(allout-solicit-alternate-bullet): Present default choice stripped
of text properties.
(allout-rebullet-heading): Use bullet stripped of text properties.
Register changes using allout-exposure-change-hook. Disregard
aberrant topics.
(allout-shift-in): With universal-argument, make topic a peer of
it's former offspring. Simplify the code by separating out
allout-shift-out functionality.
(allout-shift-out): With universal-argument, make offspring peers
of their former container, and its siblings. Implement the
functionality here, rather than inappropriately muddling the
implementation of allout-shift-in.
(allout-rebullet-topic): Respect additional argument for new
parent-child separation function.
(allout-yank-processing): Use allout-ascend directly.
(allout-show-entry): Disqualify aberrant topics.
(allout-show-children): Handle discontinuous children gracefully,
extending the depth being revealed to expose them and posting a
message indicating the situation.
(allout-show-to-offshoot): Remove obsolete and incorrect comment.
Leave cursor in correct position.
(allout-hide-current-subtree): Use allout-ascend directly.
Disqualify aberrant topics.
(allout-kill-line, allout-kill-topic): Preserve exposure layout in
a way that the yanks can restore it, as used to happen.
(allout-yank-processing): Restore exposure layout as recorded by
allout-kill-*, as used to happen.
(allout-annotate-hidden, allout-hide-by-annotation): New routines
for preseving and restoring exposure layout across kills.
(allout-toggle-subtree-encryption): Run allout-exposure-change-hook.
(allout-encrypt-string): Strip text properties.
Rearranged order and outline-headings for some of the
miscellaneous functions.
(allout-resolve-xref): No need to quote the error name in the
condition-case handler section.
(allout-flatten): Classic recursive (and recursively intensive,
without tail-recursion) list-flattener, needed by allout-shift-out
when confronted with discontinuous children.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Thu, 14 Sep 2006 17:52:07 +0000 |
parents | 036770549c03 |
children | 3d45362f1d38 a8190f7e546e |
line wrap: on
line source
/* Give this program DOC-mm.nn.oo as standard input and it outputs to standard output a file of texinfo input containing the doc strings. Copyright (C) 1989, 1992, 1994, 1996, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This version sorts the output by function name. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdio.h> #include <ctype.h> #ifdef DOS_NT #include <fcntl.h> /* for O_BINARY */ #include <io.h> /* for setmode */ #endif #ifndef HAVE_STDLIB_H /* config.h includes stdlib. */ #ifndef WINDOWSNT /* src/s/ms-w32.h includes stdlib.h */ extern char *malloc (); #endif #endif #define NUL '\0' #define MARKER '\037' #define DEBUG 0 typedef struct line LINE; struct line { LINE *next; /* ptr to next or NULL */ char *line; /* text of the line */ }; typedef struct docstr DOCSTR; struct docstr /* Allocated thing for an entry. */ { DOCSTR *next; /* next in the chain */ char *name; /* name of the function or var */ LINE *first; /* first line of doc text. */ char type; /* 'F' for function, 'V' for variable */ }; /* Print error message. `s1' is printf control string, `s2' is arg for it. */ void error (s1, s2) char *s1, *s2; { fprintf (stderr, "sorted-doc: "); fprintf (stderr, s1, s2); fprintf (stderr, "\n"); } /* Print error message and exit. */ void fatal (s1, s2) char *s1, *s2; { error (s1, s2); exit (EXIT_FAILURE); } /* Like malloc but get fatal error if memory is exhausted. */ char * xmalloc (size) int size; { char *result = malloc ((unsigned)size); if (result == NULL) fatal ("%s", "virtual memory exhausted"); return result; } char * xstrdup (str) char * str; { char *buf = xmalloc (strlen (str) + 1); (void) strcpy (buf, str); return (buf); } /* Comparison function for qsort to call. */ int cmpdoc (a, b) DOCSTR **a; DOCSTR **b; { register int val = strcmp ((*a)->name, (*b)->name); if (val) return val; return (*a)->type - (*b)->type; } enum state { WAITING, BEG_NAME, NAME_GET, BEG_DESC, DESC_GET }; char *states[] = { "WAITING", "BEG_NAME", "NAME_GET", "BEG_DESC", "DESC_GET" }; int main () { register DOCSTR *dp = NULL; /* allocated DOCSTR */ register LINE *lp = NULL; /* allocated line */ register char *bp; /* ptr inside line buffer */ register enum state state = WAITING; /* state at start */ int cnt = 0; /* number of DOCSTRs read */ DOCSTR *docs = NULL; /* chain of allocated DOCSTRS */ char buf[512]; /* line buffer */ #ifdef DOS_NT /* DOC is a binary file. */ if (!isatty (fileno (stdin))) setmode (fileno (stdin), O_BINARY); #endif bp = buf; while (1) /* process one char at a time */ { /* this char from the DOCSTR file */ register int ch = getchar (); /* Beginnings */ if (state == WAITING) { if (ch == MARKER) state = BEG_NAME; } else if (state == BEG_NAME) { cnt++; if (dp == NULL) /* first dp allocated */ { docs = dp = (DOCSTR*) xmalloc (sizeof (DOCSTR)); } else /* all the rest */ { dp->next = (DOCSTR*) xmalloc (sizeof (DOCSTR)); dp = dp->next; } lp = NULL; dp->next = NULL; bp = buf; state = NAME_GET; /* Record whether function or variable. */ dp->type = ch; ch = getchar (); } else if (state == BEG_DESC) { if (lp == NULL) /* first line for dp */ { dp->first = lp = (LINE*)xmalloc (sizeof (LINE)); } else /* continuing lines */ { lp->next = (LINE*)xmalloc (sizeof (LINE)); lp = lp->next; } lp->next = NULL; bp = buf; state = DESC_GET; } /* process gets */ if (state == NAME_GET || state == DESC_GET) { if (ch != MARKER && ch != '\n' && ch != EOF) { *bp++ = ch; } else /* saving and changing state */ { *bp = NUL; bp = xstrdup (buf); if (state == NAME_GET) dp->name = bp; else lp->line = bp; bp = buf; state = (ch == MARKER) ? BEG_NAME : BEG_DESC; } } /* NAME_GET || DESC_GET */ if (ch == EOF) break; } { DOCSTR **array; register int i; /* counter */ /* build array of ptrs to DOCSTRs */ array = (DOCSTR**)xmalloc (cnt * sizeof (*array)); for (dp = docs, i = 0; dp != NULL ; dp = dp->next) array[i++] = dp; /* sort the array by name; within each name, by type */ qsort ((char*)array, cnt, sizeof (DOCSTR*), cmpdoc); /* write the output header */ printf ("\\input texinfo @c -*-texinfo-*-\n"); printf ("@setfilename ../info/summary\n"); printf ("@settitle Command Summary for GNU Emacs\n"); printf ("@finalout\n"); printf ("@unnumbered Command Summary for GNU Emacs\n"); printf ("@table @asis\n"); printf ("\n"); printf ("@iftex\n"); printf ("@global@let@ITEM@item\n"); printf ("@def@item{@filbreak@vskip5pt@ITEM}\n"); printf ("@font@tensy cmsy10 scaled @magstephalf\n"); printf ("@font@teni cmmi10 scaled @magstephalf\n"); printf ("@def\\{{@tensy@char110}}\n"); /* this backslash goes with cmr10 */ printf ("@def|{{@tensy@char106}}\n"); printf ("@def@{{{@tensy@char102}}\n"); printf ("@def@}{{@tensy@char103}}\n"); printf ("@def<{{@teni@char62}}\n"); printf ("@def>{{@teni@char60}}\n"); printf ("@chardef@@64\n"); printf ("@catcode43=12\n"); printf ("@tableindent-0.2in\n"); printf ("@end iftex\n"); /* print each function from the array */ for (i = 0; i < cnt; i++) { printf ("\n@item %s @code{%s}\n@display\n", array[i]->type == 'F' ? "Function" : "Variable", array[i]->name); for (lp = array[i]->first; lp != NULL ; lp = lp->next) { for (bp = lp->line; *bp; bp++) { /* the characters "@{}" need special treatment */ if (*bp == '@' || *bp == '{' || *bp == '}') { putchar('@'); } putchar(*bp); } putchar ('\n'); } printf("@end display\n"); /* Try to avoid a save size overflow in the TeX output routine. */ if (i%100 == 0 && i > 0 && i != cnt) printf("\n@end table\n@table @asis\n"); } printf ("@end table\n"); printf ("@bye\n"); } return EXIT_SUCCESS; } /* arch-tag: ce28f204-1e70-4b34-8210-3d54a5662071 (do not change this comment) */ /* sorted-doc.c ends here */