home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l200 / 6.ddi / TOOL / BB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-08-21  |  2.8 KB  |  153 lines

  1. /* bb.c -- BASTOC/C driver program
  2.  
  3.     Copyright (c) 1984 by JMI Software Consultants, Inc.
  4. */
  5. #include "upd.h"
  6. GLOBAL TEXT xeq[64] = {0};
  7.  
  8. INT main(argc, argv)
  9.     INT argc;
  10.     TEXT **argv;
  11.     {
  12.     IMPORT BITS errors;
  13.  
  14.     valid(argc, argv);
  15.     if (!errors)
  16.         b2c2o(argc, argv);
  17.     if (!errors)
  18.         o2x(argc, argv);
  19.     return (errors);
  20.     }
  21.  
  22. /*    Validate command - returns YES if all files on command line
  23.     exist and all required libraries also exist. Prints error
  24.     messages when files can not be found.
  25. */
  26. BOOL valid(ac, av)
  27.     INT ac;
  28.     TEXT **av;
  29.     {
  30.     EXFUNC TEXT *strcpy();
  31.     IMPORT TEXT *lib_libs[], *upd_modes[], *flags, xeq[], *c_objs[];
  32.     IMPORT BITS errors;
  33.     IMPORT INT mode;
  34.     INTERN TEXT buf[80] = {0};
  35.     INT n;
  36.     TEXT *s;
  37.  
  38.     strcpy(buf, flags);
  39.     flags = buf;
  40.     while (--ac)
  41.         if (**++av == '-')
  42.             {
  43.             s = *av + 1;
  44.             if (*s == 'o' || *s == 'O')
  45.                 if (*++s)
  46.                     strcpy(xeq, s);
  47.                 else if (--ac)
  48.                     {
  49.                     strcpy(xeq, *++av);
  50.                     *av = "";
  51.                     }
  52.                 else
  53.                     {
  54.                     puts("Output file name missing after -o flag\n", NULL);
  55.                     errors |= BADFLAG;
  56.                     break;
  57.                     }
  58.             else if (flags_ok(s))
  59.                 strcat(buf, s);
  60.             else
  61.                 errors |= BADFLAG;
  62.             }
  63.         else if (**av == '+')
  64.             if (0 <= (n = lookup(*av + 1, upd_modes)))
  65.                 mode = n;
  66.             else
  67.                 {
  68.                 puts("Unknown flag ", *av, "\n", NULL);
  69.                 errors |= BADFLAG;
  70.                 }
  71.         else if (!exists(*av))
  72.             {
  73.             puts("Can't access input file ", *av, "\n", NULL);
  74.             errors |= BADFILE;
  75.             }
  76.     if (!exists(lib_libs[mode]))
  77.         {
  78.         puts("Can't access library file ", lib_libs[mode], "\n", NULL);
  79.         errors |= BADLIBR;
  80.         }
  81.     if (!exists(c_objs[mode]))
  82.         {
  83.         puts("Can't access object file ", c_objs[mode], "\n", NULL);
  84.         errors |= BADLIBR;
  85.         }
  86.     return (!errors);
  87.     }
  88.  
  89. /*    Validate flags for BASTOC translator
  90. */
  91. BOOL flags_ok(s)
  92.     TEXT *s;
  93.     {
  94.     IMPORT TEXT bas_flags[];
  95.     TEXT *f, bad[2];
  96.     BOOL success = YES;
  97.  
  98.     while (*s)
  99.         {
  100.         for (f = bas_flags; *f; ++f)
  101.             if (*f == *s)
  102.                 break;
  103.         if (!*f)
  104.             {
  105.             success = NO;
  106.             bad[0] = *s;
  107.             bad[1] = NULLCH;
  108.             puts("Unknown BASTOC flag ", bad, "\n", NULL);
  109.             }
  110.         ++s;
  111.         }
  112.     return (success);
  113.     }
  114.  
  115. /* write a series of strings to standard out
  116. */
  117. /*VARARGS1*/
  118. LOCAL VOID puts(s)
  119.     TEXT *s;
  120.     {
  121.     TEXT **ss;
  122.  
  123.     for (ss = &s; *ss; ++ss)
  124.         write(1, *ss, strlen(*ss));
  125.     }
  126.  
  127. VOID b2c2o(ac, av)
  128.     INT ac;
  129.     TEXT **av;
  130.     {
  131.     EXFUNC TEXT *namcpy(), *strcpy();
  132.     IMPORT BITS errors;
  133.     IMPORT INT mode;
  134.     INT l;
  135.     TEXT *s, name[64];
  136.  
  137.     while (--ac)
  138.         if (**++av != '-' && **av != '+' && **av)
  139.             {
  140.             l = strlen(*av);
  141.             if (strcmp(*av+l-2, ".b") == 0 || strcmp(*av+l-4, ".bas") == 0)
  142.                 {
  143.                 s = namcpy(name, *av);
  144.                 strcpy(s, ".c");
  145.                 if (b2c(*av))
  146.                     if (cc(name, mode))
  147.                         unlink(name);
  148.                 }
  149.             else if (strcmp(*av+l-2, ".c") == 0)
  150.                 cc(*av, mode);
  151.             }
  152.     }
  153.