Support macro names longer than two chars (closes: #408232). diff -ruN -x '*.rej' -x '*.orig' man-1.6e-old/man2html/defs.h man-1.6e/man2html/defs.h --- man-1.6e-old/man2html/defs.h 2005-08-21 01:26:06.000000000 +0200 +++ man-1.6e/man2html/defs.h 2007-04-20 11:41:55.000000000 +0200 @@ -8,6 +8,15 @@ STRDEF *next; }; +typedef struct LONGSTRDEF LONGSTRDEF; +struct LONGSTRDEF { + int nr,slen; + char *longname; + char *st; + LONGSTRDEF *next; +}; + + typedef struct INTDEF INTDEF; struct INTDEF { int nr; @@ -16,12 +25,14 @@ INTDEF *next; }; -extern STRDEF *chardef, *strdef, *defdef; +extern STRDEF *chardef, *strdef; +extern LONGSTRDEF *defdef; extern INTDEF *intdef; #define V(A,B) ((A)*256+(B)) #include +extern LONGSTRDEF *find_longstrdef(LONGSTRDEF* head, int nr, char * longname, char ** out_longname); extern void stdinit(void); extern void print_sig(void); extern char *lookup_abbrev(char *); diff -ruN -x '*.rej' -x '*.orig' man-1.6e-old/man2html/man2html.c man-1.6e/man2html/man2html.c --- man-1.6e-old/man2html/man2html.c 2007-04-20 11:40:27.000000000 +0200 +++ man-1.6e/man2html/man2html.c 2007-04-20 11:43:40.000000000 +0200 @@ -1676,7 +1676,7 @@ char *wordlist[20]; int words; char *sl; - STRDEF *owndef; + LONGSTRDEF *owndef; while (*c == ' ' || *c == '\t') c++; @@ -2378,11 +2378,13 @@ /* .de xx yy : define or redefine macro xx; end at .yy (..) */ /* define or handle as .ig yy */ { - STRDEF *de; + LONGSTRDEF *de; + char *longname; int olen=0; c=c+j; sl=fill_words(c, wordlist, SIZE(wordlist), &words, '\n'); i=V(c[0],c[1]);j=2; + longname = c; if (words == 1) wordlist[1]=".."; else { wordlist[1]--; wordlist[1][0]='.'; @@ -2391,8 +2393,7 @@ c=sl+1; sl=c; while (*c && strncmp(c,wordlist[1],j)) c=skip_till_newline(c); - de=defdef; - while (de && de->nr!= i) de=de->next; + de = find_longstrdef(defdef, i, longname, &longname); if (mode && de) olen=strlen(de->st); j=olen+c-sl; h= (char*) xmalloc((j*2+4)*sizeof(char)); @@ -2413,8 +2414,9 @@ if (de->st) free(de->st); de->st=h; } else { - de = (STRDEF*) xmalloc(sizeof(STRDEF)); + de = (LONGSTRDEF*) xmalloc(sizeof(LONGSTRDEF)); de->nr=i; + de->longname=longname; de->next=defdef; de->st=h; defdef=de; @@ -2893,13 +2895,12 @@ default: /* search macro database of self-defined macros */ - owndef = defdef; - while (owndef && owndef->nr!=i) owndef=owndef->next; + owndef = find_longstrdef(defdef, i, c, NULL); if (owndef) { char **oldargument; int deflen; int onff; - sl=fill_words(c+j, wordlist, SIZE(wordlist), &words, '\n'); + sl=fill_words(c+strlen(owndef->longname), wordlist, SIZE(wordlist), &words, '\n'); c=sl+1; *sl=0; for (i=1; i +#include #ifndef NULL #define NULL ((void *) 0) @@ -9,7 +11,8 @@ #define NROFF (-666) #define TROFF (-667) -STRDEF *chardef, *strdef, *defdef; +STRDEF *chardef, *strdef; +LONGSTRDEF *defdef; INTDEF *intdef; static INTDEF standardint[] = { @@ -178,3 +181,24 @@ intdef = &standardint[0]; defdef = NULL; } + + +LONGSTRDEF* find_longstrdef(LONGSTRDEF * head, int nr, char * longname, char ** out_longname) +{ + char *p, c; + LONGSTRDEF *de; + + p = longname; + while (p && !isspace(*p)) p++; + c = *p; + *p = 0; + + de = head; + while (de && (de->nr != nr || (de->longname && strcmp(longname, de->longname)))) + de = de->next; + + if (out_longname) + *out_longname = de ? de->longname : xstrdup(longname); + *p = c; + return de; +}