User: stephent
Date: 05/02/22 09:05:59
Modified: xemacs/lib-src ChangeLog make-docfile.c
Log:
handle UNUSED in DEFUN <87vf8l58aq.fsf(a)tleepslib.sk.tsukuba.ac.jp>
Revision Changes Path
1.187 +5 -0 XEmacs/xemacs/lib-src/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lib-src/ChangeLog,v
retrieving revision 1.186
retrieving revision 1.187
diff -u -r1.186 -r1.187
--- ChangeLog 2005/02/18 06:28:31 1.186
+++ ChangeLog 2005/02/22 08:05:58 1.187
@@ -1,3 +1,8 @@
+2004-12-19 Stephen J. Turnbull <stephen(a)xemacs.org>
+
+ * make-docfile.c (write_c_args): Handle UNUSED, USED_IF macros.
+ (scan_c_file): Handle nested parens in DEFUN argument lists.
+
2005-02-18 Stephen J. Turnbull <stephen(a)xemacs.org>
* XEmacs 21.5.19 "chives" is released.
1.17 +55 -3 XEmacs/xemacs/lib-src/make-docfile.c
Index: make-docfile.c
===================================================================
RCS file: /pack/xemacscvs/XEmacs/xemacs/lib-src/make-docfile.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- make-docfile.c 2004/12/06 03:50:53 1.16
+++ make-docfile.c 2005/02/22 08:05:58 1.17
@@ -525,9 +525,16 @@
char c = *p;
int ident_start = 0;
- /* XEmacs addition: add support for ANSI prototypes. Hop over
- "Lisp_Object" string (the only C type allowed in DEFUNs) */
+ /* XEmacs addition: add support for ANSI prototypes and the UNUSED
+ macros. Hop over them. "Lisp_Object" is the only C type allowed
+ in DEFUNs. For the UNUSED macros we need to eat parens, too. */
+ static char uu [] = "UNUSED";
+ static char ui [] = "USED_IF_";
static char lo[] = "Lisp_Object";
+
+ /* aren't these all vulnerable to buffer overrun? I guess that
+ means that the .c is busted, so we may as well just die ... */
+ /* skip over "Lisp_Object" */
if ((C_IDENTIFIER_CHAR_P (c) != in_ident) && !in_ident &&
(strncmp (p, lo, sizeof (lo) - 1) == 0) &&
isspace ((unsigned char) p[sizeof (lo) - 1]))
@@ -538,6 +545,45 @@
c = *p;
}
+ /* skip over "UNUSED" invocation */
+ if ((C_IDENTIFIER_CHAR_P (c) != in_ident) && !in_ident &&
+ (strncmp (p, uu, sizeof (uu) - 1) == 0))
+ {
+ char *here = p;
+ p += (sizeof (uu) - 1);
+ while (isspace ((unsigned char) (*p)))
+ p++;
+ if (*p == '(')
+ {
+ while (isspace ((unsigned char) (*++p)))
+ ;
+ c = *p;
+ }
+ else
+ p = here;
+ }
+
+ /* skip over "USED_IF_*" invocation (only if USED failed) */
+ else if ((C_IDENTIFIER_CHAR_P (c) != in_ident) && !in_ident &&
+ (strncmp (p, ui, sizeof (ui) - 1) == 0))
+ {
+ char *here = p;
+ p += (sizeof (ui) - 1);
+ /* There should be a law against parsing in C:
+ this allows a broken USED_IF call, skipping to next macro's
+ parens. *You* can fix that, I don't see how offhand. ;-) */
+ while (*p && *p++ != '(')
+ ;
+ if (*p)
+ {
+ while (isspace ((unsigned char) (*p)))
+ p++;
+ c = *p;
+ }
+ else
+ p = here;
+ }
+
/* Notice when we start printing a new identifier. */
if (C_IDENTIFIER_CHAR_P (c) != in_ident)
{
@@ -836,6 +882,7 @@
if (defunflag && maxargs != -1)
{
char argbuf[1024], *p = argbuf;
+ int paren_level = 1;
#if 0 /* For old DEFUN's only */
while (c != ')')
{
@@ -858,8 +905,13 @@
*p++ = c = getc (infile);
if (c < 0)
goto eof;
+ /* XEmacs change: handle macros with args (eg, UNUSED) */
+ if (c == ')')
+ paren_level--;
+ if (c == '(')
+ paren_level++;
}
- while (c != ')');
+ while (paren_level > 0);
*p = '\0';
/* Output them. */
if (ellcc)