home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / lbl / src / lbl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  2.9 KB  |  159 lines

  1. /* (C) C.D.F. Miller, Heriot-Watt University, March 1984
  2.  *
  3.  *    Permission is hereby given to reproduce or modify this
  4.  *    software freely, provided that this notice be retained,
  5.  *    and that no use be made of the software for commercial
  6.  *    purposes without the express written permission of the
  7.  *    author.
  8.  */
  9.  
  10. /* lbl.c:
  11.  *    main program - decode switches and arguments
  12.  *    and process each input file.
  13.  * usage:
  14.  *    lbl [ -d<char> ] [ -m<macro> ] [ -l ] [ -s ]
  15.  *        -d    <char> delimits in-line occurrences of a tag
  16.  *        -m    <macro> defines a tag value
  17.  *        -l    list label definitions
  18.  *        -s    suppress nroff output (implies -l)
  19.  * defaults:
  20.  *    -d@ -mL=
  21.  */
  22.  
  23. #include    <lbl.h>
  24.  
  25. extern int    lflag;
  26. extern int    sflag;
  27. extern char    delimiter;
  28. extern char    macroname[];
  29. extern char    tempname[];
  30. extern char    *progname;
  31. extern FILE    *tempfile;
  32.  
  33. main(argc, argv)
  34.     us int    argc;
  35.     char    *argv[];
  36. {
  37.     us int        decode();
  38.     us int        nflags;
  39.     FILE        *input;
  40.     int        anydone        = 0;
  41.     static char    standard[]    = "standard input";
  42.  
  43.     if (argc != 0)
  44.     {
  45.         argc--;
  46.         progname = *(argv++);
  47.     }
  48.     nflags = decode(argc, argv);
  49.     argc -= nflags;
  50.     argv += nflags;
  51.  
  52.     /* Remaining arguments must be filenames; treat "-"
  53.      * specially as standard input.
  54.      * If no arguments, use atandard input.
  55.      */
  56.  
  57.     /* Pass 1: copy to temp file, building table of tags */
  58.     if (!sflag)
  59.     {
  60.         mktemp(tempname);
  61.         if ((tempfile=fopen(tempname, "w"))==NULL)
  62.             fatal("cannot make temporary file");
  63.         setsignals();
  64.     }
  65.     if (argc == 0)
  66.     {
  67.         scan(standard, stdin);
  68.         anydone = 1;
  69.     }
  70.     else
  71.     {
  72.         while (argc != 0)
  73.         {
  74.             if (strcmp(argv[0], "-") == 0)
  75.             {
  76.                 anydone = 1;
  77.                 scan(standard, stdin);
  78.             }
  79.             else
  80.             {
  81.                 if ((input=fopen(argv[0], "r")) == NULL)
  82.                     error("cannot open %s", argv[0]);
  83.                 else
  84.                 {
  85.                     anydone = 1;
  86.                     scan(argv[0], input);
  87.                     fclose(input);
  88.                 }
  89.             }
  90.             argc--;
  91.             argv++;
  92.         }
  93.     }
  94.     if (!sflag)
  95.         fclose(tempfile);
  96.     if (lflag)
  97.         listdefs();
  98.  
  99.     /* Pass 2: translate tags */
  100.  
  101.     if (!anydone)
  102.     {
  103.         unlink(tempname);
  104.         exit(3);
  105.     }
  106.     if (!sflag)
  107.     {
  108.         if ((tempfile=fopen(tempname, "r")) == NULL)
  109.             fatal("temporary file vanished before rescan!");
  110.         rescan();
  111.         unlink(tempname);
  112.     }
  113.     exit(0);
  114. }
  115.  
  116. /* Decode argument list */
  117. us int
  118. decode(argc, argv)
  119.     us int    argc;
  120.     char    *argv[];
  121. {
  122.     int    nflags = 0;
  123.  
  124.     while (argc != 0)
  125.     {
  126.         if (argv[0][0] != '-')
  127.             return nflags;
  128.         switch (argv[0][1])
  129.         {
  130.             case 'd':
  131.                 if ((delimiter=argv[0][2]) == '\0')
  132.                     fatal("missing delimiter after -d");
  133.                 if (argv[0][3] != '\0')
  134.                     fatal("delimiter must be 1 character");
  135.                 break;
  136.             case 'm':
  137.                 if ((macroname[0]=argv[0][2]) == '\0' ||
  138.                     (macroname[1]=argv[0][3]) == '\0' ||
  139.                     argv[0][4] != '\0')
  140.                     fatal(
  141.                         "macro name must be 2 characters");
  142.                 break;
  143.             case 'l':
  144.                 lflag = 1;
  145.                 break;
  146.             case 's':
  147.                 lflag = sflag = 1;
  148.                 break;
  149.             default:
  150.                 fatal("unknown flag '%s'", argv[0]);
  151.                 /*NOTREACHED*/
  152.         }
  153.         argc--;
  154.         argv++;
  155.         nflags++;
  156.     }
  157.     return nflags;
  158. }
  159.