Mail Archives: djgpp-workers/1998/02/25/00:39:18
Here's a patch for v2.02's mkdoc.cc to make it read portability
information in .txh files. Apply with "patch -p 1" from the base djgpp
directory.
--
george DOT foot AT merton DOT oxford DOT ac DOT uk
diff -C 2 -r old/src/mkdoc/mkdoc.cc new/src/mkdoc/mkdoc.cc
*** old/src/mkdoc/mkdoc.cc Sun Nov 16 14:08:36 1997
--- new/src/mkdoc/mkdoc.cc Wed Feb 25 04:15:00 1998
***************
*** 5,8 ****
--- 5,10 ----
#include <sys/stat.h>
#include <unistd.h>
+ #include <stdlib.h>
+ #include <ctype.h>
char *dj_strlwr(char *s)
***************
*** 24,27 ****
--- 26,42 ----
typedef void (*TFunc)(Node *);
+
+ #define NUM_PORT_TARGETS 2
+
+ #define PORT_NO 0
+ #define PORT_PARTIAL 1
+ #define PORT_YES 2
+
+ /* Tokens for use in .txh files */
+ char *port_target[NUM_PORT_TARGETS] = { "ansi", "posix" };
+ /* Strings to output in .txi files */
+ char *port_target_string[NUM_PORT_TARGETS] = { "ANSI", "POSIX" };
+
+
struct Tree {
TreeNode *nodes;
***************
*** 38,41 ****
--- 53,63 ----
};
+ struct PortNote {
+ struct PortNote *next;
+ int target;
+ int number;
+ char *note;
+ };
+
struct Node {
Node *prev, *next;
***************
*** 47,52 ****
--- 69,80 ----
Tree subnodes;
char *filename;
+ int port_info[NUM_PORT_TARGETS];
+ PortNote *port_notes;
Node(char *name, char *cat);
void add(char *line);
+ void process(char *line);
+ void read_portability_note(char *str);
+ void read_portability(char *str);
+ void write_portability();
};
***************
*** 72,75 ****
--- 100,105 ----
lines = 0;
lastline = 0;
+ for (int i = 0; i < NUM_PORT_TARGETS; i++) port_info[i] = PORT_NO;
+ port_notes = NULL;
}
***************
*** 87,90 ****
--- 117,287 ----
}
+ void
+ Node::read_portability_note(char *str)
+ {
+ char *work_str = strdup (str);
+ char *s = work_str;
+ char *target;
+
+ while (isspace(*s)) s++;
+ target = s;
+ while (*s && !isspace(*s)) s++;
+ if (*s) *s++ = 0;
+ while (isspace(*s)) s++;
+ dj_strlwr (target);
+
+ int targ_num;
+ for (targ_num = 0; targ_num < NUM_PORT_TARGETS; targ_num++)
+ if (!strcmp (target, port_target[targ_num])) break;
+
+ if (targ_num == NUM_PORT_TARGETS)
+ {
+ fprintf (stderr, "%s: unrecognised portability note target `%s' ignored.\n", filename, target);
+ }
+ else
+ {
+ if (!*s)
+ {
+ fprintf (stderr, "%s: empty portability note for target `%s' ignored.\n", filename, target);
+ }
+ else
+ {
+ PortNote *p = new PortNote;
+ p->next = NULL;
+ p->number = 0;
+ p->target = targ_num;
+ p->note = strdup (s);
+ if (port_notes)
+ {
+ PortNote *q = port_notes;
+ while (q->next) q = q->next;
+ q->next = p;
+ }
+ else
+ {
+ port_notes = p;
+ }
+ }
+ }
+ free (work_str);
+ }
+
+ void
+ Node::read_portability(char *str)
+ {
+ char *targets = dj_strlwr (strdup (str));
+ char *x, *target = targets;
+ int type,i;
+
+ while (isspace (*target)) target++;
+ while (*target) {
+
+ type = PORT_YES;
+ if (*target == '~')
+ {
+ type = PORT_PARTIAL;
+ target++;
+ }
+
+ for (x = target; *x && !isspace(*x); x++);
+ if (*x) *x++ = 0;
+
+ for (i = 0; i < NUM_PORT_TARGETS; i++)
+ if (!strcmp (target, port_target[i])) break;
+
+ if (i < NUM_PORT_TARGETS)
+ port_info[i] = type;
+ else
+ fprintf (stderr, "%s: unrecognised portability target `%s' ignored.\n", filename, target);
+
+ target = x;
+ while (isspace (*target)) target++;
+ }
+
+ free (targets);
+ }
+
+ void
+ Node::write_portability()
+ {
+ char buffer[1024] = { 0 };
+ int note_number = 1;
+
+ for (int i = 0; i < NUM_PORT_TARGETS; i++)
+ {
+ switch (port_info[i])
+ {
+ case PORT_NO:
+ strcat (buffer, "not ");
+ strcat (buffer, port_target_string[i]);
+ break;
+ case PORT_YES:
+ strcat (buffer, port_target_string[i]);
+ break;
+ case PORT_PARTIAL:
+ strcat (buffer, "partially ");
+ strcat (buffer, port_target_string[i]);
+ break;
+ }
+ for (PortNote *p = port_notes; p; p = p->next)
+ {
+ if (p->target == i)
+ {
+ char smallbuffer[10];
+ p->number = note_number++;
+ sprintf (smallbuffer, " (%d)", p->number);
+ strcat (buffer, smallbuffer);
+ }
+ }
+ strcat (buffer, ", ");
+ }
+
+ char *ch = strchr (buffer, 0) - 2;
+ if (*ch == ',')
+ *ch = 0;
+ else
+ strcpy (buffer, "Not portable.");
+
+ strcat (buffer, "\n");
+ add(buffer);
+
+ for (int i = 1; i < note_number; i++)
+ for (PortNote *p = port_notes; p; p = p->next)
+ if (p->number == i)
+ {
+ sprintf (buffer, "(%d) %s\n", i, p->note);
+ add("\n");
+ add(buffer);
+ }
+
+ /* Now free the portability notes */
+ while (port_notes) {
+ PortNote *p = port_notes;
+ port_notes = p->next;
+ free (p->note);
+ delete p;
+ }
+
+ free(buffer);
+ }
+
+ void
+ Node::process(char *line)
+ {
+ if ((strncmp (line, "@portability", 12) == 0) && isspace (line[12]))
+ {
+ read_portability(line+13);
+ write_portability();
+ }
+ else if (strncmp (line, "@port-note ", 11) == 0)
+ {
+ read_portability_note(line+11);
+ }
+ else
+ {
+ add(line);
+ }
+ }
+
//-----------------------------------------------------------------------------
***************
*** 232,238 ****
result = stat(name, &statbuf);
if(result < 0)
! return 0;
if(S_ISDIR(statbuf.st_mode))
! return 1;
else return 0;
}
--- 429,435 ----
result = stat(name, &statbuf);
if(result < 0)
! return 0;
if(S_ISDIR(statbuf.st_mode))
! return 1;
else return 0;
}
***************
*** 240,244 ****
//-----------------------------------------------------------------------------
! scan_directory(char *which)
{
Node *curnode;
--- 437,441 ----
//-----------------------------------------------------------------------------
! void scan_directory(char *which)
{
Node *curnode;
***************
*** 300,304 ****
{
if (curnode)
! curnode->add(buf);
}
}
--- 497,501 ----
{
if (curnode)
! curnode->process(buf);
}
}
- Raw text -