This is logoparse.m in view mode; [Download] [Up]
#include "logo.h" #ifdef NEXT #include <stdio.h> extern const char *homeval; extern const char *helpdir; #endif NEXT extern int multnum,endflag,rendflag,topf; extern char ibuf[]; extern char *ibufptr, *getbpt, charib; extern int letflag,pflag; #ifdef PAUSE extern int pauselev; #endif extern FILE *pbuf; extern struct lexstruct keywords[]; extern struct alist *locptr; extern struct runblock *thisrun; #ifdef NEXT #import <streams/streams.h> extern NXStream *aStream; #endif NEXT struct object *makeword(c) int c; { register struct object* obj; register char *s; char str[100]; s=str; do { if (c == '\\') c = getchar()|0200; else if (c == '%') c = ' '|0200; *s++ = c; } while((c=getchar())>0 && !index(" \t\n[]",c)); #ifndef NEXT if (c<=0) { #else NEXT if (c<=0) { #endif NEXT printf("Unmatched [ in procedure.\n"); errhand(); } charib = c; *s = '\0'; obj = objcpstr(str); if (nump(obj)) { obj = numconv(localize(obj),"!makeword"); mfree(globcopy(obj)); /* unlocalize */ return(obj); } return(globcopy(obj)); } struct object *makel1() { register struct object *head,*tail; register c,cnt; while ((c=getchar())==' ' || c=='\t' || c=='\n') ; if(c==']') { charib = c; return ((struct object *)0); } #ifndef NEXT if (c<=0) { #else NEXT if (c<=0) { #endif NEXT printf("Unmatched [ in procedure.\n"); errhand(); } head = (struct object*)ckmalloc(sizeof(struct object)); tail = head; cnt = 0; head->obtype = CONS; head->refcnt = 0; head->obcdr = 0; loop: if (c=='[') { tail->obcar = globcopy(makel1()); getchar(); /* gobble the peeked close bracket */ } else { tail->obcar = makeword(c); /* This used to use charib instead of passing the char as * an argument, but that loses if the first char of a word * is backslash, in which case something is already in * charib from getchr1. */ } while ((c=getchar())==' ' || c=='\t' || c=='\n') ; if(c==']') { charib = c; return (head); } #ifndef NEXT if (c<=0) { #else NEXT if (c<=0) { #endif NEXT printf("Unmatched [ in procedure.\n"); errhand(); } tail->obcdr = (struct object*)ckmalloc(sizeof(struct object)); tail = tail->obcdr; tail->obtype = CONS; tail->refcnt = 1; tail->obcdr = 0; goto loop; } struct object *makelist() { return(localize(makel1())); } #ifdef DEBUG getchr1() #else getchar() #endif { FAST c; if (charib) { c=charib; charib=0; return(c); } else if (pflag==1) { while ((c=getc(pbuf))=='\r') ; if (c=='\\' && letflag!=1) { /* continuation line feature */ c=getc(pbuf); if(c=='\n') c=getc(pbuf); else { charib = c; c = '\\'; } } if (!letflag && c>='A' && c<='Z') c+= 32; return(c); } else if (getbpt) { /* BH 5/19/81 moved down below pflag test */ c = *getbpt++; if (c) return (c); if (!thisrun) { getbpt = 0; return('\n'); } /* startup file feature */ --getbpt; if (--(thisrun->rcount) <= 0) { if (!rendflag) rendflag = 1; /* BH 3/17/83 */ return(0); } else { rerun(); return('\n'); } } else if (ibufptr==NULL) { rebuff: #ifdef NEXT if ((c=NXRead(aStream,ibuf,IBUFSIZ))==IBUFSIZ) { if (ibuf[IBUFSIZ-1]!='\0') while (NXRead(aStream,ibuf,IBUFSIZ)==IBUFSIZ) #else if ((c=read(0,ibuf,IBUFSIZ))==IBUFSIZ) if (ibuf[IBUFSIZ-1]!='\n') { while (read(0,ibuf,IBUFSIZ)==IBUFSIZ) #endif NEXT if (ibuf[IBUFSIZ-1]=='\n') break; puts("Your line is too long."); errhand(); } if (c<0) { /* Error return from read. Probably signal. */ return ('\n'); } if (c==0) { /* Not clear what's right for EOF. I'd just ignore it only what if stdin is a file, we'll loop forever. Compromise: if we're paused, don't lose the valuable context with a keystroke, otherwise, exit. */ #ifdef PAUSE if (pauselev) return('\n'); #endif #ifdef NEXT leave(2); #else NEXT leave(3); #endif NEXT } ibufptr=ibuf; } c= *ibufptr++; if (c=='\\' && letflag!=1) { /* continuation line feature */ c = *ibufptr++; if (c=='\n') { ibufptr=NULL; goto rebuff; /* sorry, Jay */ } else { charib = c; c = '\\'; } } if (!letflag && c>='A' && c<='Z') c+=32; #ifdef NEXT if (c=='\0' || c=='\n') { ibufptr=NULL; } /* if (c=='\n') ibufptr=NULL; */ #else NEXT if (c=='\n') ibufptr=NULL; #endif NEXT return(c); } #ifdef DEBUG getchar() { /* BH 3/23/80 debugging echo output */ register c; c = getchr1(); if (memtrace) putchar(c); return(c); } #endif struct object *multiop(op,args) register op; register struct object *args; { extern struct object *list(); if (keywords[op].lexval==list) return (localize(args)); else if (multnum<2) { nputs(keywords[op].word); puts(" needs at least two inputs."); errhand(); } else if (multnum==2) return ((*keywords[op].lexval)(localize(args->obcar), localize(args->obcdr->obcar))); else { multnum--; return ((*keywords[op].lexval)(localize(args->obcar), multiop(op,args->obcdr))); } } struct object *pots() { register f; #ifdef NEXT char firstpots[400],potscmnd[400],potspipe[1024]; FILE *popen(), *potsstream; char *retptr; if (homeval == NULL) cpystr(firstpots,POTSCMD," ",LOCALLIB,"*",EXTEN,NULL); else cpystr(firstpots,POTSCMD," ",homeval,"*",EXTEN,NULL); if (helpdir == NULL) cpystr(potscmnd,DOCLOGO,firstpots,NULL); else cpystr(potscmnd,helpdir,firstpots,NULL); potsstream = popen(potscmnd,"r"); while((retptr = fgets(potspipe,1024,potsstream)) != NULL){ printf("%s",&potspipe); fflush(stdout); } pclose(potsstream); fflush(stdout); #else NEXT if (f=fork()) while (wait(0)!=f) ; else { execl ("/bin/sh","sh","-c",POTSCMD,0); exit(); } #endif NEXT return((struct object *)-1); } lbreak() { #ifdef PAUSE if (!pflag && thisrun && thisrun->str==(struct object *)(-1)) unpause(); #endif if (!pflag && thisrun) { rendflag = 1; /* BH 3/17/83 */ if (thisrun->rprev && !(thisrun->svpflag)) rendflag++; } } lstop() { endflag = 1; #ifdef PAUSE if (!pflag && thisrun && thisrun->str==(struct object *)(-1)) unpause(); #endif if (!pflag && thisrun) rendflag = 3; /* BH 3/17/83 */ } ltopl() { topf=1; errwhere(); errzap(); leave(1); } lbyecom() { leave(3); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.