Mercurial > hg > xemacs-beta
annotate lib-src/digest-doc.c @ 5241:d579d76f3dcc
Be more careful about side-effects from Lisp code, #'reduce
src/ChangeLog addition:
2010-07-24 Aidan Kehoe <kehoea@parhasard.net>
* lisp.h (PARSE_KEYWORDS):
Always accept a nil :allow-other-keys keyword argument, as
described in the ALLOW-OTHER-KEYS-NIL Common Lisp issue writeup,
and as necessary for Paul Dietz' tests for #'reduce.
* fns.c (mapping_interaction_error): New.
(Freduce): Call mapping_interaction_error when KEY or FUNCTION
have modified a string SEQUENCE such that the byte length of the
string has changed, or such that the current cursor pointer
doesn't point to the beginning of a character.
Cf. the MAPPING-DESTRUCTIVE-INTERACTION Common Lisp issue
writeup.
When traversing a list, GCPRO the part of it we still have to
traverse, to avoid any crashes if FUNCTION or KEY amputate it
behind us and force a garbage collection.
tests/ChangeLog addition:
2010-07-24 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Test a couple of things #'reduce was just made more careful
about.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 24 Jul 2010 15:56:57 +0100 |
parents | ed624ab64583 |
children | 061f4f90f874 |
rev | line source |
---|---|
428 | 1 /* Give this program DOCSTR.mm.nn as standard input |
2 and it outputs to standard output | |
3 a file of nroff output containing the doc strings. | |
4 | |
5 See also sorted-doc.c, which produces similar output | |
6 but in texinfo format and sorted by function/variable name. */ | |
7 | |
5091 | 8 #ifdef HAVE_CONFIG_H |
438 | 9 #include <config.h> |
428 | 10 #endif |
11 #include <stdio.h> | |
12 | |
13 int | |
2367 | 14 main (int argc, char **argv) |
428 | 15 { |
16 register int ch; | |
17 register int notfirst = 0; | |
18 | |
19 printf (".TL\n"); | |
613 | 20 printf ("Command Summary for XEmacs\n"); |
21 printf (".AU\nThe XEmacs Advocacy Group\n"); | |
428 | 22 while ((ch = getchar ()) != EOF) |
23 { | |
24 if (ch == '\037') | |
25 { | |
26 if (notfirst) | |
27 printf ("\n.DE"); | |
28 else | |
29 notfirst = 1; | |
30 | |
31 printf ("\n.SH\n"); | |
32 | |
33 ch = getchar (); | |
34 printf (ch == 'F' ? "Function " : "Variable "); | |
35 | |
36 while ((ch = getchar ()) != '\n') /* Changed this line */ | |
37 { | |
38 if (ch != EOF) | |
39 putchar (ch); | |
40 else | |
41 { | |
42 ungetc (ch, stdin); | |
43 break; | |
44 } | |
45 } | |
46 printf ("\n.DS L\n"); | |
47 } | |
48 else | |
49 putchar (ch); | |
50 } | |
51 return 0; | |
52 } |