home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3107 / describe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-22  |  3.5 KB  |  161 lines

  1. /* describe.c -    Set or list a descriptive comment for a file
  2.  *
  3.  * Copyright (c) 1991 Tim Cook.
  4.  * Non-profit distribution allowed.  See README for details.
  5.  */
  6.  
  7. static char rcsid[] = "$Header: describe.c 1.0 91/03/22 $" ;
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <sys/types.h>
  12. #include <sys/dir.h>
  13. #include <sys/file.h>
  14. #include <sys/stat.h>
  15. #ifdef NDBM
  16. #include <ndbm.h>
  17. #else
  18. #if defined(sequent) && defined(NULL)
  19. #undef NULL    /* On the Sequent, dbm.h #define's NULL */
  20. #endif
  21. #include <dbm.h>
  22. #endif
  23. #include <vclib.h>
  24.  
  25. #ifdef sequent
  26. #define strrchr    rindex
  27. #endif
  28.  
  29. #define NULL_CP    ((char *) 0)
  30. #define EOS    '\0'
  31.  
  32. static char *program_name ;
  33. #ifdef NDBM
  34. static DBM *desc_database ;
  35. #endif
  36.  
  37. static void usage () ;
  38. static int init_desc_file () ;
  39. static void set_description () ;
  40. static void set_from_file () ;
  41. static void delete_description () ;
  42. static void list_descriptions () ;
  43.  
  44.  
  45. int main (argc, argv)
  46.    int argc ;
  47.    char **argv ;
  48. {
  49.    extern char *optarg ;
  50.    extern int optind, opterr ;
  51.    char directory[MAXNAMLEN+1] ;
  52.    char file_name[MAXNAMLEN+1] ;
  53.    int delete_desc = FALSE ;
  54.    struct stat status ;
  55.    int option ;
  56.    char *p ;
  57.  
  58.    program_name = argv[0] ;
  59.    while ((option = getopt (argc, argv, "dls:")) != EOF) {
  60.       switch (option) {
  61.      case 's':    /* Set descriptions from file */
  62.         if (delete_desc)
  63.            usage () ;
  64.         if (optind >= argc)
  65.            p = "." ;
  66.         else
  67.            p = argv[optind] ;
  68.         init_desc_file (p, FALSE) ;
  69.         set_from_file (optarg, p) ;
  70. #ifdef NDBM
  71.         dbm_close (desc_database) ;
  72. #else
  73.         dbmclose () ;
  74. #endif
  75.         exit (0) ;
  76.         break ;
  77.          case 'l':    /* List directory */
  78.         if (delete_desc)
  79.            usage () ;
  80.         if (optind >= argc)
  81.            p = "." ;
  82.         else
  83.            p = argv[optind] ;
  84.         if (! init_desc_file (p, TRUE)) {
  85.            fprintf (stderr, "%s: no descriptions for directory %s\n",
  86.           program_name, p) ;
  87.            exit (2) ; }
  88.         list_descriptions () ;
  89. #ifdef NDBM
  90.         dbm_close (desc_database) ;
  91. #else
  92.         dbmclose () ;
  93. #endif
  94.         exit (0) ;
  95.         break ;
  96.          case 'd':    /* Delete description(s) */
  97.         delete_desc = TRUE ;
  98.         break ;
  99.          default:
  100.         usage () ; } }
  101.  
  102.    if (delete_desc) {
  103.       if (optind >= argc)
  104.      usage () ;
  105.       for ( ; optind < argc ; optind++) {
  106.      split_pathname (argv[optind], directory, file_name) ;
  107.      if (stat (argv[optind], &status) == -1) {
  108.         perror2 (program_name, argv[optind]) ; }
  109.      else {
  110.         init_desc_file (directory, FALSE) ;
  111.         delete_description (file_name, status.st_ino) ; } } }
  112.    else {
  113.       if (argc != 3)
  114.      usage () ;
  115.  
  116.       /* Set description of specified file */
  117.       split_pathname (argv[1], directory, file_name) ;
  118.       if (stat (argv[1], &status) == -1) {
  119.      perror2 (program_name, argv[1]) ;
  120.      exit (2) ; }
  121.       init_desc_file (directory, FALSE) ;
  122.       set_description (file_name, status.st_ino, argv[2]) ; }
  123.  
  124. #ifdef NDBM
  125.    dbm_close (desc_database) ;
  126. #else
  127.    dbmclose () ;
  128. #endif
  129.    }
  130.  
  131.  
  132. static
  133. void usage ()
  134. {
  135.    fprintf (stderr, "\
  136. usage: %s <file> <description>\n\
  137.    or: %s -s <descriptions-file> [<directory>]\n\
  138.    or: %s -d <file> ...\n\
  139.    or: %s -l [<directory>]\n",
  140.       program_name, program_name, program_name, program_name) ;
  141.    exit (1) ;
  142.    }
  143.  
  144.  
  145. static
  146. void set_from_file (file, directory)
  147.    char *file ;
  148.    char *directory ;
  149. {
  150.    FILE *descriptions ;
  151.    char file_name[MAXNAMLEN+1] ;
  152.    char buffer[1024] ;
  153.    char description[256] ;
  154.    struct stat status ;
  155.    int n ;
  156.  
  157.    if (strcmp (file, "-") == 0)
  158.       descriptions = stdin ;
  159.    else {
  160.       if ((descriptions = fopen (file, "r")) == (FILE *) NULL) {
  161.