Annotation of GNUtools/cc/doschk.c, revision 1.1

1.1     ! root        1: /*
        !             2: **  DosFCheck - check file names for DOS consistency
        !             3: **
        !             4: **  Distribute freely, it only encourages DOS compatibility!
        !             5: **  - DJ Delorie
        !             6: */
        !             7: 
        !             8: /* This file is not part of GCC.  */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #ifdef __MSDOS__
        !            12: #include <alloc.h>
        !            13: #else
        !            14: #include <malloc.h>
        !            15: #endif
        !            16: #include <ctype.h>
        !            17: #include <string.h>
        !            18: 
        !            19: typedef struct ENT
        !            20: {
        !            21:   struct ENT *next;
        !            22:   char *dos_name;
        !            23:   char *full_name;
        !            24:   char *path;
        !            25:   int tagged;
        !            26: } ENT;
        !            27: 
        !            28: ENT *eroot = 0;
        !            29: 
        !            30: int first_inv = 1;
        !            31: int first_msg = 1;
        !            32: 
        !            33: /****************************************************************\
        !            34:  *  Utility routines                                           *
        !            35: \****************************************************************/
        !            36: 
        !            37: void
        !            38: invalid_msg ()
        !            39: {
        !            40:   if (first_inv)
        !            41:     {
        !            42:       if (first_msg)
        !            43:        first_msg = 0;
        !            44:       else
        !            45:        putchar ('\n');
        !            46:       printf ("The following files are not valid DOS file names:\n");
        !            47:       first_inv = 0;
        !            48:     }
        !            49: }
        !            50: 
        !            51: ENT *
        !            52: alloc_ent ()
        !            53: {
        !            54:   ENT *rv = (ENT *)malloc (sizeof (ENT));
        !            55:   if (rv == 0)
        !            56:     {
        !            57:       fprintf (stderr, "Unable to allocate memory for an ENT\n");
        !            58:       exit (1);
        !            59:     }
        !            60:   memset (rv, 0, sizeof (ENT));
        !            61:   return rv;
        !            62: }
        !            63: 
        !            64: void
        !            65: fill_ent (ent, path)
        !            66: ENT *ent;
        !            67: char *path;
        !            68: {
        !            69:   char *first = path;
        !            70:   char *null = path+strlen (path);
        !            71:   char *last_slash = strrchr (path, '/');
        !            72:   char *cp, *dp;
        !            73:   int dots_seen, chars_seen;
        !            74:   
        !            75:   if (last_slash+1 == null)
        !            76:     {
        !            77:       * --null = '\0';
        !            78:       last_slash = strrchr (path, '/');
        !            79:     }
        !            80:   
        !            81:   if (!last_slash)
        !            82:     {
        !            83:       last_slash = first-1;
        !            84:     }
        !            85: 
        !            86:   if (null-last_slash < 13)
        !            87:     ent->dos_name = (char *)malloc (null-last_slash);
        !            88:   else
        !            89:     ent->dos_name = (char *)malloc (13);
        !            90:   ent->full_name = (char *)malloc (null-last_slash);
        !            91:   ent->path = (char *)malloc (last_slash-first+1);
        !            92: 
        !            93:   strcpy (ent->full_name, last_slash+1);
        !            94:   if (last_slash > first)
        !            95:     {
        !            96:       strncpy (ent->path, first, last_slash-first);
        !            97:       ent->path[last_slash-first] = '\0';
        !            98:     }
        !            99:   else
        !           100:     *ent->path = '\0';
        !           101: 
        !           102:   cp = last_slash+1;
        !           103:   dp = ent->dos_name;
        !           104:   dots_seen = 0;
        !           105:   chars_seen = 0;
        !           106:   while (1)
        !           107:     {
        !           108:       if (! *cp)
        !           109:        break;
        !           110:       switch (*cp)
        !           111:        {
        !           112:        case '.':
        !           113:          if (cp == last_slash+1 && strcmp (last_slash+1, "."))
        !           114:            {
        !           115:              invalid_msg ();
        !           116:              printf ("%s - file name cannot start with dot\n", path);
        !           117:              *dp = 0;
        !           118:              break;
        !           119:            }
        !           120:          if (dots_seen == 1)
        !           121:            {
        !           122:              invalid_msg ();
        !           123:              printf ("%s - too many dots\n", path);
        !           124:              *dp = '\0';
        !           125:              break;
        !           126:            }
        !           127:          *dp++ = '.';
        !           128:          chars_seen = 0;
        !           129:          dots_seen++;
        !           130:          break;
        !           131:        case '"':
        !           132:        case '*':
        !           133:        case '+':
        !           134:        case ',':
        !           135:        case ';':
        !           136:        case '<':
        !           137:        case '=':
        !           138:        case '>':
        !           139:        case '?':
        !           140:        case '[':
        !           141:        case '\\':
        !           142:        case ']':
        !           143:        case '|':
        !           144:          invalid_msg ();
        !           145:          printf ("%s - invalid character `%c'\n", path, *cp);
        !           146:          *dp++ = '?';
        !           147:          chars_seen++;
        !           148:          break;
        !           149:        default:
        !           150:          if (dots_seen)
        !           151:            {
        !           152:              if (chars_seen >= 3)
        !           153:                break;
        !           154:            }
        !           155:          else
        !           156:            if (chars_seen >= 8)
        !           157:              break;
        !           158:          if ((*cp <= ' ') || (*cp >= 0x7f))
        !           159:            {
        !           160:              invalid_msg ();
        !           161:              printf ("%s - invalid character `%c'\n", path, *cp);
        !           162:              *dp++ = '?';
        !           163:              chars_seen++;
        !           164:              break;
        !           165:            }
        !           166:          if (islower (*cp))
        !           167:            *dp++ = toupper (*cp);
        !           168:          else
        !           169:            *dp++ = *cp;
        !           170:          chars_seen++;
        !           171:          break;
        !           172:        }
        !           173:       cp++;
        !           174:     }
        !           175:   *dp++ = '\0';
        !           176: }
        !           177: 
        !           178: int
        !           179: compare_ent_dosname (e1, e2)
        !           180: ENT **e1;
        !           181: ENT **e2;
        !           182: {
        !           183:   int r = strcmp ((*e1)->dos_name, (*e2)->dos_name);
        !           184:   if (r == 0)
        !           185:     r = strcmp ((*e1)->path, (*e2)->path);
        !           186:   if (r == 0)
        !           187:     r = strcmp ((*e1)->full_name, (*e2)->full_name);
        !           188:   return r;
        !           189: }
        !           190: 
        !           191: int
        !           192: compare_ent_fullname (e1, e2)
        !           193: ENT **e1;
        !           194: ENT **e2;
        !           195: {
        !           196:   int r = strncmp ((*e1)->full_name, (*e2)->full_name, 14);
        !           197:   if (r == 0)
        !           198:     r = strcmp ((*e1)->path, (*e2)->path);
        !           199:   if (r == 0)
        !           200:     r = strcmp ((*e1)->full_name, (*e2)->full_name);
        !           201:   return r;
        !           202: }
        !           203: 
        !           204: char *
        !           205: mpath (ent)
        !           206: ENT *ent;
        !           207: {
        !           208:   static char buf[500];
        !           209:   if (ent->path && ent->path[0])
        !           210:     sprintf (buf, "%s/%s", ent->path, ent->full_name);
        !           211:   else
        !           212:     return ent->full_name;
        !           213:   return buf;
        !           214: }
        !           215: 
        !           216: /****************************************************************\
        !           217:  *  List handling routines                                     *
        !           218: \****************************************************************/
        !           219: 
        !           220: void
        !           221: add_ent (ent)
        !           222: ENT *ent;
        !           223: {
        !           224:   ent->next = eroot;
        !           225:   eroot = ent;
        !           226: }
        !           227: 
        !           228: void
        !           229: handle_input (line)
        !           230: char *line;
        !           231: {
        !           232:   ENT *ent = alloc_ent ();
        !           233:   fill_ent (ent, line);
        !           234:   add_ent (ent);
        !           235: }
        !           236: 
        !           237: void
        !           238: display_problems ()
        !           239: {
        !           240:   ENT **elist, *ent;
        !           241:   int ecount, i, first, first_err;
        !           242:   
        !           243:   for (ecount=0, ent=eroot; ent; ent=ent->next, ecount++);
        !           244:   elist = (ENT **)malloc (sizeof (ENT *) * ecount);
        !           245:   for (ecount=0, ent=eroot; ent; ent=ent->next, ecount++)
        !           246:     elist[ecount] = ent;
        !           247: 
        !           248:   qsort (elist, ecount, sizeof (ENT *), compare_ent_dosname);
        !           249: 
        !           250:   first = 1;
        !           251:   first_err = 1;
        !           252:   for (i=0; i<ecount-1; i++)
        !           253:     {
        !           254:       if ((strcmp (elist[i]->dos_name, elist[i+1]->dos_name) == 0) &&
        !           255:          (strcmp (elist[i]->path, elist[i+1]->path) == 0))
        !           256:        {
        !           257:          if (first_err)
        !           258:            {
        !           259:              if (first_msg)
        !           260:                first_msg = 0;
        !           261:              else
        !           262:                putchar ('\n');
        !           263:              printf ("The following resolve to the same DOS file names:\n");
        !           264:              first_err = 0;
        !           265:            }
        !           266:          if (first)
        !           267:            {
        !           268:              printf ("%14s : %s\n", elist[i]->dos_name, mpath (elist[i]));
        !           269:              first = 0;
        !           270:            }
        !           271:          printf ("\t\t %s\n", mpath (elist[i+1]));
        !           272:        }
        !           273:       else
        !           274:        first = 1;
        !           275:     }
        !           276: 
        !           277:   qsort (elist, ecount, sizeof (ENT *), compare_ent_fullname);
        !           278: 
        !           279:   first = 1;
        !           280:   first_err = 1;
        !           281:   for (i=0; i<ecount-1; i++)
        !           282:     {
        !           283:       if ((strncmp (elist[i]->full_name, elist[i+1]->full_name, 14) == 0) &&
        !           284:          (strcmp (elist[i]->path, elist[i+1]->path) == 0))
        !           285:        {
        !           286:          if (first_err)
        !           287:            {
        !           288:              if (first_msg)
        !           289:                first_msg = 0;
        !           290:              else
        !           291:                putchar ('\n');
        !           292:              printf ("The following resolve to the same SysV file names:\n");
        !           293:              first_err = 0;
        !           294:            }
        !           295:          if (first)
        !           296:            {
        !           297:              printf ("%.14s : %s\n", elist[i]->full_name, mpath (elist[i]));
        !           298:              first = 0;
        !           299:              elist[i]->tagged = 1;
        !           300:            }
        !           301:          printf ("\t\t %s\n", mpath (elist[i+1]));
        !           302:          elist[i+1]->tagged = 1;
        !           303:        }
        !           304:       else
        !           305:        first = 1;
        !           306:     }
        !           307: 
        !           308:   first_err = 1;
        !           309:   for (i=0; i<ecount; i++)
        !           310:     {
        !           311:       if ((strlen (elist[i]->full_name) > 14) && !elist[i]->tagged)
        !           312:        {
        !           313:          if (first_err)
        !           314:            {
        !           315:              if (first_msg)
        !           316:                first_msg = 0;
        !           317:              else
        !           318:                putchar ('\n');
        !           319:              printf ("The following file names are too long for SysV:\n");
        !           320:              first_err = 0;
        !           321:            }
        !           322:          printf ("%.14s : %s\n", elist[i]->full_name, mpath (elist[i]));
        !           323:        }
        !           324:     }
        !           325: }
        !           326: 
        !           327: /****************************************************************\
        !           328:  *  Main entry point                                           *
        !           329: \****************************************************************/
        !           330: 
        !           331: main (argc, argv)
        !           332: int argc;
        !           333: char **argv;
        !           334: {
        !           335:   FILE *input = stdin;
        !           336:   if (argc > 1)
        !           337:     {
        !           338:       input = fopen (argv[1], "r");
        !           339:       if (!input)
        !           340:        {
        !           341:          perror (argv[1]);
        !           342:          exit (1);
        !           343:        }
        !           344:     }
        !           345:   while (1)
        !           346:     {
        !           347:       char line[500];
        !           348:       char *lp;
        !           349:       fgets (line, 500, input);
        !           350:       if (feof (input))
        !           351:        break;
        !           352:       lp = line+strlen (line);
        !           353:       while ((lp != line) && (*lp <= ' '))
        !           354:        lp--;
        !           355:       lp[1] = 0;
        !           356:       handle_input (line);
        !           357:     }
        !           358:   display_problems ();
        !           359: }
        !           360: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.