1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
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 <sys/types.h>
+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<words; i++)
diff -ruN -x '*.rej' -x '*.orig' man-1.6e-old/man2html/strdefs.c man-1.6e/man2html/strdefs.c
--- man-1.6e-old/man2html/strdefs.c 2007-04-20 11:40:27.000000000 +0200
+++ man-1.6e/man2html/strdefs.c 2007-04-20 11:43:55.000000000 +0200
@@ -1,4 +1,6 @@
#include "defs.h"
+#include <ctype.h>
+#include <string.h>
#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;
+}
|