|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T b ┃
Length: 4096 (0x1000) Types: TextFile Names: »batch.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/xmodem/batch.c«
/* * Various routines for batch tranfer */ #include "xmodem.h" /* make sure filename sent or received in YMODEM batch is canonical */ /* Turn Unix '/' into CP/M ':' and translate to all lower case */ unixify (name) char *name; { char *ptr; for (ptr=name; *ptr; ++ptr) { if (*ptr == '/') *ptr = ':'; if (isupper (*ptr)) *ptr |= 040; } } cpmify (name) char *name; { char *ptr; for (ptr=name; *ptr; ++ptr) { if (*ptr == ':') *ptr = '/'; if (isupper (*ptr)) *ptr |= 040; } } \f /* convert a CP/M file name received in a MODEM7 batch transfer * into a unix file name mapping '/' into ':', converting to all * upper case and adding dot in proper place. * Use "filename" to hold name. * Code stolen from D. Thompson's (IRTF) xmodem.c */ char *cpm_unix (string) unsigned char *string; { register int i; unsigned char *iptr, temp; register char *optr; if (*string == '\0') error("Null file name in MODEM7 batch receive", TRUE); for (iptr=string; (temp = *iptr) ; ) { temp &= 0177; /* strips bit 7 */ if (isupper(temp)) temp |= 040; /* set bit 5 for lower case */ if (temp == '/') temp=':'; /* map / into : */ *iptr++ = temp; } /* put in main part of name */ iptr=string; optr=filename; for (i=0; i<8; i++) { if (*iptr != ' ') *optr++ = *iptr++; } /* add dot */ *optr++ = '.'; /* put in extension */ iptr = &string[8]; for (i=0; i<3; i++) { if (*iptr != ' ') *optr++ = *iptr++; } *optr++ = '\000'; return (filename); } \f /* Send 11 character CP/M filename for MODEM7 batch transmission * Returns -1 for a protocol error; 0 if successful * NOTE: we tromp a little on the argument string! * code stolen from D. Thompson's (IRTF) xmodem.c */ send_name(name) char *name; { register int cksum; register char *ptr; xmdebug("send_name"); /* append cp/m EOF */ name[NAMSIZ] = CTRLZ; name[NAMSIZ+1] = '\000'; /* create checksum */ ptr = name; cksum = 0; while (*ptr) cksum += *ptr++; cksum &= 0x00FF; /* send filename */ sendbyte(ACK); ptr = name; sendbyte(*ptr++); while (*ptr) { checknak: switch (readbyte(6)) { case CAN: { if (readbyte(3) == CAN) error("Program Canceled by User",TRUE); else goto checknak; } case ACK: break; case TIMEOUT: { logit("Timeout while sending filename\n"); sendbyte(BAD_NAME); return (-1); } default: { logit("Error while sending filename\n"); sendbyte(BAD_NAME); return (-1); } } sendbyte (*ptr++); } /* Check checksum returned by other side against my value */ if (readbyte(10) != cksum) { logit("Bad checksum while sending filename\n"); sendbyte(BAD_NAME); return (-1); } sendbyte(ACK); return (0); } \f /* Convert Unix filename to 11 character CP/M file name (8 char name, * 3 char extension, dot in between is not included). * map ':' into '/'; Use filename to hold name. * code stolen from D. Thompson's (IRTF) xmodem.c */ char *unix_cpm(string) char *string; { register char *iptr, *optr, temp; int i; char *rindex(); char *strcpy(); /* blank 11 character name */ (void) strcpy (filename," "); /* strip off any path name */ if ((iptr = rindex(string,'/'))) iptr++; else iptr=string; /* skip leading '.'s */ while (*iptr == '.') iptr++; /* copy main part of name */ optr = filename; i = 8; while ((i--) && (*iptr) && (*iptr != '.')) *optr++ = *iptr++; /* advance to unix extension, or end of unix name */ while ((*iptr != '.') && (*iptr)) iptr++; /* skip over the '.' */ while (*iptr == '.') iptr++; /* copy extension */ optr = &filename[8]; i=3; while ((i--) && (*iptr) && (*iptr != '.')) *optr++ = *iptr++; filename[NAMSIZ] = '\000'; /* Fuss with name */ for (iptr=filename; (temp = *iptr) ;) { temp &= 0177; /* strip bit 7 (parity bit) */ if (islower(temp)) temp &= ~040; /* make upper case */ if (temp == ':') temp ='/'; /* map ':' into '/' */ *iptr++ = temp; } if (DEBUG) fprintf (LOGFP, "DEBUG: File %s sent as %s\n", string, filename); return(filename); }