summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/doschk.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1996-09-18 05:35:50 +0000
committerpeter <peter@FreeBSD.org>1996-09-18 05:35:50 +0000
commitd4691e641ba47cb86eef80f5c879e13f9d961724 (patch)
tree5b7ea73fc49c8998d9dc87d3eeff5b96439e6856 /contrib/gcc/doschk.c
downloadFreeBSD-src-d4691e641ba47cb86eef80f5c879e13f9d961724.zip
FreeBSD-src-d4691e641ba47cb86eef80f5c879e13f9d961724.tar.gz
Import of unmodified (but trimmed) gcc-2.7.2. The bigger parts of the
non-i386, non-unix, and generatable files have been trimmed, but can easily be added in later if needed. gcc-2.7.2.1 will follow shortly, it's a very small delta to this and it's handy to have both available for reference for such little cost. The freebsd-specific changes will then be committed, and once the dust has settled, the bmakefiles will be committed to use this code.
Diffstat (limited to 'contrib/gcc/doschk.c')
-rw-r--r--contrib/gcc/doschk.c360
1 files changed, 360 insertions, 0 deletions
diff --git a/contrib/gcc/doschk.c b/contrib/gcc/doschk.c
new file mode 100644
index 0000000..7fbb733
--- /dev/null
+++ b/contrib/gcc/doschk.c
@@ -0,0 +1,360 @@
+/*
+** DosFCheck - check file names for DOS consistency
+**
+** Distribute freely, it only encourages DOS compatibility!
+** - DJ Delorie
+*/
+
+/* This file is not part of GCC. */
+
+#include <stdio.h>
+#ifdef __MSDOS__
+#include <alloc.h>
+#else
+#include <malloc.h>
+#endif
+#include <ctype.h>
+#include <string.h>
+
+typedef struct ENT
+{
+ struct ENT *next;
+ char *dos_name;
+ char *full_name;
+ char *path;
+ int tagged;
+} ENT;
+
+ENT *eroot = 0;
+
+int first_inv = 1;
+int first_msg = 1;
+
+/****************************************************************\
+ * Utility routines *
+\****************************************************************/
+
+void
+invalid_msg ()
+{
+ if (first_inv)
+ {
+ if (first_msg)
+ first_msg = 0;
+ else
+ putchar ('\n');
+ printf ("The following files are not valid DOS file names:\n");
+ first_inv = 0;
+ }
+}
+
+ENT *
+alloc_ent ()
+{
+ ENT *rv = (ENT *)malloc (sizeof (ENT));
+ if (rv == 0)
+ {
+ fprintf (stderr, "Unable to allocate memory for an ENT\n");
+ exit (1);
+ }
+ memset (rv, 0, sizeof (ENT));
+ return rv;
+}
+
+void
+fill_ent (ent, path)
+ENT *ent;
+char *path;
+{
+ char *first = path;
+ char *null = path+strlen (path);
+ char *last_slash = strrchr (path, '/');
+ char *cp, *dp;
+ int dots_seen, chars_seen;
+
+ if (last_slash+1 == null)
+ {
+ * --null = '\0';
+ last_slash = strrchr (path, '/');
+ }
+
+ if (!last_slash)
+ {
+ last_slash = first-1;
+ }
+
+ if (null-last_slash < 13)
+ ent->dos_name = (char *)malloc (null-last_slash);
+ else
+ ent->dos_name = (char *)malloc (13);
+ ent->full_name = (char *)malloc (null-last_slash);
+ ent->path = (char *)malloc (last_slash-first+1);
+
+ strcpy (ent->full_name, last_slash+1);
+ if (last_slash > first)
+ {
+ strncpy (ent->path, first, last_slash-first);
+ ent->path[last_slash-first] = '\0';
+ }
+ else
+ *ent->path = '\0';
+
+ cp = last_slash+1;
+ dp = ent->dos_name;
+ dots_seen = 0;
+ chars_seen = 0;
+ while (1)
+ {
+ if (! *cp)
+ break;
+ switch (*cp)
+ {
+ case '.':
+ if (cp == last_slash+1 && strcmp (last_slash+1, "."))
+ {
+ invalid_msg ();
+ printf ("%s - file name cannot start with dot\n", path);
+ *dp = 0;
+ break;
+ }
+ if (dots_seen == 1)
+ {
+ invalid_msg ();
+ printf ("%s - too many dots\n", path);
+ *dp = '\0';
+ break;
+ }
+ *dp++ = '.';
+ chars_seen = 0;
+ dots_seen++;
+ break;
+ case '"':
+ case '*':
+ case '+':
+ case ',':
+ case ';':
+ case '<':
+ case '=':
+ case '>':
+ case '?':
+ case '[':
+ case '\\':
+ case ']':
+ case '|':
+ invalid_msg ();
+ printf ("%s - invalid character `%c'\n", path, *cp);
+ *dp++ = '?';
+ chars_seen++;
+ break;
+ default:
+ if (dots_seen)
+ {
+ if (chars_seen >= 3)
+ break;
+ }
+ else
+ if (chars_seen >= 8)
+ break;
+ if ((*cp <= ' ') || (*cp >= 0x7f))
+ {
+ invalid_msg ();
+ printf ("%s - invalid character `%c'\n", path, *cp);
+ *dp++ = '?';
+ chars_seen++;
+ break;
+ }
+ if (islower (*cp))
+ *dp++ = toupper (*cp);
+ else
+ *dp++ = *cp;
+ chars_seen++;
+ break;
+ }
+ cp++;
+ }
+ *dp++ = '\0';
+}
+
+int
+compare_ent_dosname (e1, e2)
+ENT **e1;
+ENT **e2;
+{
+ int r = strcmp ((*e1)->dos_name, (*e2)->dos_name);
+ if (r == 0)
+ r = strcmp ((*e1)->path, (*e2)->path);
+ if (r == 0)
+ r = strcmp ((*e1)->full_name, (*e2)->full_name);
+ return r;
+}
+
+int
+compare_ent_fullname (e1, e2)
+ENT **e1;
+ENT **e2;
+{
+ int r = strncmp ((*e1)->full_name, (*e2)->full_name, 14);
+ if (r == 0)
+ r = strcmp ((*e1)->path, (*e2)->path);
+ if (r == 0)
+ r = strcmp ((*e1)->full_name, (*e2)->full_name);
+ return r;
+}
+
+char *
+mpath (ent)
+ENT *ent;
+{
+ static char buf[500];
+ if (ent->path && ent->path[0])
+ sprintf (buf, "%s/%s", ent->path, ent->full_name);
+ else
+ return ent->full_name;
+ return buf;
+}
+
+/****************************************************************\
+ * List handling routines *
+\****************************************************************/
+
+void
+add_ent (ent)
+ENT *ent;
+{
+ ent->next = eroot;
+ eroot = ent;
+}
+
+void
+handle_input (line)
+char *line;
+{
+ ENT *ent = alloc_ent ();
+ fill_ent (ent, line);
+ add_ent (ent);
+}
+
+void
+display_problems ()
+{
+ ENT **elist, *ent;
+ int ecount, i, first, first_err;
+
+ for (ecount=0, ent=eroot; ent; ent=ent->next, ecount++);
+ elist = (ENT **)malloc (sizeof (ENT *) * ecount);
+ for (ecount=0, ent=eroot; ent; ent=ent->next, ecount++)
+ elist[ecount] = ent;
+
+ qsort (elist, ecount, sizeof (ENT *), compare_ent_dosname);
+
+ first = 1;
+ first_err = 1;
+ for (i=0; i<ecount-1; i++)
+ {
+ if ((strcmp (elist[i]->dos_name, elist[i+1]->dos_name) == 0) &&
+ (strcmp (elist[i]->path, elist[i+1]->path) == 0))
+ {
+ if (first_err)
+ {
+ if (first_msg)
+ first_msg = 0;
+ else
+ putchar ('\n');
+ printf ("The following resolve to the same DOS file names:\n");
+ first_err = 0;
+ }
+ if (first)
+ {
+ printf ("%14s : %s\n", elist[i]->dos_name, mpath (elist[i]));
+ first = 0;
+ }
+ printf ("\t\t %s\n", mpath (elist[i+1]));
+ }
+ else
+ first = 1;
+ }
+
+ qsort (elist, ecount, sizeof (ENT *), compare_ent_fullname);
+
+ first = 1;
+ first_err = 1;
+ for (i=0; i<ecount-1; i++)
+ {
+ if ((strncmp (elist[i]->full_name, elist[i+1]->full_name, 14) == 0) &&
+ (strcmp (elist[i]->path, elist[i+1]->path) == 0))
+ {
+ if (first_err)
+ {
+ if (first_msg)
+ first_msg = 0;
+ else
+ putchar ('\n');
+ printf ("The following resolve to the same SysV file names:\n");
+ first_err = 0;
+ }
+ if (first)
+ {
+ printf ("%.14s : %s\n", elist[i]->full_name, mpath (elist[i]));
+ first = 0;
+ elist[i]->tagged = 1;
+ }
+ printf ("\t\t %s\n", mpath (elist[i+1]));
+ elist[i+1]->tagged = 1;
+ }
+ else
+ first = 1;
+ }
+
+ first_err = 1;
+ for (i=0; i<ecount; i++)
+ {
+ if ((strlen (elist[i]->full_name) > 14) && !elist[i]->tagged)
+ {
+ if (first_err)
+ {
+ if (first_msg)
+ first_msg = 0;
+ else
+ putchar ('\n');
+ printf ("The following file names are too long for SysV:\n");
+ first_err = 0;
+ }
+ printf ("%.14s : %s\n", elist[i]->full_name, mpath (elist[i]));
+ }
+ }
+}
+
+/****************************************************************\
+ * Main entry point *
+\****************************************************************/
+
+main (argc, argv)
+int argc;
+char **argv;
+{
+ FILE *input = stdin;
+ if (argc > 1)
+ {
+ input = fopen (argv[1], "r");
+ if (!input)
+ {
+ perror (argv[1]);
+ exit (1);
+ }
+ }
+ while (1)
+ {
+ char line[500];
+ char *lp;
+ fgets (line, 500, input);
+ if (feof (input))
+ break;
+ lp = line+strlen (line);
+ while ((lp != line) && (*lp <= ' '))
+ lp--;
+ lp[1] = 0;
+ handle_input (line);
+ }
+ display_problems ();
+}
+
OpenPOWER on IntegriCloud