home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / macutils.lzh / MACUTILS / COMM / tomac.c < prev    next >
C/C++ Source or Header  |  1995-09-18  |  5KB  |  243 lines

  1. #include <stdio.h>
  2. #include "comm.h"
  3. #include "../fileio/machdr.h"
  4. #include "../fileio/rdfile.h"
  5. #include "../util/patchlevel.h"
  6. #include "globals.h"
  7.  
  8. extern char *malloc();
  9. extern char *realloc();
  10. extern char *strcat();
  11. extern void exit();
  12. extern void transname();
  13. extern void do_indent();
  14. extern void dofile();
  15. extern void setup_tty();
  16. extern void reset_tty();
  17.  
  18. #define LOCALOPT    "ilqxyzoTVH"
  19.  
  20. static void usage();
  21.  
  22. static char options[128];
  23. static char *dir_stack;
  24. static int dir_ptr = -64;
  25. static int dir_max;
  26.  
  27. int main(argc, argv)
  28. int argc;
  29. char **argv;
  30. {
  31.     int c, i, j, n;
  32.     extern int optind;
  33.     extern char *optarg;
  34.     int errflg;
  35.     char text[32], ftype[5], fauth[5];
  36.     int dir_skip = 0, write_it, query = 0, list = 0, info_only = 0;
  37.     int indent = 0;
  38.  
  39.     (void)strcat(options, get_rdfileopt());
  40.     (void)strcat(options, LOCALOPT);
  41.     errflg = 0;
  42.  
  43.     while((c = getopt(argc, argv, options)) != EOF) {
  44.     if(!rdfileopt((char)c)) {
  45.         switch(c) {
  46.         case 'l':
  47.         list++;
  48.         break;
  49.         case 'q':
  50.         query++;
  51.         break;
  52.         case 'i':
  53.         info_only++;
  54.         break;
  55.         case 'o':
  56.         pre_beta++;
  57.         case 'x':
  58.         xfertype = XMODEM;
  59. #ifndef XM
  60.         (void)fprintf(stderr, "XMODEM not supported\n");
  61.         exit(1);
  62. #else /* XM */
  63.         break;
  64. #endif /* XM */
  65.         case 'y':
  66.         xfertype = YMODEM;
  67. #ifndef YM
  68.         (void)fprintf(stderr, "YMODEM not supported\n");
  69.         exit(1);
  70. #else /* YM */
  71.         break;
  72. #endif /* YM */
  73.         case 'z':
  74.         xfertype = ZMODEM;
  75. #ifndef ZM
  76.         (void)fprintf(stderr, "ZMODEM not supported\n");
  77.         exit(1);
  78. #else /* ZM */
  79.         break;
  80. #endif /* ZM */
  81.         case 'T':
  82.         time_out++;
  83.         break;
  84.         case '?':
  85.         errflg++;
  86.         break;
  87.         case 'H':
  88.         give_rdfileopt();
  89.         (void)fprintf(stderr, "Tomac specific options:\n");
  90.         (void)fprintf(stderr,
  91.             "-i:\tgive information only, do not write\n");
  92.         (void)fprintf(stderr, "-l:\tgive listing\n");
  93.         (void)fprintf(stderr,
  94.             "-q:\tquery for every file/folder before writing\n");
  95. #ifdef XM
  96.         (void)fprintf(stderr, "-x:\tuse XMODEM protocol\n");
  97. #endif /* XM */
  98. #ifdef YM
  99.         (void)fprintf(stderr, "-y:\tuse YMODEM protocol\n");
  100. #endif /* YM */
  101. #ifdef ZM
  102.         (void)fprintf(stderr, "-z:\tuse ZMODEM protocol\n");
  103. #endif /* ZM */
  104.         (void)fprintf(stderr, "-o:\tuse pre-beta protocol\n");
  105.         (void)fprintf(stderr, "-T:\tdetect time-outs\n");
  106.         (void)fprintf(stderr,
  107.             "-V:\tgive information about this version\n");
  108.         (void)fprintf(stderr, "-H:\tthis message\n");
  109.         (void)fprintf(stderr,
  110.             "Default is silent sending with XMODEM\n");
  111.         exit(0);
  112.         case 'V':
  113.         (void)fprintf(stderr, "Version %s, ", VERSION);
  114.         (void)fprintf(stderr, "patchlevel %d", PATCHLEVEL);
  115.         (void)fprintf(stderr, "%s.\n", get_minb());
  116.         (void)fprintf(stderr, "Supported protocols:\n");
  117. #ifdef XM
  118.         (void)fprintf(stderr, "\tXMODEM\n");
  119. #endif /* XM */
  120. #ifdef YM
  121.         (void)fprintf(stderr, "\tYMODEM\n");
  122. #endif /* YM */
  123. #ifdef ZM
  124.         (void)fprintf(stderr, "\tZMODEM\n");
  125. #endif /* ZM */
  126.         exit(0);
  127.         }
  128.     }
  129.     }
  130.     if(errflg) {
  131.     usage();
  132.     exit(1);
  133.     }
  134.  
  135.     if(info_only || query) {
  136.     list++;
  137.     }
  138.  
  139.     setup(argc - optind, argv + optind);
  140.     while((i = nextfile()) != ISATEND) {
  141.     if(dir_skip) {
  142.         if(i == ISDIR) {
  143.         dir_skip++;
  144.         } else if(i == ENDDIR) {
  145.         dir_skip--;
  146.         }
  147.         continue;
  148.     }
  149.  
  150.     write_it = 1;
  151.     n = file_info[I_NAMEOFF] & 0x7f;
  152.     transname(file_info + I_NAMEOFF + 1, text, n);
  153.     if(i == ISFILE) {
  154.         transname(file_info + I_TYPEOFF, ftype, 4);
  155.         transname(file_info + I_AUTHOFF, fauth, 4);
  156.     }
  157.     if(list) {
  158.         if(i == ISFILE) {
  159.         do_indent(indent);
  160.         (void)fprintf(stderr,
  161.             "name=\"%s\", type=%4.4s, author=%4.4s, data=%ld, rsrc=%ld",
  162.             text, ftype, fauth, (long)data_size, (long)rsrc_size);
  163.         } else if(i == ISDIR) {
  164.         do_indent(indent);
  165.         dir_ptr += 64;
  166.         if(dir_ptr == dir_max) {
  167.             if(dir_max == 0) {
  168.             dir_stack = malloc(64);
  169.             } else {
  170.             dir_stack = realloc(dir_stack, (unsigned)dir_max + 64);
  171.             }
  172.             dir_max += 64;
  173.             if(dir_stack == NULL) {
  174.             (void)fprintf(stderr, "Insufficient memory\n");
  175.             exit(1);
  176.             }
  177.         }
  178.         for(j = 0; j <= n; j++) {
  179.             dir_stack[dir_ptr + j] = text[j];
  180.         }
  181.         (void)fprintf(stderr, "folder=\"%s\"", text);
  182.         indent++;
  183.         } else {
  184.         indent--;
  185.         do_indent(indent);
  186.         (void)fprintf(stderr, "leaving folder \"%s\"",
  187.             dir_stack + dir_ptr);
  188.         dir_ptr -= 64;
  189.         }
  190.         if(info_only) {
  191.         write_it = 0;
  192.         }
  193.         if(query) {
  194.         if(i != ENDDIR) {
  195.             write_it = do_query();
  196.         } else {
  197.             (void)fputc('\n', stderr);
  198.         }
  199.         if(!write_it && i == ISDIR) {
  200.             dir_skip = 1;
  201.             indent--;
  202.             dir_ptr -= 64;
  203.         }
  204.         } else {
  205.         (void)fputc('\n', stderr);
  206.         }
  207.     }
  208.  
  209.     if(write_it) {
  210.         if(i == ISFILE) {
  211.         setup_tty();
  212.         switch(xfertype) {
  213. #ifdef XM
  214.         case XMODEM:
  215.             xm_to();
  216.             break;
  217. #endif /* XM */
  218. #ifdef YM
  219.         case YMODEM:
  220.             ym_to();
  221.             break;
  222. #endif /* YM */
  223. #ifdef ZM
  224.         case ZMODEM:
  225.             zm_to();
  226.             break;
  227. #endif /* ZM */
  228.         }
  229.         reset_tty();
  230.         }
  231.     }
  232.     }
  233.     exit(0);
  234.     /* NOTREACHED */
  235. }
  236.  
  237. static void usage()
  238. {
  239.     (void)fprintf(stderr, "Usage: tomac [-%s] [files]\n", options);
  240.     (void)fprintf(stderr, "Use \"tomac -H\" for help.\n");
  241. }
  242.  
  243.