home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Libraries / xmodem 3.10 / batch.c next >
Encoding:
C/C++ Source or Header  |  1994-05-10  |  4.8 KB  |  250 lines  |  [TEXT/MPS ]

  1. /*
  2.  *  Various routines for batch transfer
  3.  */
  4.  
  5. #include "xmodem.h"
  6.  
  7. /* make sure filename sent or received in YMODEM batch is canonical. */
  8.  
  9. /* Incoming: Turn Unix '/' into CP/M ':' and translate to all lower case.
  10.  * Remove trailing dot.
  11.  */
  12.  
  13. unixify (name)
  14. char *name;
  15.     {
  16.     char *ptr;
  17.  
  18.     /* change '/' to ':' and convert to lower case */
  19.     for (ptr=name; *ptr; ++ptr)
  20.         {
  21.         if (*ptr == '/')
  22.             *ptr = ':';
  23.         if (isupper (*ptr))
  24.             *ptr |= 040;
  25.         }
  26.  
  27.     /* remove trailing dot if present */
  28.     ptr--;
  29.     if (*ptr == '.')
  30.         *ptr = '\0';
  31.     }
  32.  
  33. /* make sure filename sent or received in YMODEM batch is canonical. */
  34.  
  35. /* Outgoing: Turn ':' into '/' (for symmetry!) and turn into all lower case.
  36.  * Remove everything before last '/'.  Use "filename" to hold final name.
  37.  */
  38.  
  39. char *
  40. cpmify (name)
  41. char *name;
  42.     {
  43.     char *ptr, *slash;
  44.     char *strcpy();
  45.  
  46.     /* find last '/' and copy rest of name */
  47.  
  48.     slash = name;
  49.     for (ptr=name; *ptr; ++ptr)
  50.         if (*ptr == '/')
  51.             slash = ptr + 1;
  52.     strcpy (filename, slash);
  53.  
  54.     /* change ':' to '/' and covert to all lower case */
  55.  
  56.     for (ptr=filename; *ptr; ++ptr)
  57.         {
  58.         if (*ptr == ':')
  59.             *ptr = '/';
  60.         if (isupper (*ptr))
  61.             *ptr |= 040;
  62.         }
  63.     return (filename);
  64.     }
  65.  
  66.  
  67. /* convert a CP/M file name received in a MODEM7 batch transfer
  68.  * into a unix file name mapping '/' into ':', converting to all
  69.  * upper case and adding dot in proper place.  
  70.  * Use "filename" to hold name.
  71.  * Code stolen from D. Thompson's (IRTF) xmodem.c
  72.  */
  73.  
  74. char *
  75. cpm_unix (string)
  76. unsigned char *string;
  77. {
  78.     register int i;
  79.     unsigned char *iptr, temp;
  80.     register char *optr;
  81.  
  82.     if (*string == '\0')
  83.         error("Null file name in MODEM7 batch receive", TRUE);
  84.  
  85.     for (iptr=string; (temp = *iptr) ; ) {
  86.         temp &= 0177;            /* strips bit 7 */
  87.         if (isupper(temp))
  88.             temp |= 040;        /* set bit 5 for lower case */
  89.         if (temp == '/') 
  90.             temp=':';        /* map / into : */
  91.         *iptr++ = temp;
  92.     }
  93.  
  94.     /* put in main part of name */
  95.     iptr=string;
  96.     optr=filename;
  97.     for (i=0; i<8; i++) {
  98.         if (*iptr != ' ')
  99.             *optr++ = *iptr++;
  100.     }
  101.  
  102.     /* add dot if necessary */
  103.     if (string[8] != ' ' || string[9] != ' ' || string[10] != ' ')
  104.         *optr++ = '.';
  105.  
  106.     /* put in extension */
  107.     iptr = &string[8];
  108.     for (i=0; i<3; i++) {
  109.         if (*iptr != ' ')
  110.             *optr++ = *iptr++;
  111.     }
  112.  
  113.     *optr++ = '\000';
  114.     return (filename);
  115. }
  116.  
  117. /* Send 11 character CP/M filename for MODEM7 batch transmission
  118.  * Returns -1 for a protocol error; 0 if successful
  119.  * NOTE: we tromp a little on the argument string!
  120.  * code stolen from D. Thompson's (IRTF) xmodem.c
  121.  */
  122.  
  123. send_name(name)
  124. char *name;
  125. {
  126.     register int cksum;
  127.     register char *ptr;
  128.  
  129.     xmdebug("send_name");
  130.  
  131.     /* append cp/m EOF */
  132.     name[NAMSIZ] = CTRLZ;
  133.     name[NAMSIZ+1] = '\000';
  134.  
  135.     /* create checksum */
  136.     ptr = name;
  137.     cksum = 0;
  138.     while (*ptr)
  139.         cksum += *ptr++;
  140.     cksum &= 0x00FF;
  141.  
  142.     /* send filename */
  143.  
  144.     sendbyte(ACK);
  145.     ptr = name;
  146.     sendbyte(*ptr++);
  147.  
  148.     while (*ptr) {
  149.  
  150.             switch (readbyte(15)) {
  151.  
  152.             case ACK: break;
  153.  
  154.             case TIMEOUT: {
  155.                 logit("Timeout while sending MODEM7 filename\n");
  156.                 tlogit("Timeout while sending MODEM7 filename\n");
  157.                 sendbyte(BAD_NAME);
  158.                 return (-1);
  159.             }
  160.  
  161.             default: {
  162.                 logit("Error while sending MODEM7 filename\n");
  163.                 tlogit("Error while sending MODEM7 filename\n");
  164.                 sendbyte(BAD_NAME);
  165.                 return (-1);
  166.             }
  167.         }    
  168.  
  169.         sendbyte (*ptr++);
  170.     }
  171.  
  172.     /* Check checksum returned by other side against my value */
  173.     if (readbyte(16) != cksum) {
  174.         logit("Bad checksum while sending MODEM7 filename\n");
  175.         tlogit("Bad checksum while sending MODEM7 filename\n");
  176.         sendbyte(BAD_NAME);
  177.         return (-1);
  178.     }
  179.  
  180.     sendbyte(ACK);
  181.     return (0);
  182. }
  183.  
  184. /* Convert Unix filename to 11 character CP/M file name (8 char name,
  185.  * 3 char extension, dot in between is not included).
  186.  * map ':' into '/'; Use filename to hold name.
  187.  * code stolen from D. Thompson's (IRTF) xmodem.c
  188.  */
  189.  
  190. char *
  191. unix_cpm(string)
  192. char *string;
  193. {
  194.     register char *iptr, *optr, temp;
  195.     int i;
  196.  
  197.     char *rindex();
  198.     char *strcpy();
  199.  
  200.     /* blank 11 character name */
  201.     (void) strcpy (filename,"           ");
  202.  
  203.     /* strip off any path name */
  204.     if ((iptr = rindex(string,'/')))
  205.         iptr++;
  206.     else
  207.         iptr=string;
  208.  
  209.     /* skip leading '.'s */
  210.     while (*iptr == '.')
  211.         iptr++;
  212.  
  213.     /* copy main part of name */
  214.     optr = filename;
  215.     i = 8;
  216.     while ((i--) && (*iptr) && (*iptr != '.'))
  217.         *optr++ = *iptr++;
  218.  
  219.     /* advance to unix extension, or end of unix name */
  220.     while ((*iptr != '.') && (*iptr))
  221.         iptr++;
  222.  
  223.     /* skip over the  '.' */
  224.     while (*iptr == '.')
  225.         iptr++;
  226.  
  227.     /* copy extension */
  228.     optr = &filename[8];
  229.     i=3;
  230.     while ((i--) && (*iptr) && (*iptr != '.'))
  231.         *optr++ = *iptr++;
  232.  
  233.     filename[NAMSIZ] = '\000';
  234.  
  235.     /* Fuss with name */
  236.     for (iptr=filename; (temp = *iptr) ;) {
  237.         temp &= 0177;            /* strip bit 7 (parity bit) */
  238.         if (islower(temp))
  239.             temp &= ~040;        /* make upper case */
  240.         if (temp == ':')
  241.             temp ='/';        /* map ':' into '/' */
  242.         *iptr++ = temp;
  243.     }
  244.  
  245.     if (DEBUG)
  246.         fprintf (LOGFP, "DEBUG: File %s sent as %s\n", string, filename);
  247.  
  248.     return(filename);
  249. }
  250.