Thread View: mod.amiga.sources
1 messages
1 total messages
Started by doc
Tue, 23 Sep 1986 14:58
VT100 Terminal Emulator (V2.1 DBW 860915) Part 2 of 2
Author: doc
Date: Tue, 23 Sep 1986 14:58
Date: Tue, 23 Sep 1986 14:58
2554 lines
73776 bytes
73776 bytes
Reply-To: wecker%cookie.DEC@decwrl.DEC.COM (DAVE TANSTAAFL WECKER)
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# expand.c
# init.c
# remote.c
# script.c
# window.c
# xmodem.c
# This archive created: Sun Sep 14 22:42:46 1986
echo shar: extracting expand.c
sed 's/^XX//' << \SHAR_EOF > expand.c
XX/*************************************************************
XX * vt100 terminal emulator - Wild card and Directory support
XX * v2.1 860915 DBW - new features (see README)
XX * 860830 Steve Drew Added Wild card support, features(expand.c)
XX * v2.0 860809 DBW - Major rewrite
XX * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes
XX * v1.0 860712 DBW - First version released
XX *
XX * Much of the code from this module extracted from
XX * Matt Dillons Shell program. (Thanxs Matt.)
XX *************************************************************/
XX
XX#define MODULE_EXPAND 1
XX#include "vt100.h"
XX
XXstruct DPTR { /* Format of directory fetch pointer */
XX struct FileLock *lock; /* lock on directory */
XX struct FileInfoBlock *fib; /* mod'd fib for entry */
XX};
XX
XX/*
XX * Disk directory routines
XX *
XX *
XX * dopen() returns a struct DPTR, or NULL if the given file does not
XX * exist. stat will be set to 1 if the file is a directory. If the
XX * name is "", then the current directory is openned.
XX *
XX * dnext() returns 1 until there are no more entries. The **name and
XX * *stat are set. *stat = 1 if the file is a directory.
XX *
XX * dclose() closes a directory channel.
XX *
XX */
XX
XXstruct DPTR *
XXdopen(name, stat)
XXchar *name;
XXint *stat;
XX{
XX struct DPTR *dp;
XX int namelen, endslash = 0;
XX struct FileLock *MyLock;
XX
XX MyLock = (struct FileLock *)( (ULONG) ((struct Process *)
XX (FindTask(NULL)))->pr_CurrentDir);
XX namelen = strlen(name);
XX if (namelen && name[namelen - 1] == '/') {
XX name[namelen - 1] = '\0';
XX endslash = 1;
XX }
XX *stat = 0;
XX dp = (struct DPTR *)malloc(sizeof(struct DPTR));
XX if (*name == '\0')
XX dp->lock = (struct FileLock *)DupLock (MyLock);
XX else
XX dp->lock = (struct FileLock *)Lock (name, ACCESS_READ);
XX if (endslash)
XX name[namelen - 1] = '/';
XX if (dp->lock == NULL) {
XX free (dp);
XX return (NULL);
XX }
XX dp->fib = (struct FileInfoBlock *)
XX AllocMem((long)sizeof(struct FileInfoBlock), MEMF_PUBLIC);
XX if (!Examine (dp->lock, dp->fib)) {
XX dclose (dp);
XX return (NULL);
XX }
XX if (dp->fib->fib_DirEntryType >= 0)
XX *stat = 1;
XX return (dp);
XX}
XX
XXdnext(dp, pname, stat)
XXstruct DPTR *dp;
XXchar **pname;
XXint *stat;
XX{
XX if (dp == NULL)
XX return (0);
XX if (ExNext (dp->lock, dp->fib)) {
XX *stat = (dp->fib->fib_DirEntryType < 0) ? 0 : 1;
XX *pname = dp->fib->fib_FileName;
XX return (1);
XX }
XX return (0);
XX}
XX
XX
XXdclose(dp)
XXstruct DPTR *dp;
XX{
XX if (dp == NULL)
XX return (1);
XX if (dp->fib)
XX FreeMem (dp->fib, (long)sizeof(*dp->fib));
XX if (dp->lock)
XX UnLock (dp->lock);
XX free (dp);
XX return (1);
XX}
XX
XXfree_expand(av)
XXchar **av;
XX{
XX char **base = av;
XX
XX if (av) {
XX while (*av) {
XX free (*av);
XX ++av;
XX }
XX free (base);
XX }
XX}
XX
XX/*
XX * EXPAND(wild_name, pac)
XX * wild_name - char * (example: "df0:*.c")
XX * pac - int * will be set to # of arguments.
XX *
XX */
XX
XX
XXchar **
XXexpand(base, pac)
XXchar *base;
XXint *pac;
XX{
XX char **eav = (char **)malloc (sizeof(char *));
XX int eleft, eac;
XX
XX char *ptr, *name;
XX char *bname, *ename, *tail;
XX int stat, scr;
XX struct DPTR *dp;
XX
XX *pac = eleft = eac = 0;
XX base = strcpy(malloc(strlen(base)+1), base);
XX for (ptr = base; *ptr && *ptr != '?' && *ptr != '*'; ++ptr);
XX for (; ptr >= base && !(*ptr == '/' || *ptr == ':'); --ptr);
XX if (ptr < base) {
XX bname = strcpy (malloc(1), "");
XX } else {
XX scr = ptr[1];
XX ptr[1] = '\0';
XX bname = strcpy (malloc(strlen(base)+1), base);
XX ptr[1] = scr;
XX }
XX ename = ptr + 1;
XX for (ptr = ename; *ptr && *ptr != '/'; ++ptr);
XX scr = *ptr;
XX *ptr = '\0';
XX tail = (scr) ? ptr + 1 : NULL;
XX
XX if ((dp = dopen (bname, &stat)) == NULL || stat == 0) {
XX free (bname);
XX free (base);
XX free (eav);
XX emits ("Could not open directory");
XX return (NULL);
XX }
XX while (dnext (dp, &name, &stat)) {
XX if (compare_ok(ename, name)) {
XX if (tail) {
XX int alt_ac;
XX char *search, **alt_av, **scrav;
XX struct FileLock *lock;
XX
XX if (!stat) /* expect more dirs, but this not a dir */
XX continue;
XX lock = (struct FileLock *)CurrentDir (dp->lock);
XX search = malloc(strlen(name)+strlen(tail)+2);
XX strcpy (search, name);
XX strcat (search, "/");
XX strcat (search, tail);
XX scrav = alt_av = expand (search, &alt_ac);
XX CurrentDir (lock);
XX if (scrav) {
XX while (*scrav) {
XX if (eleft < 2) {
XX char **scrav = (char **)malloc(sizeof(char *) * (eac + 10));
XX movmem (eav, scrav, sizeof(char *) * (eac + 1));
XX free (eav);
XX eav = scrav;
XX eleft = 10;
XX }
XX eav[eac] = malloc(strlen(bname)+strlen(*scrav)+1);
XX strcpy(eav[eac], bname);
XX strcat(eav[eac], *scrav);
XX free (*scrav);
XX ++scrav;
XX --eleft, ++eac;
XX }
XX free (alt_av);
XX }
XX } else {
XX if (eleft < 2) {
XX char **scrav = (char **)malloc(sizeof(char *) * (eac + 10));
XX movmem (eav, scrav, sizeof(char *) * (eac + 1));
XX free (eav);
XX eav = scrav;
XX eleft = 10;
XX }
XX eav[eac] = malloc (strlen(bname)+strlen(name)+1);
XX eav[eac] = strcpy(eav[eac], bname);
XX strcat(eav[eac], name);
XX --eleft, ++eac;
XX }
XX }
XX }
XX dclose (dp);
XX *pac = eac;
XX eav[eac] = NULL;
XX free (bname);
XX free (base);
XX if (eac)
XX return (eav);
XX free (eav);
XX return (NULL);
XX}
XX
XX/*
XX * Compare a wild card name with a normal name
XX */
XX
XX#define MAXB 8
XX
XXcompare_ok(wild, name)
XXchar *wild, *name;
XX{
XX char *w = wild;
XX char *n = name;
XX char *back[MAXB][2];
XX int bi = 0;
XX
XX while (*n || *w) {
XX switch (*w) {
XX case '*':
XX if (bi == MAXB) {
XX emits ("Too many levels of '*'");
XX return (0);
XX }
XX back[bi][0] = w;
XX back[bi][1] = n;
XX ++bi;
XX ++w;
XX continue;
XXgoback:
XX --bi;
XX while (bi >= 0 && *back[bi][1] == '\0')
XX --bi;
XX if (bi < 0)
XX return (0);
XX w = back[bi][0] + 1;
XX n = ++back[bi][1];
XX ++bi;
XX continue;
XX case '?':
XX if (!*n) {
XX if (bi)
XX goto goback;
XX return (0);
XX }
XX break;
XX default:
XX if (toupper(*n) != toupper(*w)) {
XX if (bi)
XX goto goback;
XX return (0);
XX }
XX break;
XX }
XX if (*n) ++n;
XX if (*w) ++w;
XX }
XX return (1);
XX}
XX
XXset_dir(new)
XXchar *new;
XX{
XX register char *s;
XX int i;
XX struct FileLock *lock;
XX char temp[60];
XX struct FileInfoBlock fib;
XX
XX if (*new != '\000') {
XX strcpy(temp, MyDir);
XX s = new;
XX if (*s == '/') {
XX s++;
XX for (i=strlen(MyDir);
XX MyDir[i] != '/' && MyDir[i] != ':';
XX i--);
XX MyDir[i+1] = '\0';
XX strcat(MyDir, s);
XX }
XX else if (exists(s, ':') == 0) {
XX if (MyDir[strlen(MyDir)-1] != ':')
XX strcat(MyDir, "/");
XX strcat(MyDir, s);
XX }
XX else
XX strcpy(MyDir, s);
XX
XX if ((lock = (struct FileLock *)Lock(MyDir)) == 0) {
XX emits("Directory not found\n");
XX strcpy(MyDir, temp);
XX }
XX else {
XX if (Examine(lock, &fib)) {
XX if (fib.fib_DirEntryType > 0) {
XX if (lock = (struct FileLock *)CurrentDir(lock))
XX UnLock(lock);
XX if (MyDir[strlen(MyDir)-1] == '/')
XX MyDir[strlen(MyDir)-1] = '\0';
XX }
XX else {
XX emits("Not a Directory\n");
XX strcpy(MyDir,temp);
XX }
XX }
XX }
XX }
XX}
XX
XXexists(s,c)
XXchar *s,c;
XX {
XX while (*s != '\000')
XX if (*s++ == c) return(1);
XX return(0);
XX }
SHAR_EOF
if test 8210 -ne "`wc -c expand.c`"
then
echo shar: error transmitting expand.c '(should have been 8210 characters)'
fi
echo shar: extracting init.c
sed 's/^XX//' << \SHAR_EOF > init.c
XX/***************************************************************
XX * vt100 - terminal emulator - initialization
XX *
XX * v2.1 860915 DBW - new features (see README)
XX * 860901 ACS - Added Parity and Word Length and support code
XX * 860823 DBW - Integrated and rewrote lots of code
XX * v2.0 860809 DBW - Major rewrite
XX * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes
XX * v1.0 860712 DBW - First version released
XX *
XX ***************************************************************/
XX
XX#define MODULE_INIT 1
XX#include "vt100.h"
XX
XXvoid InitDefaults(argc,argv)
XXint argc;
XXchar **argv;
XX {
XX FILE *fd;
XX char line[256],scr[32],delim,macro[256],c0,*ptr;
XX int i,j,k;
XX long li;
XX
XX if (((argc > 1) && (fd=fopen(argv[1],"r")) != 0) ||
XX (fd=fopen("vt100.init","r")) != 0 ||
XX (fd=fopen("s:vt100.init","r")) != 0) {
XX while (fgets(line,256,fd) != 0) {
XX if ((c0 = line[0]) == '#') continue;
XX if ((c0|' ') == 'e') break;
XX switch (c0|' ') {
XX case 'b':
XX if ((line[1]|' ') == 'o') {
XX /* bold color */
XX if (sscanf(line,"%s %x",scr,&i) == 2) p_bold = i;
XX break;
XX }
XX if ((line[1]|' ') == 'u') {
XX /* buffer size */
XX if (sscanf(line,"%s %d",scr,&i) == 2) p_buffer = i;
XX if (p_buffer < 512) p_buffer = 512;
XX break;
XX }
XX if ((line[1]|' ') == 'r') {
XX /* break time */
XX if (sscanf(line,"%s %ld",scr,&li) == 2) p_break = li;
XX break;
XX }
XX if ((line[1]|' ') != 'a') break;
XX switch(line[2]|' ') {
XX /* baud rate */
XX case 'u':
XX if (sscanf(line,"%s %d",scr,&i) == 2)
XX switch (i) {
XX case 300:
XX case 1200:
XX case 2400:
XX case 4800:
XX case 9600: p_baud = i; break;
XX }
XX break;
XX
XX /* background */
XX case 'c':
XX if (sscanf(line,"%s %x",scr,&i) == 2) p_background = i;
XX break;
XX }
XX break;
XX
XX /* screen type */
XX case 's':
XX if (sscanf(line,"%s %s",scr,scr) == 2) {
XX if ((scr[0]|' ') == 'w') p_screen = 0;
XX else p_screen = 1;
XX }
XX break;
XX
XX /* number of lines */
XX case 'l':
XX if (sscanf(line,"%s %d",scr,&i) == 2) p_lines = i;
XX break;
XX
XX /* screen depth */
XX case 'd':
XX if (sscanf(line,"%s %d",scr,&i) == 2) p_depth = i;
XX break;
XX
XX /* cursor color */
XX case 'c':
XX if (sscanf(line,"%s %x",scr,&i) == 2) p_cursor = i;
XX break;
XX
XX /* interlace type */
XX case 'i':
XX if (sscanf(line,"%s %s",scr,scr) == 2) {
XX if ((scr[1]|' ') == 'n') p_interlace = 1;
XX else p_interlace = 0;
XX }
XX break;
XX
XX case 'f':
XX switch (line[1]|' ') {
XX
XX /* foreground color */
XX case 'o':
XX if (sscanf(line,"%s %x",scr,&i) == 2) p_foreground = i;
XX break;
XX
XX /* function key */
XX default:
XX if (sscanf(&line[1],"%d",&i) != 1) break;
XX if (i < 1 || i > 10) break;
XX delim = 0;
XX for (j=(i==10?3:2); line[j] != 0 &&
XX (line[j] == ' ' || line[j] == '\t'); j++) ;
XX if (line[j] == 0) {
XX if (c0 == 'f') p_f[i-1] = NULL;
XX else p_F[i-1] = NULL;
XX break;
XX }
XX delim = line[j];
XX k = 0;
XX macro[0] = 0;
XX while (line[++j] != delim) {
XX if (line[j] == 0) {
XX if (fgets(line,256,fd) == 0) {
XX line[0] = delim;
XX line[1] = 0;
XX }
XX j = -1;
XX continue;
XX }
XX if (line[j] == '^' && line[++j] != '^')
XX macro[k++] = (line[j]|' ') - 0x60;
XX else if (line[j] != '\n') macro[k++] = line[j];
XX macro[k] = 0;
XX }
XX ptr = malloc(k+1);
XX if (c0 == 'f') p_f[i-1] = ptr;
XX else p_F[i-1] = ptr;
XX strcpy(ptr,macro);
XX break;
XX }
XX break;
XX
XX case 'm':
XX if (sscanf(line,"%s %s",scr,scr) == 2) {
XX if ((scr[0]|' ') == 'i') p_mode = 0;
XX else p_mode = 1;
XX }
XX break;
XX
XX case 'p': /*parity*/
XX if (sscanf(line,"%s %s",scr,scr) == 2)
XX switch(*scr|' ') {
XX case 'n': p_parity = -1; break;
XX case 'e': p_parity = 0; break;
XX case 'o': p_parity = 1; break;
XX }
XX break;
XX
XX case 'w': /*wordsize*/
XX if (sscanf(line,"%s %d",scr,&i) == 2)
XX if (i==7 || i==8) p_wordsize = i;
XX break;
XX }
XX }
XX fclose(fd);
XX }
XX /* Now set up all the screen info as necessary */
XX if (p_interlace == 0) {
XX if (p_lines > 24) p_lines = 24;
XX MINY = 14;
XX NewWindow.Height = (long)((p_lines*8)+8);
XX }
XX else {
XX if (p_lines > 48) p_lines = 48;
XX MINY = 16;
XX NewScreen.ViewModes |= LACE;
XX NewWindow.Height = (long)((p_lines*8)+10);
XX }
XX NewWindow.MinHeight = NewWindow.Height;
XX NewWindow.MaxHeight = NewWindow.Height;
XX NewWindow.TopEdge = 3L;
XX MAXY = ((p_lines-1)*8) + MINY;
XX top = MINY;
XX bot = MAXY;
XX savx = MINX;
XX savy = MINY;
XX if (p_screen == 1) {
XX if (p_depth > 2) p_depth = 2;
XX if (p_depth < 1) p_depth = 1;
XX NewScreen.Depth = (long)p_depth;
XX NewScreen.Height = (long)((p_lines*8)+15);
XX if (p_interlace == 1)
XX NewScreen.TopEdge = (long)(402 - NewScreen.Height);
XX else
XX NewScreen.TopEdge = 0L;
XX }
XX else {
XX p_depth = 2L;
XX NewWindow.TopEdge = 0L;
XX NewWindow.Screen = NULL;
XX NewWindow.Type = WBENCHSCREEN;
XX }
XX }
XX
XXvoid InitDevs()
XX{
XXUSHORT colors[4];
XXint i;
XXBYTE *b,*c;
XX
XXIntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", INTUITION_REV);
XXif( IntuitionBase == NULL )
XX cleanup("can't open intuition",1);
XX
XXGfxBase = (struct GfxBase *)OpenLibrary("graphics.library",GRAPHICS_REV);
XXif( GfxBase == NULL )
XX cleanup("can't open graphics library",2);
XX
XXif (p_screen == 1) {
XX if ((myscreen = (struct Screen *)OpenScreen(&NewScreen)) == NULL)
XX cleanup("can't open screen",3);
XX NewWindow.Screen = myscreen;
XX }
XX
XXif(( mywindow = (struct Window *)OpenWindow(&NewWindow) ) == NULL)
XX cleanup("can't open window",4);
XX
XXmyviewport = (struct ViewPort *)ViewPortAddress(mywindow);
XX
XXif (p_screen != 0) {
XX colors[0] = p_background;
XX colors[1] = p_foreground;
XX colors[2] = p_bold;
XX colors[3] = p_cursor;
XX if (p_depth == 1)
XX LoadRGB4(myviewport,(struct ColorMap *)colors,2L);
XX else
XX LoadRGB4(myviewport,(struct ColorMap *)colors,4L);
XX }
XX
XXRead_Request = (struct IOExtSer *)
XX AllocMem((long)sizeof(*Read_Request),MEMF_PUBLIC|MEMF_CLEAR);
XXRead_Request->io_SerFlags = 0L;
XXRead_Request->IOSer.io_Message.mn_ReplyPort = CreatePort("Read_RS",0);
XXif(OpenDevice(SERIALNAME,NULL,Read_Request,NULL))
XX cleanup("Cant open Read device",5);
XXrs_in = malloc(p_buffer+1);
XXRead_Request->io_SerFlags = 0L;
XXswitch (p_parity) {
XX case 1:
XX Read_Request->io_SerFlags |= SERF_PARTY_ODD;
XX case 0:
XX Read_Request->io_SerFlags |= SERF_PARTY_ON;
XX p_wordsize = 7;
XX }
XXRead_Request->io_Baud = p_baud;
XXRead_Request->io_ReadLen = p_wordsize;
XXRead_Request->io_WriteLen = p_wordsize;
XXRead_Request->io_CtlChar = 0x11130000L;
XXRead_Request->io_RBufLen = p_buffer;
XXRead_Request->io_BrkTime = p_break;
XXRead_Request->IOSer.io_Command = SDCMD_SETPARAMS;
XXDoIO(Read_Request);
XXRead_Request->IOSer.io_Command = CMD_READ;
XXRead_Request->IOSer.io_Length = 1;
XXRead_Request->IOSer.io_Data = (APTR) &rs_in[0];
XX
XXWrite_Request = (struct IOExtSer *)
XX AllocMem((long)sizeof(*Write_Request),MEMF_PUBLIC|MEMF_CLEAR);
XXb = (BYTE *)Read_Request;
XXc = (BYTE *)Write_Request;
XXfor (i=0;i<sizeof(struct IOExtSer);i++) *c++ = *b++;
XXWrite_Request->IOSer.io_Message.mn_ReplyPort = CreatePort("Write_RS",0);
XXWrite_Request->IOSer.io_Command = CMD_WRITE;
XXWrite_Request->IOSer.io_Length = 1;
XXWrite_Request->IOSer.io_Data = (APTR) &rs_out[0];
XX
XX
XXTimer_Port = CreatePort("Timer Port",0);
XXScript_Timer_Port = CreatePort("Timer Port",0);
XX
XXif (OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &Timer, 0) ||
XX OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &Script_Timer, 0))
XX cleanup("can't open timer device",7);
XX
XXTimer.tr_node.io_Message.mn_ReplyPort = Timer_Port;
XXTimer.tr_node.io_Command = TR_ADDREQUEST;
XXTimer.tr_node.io_Flags = 0;
XXTimer.tr_node.io_Error = 0;
XX
XXScript_Timer.tr_node.io_Message.mn_ReplyPort = Script_Timer_Port;
XXScript_Timer.tr_node.io_Command = TR_ADDREQUEST;
XXScript_Timer.tr_node.io_Flags = 0;
XXScript_Timer.tr_node.io_Error = 0;
XX}
XX
XX/*****************************************************************/
XX/* The following function initializes the structure arrays */
XX/* needed to provide the File menu topic. */
XX/*****************************************************************/
XXvoid InitFileItems()
XX{
XXint n;
XX
XX/* initialize each menu item and IntuiText with loop */
XXfor( n=0; n<FILEMAX; n++ )
XX {
XX FileItem[n].NextItem = &FileItem[n+1];
XX FileItem[n].LeftEdge = 0;
XX FileItem[n].TopEdge = 11 * n;
XX FileItem[n].Width = 135;
XX FileItem[n].Height = 11;
XX FileItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
XX FileItem[n].MutualExclude = 0;
XX FileItem[n].ItemFill = (APTR)&FileText[n];
XX FileItem[n].SelectFill = NULL;
XX FileItem[n].Command = 0;
XX FileItem[n].SubItem = NULL;
XX FileItem[n].NextSelect = 0;
XX
XX FileText[n].FrontPen = 0;
XX FileText[n].BackPen = 1;
XX FileText[n].DrawMode = JAM2; /* render in fore and background */
XX FileText[n].LeftEdge = 0;
XX FileText[n].TopEdge = 1;
XX FileText[n].ITextFont = NULL;
XX FileText[n].NextText = NULL;
XX }
XXFileItem[FILEMAX-1].NextItem = NULL;
XX
XX/* initialize text for specific menu items */
XXFileText[0].IText = (UBYTE *)"Ascii Capture";
XXFileText[1].IText = (UBYTE *)"Ascii Send";
XXFileText[2].IText = (UBYTE *)"Xmodem Receive";
XXFileText[3].IText = (UBYTE *)"Xmodem Send";
XXFileText[4].IText = (UBYTE *)"Kermit Get";
XXFileText[5].IText = (UBYTE *)"Kermit Receive";
XXFileText[6].IText = (UBYTE *)"Kermit Send";
XXFileText[7].IText = (UBYTE *)"Kermit BYE";
XX}
XX
XX/*****************************************************************/
XX/* The following function initializes the structure arrays */
XX/* needed to provide the BaudRate menu topic. */
XX/*****************************************************************/
XXvoid InitRSItems()
XX{
XXint n;
XX
XX/* initialize each menu item and IntuiText with loop */
XXfor( n=0; n<RSMAX; n++ )
XX {
XX RSItem[n].NextItem = &RSItem[n+1];
XX RSItem[n].LeftEdge = 0;
XX RSItem[n].TopEdge = 11 * n;
XX RSItem[n].Width = 85;
XX RSItem[n].Height = 11;
XX RSItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT;
XX RSItem[n].MutualExclude = (~(1 << n));
XX RSItem[n].ItemFill = (APTR)&RSText[n];
XX RSItem[n].SelectFill = NULL;
XX RSItem[n].Command = 0;
XX RSItem[n].SubItem = NULL;
XX RSItem[n].NextSelect = 0;
XX
XX RSText[n].FrontPen = 0;
XX RSText[n].BackPen = 1;
XX RSText[n].DrawMode = JAM2; /* render in fore and background */
XX RSText[n].LeftEdge = 0;
XX RSText[n].TopEdge = 1;
XX RSText[n].ITextFont = NULL;
XX RSText[n].NextText = NULL;
XX }
XXRSItem[RSMAX-1].NextItem = NULL;
XX/* select baud item chekced */
XXswitch (p_baud) {
XX case 300: n = 0; break;
XX case 1200: n = 1; break;
XX case 2400: n = 2; break;
XX case 4800: n = 3; break;
XX case 9600: n = 4; break;
XX default: n = 2; p_baud = 2400;
XX }
XXRSItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT | CHECKED;
XX
XX/* initialize text for specific menu items */
XXRSText[0].IText = (UBYTE *)" 300";
XXRSText[1].IText = (UBYTE *)" 1200";
XXRSText[2].IText = (UBYTE *)" 2400";
XXRSText[3].IText = (UBYTE *)" 4800";
XXRSText[4].IText = (UBYTE *)" 9600";
XX}
XX
XX/*****************************************************************/
XX/* The following function initializes the structure arrays */
XX/* needed to provide the Transfer Mode menu topic. */
XX/*****************************************************************/
XXvoid InitXFItems()
XX{
XXint n;
XX
XX/* initialize each menu item and IntuiText with loop */
XXfor( n=0; n<XFMAX; n++ )
XX {
XX XFItem[n].NextItem = &XFItem[n+1];
XX XFItem[n].LeftEdge = 0;
XX XFItem[n].TopEdge = 11 * n;
XX XFItem[n].Width = 85;
XX XFItem[n].Height = 11;
XX XFItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT;
XX XFItem[n].MutualExclude = (~(1 << n));
XX XFItem[n].ItemFill = (APTR)&XFText[n];
XX XFItem[n].SelectFill = NULL;
XX XFItem[n].Command = 0;
XX XFItem[n].SubItem = NULL;
XX XFItem[n].NextSelect = 0;
XX
XX XFText[n].FrontPen = 0;
XX XFText[n].BackPen = 1;
XX XFText[n].DrawMode = JAM2; /* render in fore and background */
XX XFText[n].LeftEdge = 0;
XX XFText[n].TopEdge = 1;
XX XFText[n].ITextFont = NULL;
XX XFText[n].NextText = NULL;
XX }
XXXFItem[XFMAX-1].NextItem = NULL;
XX/* mode checked */
XXXFItem[p_mode].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX | CHECKIT | CHECKED;
XX
XX/* initialize text for specific menu items */
XXXFText[0].IText = (UBYTE *)" image";
XXXFText[1].IText = (UBYTE *)" CR LF";
XX}
XX
XX
XX/*****************************************************************/
XX/* The following function initializes the structure arrays */
XX/* needed to provide the Script menu topic. */
XX/*****************************************************************/
XXvoid InitScriptItems()
XX{
XXint n;
XX
XX/* initialize each menu item and IntuiText with loop */
XXfor( n=0; n<SCRIPTMAX; n++ )
XX {
XX ScriptItem[n].NextItem = &ScriptItem[n+1];
XX ScriptItem[n].LeftEdge = 0;
XX ScriptItem[n].TopEdge = 11 * n;
XX ScriptItem[n].Width = 155;
XX ScriptItem[n].Height = 11;
XX ScriptItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
XX ScriptItem[n].MutualExclude = 0;
XX ScriptItem[n].ItemFill = (APTR)&ScriptText[n];
XX ScriptItem[n].SelectFill = NULL;
XX ScriptItem[n].Command = 0;
XX ScriptItem[n].SubItem = NULL;
XX ScriptItem[n].NextSelect = 0;
XX
XX ScriptText[n].FrontPen = 0;
XX ScriptText[n].BackPen = 1;
XX ScriptText[n].DrawMode = JAM2; /* render in fore and background */
XX ScriptText[n].LeftEdge = 0;
XX ScriptText[n].TopEdge = 1;
XX ScriptText[n].ITextFont = NULL;
XX ScriptText[n].NextText = NULL;
XX }
XXScriptItem[SCRIPTMAX-1].NextItem = NULL;
XX
XX/* initialize text for specific menu items */
XXScriptText[0].IText = (UBYTE *)"Execute file";
XXScriptText[1].IText = (UBYTE *)"Abort Execution";
XX}
XX
XX/*****************************************************************/
XX/* The following function initializes the structure arrays */
XX/* needed to provide the Util menu topic. */
XX/*****************************************************************/
XXvoid InitUtilItems()
XX{
XXint n;
XX
XX/* initialize each menu item and IntuiText with loop */
XXfor( n=0; n<UTILMAX; n++ )
XX {
XX UtilItem[n].NextItem = &UtilItem[n+1];
XX UtilItem[n].LeftEdge = 0;
XX UtilItem[n].TopEdge = 11 * n;
XX UtilItem[n].Width = 100;
XX UtilItem[n].Height = 11;
XX UtilItem[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
XX if (n >= 3) UtilItem[n].Flags |= CHECKIT;
XX switch (n) {
XX case 3: UtilItem[3].MutualExclude = 0x30; break;
XX case 4: UtilItem[4].MutualExclude = 0x28; break;
XX case 5: UtilItem[5].MutualExclude = 0x18; break;
XX case 6: UtilItem[6].MutualExclude = 0x80; break;
XX case 7: UtilItem[7].MutualExclude = 0x40; break;
XX default:UtilItem[n].MutualExclude = 0; break;
XX }
XX UtilItem[n].ItemFill = (APTR)&UtilText[n];
XX UtilItem[n].SelectFill = NULL;
XX UtilItem[n].Command = 0;
XX UtilItem[n].SubItem = NULL;
XX UtilItem[n].NextSelect = 0;
XX
XX UtilText[n].FrontPen = 0;
XX UtilText[n].BackPen = 1;
XX UtilText[n].DrawMode = JAM2; /* render in fore and background */
XX UtilText[n].LeftEdge = 0;
XX UtilText[n].TopEdge = 1;
XX UtilText[n].ITextFont = NULL;
XX UtilText[n].NextText = NULL;
XX }
XX/* select parity item */
XXswitch (p_parity) {
XX case -1: n = 3; break;
XX case 0: n = 4; break;
XX case 1: n = 5; break;
XX default: n = 3; p_parity = -1; break;
XX }
XXUtilItem[n].Flags |= CHECKED;
XX
XX/* select word item */
XXswitch (p_wordsize) {
XX case 8: n = 6; break;
XX case 7: n = 7; break;
XX default: n = 6; p_wordsize = 8; break;
XX }
XXUtilItem[n].Flags |= CHECKED;
XX
XXUtilItem[UTILMAX-1].NextItem = NULL;
XX
XX/* initialize text for specific menu items */
XXUtilText[0].IText = (UBYTE *)" Send Break";
XXUtilText[1].IText = (UBYTE *)" Hang Up";
XXUtilText[2].IText = (UBYTE *)" Change Dir";
XXUtilText[3].IText = (UBYTE *)" No Parity";
XXUtilText[4].IText = (UBYTE *)" Even Parity";
XXUtilText[5].IText = (UBYTE *)" Odd Parity";
XXUtilText[6].IText = (UBYTE *)" 8 bit Words";
XXUtilText[7].IText = (UBYTE *)" 7 bit Words";
XX}
XX
XX/**********************************************************************/
XX/* The following function initializes the Menu structure array with */
XX/* appropriate values for our simple menu strip. Review the manual */
XX/* if you need to know what each value means. */
XX/**********************************************************************/
XXvoid InitMenu()
XX{
XXmenu[0].NextMenu = &menu[1];
XXmenu[0].LeftEdge = 5;
XXmenu[0].TopEdge = 0;
XXmenu[0].Width = 50;
XXmenu[0].Height = 10;
XXmenu[0].Flags = MENUENABLED;
XXmenu[0].MenuName = "File"; /* text for menu-bar display */
XXmenu[0].FirstItem = &FileItem[0]; /* pointer to first item in list */
XX
XXmenu[1].NextMenu = &menu[2];
XXmenu[1].LeftEdge = 65;
XXmenu[1].TopEdge = 0;
XXmenu[1].Width = 85;
XXmenu[1].Height = 10;
XXmenu[1].Flags = MENUENABLED;
XXmenu[1].MenuName = "BaudRate"; /* text for menu-bar display */
XXmenu[1].FirstItem = &RSItem[0]; /* pointer to first item in list */
XX
XXmenu[2].NextMenu = &menu[3];
XXmenu[2].LeftEdge = 160;
XXmenu[2].TopEdge = 0;
XXmenu[2].Width = 85;
XXmenu[2].Height = 10;
XXmenu[2].Flags = MENUENABLED;
XXmenu[2].MenuName = "Xfer Mode"; /* text for menu-bar display */
XXmenu[2].FirstItem = &XFItem[0]; /* pointer to first item in list */
XX
XXmenu[3].NextMenu = &menu[4];
XXmenu[3].LeftEdge = 255;
XXmenu[3].TopEdge = 0;
XXmenu[3].Width = 60;
XXmenu[3].Height = 10;
XXmenu[3].Flags = MENUENABLED;
XXmenu[3].MenuName = "Script"; /* text for menu-bar display */
XXmenu[3].FirstItem = &ScriptItem[0]; /* pointer to first item in list */
XX
XXmenu[4].NextMenu = NULL;
XXmenu[4].LeftEdge = 325;
XXmenu[4].TopEdge = 0;
XXmenu[4].Width = 70;
XXmenu[4].Height = 10;
XXmenu[4].Flags = MENUENABLED;
XXmenu[4].MenuName = "Utility"; /* text for menu-bar display */
XXmenu[4].FirstItem = &UtilItem[0]; /* pointer to first item in list */
XX}
XX
SHAR_EOF
if test 17694 -ne "`wc -c init.c`"
then
echo shar: error transmitting init.c '(should have been 17694 characters)'
fi
echo shar: extracting remote.c
sed 's/^XX//' << \SHAR_EOF > remote.c
XX/****************************************************
XX * vt100 emulator - remote character interpretation
XX *
XX * v2.1 860915 DBW - new features (see README)
XX * 860823 DBW - Integrated and rewrote lots of code
XX * v2.0 860803 DRB - Rewrote the control sequence parser
XX * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes
XX * v1.0 860712 DBW - First version released
XX *
XX ****************************************************/
XX
XX#define MODULE_REMOTE 1
XX#include "vt100.h"
XX
XXstatic int p[10];
XXstatic int numpar;
XXstatic char escseq[40];
XX
XXvoid doctrl();
XXvoid doesc(); /* force correct denomination */
XXvoid doerase();
XXvoid doindex();
XX
XX/************************************************
XX* function to handle remote characters
XX*************************************************/
XXvoid doremote(c)
XXchar c;
XX {
XX if (c == 24) { inesc = 0; inctrl = 0; return; }
XX if (c == 27 || (inesc >= 0 && c >= ' ')) { doesc(c); return; }
XX if (inctrl >= 0 && c >= ' ') { doctrl(c); return; }
XX if (c == 10 || c == 11 || c == 12) {
XX if (nlmode) doindex('E'); else doindex('D');
XX return;
XX }
XX if (c == 13) {
XX if (!nlmode) emit(c);
XX return;
XX }
XX if (c == 15) { alt = 0; return; }
XX if (c == 14) { alt = 1; return; }
XX if (a[alt] && c > 94 && c < 127) { doalt(c); return; }
XX emit(c);
XX }
XX
XXvoid doesc(c)
XXchar c;
XX{
XX if (inesc < 0) { inesc = 0; return; }
XX if (c == 27 || c == 24) { inesc = -1; return; }
XX if (c < ' ' || c == 127) return; /* Ignore control chars */
XX if (c < '0') {escseq[inesc++] = c; return; } /* Collect intermediates */
XX
XX /* by process of elimination, we have a final character. Put it in
XX the buffer, and dispatch on the first character in the buffer */
XX
XX escseq[inesc] = c;
XX inesc = -1; /* No longer collecting a sequence */
XX switch (escseq[0]) /* Dispatch on the first received */
XX {
XX case '[': /* Control sequence introducer */
XX numpar = 0; /* No parameters yet */
XX private = 0; /* Not a private sequence (yet?) */
XX badseq = 0; /* Good until proven bad */
XX p[0] = p[1] = 0; /* But default the first parameter */
XX inctrl = 0; /* We are in a control sequence */
XX return; /* All done for now ... */
XX
XX case 'D': case 'E': case 'M': /* Some kind of index */
XX doindex (c); /* Do the index */
XX return; /* Return */
XX
XX case '7': /* Save cursor position */
XX savx = x; savy = y; savmode = curmode; savalt = alt;
XX sa[0] = a[0]; sa[1] = a[1];
XX return;
XX
XX case '8': /* Restore cursor position */
XX x = savx; y = savy; alt = savalt; curmode = savmode;
XX a[0] = sa[0]; a[1] = sa[1];
XX return;
XX
XX case 'c': /* Reset */
XX top = MINY; bot = MAXY; savx = MINX; savy = MINY;
XX curmode = FS_NORMAL; keyapp = FALSE;
XX inesc = -1;
XX a[0] = 0; a[1] = 0; sa[0] = 0; sa[1] = 0;
XX emit(12);
XX return;
XX
XX case '(': /* Change character set */
XX if (c == '0' || c == '2') a[0] = 1; else a[0] = 0;
XX return;
XX
XX case ')': /* Change the other character set */
XX if (c == '0' || c == '2') a[1] = 1; else a[1] = 0;
XX return;
XX
XX case '=': /* set keypad application mode */
XX keyapp = TRUE;
XX return;
XX
XX case '>': /* reset application mode */
XX keyapp = FALSE;
XX return;
XX
XX case 'Z':
XX sendchar(27); sendstring("[?1;7c"); return;
XX
XX /* If we didn't match anything, we can just return, happy in the
XX knowledge that we've at least eaten the whole sequence */
XX
XX } /* End of switch */
XX return;
XX}
XX
XXvoid doctrl(c)
XXchar c;
XX{
XX int i;
XX
XX if (c == 27 || c == 24) { inctrl = -1; return; }
XX if (c < ' ' || c == 127) return; /* Ignore control chars */
XX
XX /* First, look for some parameter characters. If the very first
XX parameter character isn't a digit, then we have a private sequence */
XX
XX if (c >= '0' && c < '@')
XX {
XX /* can't have parameters after intermediates */
XX if (inctrl > 0) {badseq++ ; return; }
XX switch (c)
XX {
XX case '0': case '1': case '2': case '3': case '4':
XX case '5': case '6': case '7': case '8': case '9':
XX p[numpar] = p[numpar] * 10 + (c - '0');
XX return;
XX
XX case ';':
XX p[++numpar] = 0; /* Start a new parameter */
XX return;
XX
XX case '<': case '=': case '>': case '?': /* Can only mean private */
XX if (inctrl = 0) private = c; /* Only allowed BEFORE parameters */
XX return;
XX
XX /* if we come here, it's a bad sequence */
XX }
XX badseq++; /* Flag the bad sequence */
XX }
XX
XX if (c < '0') /* Intermediate character */
XX {
XX escseq[inctrl++] = c; /* Save the intermediate character */
XX return;
XX }
XX
XX /* if we get here, we have the final character. Put it in the
XX escape sequence buffer, then dispatch the control sequence */
XX
XX numpar++; /* Reflect the real number of parameters */
XX escseq[inctrl++] = c; /* Store the final character */
XX escseq[inctrl] = '\000'; /* Tie off the buffer */
XX inctrl = -1; /* End of the control sequence scan */
XX
XX /* Don't know how to do any private sequences right now, so just punt
XX them */
XX
XX if (private != 0 || badseq != 0) return;
XX
XX switch (escseq[0]) /* Dispatch on first intermediate or final */
XX {
XX case 'A': if (p[0]<=0) p[0] = 1;
XX y -= 8*p[0]; if (y<top) y = top; return;
XX case 'B': if (p[0]<=0) p[0] = 1;
XX y += 8*p[0]; if (y>bot) y = bot; return;
XX case 'C': if (p[0]<=0) p[0] = 1;
XX x += 8*p[0]; if (x>MAXX) x = MAXX; return;
XX case 'D': if (p[0]<=0) p[0] = 1;
XX x -= 8*p[0]; if (x<MINX) x = MINX; return;
XX
XX case 'H': case 'f': /* Cursor position */
XX if (p[0] <= 0) p[0] = 1;
XX if (p[1] <= 0) p[1] = 1;
XX y = (--p[0]*8)+MINY; x = (--p[1]*8)+MINX;
XX if (y > MAXY) y = MAXY;
XX if (x > MAXX) x = MAXX;
XX if (y < MINY) y = MINY;
XX if (x < MINX) x = MINX;
XX return;
XX
XX case 'r': /* Set scroll region */
XX if (p[0] <= 0) p[0] = 1;
XX if (p[1] <= 0) p[1] = p_lines;
XX top = (--p[0]*8)+MINY; bot = (--p[1]*8)+MINY;
XX if (top < MINY) top = MINY;
XX if (bot > MAXY) bot = MAXY;
XX if (top > bot) { top = MINY; bot = MAXY; }
XX x = MINX; y = MINY;
XX return;
XX
XX case 'm': /* Set graphic rendition */
XX for (i=0;i<numpar;i++) {
XX if (p[i] < 0) p[i] = 0;
XX switch (p[i]) {
XX case 0:
XX curmode = FS_NORMAL;
XX break;
XX
XX case 1:
XX curmode |= FSF_BOLD;
XX break;
XX
XX case 4:
XX curmode |= FSF_UNDERLINED;
XX break;
XX
XX case 5:
XX curmode |= FSF_ITALIC;
XX break;
XX
XX default:
XX curmode |= FSF_REVERSE;
XX break;
XX }
XX }
XX return;
XX
XX case 'K': /* Erase in line */
XX doerase();
XX return;
XX
XX case 'J': /* Erase in display */
XX if (p[0] < 0) p[0] = 0;
XX SetAPen(mywindow->RPort,0L);
XX if (p[0] == 0) {
XX if (y < MAXY) RectFill(mywindow->RPort,
XX (long)MINX,(long)(y+2),(long)(MAXX+7),(long)(MAXY+1));
XX }
XX else if (p[0] == 1) {
XX if (y > MINY) RectFill(mywindow->RPort,
XX (long)MINX,(long)(MINY-6),(long)(MAXX+7),(long)(y-7));
XX }
XX else RectFill(mywindow->RPort,
XX (long)MINX,(long)(MINY-6),(long)(MAXX+7),(long)(MAXY+1));
XX SetAPen(mywindow->RPort,1L);
XX doerase(); return;
XX
XX case 'h': /* Set parameter */
XX if (p[0] == 20) nlmode = 1;
XX return;
XX
XX case 'l': /* Reset parameter */
XX if (p[0] == 20) nlmode = 0;
XX return;
XX
XX case 'x':
XX sendchar(27); sendstring("[3;1;8;64;64;1;0x"); return;
XX
XX case 'n':
XX if (p[0] == 6) {
XX sendchar(27);
XX sprintf(escseq,"[%d;%dR",((y-MINY)/8)+1,((x-MINX)/8)+1);
XX sendstring(escseq); return;
XX }
XX sendchar(27); sendstring("[0n"); return;
XX
XX case 'c':
XX sendchar(27); sendstring("[?1;7c"); return;
XX }
XX
XX /* Don't know how to do this one, so punt it */
XX}
XX
XXvoid doindex(c)
XXchar c;
XX {
XX if (c != 'M') {
XX if (c == 'E') x = MINX;
XX if (y > bot) if (y < MAXY) y += 8;
XX if (y == bot)
XX ScrollRaster(mywindow->RPort,0L,8L,(long)MINX,(long)(top-6),
XX (long)(MAXX+7),(long)(bot+1));
XX if (y < bot) y += 8;
XX }
XX else {
XX if (y < top) if (y > MINY) y -= 8;
XX if (y == top)
XX ScrollRaster(mywindow->RPort,0L,-8L,(long)MINX,(long)(top-6),
XX (long)(MAXX+7),(long)(bot+1));
XX if (y > top) y -= 8;
XX }
XX return;
XX }
XX
XXdoalt(c)
XXchar c;
XX {
XX int oldx,newx;
XX inesc = -1;
XX oldx = x; emit(' '); newx = x;
XX x = oldx;
XX SetAPen(mywindow->RPort,1L);
XX switch (c) {
XX case 'j':
XX case 'm':
XX case 'v': doline(4,-8,4,-4);
XX if (c=='j') doline(0,-4,4,-4);
XX else if (c=='m') doline(4,-4,8,-4);
XX else doline(0,-4,8,-4);
XX break;
XX
XX case 'k':
XX case 'l':
XX case 'w': doline(4,-4,4,0);
XX if (c=='k') doline(0,-4,4,-4);
XX else if (c=='l') doline(4,-4,8,-4);
XX else doline(0,-4,8,-4);
XX break;
XX
XX case 'n':
XX case 'q': doline(0,-4,8,-4);
XX if (c=='n') doline(4,-8,4,0);
XX break;
XX
XX case 't':
XX case 'u':
XX case 'x': doline(4,-8,4,0);
XX if (c=='t') doline(4,-4,8,-4);
XX else if (c=='u') doline(0,-4,4,-4);
XX break;
XX }
XX x = newx;
XX }
XX
XXdoline(x1,y1,x2,y2) {
XX RectFill(mywindow->RPort,(long)(x+x1),(long)(y+y1),
XX (long)(x+x2),(long)(y+y2));
XX }
XX
XXvoid doerase()
XX {
XX if (p[0] < 0) p[0] = 0;
XX SetAPen(mywindow->RPort,0L);
XX if (p[0] == 0) RectFill(mywindow->RPort,(long)x,(long)(y-6),
XX (long)(MAXX+7),(long)(y+1));
XX else if (p[0] == 1) RectFill(mywindow->RPort,
XX (long)MINX,(long)(y-6),(long)(x+7),(long)(y+1));
XX else RectFill(mywindow->RPort,
XX (long)MINX,(long)(y-6),(long)(MAXX+7),(long)(y+1));
XX SetAPen(mywindow->RPort,1L);
XX return;
XX }
XX
SHAR_EOF
if test 9213 -ne "`wc -c remote.c`"
then
echo shar: error transmitting remote.c '(should have been 9213 characters)'
fi
echo shar: extracting script.c
sed 's/^XX//' << \SHAR_EOF > script.c
XX/*************************************************************
XX * vt100 terminal emulator - Script file support
XX *
XX * v2.1 860915 DBW - new features (see README)
XX * 860901 ACS - Added BAUD, PARITY and WORD commands & handling
XX * 860823 DBW - Integrated and rewrote lots of code
XX * 860815 Steve Drew: Initial version written of SCRIPT.C
XX * v2.0 860809 DBW - Major rewrite
XX * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes
XX * v1.0 860712 DBW - First version released
XX *
XX *************************************************************/
XX
XX#define MODULE_SCRIPT 1
XX
XX#include "vt100.h"
XX
XXstruct COMMAND {
XX int (*func)();
XX char *cname;
XX};
XX
XXstruct LABEL {
XX struct LABEL *next;
XX char *name;
XX long pos;
XX};
XX
XX
XX
XX/**************** globals needed ******************/
XX
XXchar on_string[20]; /* string to match on for on cmd */
XXchar wait_string[20]; /* string to match of for wait cmd */
XXchar golabel[20]; /* label we are looking for in goto */
XXchar on_cmd[20]; /* command to execute when on matchs*/
XXint onsize; /* size of on_string */
XXint waitsize; /* size of wait_string */
XXint onpos; /* position in on string for search */
XXint waitpos; /* pos in wait_string for search */
XXint on_match; /* flag set while doing on_cmd */
XXFILE *sf; /* file pointer for script file */
XXstruct LABEL *lbase = NULL; /* will point to first label */
XXstruct LABEL *labels; /* current label pointer */
XX
XXint cmd_send(), cmd_wait(), cmd_on(), cmd_goto(), cmd_delay(), cmd_done(),
XX cmd_ks(), cmd_kg(), cmd_kr(), cmd_xs(), cmd_xr(), cmd_cap(), cmd_as(),
XX cmd_null(), cmd_kb(), cmd_cd(), cmd_sb(), cmd_baud(), cmd_word(),
XX cmd_parity(), cmd_bt(), cmd_tm();
XX
XXchar *next_wrd(), *tostring();
XX
XX
XX/********************** command table **********************************/
XX
XXstatic struct COMMAND commands[]= {
XX cmd_send, "send", /* send string to host */
XX cmd_wait, "wait", /* wait for a string from host */
XX cmd_on, "on", /* on a 'string' do a cmd */
XX cmd_goto, "goto", /* goto label */
XX cmd_delay, "delay", /* delay amount of seconds */
XX cmd_done, "exit", /* exit script file */
XX cmd_ks, "ks", /* kermit send file */
XX cmd_kr, "kr", /* kermit receive file */
XX cmd_kg, "kg", /* kermit get file */
XX cmd_kb, "kb", /* kermit bye (for server) */
XX cmd_xs, "xs", /* xmodem send file */
XX cmd_xr, "xr", /* xmodem receive file */
XX cmd_cap, "capture", /* ascii capture on/off */
XX cmd_as, "ascii_send", /* ascii send */
XX cmd_cd, "cd", /* change directory */
XX cmd_sb, "sb", /* Send a break */
XX cmd_baud, "baud", /* Set Baud Rate */
XX cmd_parity, "parity", /* Set Parity */
XX cmd_word, "word", /* Set Word Length */
XX cmd_bt, "bt", /* Set Break Time */
XX cmd_tm, "tm", /* Set KERMIT transfer mode */
XX cmd_null, NULL
XX};
XX
XX/********************************************************************/
XX/* checks char to see if match with on string or wait_string */
XX/* if on string match oncmd gets executed imediately, */
XX/* if wait_string match script_wait is set. */
XX/********************************************************************/
XX
XXchk_script(c)
XXchar c;
XX{
XX if (on_string[0] != '\0') {
XX if (on_string[onpos] == c) {
XX onpos++;
XX if (onpos == onsize) {
XX on_match = TRUE;
XX do_script_cmd(ONCOMMAND);
XX on_match = FALSE;
XX return(0);
XX }
XX }
XX else onpos = 0;
XX }
XX
XX if (wait_string[0] != '\0') {
XX if (wait_string[waitpos] != c) {
XX waitpos = 0;
XX return(0);
XX }
XX waitpos++;
XX if (waitpos != waitsize) return(0);
XX wait_string[0] = '\0';
XX script_wait = FALSE;
XX }
XX}
XX
XXscript_start(file)
XXchar *file;
XX{
XX if ((sf = fopen(file, "r")) == NULL) {
XX emits("Can't open script file\n");
XX return(0);
XX }
XX script_on = TRUE;
XX script_wait = FALSE;
XX wait_string[0] = '\0';
XX on_string[0] = '\0';
XX on_match = FALSE;
XX lbase = NULL;
XX}
XX
XX/* return pointer to next word. set l to size of the word */
XX
XXchar *next_wrd(s,l)
XXchar *s;
XXint *l;
XX{
XX char *p;
XX while(*s && (*s == ' ' || *s == 9)) s++;
XX p = s;
XX while(*s && (*s != ' ' && *s != 9)) s++;
XX *l = s-p;
XX return(p);
XX}
XX
XXexe_cmd(p,l)
XXchar *p;
XXint l;
XX{
XX int i;
XX
XX /* downcase the command */
XX for (i=0; i<l; i++) p[i] |= ' ';
XX
XX /* now search for it */
XX for (i=0; commands[i].func != cmd_null; ++i)
XX if (strncmp(p, commands[i].cname, l) == 0) {
XX (*commands[i].func)(next_wrd(p+l, &l));
XX return(TRUE);
XX }
XX emits ("\nScript - unknown command: ");
XX emits (p);
XX emits ("\n");
XX}
XX
XXstruct LABEL *find_label(lname)
XXchar *lname;
XX{
XX struct LABEL *label;
XX
XX label = lbase;
XX while(label != NULL) {
XX if (strcmp(label->name, lname) == 0) return (label);
XX label = label->next;
XX }
XX return(NULL);
XX}
XX
XX
XXdo_script_cmd(stat)
XXint stat;
XX{
XX int len,l;
XX char line[256];
XX char *p;
XX
XX if (stat == ONCOMMAND) { /* if ON command is matched and we were */
XX strcpy(line,on_cmd); /* doing a DELAY then abort the delay timer,*/
XX p = next_wrd(line,&l); /* except if on_cmd was just a SEND. */
XX if (*p != 'S' && script_wait == WAIT_TIMER) {
XX AbortIO((char *) &Script_Timer);
XX Wait (1L << Script_Timer_Port->mp_SigBit);
XX script_wait = FALSE; /* script will proceed after on command */
XX }
XX exe_cmd(p,l);
XX return(0);
XX }
XX
XX script_wait = FALSE;
XX while(fgets(line,256,sf) != NULL) {
XX len = strlen(line);
XX line[--len] = '\0';
XX p = next_wrd(&line[0], &l);
XX if (*(p + l - 1) == ':') { /* its a label */
XX *(p + l - 1) = '\0';
XX if (find_label(p) == NULL) { /* it's a new label */
XX if (lbase == NULL) { /* it's the first label */
XX labels = lbase = (struct LABEL *) malloc (sizeof (struct LABEL));
XX }
XX else {
XX labels->next =
XX (struct LABEL *) malloc (sizeof (struct LABEL));
XX labels = labels->next;
XX }
XX labels->pos = ftell(sf);
XX labels->name = malloc(l);
XX labels->next = NULL;
XX strcpy(labels->name, p);
XX if (stat == GOTOLABEL && strcmp(p, golabel) == 0)
XX stat = NEXTCOMMAND;
XX }
XX p = next_wrd(p+l+1, &l);
XX } /* end of it's a label */
XX if (stat == GOTOLABEL || *p == '#') continue;
XX if (*p) exe_cmd(p,l);
XX return(0);
XX } /* end of while */
XX if (stat == GOTOLABEL) {
XX emits("\nScript - label not found: ");
XX emits(golabel);
XX emits("\n");
XX }
XX exit_script();
XX}
XX
XXexit_script()
XX{
XX if (script_wait == WAIT_TIMER) /* timer not done yet */
XX AbortIO((char *) &Script_Timer); /* so abort it */
XX emits("\nScript - terminated\n");
XX script_on = FALSE;
XX script_wait = TRUE;
XX fclose(sf);
XX}
XX
XX/* remove quotes terminate string & return pointer to start */
XX
XXchar *tostring(ptr)
XXchar *ptr;
XX{
XX char *s;
XX
XX s = ptr;
XX if (*ptr == '"') {
XX while(*ptr++ && *ptr !='"');
XX if (*ptr == '"') {
XX *ptr = '\0';
XX ptr = s+1;
XX while(*s++) if (*s == '|') *s = '\r';
XX return(ptr);
XX }
XX }
XX if (*s == '^') {
XX *s = *(s+1)-64;
XX *(s+1) = '\0';
XX return(s);
XX }
XX *(s+1) = '\0';
XX return(s);
XX}
XX
XXcmd_goto(lname)
XXchar *lname;
XX{
XX struct LABEL *label;
XX /* if on_cmd was a goto kill wait state */
XX if (on_match) { wait_string[0] = '\0'; script_wait = FALSE; }
XX if ((label = find_label(lname)) == NULL) { /* is it forward */
XX strcpy(golabel,lname);
XX do_script_cmd(GOTOLABEL);
XX }
XX else {
XX fseek(sf,(long)(label->pos),0);
XX }
XX}
XX
XXcmd_send(str)
XXchar *str;
XX{
XX sendstring(tostring(str));
XX}
XX
XX
XXcmd_wait(str)
XXchar *str;
XX{
XX str = tostring(str);
XX *(str+20) = '\0'; /* 20 characters max */
XX strcpy(wait_string, str);
XX waitsize = strlen(str);
XX script_wait = WAIT_STRING;
XX}
XX
XXcmd_on(str)
XXchar *str;
XX{
XX char *p;
XX
XX p = tostring(str);
XX strcpy(on_string, p);
XX onsize = strlen(p);
XX *(p+onsize+2+20) = '\0'; /* 20 characters max */
XX strcpy(on_cmd,p+onsize+2);
XX}
XX
XXcmd_delay(seconds)
XXchar *seconds;
XX{
XX script_wait = WAIT_TIMER;
XX Script_Timer.tr_time.tv_secs = atoi(seconds);
XX Script_Timer.tr_time.tv_micro = 0;
XX SendIO((char *) &Script_Timer.tr_node);
XX}
XX
XXcmd_done()
XX{
XX exit_script();
XX}
XX
XXcmd_ks(file)
XXchar *file;
XX{
XX multi_xfer(file, doksend, 1);
XX}
XX
XXcmd_kr(file)
XXchar *file;
XX{
XX multi_xfer(file, dokreceive, 0);
XX}
XX
XXcmd_kg(file)
XXchar *file;
XX{
XX server = TRUE;
XX multi_xfer(file, dokreceive, 0);
XX}
XX
XXcmd_kb()
XX{
XX saybye();
XX}
XX
XXcmd_xs(file)
XXchar *file;
XX{
XX multi_xfer(file, XMODEM_Send_File, 1);
XX}
XX
XXcmd_xr(file)
XXchar *file;
XX{
XX multi_xfer(file, XMODEM_Read_File, 1);
XX}
XX
XXcmd_cap(file)
XXchar *file;
XX{
XXdo_capture(file);
XX}
XX
XXcmd_as(file)
XXchar *file;
XX{
XXdo_send(file);
XX}
XX
XXcmd_cd(name)
XXchar *name;
XX {
XX set_dir(name);
XX }
XX
XXcmd_sb(str)
XXchar *str;
XX {
XX sendbreak();
XX }
XX
XXcmd_baud(rate)
XXchar *rate;
XX{
XX int i = atoi(rate);
XX
XX switch( i )
XX {
XX case 300:
XX case 1200:
XX case 2400:
XX case 4800:
XX case 9600:
XX setserbaud(i, TRUE);
XX break;
XX
XX default:
XX emits("\nScript - invalid baud rate: ");
XX emits(rate);
XX emits("\n");
XX break;
XX }
XX}
XX
XXcmd_parity(par)
XXchar *par;
XX{
XX int i;
XX
XX switch( *par|' ' )
XX {
XX case 'n': i = -1; break;
XX case 'e': i = 0; break;
XX case 'o': i = 1; break;
XX
XX default:
XX emits("\nScript - invalid parity: ");
XX emits(par);
XX emits("\n");
XX return;
XX }
XX if (i >= 0 && p_wordsize != 7) {
XX setserword(7, TRUE); /* Set 7-bit words if we have parity. */
XX emits("\nScript - ");
XX emits(i == 0 ? "Even" : "Odd");
XX emits(" parity requested, WORD forced to 7 bits\n");
XX }
XX setserpar(i, TRUE);
XX}
XX
XXcmd_word(wordlength)
XXchar *wordlength;
XX{
XX int i = atoi(wordlength);
XX
XX switch( i )
XX {
XX case 8:
XX if (p_parity >= 0) {
XX emits("\nScript - 8-bit WORD requested, parity forced from ");
XX emits(p_parity == 0 ? "Even" : "Odd");
XX emits(" to None\n");
XX setserpar(-1, TRUE);
XX }
XX /* Fall through to case 7: */
XX case 7:
XX setserword(i, TRUE);
XX break;
XX
XX default:
XX emits("\nScript - invalid word length: ");
XX emit(*wordlength);
XX emits("\n");
XX break;
XX }
XX}
XX
XXcmd_bt(breaklength)
XXchar *breaklength;
XX{
XX long i = atol(breaklength);
XX AbortIO(Read_Request);
XX Read_Request->io_BrkTime = Write_Request->io_BrkTime = i;
XX setparams();
XX}
XX
XXcmd_tm(tmode)
XXchar *tmode;
XX{
XX switch (*tmode|' ') {
XX case 'i':
XX p_mode = 0;
XX break;
XX
XX case 'c':
XX p_mode = 1;
XX break;
XX
XX default:
XX emits("\nScript - invalid transfer mode: ");
XX emits(tmode);
XX emits("\n");
XX return;
XX }
XX
XX ClearMenuStrip(mywindow);
XX InitXFItems();
XX SetMenuStrip(mywindow,&menu[0]);
XX}
XX
XXcmd_null(file)
XXchar *file;
XX{
XX}
XX
SHAR_EOF
if test 11733 -ne "`wc -c script.c`"
then
echo shar: error transmitting script.c '(should have been 11733 characters)'
fi
echo shar: extracting window.c
sed 's/^XX//' << \SHAR_EOF > window.c
XX/****************************************************
XX * vt100 emulator - window/keyboard support
XX *
XX * v2.1 860915 DBW - new features (see README)
XX * 860823 DBW - Integrated and rewrote lots of code
XX * v2.0 860809 DBW - Major rewrite
XX * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes
XX * v1.0 860712 DBW - First version released
XX *
XX ****************************************************/
XX
XX#define MODULE_WINDOW 1
XX#include "vt100.h"
XX
XX/* forward declarations for LATTICE */
XXvoid filename();
XXvoid emits();
XXvoid emit();
XXvoid emitbatch();
XXvoid cursoroff();
XXvoid cursoron();
XX
XX/*************************************************
XX* function to get file name
XX*************************************************/
XXvoid filename(name)
XXchar name[];
XX {
XX char c;
XX ULONG class;
XX unsigned int code;
XX int keepgoing,i;
XX keepgoing = TRUE;
XX i=0;
XX while (keepgoing) {
XX while( NewMessage=(struct IntuiMessage *)GetMsg(mywindow->UserPort) )
XX {
XX class = NewMessage->Class;
XX code = NewMessage->Code;
XX ReplyMsg( NewMessage );
XX if (class=RAWKEY)
XX {
XX c = toasc(code,1);
XX name[i]=c;
XX if (name[i] != 0)
XX {
XX if (name[i] == 13)
XX {
XX name[i]=0;
XX keepgoing = FALSE;
XX }
XX else
XX {
XX if (name[i] == 8 || name[i] == 127)
XX {
XX i -= 2;
XX if (i < -1) i = -1;
XX else {
XX if (x == MINX) { y -= 8; x = MAXX; }
XX emit(8);
XX emit(32);
XX emit(8);
XX }
XX }
XX else
XX emit(c);
XX if (x == MAXX) emits("\n");
XX }
XX i += 1;
XX }
XX }
XX } /* end of new message loop */
XX } /* end of god knows what */
XX emit(13);
XX emit(10);
XX } /* end of function */
XX
XX
XX/*************************************************
XX* function to print a string
XX*************************************************/
XXvoid emits(string)
XXchar string[];
XX {
XX int i;
XX char c;
XX
XX i=0;
XX while (string[i] != 0)
XX {
XX c=string[i];
XX if (c == 10) emit(13);
XX emit(c);
XX i += 1;
XX }
XX }
XX
XX/*************************************************
XX* function to output ascii chars to window
XX*************************************************/
XXvoid emit(c)
XXchar c;
XX {
XX Move(mywindow->RPort,(long)x,(long)y);
XX
XX c &= 0x7F;
XX switch( c )
XX {
XX case '\t':
XX x += 64 - ((x-MINX) % 64);
XX break;
XX
XX case 10: /* lf */
XX y += 8;
XX break;
XX
XX case 13: /* cr */
XX x = MINX;
XX break;
XX
XX case 8: /* backspace */
XX x -= 8;
XX if (x < MINX) x = MINX;
XX break;
XX
XX case 12: /* page */
XX x = MINX;
XX y = MINY;
XX SetAPen(mywindow->RPort,0L);
XX RectFill(mywindow->RPort,(long)MINX,
XX (long)(MINY-7),(long)(MAXX+7),(long)(MAXY+1));
XX SetAPen(mywindow->RPort,1L);
XX break;
XX
XX case 7: /* bell */
XX DisplayBeep(NULL);
XX ClipBlit(mywindow->RPort,0L,0L,mywindow->RPort,0L,0L,
XX (long)MAXX,(long)MAXY,0x50L);
XX ClipBlit(mywindow->RPort,0L,0L,mywindow->RPort,0L,0L,
XX (long)MAXX,(long)MAXY,0x50L);
XX break;
XX
XX default:
XX if (c < ' ' || c > '~') break;
XX SetSoftStyle(mywindow->RPort,(long)curmode,255L);
XX if (curmode&FSF_REVERSE) {
XX SetDrMd(mywindow->RPort,(long)(JAM2+INVERSVID));
XX Text(mywindow->RPort,&c,1L);
XX SetDrMd(mywindow->RPort,(long)JAM2);
XX }
XX else Text(mywindow->RPort,&c,1L);
XX x += 8;
XX } /* end of switch */
XX
XX while (x > MAXX) x -= 8;
XX while (y > MAXY) {
XX y -= 8;
XX x = MINX;
XX ScrollRaster(mywindow->RPort,0L,8L,(long)MINX,
XX (long)(MINY-6),(long)(MAXX+7),(long)(MAXY+1));
XX }
XX }
XX
XX/*************************************************
XX* function to output ascii chars to window (batched)
XX*************************************************/
XXvoid emitbatch(la,lookahead)
XXint la;
XXchar *lookahead;
XX {
XX int i;
XX Move(mywindow->RPort,(long)x,(long)y);
XX i = x / 8;
XX if (i+la > maxcol) la = maxcol-i;
XX SetSoftStyle(mywindow->RPort,(long)curmode,255L);
XX if (curmode&FSF_REVERSE) {
XX SetDrMd(mywindow->RPort,(long)(JAM2+INVERSVID));
XX Text(mywindow->RPort,lookahead,(long)la);
XX SetDrMd(mywindow->RPort,(long)JAM2);
XX }
XX else Text(mywindow->RPort,lookahead,(long)la);
XX x += (8 * la);
XX }
XX
XX/******************************
XX* Manipulate cursor
XX******************************/
XXvoid cursoroff()
XX {
XX SetDrMd(mywindow->RPort,(long)COMPLEMENT);
XX SetAPen(mywindow->RPort,3L);
XX RectFill(mywindow->RPort,
XX (long)(x-1),(long)(y-6),(long)(x+8),(long)(y+1));
XX SetAPen(mywindow->RPort,1L);
XX SetDrMd(mywindow->RPort,(long)JAM2);
XX }
XX
XXvoid cursoron()
XX {
XX SetDrMd(mywindow->RPort,(long)COMPLEMENT);
XX SetAPen(mywindow->RPort,3L);
XX RectFill(mywindow->RPort,
XX (long)(x-1),(long)(y-6),(long)(x+8),(long)(y+1));
XX SetAPen(mywindow->RPort,1L);
XX SetDrMd(mywindow->RPort,(long)JAM2);
XX }
XX
XX/************************************************
XX* function to take raw key data and convert it
XX* into ascii chars
XX**************************************************/
XXint toasc(code,local)
XXunsigned int code;
XXint local;
XX {
XX static int ctrl = FALSE;
XX static int shift = FALSE;
XX static int capsl = FALSE;
XX static int amiga = FALSE;
XX char c = 0, keypad = 0;
XX static char keys[75] = {
XX '`','1','2','3','4','5','6','7','8','9','0','-' ,
XX '=','\\', 0, '0','q','w','e','r','t','y','u','i','o' ,
XX 'p','[',']', 0, '1','2','3','a','s','d','f','g','h' ,
XX 'j','k','l',';','\'', 0, 0, '4','5','6', 0, 'z','x','c','v',
XX 'b','n','m',44,'.','/', 0, '.','7','8','9',' ',8,
XX '\t',13,13,27,127,0,0,0,'-' } ;
XX
XX switch ( code )
XX {
XX case 98: capsl = TRUE; c = 0;break;
XX case 226: capsl = FALSE;c = 0;break;
XX case 99: ctrl = TRUE; c = 0;break;
XX case 227: ctrl = FALSE; c = 0;break;
XX case 96:
XX case 97: shift = TRUE; c = 0;break;
XX case 224:
XX case 225: shift = FALSE;c = 0;break;
XX case 102:
XX case 103: amiga = TRUE; c = 0; break;
XX case 230:
XX case 231: amiga = FALSE; c = 0; break;
XX case 0x50:
XX case 0x51:
XX case 0x52:
XX case 0x53:
XX case 0x54:
XX case 0x55:
XX case 0x56:
XX case 0x57:
XX case 0x58:
XX case 0x59: c = 0;
XX if (shift) sendstring(p_F[code - 0x50]);
XX else sendstring(p_f[code - 0x50]);
XX break;
XX case 0x0f: c = (keyapp) ? 'p' : '0'; keypad = TRUE; break;
XX case 0x1d: c = (keyapp) ? 'q' : '1'; keypad = TRUE; break;
XX case 0x1e: c = (keyapp) ? 'r' : '2'; keypad = TRUE; break;
XX case 0x1f: c = (keyapp) ? 's' : '3'; keypad = TRUE; break;
XX case 0x2d: c = (keyapp) ? 't' : '4'; keypad = TRUE; break;
XX case 0x2e: c = (keyapp) ? 'u' : '5'; keypad = TRUE; break;
XX case 0x2f: c = (keyapp) ? 'v' : '6'; keypad = TRUE; break;
XX case 0x3d: c = (keyapp) ? 'w' : '7'; keypad = TRUE; break;
XX case 0x3e: c = (keyapp) ? 'x' : '8'; keypad = TRUE; break;
XX case 0x3f: c = (keyapp) ? 'y' : '9'; keypad = TRUE; break;
XX case 0x43: c = (keyapp) ? 'M' : 13 ; keypad = TRUE; break;
XX case 0x4a: c = (keyapp) ? 'l' : '-'; keypad = TRUE; break;
XX case 0x5f: sendstring("\033Om") ;break;
XX case 0x3c: c = (keyapp) ? 'n' : '.'; keypad = TRUE; break;
XX case 0x4c:
XX case 0x4d:
XX case 0x4e:
XX case 0x4f: sendchar(27); /* cursor keys */
XX if (keyapp) sendchar('O');
XX else sendchar('[');
XX sendchar(code - 11);
XX break;
XX
XX default:
XX if (code < 75) c = keys[code];
XX else c = 0;
XX }
XX
XX if (keypad) {
XX if (keyapp) sendstring("\033O");
XX sendchar(c);
XX return(0);
XX }
XX
XX /* add modifiers to the keys */
XX
XX if (c != 0) {
XX if (shift) {
XX if ((c <= 'z') && (c >= 'a')) c -= 32;
XX else
XX switch( c ) {
XX case '[': c = '{'; break;
XX case ']': c = '}'; break;
XX case '\\': c = '|'; break;
XX case '\'': c = '"'; break;
XX case ';': c = ':'; break;
XX case '/': c = '?'; break;
XX case '.': c = '>'; break;
XX case ',': c = '<'; break;
XX case '`': c = '~'; break;
XX case '=': c = '+'; break;
XX case '-': c = '_'; break;
XX case '1': c = '!'; break;
XX case '2': c = '@'; break;
XX case '3': c = '#'; break;
XX case '4': c = '$'; break;
XX case '5': c = '%'; break;
XX case '6': c = '^'; break;
XX case '7': c = '&'; break;
XX case '8': c = '*'; break;
XX case '9': c = '('; break;
XX case '0': c = ')'; break;
XX default: break;
XX }
XX }
XX else if (capsl && (c <= 'z') && (c >= 'a')) c -= 32;
XX }
XX if (ctrl) {
XX if (c >= '`' && c <= 127) c -= 96;
XX else if (c >= '@' && c <= '_') c -= 64;
XX }
XX if (amiga && c == '.') { sendbreak(); return(0); }
XX if (c != 0 && (!local)) sendchar(c);
XX return((int)c);
XX }
XX
SHAR_EOF
if test 8147 -ne "`wc -c window.c`"
then
echo shar: error transmitting window.c '(should have been 8147 characters)'
fi
echo shar: extracting xmodem.c
sed 's/^XX//' << \SHAR_EOF > xmodem.c
XX/*************************************************************
XX * vt100 terminal emulator - XMODEM protocol support
XX *
XX * v2.1 860915 DBW - new features (see README)
XX * 860901 ACS - Added Parity and Word Length and support code
XX * 860823 DBW - Integrated and rewrote lots of code
XX * 860815 Steve Drew: readchar inproved with real timeouts
XX * v2.0 860809 DBW - Major rewrite
XX * v1.1 860720 DBW - Switches, 80 cols, colors, bug fixes
XX * v1.0 860712 DBW - First version released
XX *
XX *************************************************************/
XX
XX#define MODULE_XMODEM 1
XX#include "vt100.h"
XX
XXint enablexon = TRUE;
XX
XX/* forward declarations for LATTICE */
XXvoid sendstring();
XXvoid sendchar();
XXvoid sendbreak();
XXvoid No_XON();
XXvoid Do_XON();
XX
XXstatic unsigned long parity_settings[4] = {
XX 0x96696996,
XX 0x69969669,
XX 0x69969669,
XX 0x96696996 };
XX
XX/************************************************************
XX* Send a string (using sendchar below)
XX************************************************************/
XX
XXvoid sendstring(s)
XXchar *s;
XX {
XX char c;
XX
XX while ((c = *s++) != '\000') sendchar(c);
XX }
XX
XX/**************************************************************/
XX/* send char and read char functions for the xmodem function */
XX/************************************************************/
XXvoid sendchar(ch)
XXint ch;
XX {
XX int doxon,i,j,k;
XX
XX doxon = enablexon;
XX if (doxon) No_XON();
XX if (p_parity < 0) /* no parity */
XX rs_out[0] = ch & 0xFF;
XX else {
XX i = (ch >> 5) & 0x3;
XX j = ch & 0x1F;
XX k = ((parity_settings[i] >> j) & 0x1) << 7;
XX if (p_parity == 0) /* even parity */
XX rs_out[0] = (ch & 0x7F) | k;
XX else /* odd parity */
XX rs_out[0] = (ch & 0x7F) | (k ^ 0x80);
XX }
XX DoIO(Write_Request);
XX if (doxon) Do_XON();
XX }
XX
XX/* send a break to the host */
XXvoid sendbreak() {
XX AbortIO(Read_Request);
XX Read_Request->IOSer.io_Command = SDCMD_BREAK;
XX DoIO(Read_Request);
XX Read_Request->IOSer.io_Command = CMD_READ;
XX SendIO(Read_Request);
XX }
XX
XXint readchar()
XX {
XX int rd,ch;
XX
XX Timer.tr_time.tv_secs = ttime;
XX Timer.tr_time.tv_micro = 0;
XX SendIO((char *) &Timer.tr_node);
XX
XX rd = FALSE;
XX while (rd == FALSE)
XX {
XX Wait((1L << Read_Request->IOSer.io_Message.mn_ReplyPort->mp_SigBit) |
XX ( 1L << mywindow->UserPort->mp_SigBit) |
XX ( 1L << Timer_Port->mp_SigBit));
XX if (CheckIO(Read_Request))
XX {
XX WaitIO(Read_Request);
XX ch=rs_in[0];
XX rd = TRUE;
XX SendIO(Read_Request);
XX }
XX if (NewMessage=(struct IntuiMessage *)GetMsg(mywindow->UserPort)) {
XX if ((NewMessage->Class == RAWKEY) && (NewMessage->Code == 69))
XX {
XX AbortIO((char *) &Timer);
XX Wait (1L << Timer_Port->mp_SigBit);
XX if (want_message)
XX emits("\nUser aborted transfer\n");
XX timeout = USERABORT;
XX return('\0');
XX }
XX continue;
XX }
XX if (rd == FALSE && CheckIO(&Timer)) {
XX if (want_message)
XX emits("\nTimeout waiting for character\n");
XX timeout = TIMEOUT;
XX return('\0');
XX }
XX } /* end while */
XX AbortIO((char *) &Timer);
XX Wait (1L << Timer_Port->mp_SigBit);
XX timeout = GOODREAD;
XX return(ch & 0xFF);
XX }
XX
XXvoid No_XON() {
XX
XX /* turn off XON/XOFF processing */
XX enablexon = FALSE;
XX Write_Request->io_SerFlags |= SERF_XDISABLED;
XX Write_Request->IOSer.io_Command = SDCMD_SETPARAMS;
XX DoIO(Write_Request);
XX Write_Request->IOSer.io_Command = CMD_WRITE;
XX }
XX
XXvoid Do_XON() {
XX /* turn on XON/XOFF processing */
XX enablexon = TRUE;
XX Write_Request->io_SerFlags &= ~SERF_XDISABLED;
XX Write_Request->IOSer.io_Command = SDCMD_SETPARAMS;
XX DoIO(Write_Request);
XX Write_Request->IOSer.io_Command = CMD_WRITE;
XX }
XX
XX/**************************************/
XX/* xmodem send and recieve functions */
XX/************************************/
XX
XXint XMODEM_Read_File(file)
XXchar *file;
XX {
XX int firstchar, sectnum, sectcurr, sectcomp, errors, errorflag;
XX unsigned int checksum, j, bufptr;
XX char numb[10];
XX bytes_xferred = 0L;
XX ttime = TTIME_SHORT;
XX want_message = TRUE; /* tell readchar to print any error msgs */
XX
XX if ((fd = creat(file, 0)) < 0)
XX {
XX emits("Cannot Open File\n");
XX return FALSE;
XX }
XX else
XX emits("Receiving File\n\nType <ESC> to abort transfer\n");
XX
XX sectnum = errors = bufptr = 0;
XX sendchar(NAK);
XX firstchar = 0;
XX No_XON();
XX while (firstchar != EOT && errors != ERRORMAX)
XX {
XX errorflag = FALSE;
XX
XX do { /* get sync char */
XX firstchar = readchar();
XX if (timeout != GOODREAD) {
XX if (timeout == USERABORT || errors++ == ERRORMAX)
XX Do_XON();
XX return FALSE;
XX }
XX } while (firstchar != SOH && firstchar != EOT);
XX
XX if (firstchar == SOH)
XX {
XX emits(blanks);
XX emits("\rGetting Block ");
XX sprintf(numb, "%d", sectnum);
XX emits(numb);
XX emits("...");
XX sectcurr = readchar();
XX if (timeout != GOODREAD) { Do_XON(); return FALSE; }
XX sectcomp = readchar();
XX if (timeout != GOODREAD) { Do_XON(); return FALSE; }
XX if ((sectcurr + sectcomp) == 255)
XX {
XX if (sectcurr == ((sectnum + 1) & 0xff))
XX {
XX checksum = 0;
XX for (j = bufptr; j < (bufptr + SECSIZ); j++)
XX {
XX bufr[j] = readchar();
XX if (timeout != GOODREAD) { Do_XON(); return FALSE; }
XX checksum = (checksum + bufr[j]) & 0xff;
XX }
XX if (checksum == readchar() && timeout == GOODREAD)
XX {
XX errors = 0;
XX sectnum++;
XX bufptr += SECSIZ;
XX bytes_xferred += SECSIZ;
XX emits("verified\r");
XX if (bufptr == BufSize)
XX {
XX if (write(fd, bufr, BufSize-128) == EOF)
XX {
XX emits("\nError Writing File\n");
XX Do_XON();
XX return FALSE;
XX }
XX bufptr = 128;
XX for (j = 0; j < 128; j++)
XX bufr[j] = bufr[(BufSize-128)+j];
XX }
XX sendchar(ACK);
XX }
XX else
XX {
XX errorflag = TRUE;
XX if (timeout == USERABORT) { Do_XON(); return FALSE; }
XX }
XX }
XX else
XX {
XX /* got a duplicate sector */
XX if (sectcurr == (sectnum & 0xff))
XX {
XX /* wait until we time out for 5secs */
XX do {
XX readchar();
XX } while (timeout == GOODREAD);
XX if (timeout == USERABORT) {
XX Do_XON();
XX return FALSE;
XX }
XX emits("\nReceived Duplicate Sector\n");
XX sendchar(ACK);
XX }
XX else errorflag = TRUE;
XX }
XX }
XX else errorflag = TRUE;
XX }
XX if (errorflag == TRUE)
XX {
XX errors++;
XX emits("\nError\n");
XX sendchar(NAK);
XX }
XX } /* end while */
XX if ((firstchar == EOT) && (errors < ERRORMAX))
XX {
XX sendchar(ACK);
XX while (bufptr > 0 && (bufr[--bufptr] == 0x00 ||
XX bufr[bufptr] == 0x1A)) ;
XX write(fd, bufr, ++bufptr);
XX close(fd);
XX Do_XON();
XX return TRUE;
XX }
XX Do_XON();
XX return FALSE;
XX }
XX
XXint XMODEM_Send_File(file)
XXchar *file;
XX {
XX int sectnum, bytes_to_send, size, attempts, c;
XX unsigned checksum, j, bufptr;
XX char numb[10];
XX bytes_xferred = 0;
XX ttime = TTIME_LONG;
XX want_message = TRUE; /* tell readchar to print any error msgs */
XX
XX if ((fd = open(file, 0)) < 0) {
XX emits("Cannot Open Send File\n");
XX return FALSE;
XX }
XX else
XX emits("Sending File\n\nType <ESC> to abort transfer\n");
XX attempts = 0;
XX sectnum = 1;
XX No_XON();
XX /* wait for sync char */
XX j=1;
XX while (((c = readchar()) != NAK) && (j++ < ERRORMAX))
XX if (timeout == USERABORT) { Do_XON(); return(FALSE); }
XX if (j >= (ERRORMAX))
XX {
XX emits("\nReceiver not sending NAKs\n");
XX Do_XON();
XX return FALSE;
XX }
XX
XX while ((bytes_to_send = read(fd, bufr, BufSize)) && attempts != RETRYMAX)
XX {
XX if (bytes_to_send == EOF)
XX {
XX emits("\nError Reading File\n");
XX Do_XON();
XX return FALSE;
XX }
XX
XX bufptr = 0;
XX while (bytes_to_send > 0 && attempts != RETRYMAX)
XX {
XX attempts = 0;
XX emits(blanks);
XX emits("\rBlock ");
XX sprintf(numb, "%d ", sectnum);
XX emits(numb);
XX do {
XX emits(".");
XX sendchar(SOH);
XX sendchar(sectnum);
XX sendchar(~sectnum);
XX checksum = 0;
XX size = SECSIZ <= bytes_to_send ? SECSIZ : bytes_to_send;
XX bytes_to_send -= size;
XX for (j = bufptr; j < (bufptr + SECSIZ); j++)
XX if (j < (bufptr + size)) {
XX sendchar(bufr[j]);
XX checksum += bufr[j];
XX }
XX else sendchar(0);
XX sendchar(checksum);
XX attempts++;
XX c = readchar();
XX if (timeout == USERABORT) {
XX emits("\n");
XX Do_XON();
XX return FALSE;
XX }
XX } while ((c != ACK) && (attempts != RETRYMAX));
XX bufptr += size;
XX bytes_xferred += size;
XX emits(" sent\r");
XX sectnum++;
XX }
XX }
XX close(fd);
XX if (attempts == RETRYMAX)
XX {
XX emits("\nNo Acknowledgment Of Sector, Aborting\n");
XX Do_XON();
XX return FALSE;
XX }
XX else
XX {
XX attempts = 0;
XX do {
XX sendchar(EOT);
XX attempts++;
XX } while ((readchar() != ACK) &&
XX (attempts != RETRYMAX) &&
XX (timeout != USERABORT)) ;
XX if (attempts == RETRYMAX)
XX emits("\nNo Acknowledgment Of End Of File\n");
XX }
XX Do_XON();
XX return TRUE;
XX }
XX
SHAR_EOF
if test 9012 -ne "`wc -c xmodem.c`"
then
echo shar: error transmitting xmodem.c '(should have been 9012 characters)'
fi
# End of shell archive
exit 0
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads