home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / TERMS / ZMP-SRC.LZH / ZMXFER.C < prev    next >
Text File  |  2000-06-30  |  15KB  |  465 lines

  1. /***************************** Transfer Module ******************************/
  2.  
  3. #include "zmp.h"
  4.  
  5. #ifdef   AZTEC_C
  6. #include "libc.h"
  7. #else
  8. #include <stdio.h>
  9. #endif
  10.  
  11. #include <setjmp.h>
  12. jmp_buf jb_stop;
  13.  
  14. ovmain(a)
  15. char a;
  16.  
  17. {
  18.     Sending = QuitFlag = StopFlag = FALSE;
  19.     if (a == 'S')
  20.         sendout(NULL);
  21.     else
  22.         bringin(NULL);
  23. }
  24.  
  25.  
  26. sendout(prot)
  27. int prot;
  28. {
  29.     static int kbdata, count, result;
  30.  
  31.     result = NERROR;
  32.     if (!prot)
  33.         kbdata = protocol(TRUE);
  34.     else
  35.         kbdata = prot;
  36.     flush();
  37.  
  38. #ifdef HOSTON
  39.     if (Inhost) {
  40.         if (count=getpathname("(s) for Download"))
  41.             mstrout("\nBegin your Download procedure...",TRUE);
  42.     }
  43.     else 
  44. #endif
  45.  
  46.     count = getpathname("(s) for Transmit");
  47.     if (count) {
  48.         switch(kbdata) {
  49.                   case 'K':
  50.                 Blklen = KSIZE;
  51.                 Xmodem = TRUE;
  52.                 Zmodem = FALSE;
  53.                 result = wcsend(1,Pathlist);
  54.                 break;
  55.             case 'X':
  56.                 Blklen = 128;
  57.                 Xmodem = TRUE;
  58.                 Zmodem = FALSE;
  59.                 result = wcsend(1,Pathlist);
  60.                 break;
  61.             case 'Y':
  62.                 Zmodem = Xmodem = FALSE;
  63.                 result = wcsend(count,Pathlist);
  64.                 break;
  65.             case 'Z':
  66.                 Zmodem = TRUE;
  67.                 Xmodem = FALSE;
  68.                 XonXoffOk = XonXoff;    /* maybe allow xon-xoff */
  69.                 result = wcsend(count,Pathlist);
  70.                 break;
  71.             case 'A':
  72.                 XonXoffOk = XonXoff;
  73.                 result = asciisend(Pathlist[0]);
  74.                 break;
  75.             default:
  76.                 result = !OK;
  77.                 break;
  78.         }
  79.     }
  80.     endstat(result,count);
  81.     return result;
  82. }
  83.  
  84. bringin(prot)
  85. int prot;
  86. {
  87.     static int kbdata, count, result;
  88.  
  89.     count = 0;
  90.     result = NERROR;
  91.     if (Zmodem)
  92.         kbdata = 'Z';    /* auto receive from TERM */
  93.     else {
  94.         if (!prot)
  95.             kbdata = protocol(FALSE);
  96.         else
  97.             kbdata = prot;
  98.     }
  99.     flush();
  100.     switch(kbdata) {
  101.            case 'X':
  102. #ifdef HOSTON
  103.             if (Inhost) {
  104.                 if (count=getpathname(" to Upload"))
  105.                     mstrout("\nBegin your Upload ",
  106.                         "procedure...",TRUE);
  107.             }
  108.             else
  109. #endif
  110.  
  111.             count = getpathname(" to Receive");
  112.             if (!count)
  113.                 break;
  114.             Zmodem = FALSE;
  115.             Nozmodem = Xmodem = TRUE;
  116.             result = wcreceive(Pathlist[0]);      /* just one file */
  117.             break;
  118.         case 'Y':
  119.             Zmodem = Xmodem = FALSE;
  120.             Nozmodem = TRUE;
  121.  
  122. #ifdef HOSTON
  123.             if (Inhost)
  124.                 mstrout("\nBegin your Upload procedure...",TRUE);
  125. #endif
  126.  
  127.             result = wcreceive(NULL);
  128.             break;
  129.         case 'Z':
  130.             Zmodem = TRUE;
  131.             Nozmodem = Xmodem = FALSE;
  132.  
  133. #ifdef HOSTON
  134.             if (Inhost)
  135.                 mstrout("\nBegin your Upload procedure...",TRUE);
  136. #endif
  137.  
  138.             result = wcreceive(NULL);
  139.             break;
  140.         default:
  141.             break;
  142.     }
  143.     endstat(result,count);
  144.     return result;
  145. }
  146.  
  147. /* Clean up at end and report */
  148. endstat(result, count)
  149. int result, count;
  150. {
  151.     XonXoffOk = FALSE;    /* disable xon-xoff */
  152.     freepath(count);
  153.     LOCATE(BR+2,1);
  154.     printf("\nTransfer %s\n",result==OK?"Successful":"Aborted");
  155.     flush();
  156. }
  157.  
  158. protocol(for_send)
  159. int for_send;        /* select block size in transmit only */
  160. {
  161.     static int c;
  162.     static char *buffer;
  163.    
  164.     buffer = Pathname;
  165.     sprintf(buffer,"\n%sXmodem, %sYmodem, or Zmodem? (%sX,%sY,Z) <Z>  ",
  166.         for_send ? "ASCII, " : "",
  167.         for_send ? "Xmodem-1k, " : "",
  168.         for_send ? "A," : "",
  169.         for_send ? "K," : "" );
  170.  
  171. #ifdef HOSTON
  172.     if (Inhost) {
  173.         mstrout(buffer,TRUE);
  174.         purgeline();
  175.         c = toupper(mgetchar(20));
  176.         if (c == CR)
  177.             c = 'Z';
  178.         mcharout(c);
  179.         return c;
  180.     }
  181.    else {
  182. #endif
  183.  
  184.     printf(buffer);
  185.     flush();
  186.     c = toupper(chrin());
  187.     if (c == CR)
  188.     c = 'Z';
  189.  
  190. #ifdef HOSTON
  191.     }
  192. #endif
  193.  
  194.     return c;
  195. }
  196.  
  197.  
  198. /* crctab calculated by Mark G. Mendel, Network Systems Corporation */
  199. static unsigned crctab[256] = {
  200.     0x0000,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
  201.     0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
  202.     0x1231,  0x0210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
  203.     0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
  204.     0x2462,  0x3443,  0x0420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
  205.     0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
  206.     0x3653,  0x2672,  0x1611,  0x0630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
  207.     0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
  208.     0x48c4,  0x58e5,  0x6886,  0x78a7,  0x0840,  0x1861,  0x2802,  0x3823,
  209.     0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
  210.     0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0x0a50,  0x3a33,  0x2a12,
  211.     0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
  212.     0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0x0c60,  0x1c41,
  213.     0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
  214.     0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0x0e70,
  215.     0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
  216.     0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
  217.     0x1080,  0x00a1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
  218.     0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
  219.     0x02b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
  220.     0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
  221.     0x34e2,  0x24c3,  0x14a0,  0x0481,  0x7466,  0x6447,  0x5424,  0x4405,
  222.     0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
  223.     0x26d3,  0x36f2,  0x0691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
  224.     0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
  225.     0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x08e1,  0x3882,  0x28a3,
  226.     0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
  227.     0x4a75,  0x5a54,  0x6a37,  0x7a16,  0x0af1,  0x1ad0,  0x2ab3,  0x3a92,
  228.     0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
  229.     0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0x0cc1,
  230.     0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
  231.     0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0x0ed1,  0x1ef0
  232. };
  233.  
  234. /*
  235.  * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. 
  236.  *  NOTE: First argument must be in range 0 to 255.
  237.  *        Second argument is referenced twice.
  238.  * 
  239.  * Programmers may incorporate any or all code into their programs, 
  240.  * giving proper credit within the source. Publication of the 
  241.  * source routines is permitted so long as proper credit is given 
  242.  * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, 
  243.  * Omen Technology.
  244.  */
  245.  
  246. updcrc(cp, crc)
  247. unsigned cp, crc;
  248. {
  249.    return ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp);
  250. }
  251.  
  252. /*
  253.  * Copyright (C) 1986 Gary S. Brown.  You may use this program, or
  254.  * code or tables extracted from it, as desired without restriction.
  255.  */
  256.  
  257. /* First, the polynomial itself and its table of feedback terms.  The  */
  258. /* polynomial is                                                       */
  259. /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
  260. /* Note that we take it "backwards" and put the highest-order term in  */
  261. /* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
  262. /* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
  263. /* the MSB being 1.                                                    */
  264.  
  265. /* Note that the usual hardware shift register implementation, which   */
  266. /* is what we're using (we're merely optimizing it by doing eight-bit  */
  267. /* chunks at a time) shifts bits into the lowest-order term.  In our   */
  268. /* implementation, that means shifting towards the right.  Why do we   */
  269. /* do it this way?  Because the calculated CRC must be transmitted in  */
  270. /* order from highest-order term to lowest-order term.  UARTs transmit */
  271. /* characters in order from LSB to MSB.  By storing the CRC this way,  */
  272. /* we hand it to the UART in the order low-byte to high-byte; the UART */
  273. /* sends each low-bit to hight-bit; and the result is transmission bit */
  274. /* by bit from highest- to lowest-order term without requiring any bit */
  275. /* shuffling on our part.  Reception works similarly.                  */
  276.  
  277. /* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
  278. /*                                                                     */
  279. /*     The table can be generated at runtime if desired; code to do so */
  280. /*     is shown later.  It might not be obvious, but the feedback      */
  281. /*     terms simply represent the results of eight shift/xor opera-    */
  282. /*     tions for all combinations of data and CRC register values.     */
  283. /*                                                                     */
  284. /*     The values must be right-shifted by eight bits by the "updcrc"  */
  285. /*     logic; the shift must be unsigned (bring in zeroes).  On some   */
  286. /*     hardware you could probably optimize the shift in assembler by  */
  287. /*     using byte-swap instructions.                                   */
  288.  
  289. static long cr3tab[] = { /* CRC polynomial 0xedb88320 */
  290.  
  291.     0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
  292.     0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
  293.     0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  294.     0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
  295.     0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  296.     0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  297.     0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
  298.     0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
  299.     0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  300.     0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  301.     0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
  302.     0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  303.     0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
  304.     0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
  305.     0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  306.     0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
  307.     0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
  308.     0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  309.     0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
  310.     0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  311.     0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  312.     0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
  313.     0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
  314.     0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  315.     0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  316.     0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
  317.     0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  318.     0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
  319.     0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
  320.     0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  321.     0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
  322.     0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
  323. };
  324.  
  325. long
  326. updc32(b,c)
  327. int b;
  328. long c;
  329. {
  330.     return (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF));
  331. }
  332.  
  333.  
  334.  
  335. asciisend(file)  /* send ascii file with xon/xoff protocol */
  336. char *file;
  337. {
  338.     char *grabmem();
  339.     static int fd, status, bytes, c;
  340.     static char *inbuf;
  341.     static unsigned j, bufsize;
  342.  
  343.     status = NERROR;
  344.     inbuf = grabmem(&bufsize);
  345.     if (allocerror(inbuf))
  346.         return NERROR;
  347.  
  348. #ifdef AZTEC_C
  349.     fd = fopen(file,"rb");
  350.     if (openerror(fd,file,BUFIOT)) {
  351. #else 
  352.     fd = open(file,0);
  353.     if (openerror(fd,file,UBIOT)) {
  354. #endif
  355.  
  356.         free(inbuf);
  357.         return NERROR;
  358.     }
  359.  
  360. #ifdef   DEBUG
  361.     printf("\nbufsize = %d\n",bufsize);
  362. #endif
  363.  
  364.     sprintf(Buf,"Sending %s, ASCII Transfer",file);
  365.     putlabel(Buf);
  366.     j = 0;
  367.  
  368. #ifdef AZTEC_C
  369.     while ((bytes = fread(inbuf,1,bufsize,fd)) > 0) {
  370. #else
  371.     while ((bytes = read(fd,inbuf,bufsize)) > 0) {
  372. #endif
  373.  
  374.         c = inbuf[0];
  375.         for (j = 0; (j < bytes) && (c != CTRLZ); c = inbuf[++j]) {
  376.             xmchout(c);
  377.             opabort();
  378.             if (QuitFlag || StopFlag) /* xmchout tests for xoff */
  379.                 goto cleanup;    /* abort */
  380.             putchar(c);
  381.             if ((c & 0x7f) == CR) {
  382.                 if (Linedelay)
  383.                     mswait(Linedelay);
  384.             }
  385.             else {
  386.                 if (Chardelay)
  387.                     mswait(Chardelay);
  388.             }
  389.             if (QuitFlag == TRUE)
  390.                 goto cleanup;
  391.         }
  392.     }
  393.     status = OK;
  394.  
  395. cleanup:
  396.  
  397. #ifdef AZTEC_C
  398.     fclose(fd);
  399. #else
  400.     close(fd);
  401. #endif
  402.  
  403.     free(inbuf);
  404.     return status;
  405. }
  406.  
  407. checkpath(name)  /* eliminate bad paths in receive */
  408. char *name;
  409. {
  410.     char *p, c, *index();
  411.     short i;
  412.     static char badchar[] = ",;:_[]=<>/";    /* disallowed f/n characters */
  413.  
  414.     for (p=name; *p; p++) {             /* dump strange characters */
  415.  
  416. #ifdef AZTEC_C
  417.         if (!isalpha(*p) && !isdigit(*p) && (*p != '.')) {
  418. #else
  419.         if (!(((c = *p) > '!') && (c < 0x7f) && !index(badchar,c))) {
  420. #endif
  421.  
  422.             *p = '\0';
  423.             strcat(name,p+1);
  424.         }
  425.     }
  426.     if ((i = index(name,'.') - name) > 8) {
  427.         p = name + i;
  428.         name[8] = '.';
  429.         name[9] = '\0';
  430.         p[3] = '\0';
  431.         strcat(name,p);
  432.     }
  433.     name[12] = '\0';
  434.     report(PATHNAME,name);
  435. }
  436.  
  437. /* output a character to the modem and test the receive channel */
  438. xmchout(c)
  439. char c;
  440. {
  441.     testrxc(200);    /* test receive channel */
  442.     mcharout(c);    /* then send it */
  443. }
  444.  
  445. /* Test receive channel for xon/xoff and interrupt while sending */
  446. testrxc(timeout)
  447. short timeout;        /* timeout in seconds */
  448. {
  449.     static char c;
  450.  
  451.     c = minprdy() ? mcharinp() : '\0';    /* get a character if any */
  452.     if (c) {
  453.         if (XonXoffOk && (c == CTRLS)) {
  454.             while (((c = readline(10)) != CTRLQ) && timeout--);
  455.             if (c < 1)
  456.                 c = CTRLC;    /* timeout */
  457.         }
  458.         StopFlag = ((c == CTRLC) || (c == CTRLX) || (c == '*'));
  459.         if (StopFlag && Zmodem && Sending)
  460.             longjmp(jb_stop,c);    /* zmodem transmit interrupt */
  461.     }
  462. }
  463.  
  464. /*        End of Transfer Overlay File #1 */
  465.