The declarations shown below contain several extraneous elements, and are only included for consistency with the rest of the program, in case the definition of terms used elsewhere is needed.
/* * RECView.m -- Implementation file for the RECView class * * You may freely copy, distribute, and reuse the code in this example. * NeXT disclaims any warranty of any kind, expressed or implied, as to * its fitness for any particular use, or that it even has a use. * */ #import "rec.h" #import "recdtbl.h" #import "RECView.h" #import <NXCType.h> #import <math.h> #import <stdlib.h> #import <string.h> # define CLEN 600 /* buffer length for rec source */ # define PLEN 2000 /* buffer length for rec object */ # define HMAX 50 /* maximum depth pushdown stack */ # define CMAX 10 /* number of saved constants */ # define NMU 5 /* number of items in first column */ # define NY 8 /* number of demonstration programs */ # define NIP 12 /* number of initial polygons */ # define NSK 5 /* number of prototype skeletons */ # define PI 3.14159 //int rec(char *z); char cstr[CLEN] = { " (()) " }; /* console rec program */ Inst rprg[PLEN]; /* rec program array */ int phil; /* length of cstr */ char idef[1][30] = { " (()) " }; //(z(!100!0r:;)1r2r(0r:;);) a€" }; char recrule[NY][CLEN] = { " ([pentagonal] X5 P CN CN CN CN C p ;)", " ([bipentag] X5 P CN CN CN Cn Cn Cn Cn C p ;)", " ([two sectors] B C R2 C R1 C N C ;)" }; char skeletons[NSK][CLEN] = { " ([the polygon] B C ;)" " ([top polygon] O C ;)", " ([sector] O (!n! C N :;) ;)", " ([binary] O (!n-1! C N :;) (!n-1! C n :;);)", " ([second] O (!n! C N :;) ;)" }; int isErrm=FALSE; int drawBack=YES; int exSource=YES; int options[4]={FALSE,FALSE,FALSE,FALSE}; char errm[50]; double cgrad=0.15; /* threshold in tanh compression */ double gmulp=10.0; /* scale factor turning complex numbers into pixels */ double qsize=1.50; /* size of small pixel squares on screen */ double exoff=0.0, wyoff=0.0; extern double r_dblpar; int plev=0; /* pushdown depth */ double constant[CMAX][2]; /* saved constants */ double thestack[HMAX][2]; /* operating stack */ @implementation RECView /* --------------- A P P I N I T I A L I Z A T I O N ----------------- */ - appWillInit:sender {printf("appWillInit = REC/C\n"); return self;} - appDidInit:sender { char c[3], fecha[30], tiempo[30], *df; int i; struct tm *timeptr; time_t secsnow; printf("appDidInit = REC/C for Complex Arithmetic\n"); time(&secsnow); timeptr = localtime(&secsnow); sprintf(fecha,"%d-%d-19%02d\n", ((timeptr->tm_mon) + 1), timeptr->tm_mday, timeptr->tm_year); [tiDat setStringValue: fecha]; sprintf(tiempo,"%02d:%02d:%02d\n", timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec); // [titime setStringValue: tiempo]; ///* initialize r_vst with select standard procedures */ // rec_c(idef[0],xprg[0],XLEN,dtbl); // r_vst['a']=xprg[0]; [browser getTitleFromPreviousColumn: YES]; [browser setDoubleAction: @selector(browserDoubleClick:)]; [browser setPath: "/demonstrations"]; [self loadExternal: self]; return self; } - appWillTerminate:sender {printf("goodbye\n"); return self;} /* ----------------------------- G E N E R A L ----------------------------- */ /* = = = = = = = P a r a m e t e r A d j u s t m e n t = = = = = = = */ - rexsli:sender {int i; /* set x-offset */ exoff=120.0*[sender doubleValue]; [planeView display]; return self; } - rwysli:sender { /* set y-offset */ wyoff=120.0*[sender doubleValue]; [planeView display]; return self; } /* = = = = = = = = = = P r o g r a m E d i t o r = = = = = = = = = = */ - recMatrix:sender { printf("selected row = %3d\n ",[sender selectedRow]); [comment setStringValue: dtbl[ [sender selectedRow] * 32 + [sender selectedCol] ].r_cmnt]; return self; } - ascii:sender { dtbl[ [sender selectedRow] * 32 + [sender selectedCol] ].xfun(); return self; } /* = = = = = = = = = P r o g r a m E x e c u t o r = = = = = = = = = */ - setOption:sender {int i; i=[sender selectedCol]; options[i]=[[sender selectedCell] state]; return self; } - run:sender {[planeView display]; return self;} - recompile:sender { [execWin getSubstring: cstr start: 0 length: [execWin textLength]]; [window setDocEdited:YES]; return self; } - browserDoubleClick:sender {int i, j, k; if (strcmp([browser titleOfColumn: [browser selectedColumn]], "initial polygons") == 0) {} else if (strcmp([browser titleOfColumn: [browser selectedColumn]], "demonstrations") == 0) { [RECValue setStringValue: " "]; [execLine setStringValue: [sender stringValue]]; strcpy(cstr,[sender stringValue]); } else if (strcmp([browser titleOfColumn: [browser selectedColumn]], "skeletons") == 0) { [RECValue setStringValue: " "]; [execLine setStringValue: [sender stringValue]]; } [planeView display]; return self; } - gho:sender { strcpy(cstr,[sender stringValue]); //printf("went and ghoed: %s\n",[sender stringValue]); //printf("went and ghoed: %s\n",cstr); [planeView display]; return self; } /* - - - - - - - - F I L E A N D D I R E C T O R Y - - - - - - - - */ - setFilename:(const char *)aFilename { if (filename) free(filename); filename = malloc(strlen(aFilename)+1); strcpy(filename, aFilename); [window setTitleAsFilename:aFilename]; return self; } - open:sender { char *types[2] = {"rec",0}; int i, fd; NXStream *theStream; [[OpenPanel new] allowMultipleFiles: NO]; [[OpenPanel new] chooseDirectories: NO]; if ([ [OpenPanel new] runModalForTypes:types]) { [self setFilename: [[OpenPanel new] filename]]; fd = open(filename, O_RDONLY, 06666); theStream = NXOpenFile(fd, NX_READONLY); // NXScanf(theStream,"%s",cstr); i=0; while (NXScanf(theStream,"%c",&cstr[i])!=EOF) i++; phil=strlen(cstr); NXClose(theStream); close(fd); [window setTitleAsFilename: filename]; [window setDocEdited:NO]; [execWin setSel: 0: [execWin textLength]]; [execWin replaceSel: cstr]; [execWin scrollSelToVisible]; [execWin display]; } return self; } - saveAs:sender { id panel; const char *dir; char *file; /* prompt user for the file name and save to that file */ if (filename==0) { /* no filename; set up defaults */ dir = NXHomeDirectory(); file = (char *)[window title]; } else { file=rindex(filename,'/'); if (file) { dir = filename; *file = 0; file++; } else { dir = filename; file = (char *)[window title]; } } panel = [SavePanel new]; [panel setRequiredFileType: ""]; if ([panel runModalForDirectory: dir file: file]) { [self setFilename: [panel filename]]; return [self save: sender]; } return nil; /* didn't save */ } - save:sender { int fd; NXStream *theStream; if (filename==0) return [self saveAs: sender]; [window setTitle: "Saving ..."]; fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 06666); if (fd < 0) { NXRunAlertPanel(0, "Cannot save file: %s",0,0,0,strerror(errno)); return self; } theStream = NXOpenFile(fd, NX_WRITEONLY); [execWin writeText: theStream]; NXClose(theStream); close(fd); [window setTitleAsFilename: filename]; [window setDocEdited:NO]; return self; } - close:sender {const char *fname; int q; if ([window isDocEdited]) // fname=filename ? filename : [sender title]; // if (rindex(fname,'/')) fname = rindex(fname,'/') + 1; q = NXRunAlertPanel( "Save", "Save changes to %s?", "Save", "Don't Save", "Cancel", filename); if (q==1) {if (![self save:nil]) return nil;} if(q==-1) return nil; // [sender setDelegate: nil]; // [proc free]; // [self free]; return self; } - windowWillClose:sender { [self close: self]; printf("windowWillClose\n"); return self; } /******* REC program management ********/ - loadRECPanel:sender { if ([sender state]) [self loadInternal: sender]; else [self loadExternal: sender];} - loadInternal:sender { printf("Internal\n "); [self loadLowerPaneltwo: internalRECBox ]; return self; } - loadExternal:sender { printf("External\n "); [self loadLowerPaneltwo: externalRECBox ]; return self; } - loadLowerPaneltwo:thisRuleBox {NXRect bxRect, loRect; [theBigBox getFrame: &bxRect]; [thisRuleBox getFrame: &loRect]; [theLilBox setContentView: [thisRuleBox contentView]]; loRect.origin.x=(bxRect.size.width-loRect.size.width)/2.0; loRect.origin.y=(bxRect.size.height-loRect.size.height)/2.0; [theLilBox setFrame: &loRect]; [theBigBox display]; [theLilBox display]; return self; } - textDidChange:textObject { return [windows setDocEdited: YES]; }