/* sMOVIEparse.c - Function which scans a text file and builds lists in memory which are subsequently used to produce a view which essentially just smoothly scrolls the text from the file up through the view. (Runner up in the 1989 Silver Bogroll award for long involved sentences.) M. J. Round. 7 - Oct - 1989. */ #include "sMOVIE.h" extern struct GfxBase *GfxBase; extern struct RastPort rp; extern struct TextFont *tf[MAXFONTS+1], *font, *defaultfont; extern char *txptr,fontname[MAXFONTS][MAXFONTNAMELENGTH]; extern char line[MAXLINE + 1],buff[MAXLINE * 2]; extern int pointsize[MAXFONTS],fonts,textsiz,cmdsiz,maxfontheight; extern int height,width,maxheight,maxwidth,maxdepth,centring,ind,tab; extern int no_text_or_lines; extern short *cmdptr; extern char esc; extern int runningfromcli; void getargs(int,char *); int checksizes(int *,int *,short *,short *,short *); void parse(fp,pass) /* parse script file */ /* 1st pass (pass == 0) Build font table, calculate memory requirement */ /* 2nd pass (pass != 0) create *txptr and *cmdptr lists. */ FILE *fp; int pass; { char *p,fname[MAXFONTNAMELENGTH]; int i,j,fsize,depth; FILE *fil; while((p = fgets(line, MAXLINE, fp)) != NULL) { if(line[strlen(line)-1] != '\n') (void) strcat(line,"\n"); if (*p++ == esc) { j =0; for (i=0; i<3; i++) /* code 3 letter command to an integer value */ j = j * 26 - 65 + toupper((int)*p++); switch (j) { /* * * * * * * * * * * * * * * * * * */ case 1655: /* CLR: clear screen */ case 1656: /* CLS: synonym */ if (pass) *cmdptr++ = 7; /* command code */ else cmdsiz += 1; continue; /* * * * * * * * * * * * * * * * * * */ case 1727: /* COL: change pen colour */ if (pass) { *cmdptr++ = 3; /* command code */ getargs(2,p); } else cmdsiz += 3; continue; /* * * * * * * * * * * * * * * * * * */ case 1728: /* COM: comment */ continue; /* * * * * * * * * * * * * * * * * * */ case 2147: /* DEP: change screen depth */ if (pass) { p = strtok(stpblk(p)," ;"); if (p != NULL && isdigit((int)*p)) depth = atoi(p); if (depth > MAX_DEPTH) depth = MAX_DEPTH; if (depth < 1) depth = 1; if (depth > maxdepth) maxdepth = depth; } continue; /* * * * * * * * * * * * * * * * * * */ case 2177: /* DFT: default sizesn */ if (pass) { short dummy; *cmdptr++ = 13; /* command code */ width = GfxBase->NormalDisplayColumns; height = GfxBase->NormalDisplayRows; checksizes(&width,&height,&dummy,&dummy,&dummy); } else cmdsiz += 1; continue; /* * * * * * * * * * * * * * * * * * */ case 2338: /* DLY: delay (jiffies) */ if (pass) { *cmdptr++ = 5; /* command code */ getargs(1,p); } else cmdsiz += 2; continue; /* * * * * * * * * * * * * * * * * * */ case 3174: /* ESC: change esc character */ p = stpblk(p); if (*p != '\0') { esc = *p; if (!pass && runningfromcli) { sprintf(buff,"Escape code changed to '%c'.\n",esc); print(buff); } } else if (!pass && runningfromcli) { sprintf(buff,"Corrupt ESC command:-\n%s\n",line); print(buff); } continue; /* * * * * * * * * * * * * * * * * * */ case 3599: /* FIL: include a file */ p = stpblk(p); if (isalpha((int)*p)) { if ((fil = fopen(strtok(p,",; \n"),"r")) == NULL) { if (!pass && runningfromcli) { sprintf(buff,"FIL can't open %s\n",p); print(buff); } } else { /* isn't recursion wonderful? */ parse(fil,pass); fclose(fil); } } else if (!pass && runningfromcli) { sprintf(buff,"Corrupt FIL command:-\n%s\n",line); print(buff); } continue; /* * * * * * * * * * * * * * * * * * */ case 3737: /* FNT: change font */ fname[0] = '\0'; /* fetch name and pointsize */ p = stpsym(stpblk(p),fname,MAXFONTNAMELENGTH); p = stpblk(p); if (isdigit((int)*p)) fsize = atoi(p); else fsize = 0; if (pass) { *cmdptr++ = 4; /* command code */ *cmdptr = 0; /* default code */ font = defaultfont; for (i=0; i= MAXFONTS) { if (runningfromcli) { sprintf(buff,"Too many fonts:-\n%s\n",line); print(buff); } continue; } strcpy(fontname[fonts],fname); pointsize[fonts] = fsize; if (fontname[fonts][0] != '\0' && pointsize[fonts]) { ++fonts; /* check for duplications */ { for (i=0; i<(fonts-1); i++) if(strcmp(fontname[i], fontname[fonts-1]) == 0 && pointsize[i] == pointsize[fonts-1]) --fonts; } } else { if (runningfromcli) { sprintf("Corrupt FNT command:-\n%s\n",line); print(buff); } continue; } } continue; /* * * * * * * * * * * * * * * * * * */ case 5749: /* IND: set left margin */ if (pass) { p = strtok(stpblk(p)," ;"); if (p != NULL && isdigit((int)*p)) { ind = atoi(p); if (ind > width - 2) ind = 0; } else if (runningfromcli) { sprintf(buff, "Corrupt IND command:-\n%s\n",line); print(buff); } } continue; /* * * * * * * * * * * * * * * * * * */ case 7792: /* LNS: draw line(s) */ if (pass) { *cmdptr++ = 2; /* command code */ getargs(3,p); } else { cmdsiz += 4; no_text_or_lines = 0; } continue; /* * * * * * * * * * * * * * * * * * */ case 9596: /* OFC: turn off centring */ if (pass) centring = 0; continue; /* * * * * * * * * * * * * * * * * * */ case 9804: /* ONC: turn on centring */ if (pass) centring = 1; continue; /* * * * * * * * * * * * * * * * * * */ case 10445: /* PLT: change pallette */ if (pass) { *cmdptr++ = 10; /* command code */ getargs(4,p); } else cmdsiz += 5; continue; /* * * * * * * * * * * * * * * * * * */ case 11979: /* RST: replay from start */ if (pass) *cmdptr++ = 14; /* command code */ else cmdsiz += 1; continue; /* * * * * * * * * * * * * * * * * * */ case 12401: /* SIZ: screen size change */ if (pass) { *cmdptr++ = 11; /* command code */ p = stpblk(p); if (strnicmp(p,"HIRES",5) == 0) *cmdptr++ = 1; else if (strnicmp(p,"LORES",5) == 0) *cmdptr++ = 0; else { *cmdptr++ = 1; if (runningfromcli) { sprintf(buff, "Not 'HIRES' or 'LORES' :-\n%s\n",line); print(buff); } } p = strpbrk(p,", "); getargs(5,p); width = *(cmdptr-5); height = *(cmdptr-4); if(checksizes(&width,&height, cmdptr-3,cmdptr-2,cmdptr-1)) *(cmdptr-6) = 1; /* must be HIRES */ *(cmdptr-5) = width; *(cmdptr-4) = height; } else cmdsiz += 7; continue; /* * * * * * * * * * * * * * * * * * */ case 12560: /* SPC: change text spacing */ if (pass) { *cmdptr++ = 9; /* command code */ getargs(1,p); } else cmdsiz += 2; continue; /* * * * * * * * * * * * * * * * * * */ case 12561: /* SPD: change scroll speed */ if (pass) { *cmdptr++ = 6; /* command code */ getargs(1,p); } else cmdsiz += 2; continue; /* * * * * * * * * * * * * * * * * * */ case 12661: /* SSZ: smooth sizing */ if (pass) { *cmdptr++ = 12; /* command code */ getargs(7,p); width = *(cmdptr-5); height = *(cmdptr-4); checksizes(&width,&height, cmdptr-3,cmdptr-2,cmdptr-1); *(cmdptr-5) = width; *(cmdptr-4) = height; } else cmdsiz += 8; continue; /* * * * * * * * * * * * * * * * * * */ case 12845: /* TAB: set tab expansion */ p = strtok(stpblk(p)," ;"); if (p != NULL && isdigit((int)*p)) { tab = atoi(p); if (tab > MAXLINE - 2) tab = 0; } else { tab = DEFAULTTABSIZE; if (pass && runningfromcli) { sprintf(buff,"Corrupt TAB command:-\n%s\n",line); print(buff); } } continue; /* * * * * * * * * * * * * * * * * * */ default: if (!pass && runningfromcli) { sprintf(buff,"Bad code: Value: %d\n%s",j,line); print(buff); } continue; /* * * * * * * * * * * * * * * * * * */ } /* end of switch */ } /* end of if */ else { /* handle lines NOT starting with escape code i.e. text */ /* expand tabs */ if (strchr(line,'\t')) { char copy[MAXLINE + 1],last; register char *p, *t; register int n; int i; t = strcpy(copy,line); p = line; for (n = 1; (last = *p++ = *t++) && (n <= MAXLINE); ++n) { if (last == '\t') { n--; p--; if (tab) for (i = tab - n % tab; i>0; i--) { *p++ = ' '; n++; if (n >= MAXLINE) break; } } } if (n >= MAXLINE) strcpy (line,copy); } if (pass) { *cmdptr++ = 1; *cmdptr++ = strlen(line)-1; if (centring) { SetFont(&rp,font); /* print text at middle window height */ Move(&rp,0,30+(font->tf_Baseline * 2 - font->tf_YSize)/2); Text(&rp,line,*(cmdptr-1)); *cmdptr = (width - rp.cp_x)/2; if (*cmdptr < 0 || *cmdptr > width/2) *cmdptr = 0; ++cmdptr; } else *cmdptr++ = ind; if(strlen(line) > 1) txptr = strncpy(txptr,line,strlen(line)-1); txptr += strlen(line)-1; } else { cmdsiz += 3; textsiz += strlen(line)-1; no_text_or_lines = 0; } } } /* while */ } /* end of parse */ void getargs(number,p) int number; char *p; { char *t; int fail; strcpy(buff,line); /* take copy 'cos strtok() changes string */ fail = 0; if (--number) t = strtok(stpblk(p)," ,"); else t = strtok(stpblk(p)," ;"); if (t != NULL && isdigit(*t)) *cmdptr++ = (short) atoi(t); else { *cmdptr++ = 0; fail = 1; } while (number--) if (fail) *cmdptr++ = 0; else { if (number) t = strtok(NULL," ,"); else t = strtok(NULL," ;"); if (t != NULL && *t == '-' || isdigit(*t)) *cmdptr++ = (short) atoi(t); else { *cmdptr++ = 0; fail = 1; } } if (fail && runningfromcli) { strcpy(line,buff); sprintf(buff,"Corrupt command:-\n%s\n",line); print(buff); } } /* end of getargs */ int checksizes(w,h,x,y,ox) int *w,*h; short *x,*y,*ox; { int hires = 0; if (*w > MAX_WIDTH) *w = MAX_WIDTH; if (*w < MIN_WIDTH) *w = MIN_WIDTH; if (*w > 352) hires=1; /* must be HIRES */ if (*h > MAX_HEIGHT) *h = MAX_HEIGHT; if (*h < MIN_HEIGHT) *h = MIN_HEIGHT; if (*w > maxwidth) maxwidth = *w; if (*h > maxheight) maxheight = *h; if (*x > 703) *x = 703; if (*x > 351) hires=1; /* must be HIRES */ if (*y > 200) *y = 200; if (*x < -16) *x = -16; if (*y < -16) *y = -16; if (*ox < 0) *ox = 0; if (*ox > 640) *ox = 640; return (hires); }