This is COWSUserController.m in view mode; [Download] [Up]
/* Copyright (C) 1994 Sean Luke COWSUserController.m Version 1.4 Sean Luke Allows easy hookup to libraries and control nib and interpreter */ #import "COWSUserController.h" #import "COWSInterpreter.h" #import "COWSStringNode.h" #import "COWSControlPanel.h" #import <string.h> #import <stdlib.h> @implementation COWSUserController - init { id returnval=[super init]; autostart=COWSCONTROLLER_NOAUTOLOAD; return returnval; } - awakeFromNib { [controlPanel connect:self]; if (interpreter&&[interpreter conformsTo:@protocol(InterpreterControl)]) { [interpreter printErrors:NO]; [interpreter setTimedEntrySpeed:timed_entry_speed]; [interpreter setRepeats:pulses_per_timed_entry]; [interpreter setLocked:locked]; [interpreter setForeground:foreground]; [[controlPanel lockedButton] setIntValue:locked]; [[controlPanel foregroundButton] setIntValue:foreground]; } else { printf ("COWS User Controller ERROR: no interpreter to load and run!\n"); return NULL; } return self; } - load:sender { char* prog; if (program&&[program isKindOf:[Text class]]) { int length=[program textLength]; prog=malloc(length + 1); [program getSubstring:prog start:0 length:length]; prog[length]='\0'; // some bug in Text object } else { printf ("COWS User Controller Warning: no program\n"); prog=malloc(1); prog[0]='\0'; } if (interpreter&&[interpreter conformsTo:@protocol(InterpreterControl)]) { [interpreter clearLibraryFunctions]; if (library1) [interpreter addLibrary:library1]; if (library2) [interpreter addLibrary:library2]; if (library3) [interpreter addLibrary:library3]; if (library4) [interpreter addLibrary:library4]; if (library5) [interpreter addLibrary:library5]; if (library6) [interpreter addLibrary:library6]; if (library7) [interpreter addLibrary:library7]; if (library8) [interpreter addLibrary:library8]; //if (delegate&&[delegate respondsTo:@selector(loadLibraries)]) // [delegate loadlibraries]; if ([interpreter setProgram:prog]<0) { NXRunAlertPanel ("Load","Syntax Error in Program Load","Oops",NULL, NULL); free(prog); return NULL; } } else { printf ("COWS User Controller ERROR: no interpreter to load!\n"); free(prog); return NULL; } free(prog); return self; } - run:sender { id args, new_args; if (interpreter&&[interpreter conformsTo:@protocol(InterpreterControl)]) { if ([interpreter working]) { printf ("COWS User Controller ERROR: interpreter already working!\n"); return NULL; } args=[[COWSArgumentList alloc] init]; if (strlen([[controlPanel arg1] stringValue])) { id temp=[[COWSStringNode alloc] init]; [temp setString:[[controlPanel arg1] stringValue]]; [args push:temp]; if (strlen([[controlPanel arg2] stringValue])) { id temp=[[COWSStringNode alloc] init]; [temp setString:[[controlPanel arg2] stringValue]]; [args push:temp]; if (strlen([[controlPanel arg3] stringValue])) { id temp=[[COWSStringNode alloc] init]; [temp setString:[[controlPanel arg3] stringValue]]; [args push:temp]; if (strlen([[controlPanel arg4] stringValue])) { id temp=[[COWSStringNode alloc] init]; [temp setString:[[controlPanel arg4] stringValue]]; [args push:temp]; } } } } // this is in wrong order...so reverse it... new_args=[[COWSArgumentList alloc] init]; while([args top]!=NULL) { [new_args push:[args pop]]; } [args free]; [interpreter interpretFunction:[[controlPanel function] stringValue] arguments:new_args]; [new_args free]; } else { printf ("COWS User Controller ERROR: no interpreter to run!\n"); return NULL; } return self; } - loadAndRunOrStop:sender { if (interpreter&&[interpreter conformsTo:@protocol(InterpreterControl)]) { [interpreter printErrors:NO]; if ([interpreter working]) { [interpreter stopInterpreting]; [controlPanel disableDisplay]; [[controlPanel loadAndRunButton] setState:0]; [[controlPanel lockedButton] setEnabled:YES]; [[controlPanel foregroundButton] setEnabled:YES]; [[controlPanel loadButton] setEnabled:YES]; [[controlPanel runButton] setEnabled:YES]; [controlPanel reenableDisplay]; [controlPanel displayIfNeeded]; } else if ([self load:self]) [self run:self]; } else { printf ("COWS User Controller ERROR: no interpreter to load and run!\n"); return NULL; } return self; } - setLockedToMe:sender // assumes that sender is the lockedButton { if (interpreter&&[interpreter conformsTo:@protocol(InterpreterControl)]) { [interpreter setLocked:(BOOL) [sender intValue]]; } else { printf ("COWS User Controller ERROR: no interpreter to toggle lock!\n"); return NULL; } return self; } - setForegroundToMe:sender // assumes that sender is the foregroundButton { if (interpreter&&[interpreter conformsTo:@protocol(InterpreterControl)]) { [interpreter setForeground:(BOOL) [sender intValue]]; } else { printf ("COWS User Controller ERROR: no interpreter to toggle foreground!\n"); return NULL; } return self; } - finishedInterpreting:(const char*)returnValue:(int)thisMessage:sender { [super finishedInterpreting:returnValue:thisMessage:sender]; return self; } - errorInterpreting:(int) thisError:(const char*)thisFunction: (int)thisPosition:(const char*)thisString:sender { char error[COWSUSERCONTROLLER_MAXERRSTRINGLENGTH]; char msg[COWSUSERCONTROLLER_MAXERRSTRINGLENGTH]; switch (thisError) { case COWSLIBRARYFUNCTIONERROR : strcpy(msg,thisString); break; case COWSERRORNOSUCHFUNCTION : strcpy(msg,"No Such Function"); break; case COWSERRORNOTENOUGHARGUMENTS : strcpy(msg,"Not Enough Arguments"); break; case COWSERRORTOOMANYARGUMENTS : strcpy(msg,"Too Many Arguments"); break; case COWSERRORNOSUCHVARIABLE : strcpy(msg,"No Such Variable"); break; case COWSERRORNOMORETOKENS : strcpy(msg,"No More Tokens"); break; case COWSERRORNOFUNCTIONNAME : strcpy(msg,"No Function Name"); break; case COWSERRORSETNOTVARIABLE : strcpy(msg,"Set: Not a Variable"); break; case COWSERRORSETTOOMANYVALUES : strcpy(msg,"Set: Too Many Values"); break; case COWSERRORSETNOVALUE : strcpy(msg,"Set: No Value to Set"); break; case COWSERRORSETNOSUCHVARIABLE : strcpy(msg,"Set: No Such Variable"); break; case COWSERRORIFNOTHENCLAUSE : strcpy(msg,"If: No Then Clause"); break; case COWSERRORIFTOOMANYVALUES : strcpy(msg,"If: Too Many Values"); break; case COWSERRORIFNOTENOUGHVALUES : strcpy(msg,"If: Not Enough Values"); break; case COWSERRORWHILETOOMANYVALUES : strcpy(msg,"While: Too Many Values"); break; case COWSERRORWHILENOTENOUGHVALUES : strcpy(msg,"While: Not Enough Values"); break; case COWSERRORFORNOTAVARIABLE : strcpy(msg,"For: Not a Variable"); break; case COWSERRORFORSTARTNOTNUMBER : strcpy(msg,"For: Start Value Not a Number"); break; case COWSERRORFORSTOPNOTNUMBER : strcpy(msg,"For: Stop Value Not a Number"); break; case COWSERRORFORSTEPNOTNUMBER : strcpy(msg,"For: Step Value Not a Number"); break; case COWSERRORFORNOSUCHVARIABLE : strcpy(msg,"For: No Such Variable"); break; case COWSERRORFORTOOMANYVALUES : strcpy(msg,"For: Too Many Values"); break; case COWSERRORFORNOTENOUGHVALUES : strcpy(msg,"For: Not Enough Values"); break; case COWSINTERNALERROR : strcpy(msg,"Interpreter Internal Error"); break; default : strcpy(msg,"Unknown Error"); break; } if (thisError==COWSLIBRARYFUNCTIONERROR) { sprintf (error,"%s",msg); NXRunAlertPanel("Library Error",error,"Oops",NULL,NULL); } else { sprintf(error,"%s (%s, %d)",msg,thisString,thisPosition); NXRunAlertPanel("Interpreter Error",error,"Oops",NULL,NULL); } [super errorInterpreting: thisError:thisFunction:thisPosition:thisString:sender]; return self; } - interpreterStarted:sender { [[controlPanel loadAndRunButton] setState:1]; [[controlPanel lockedButton] setEnabled:NO]; [[controlPanel foregroundButton] setEnabled:NO]; [[controlPanel loadButton] setEnabled:NO]; [[controlPanel runButton] setEnabled:NO]; [controlPanel reenableDisplay]; [super interpreterStarted:sender]; return self; } - interpreterStopped:sender { [[controlPanel loadAndRunButton] setState:0]; [[controlPanel lockedButton] setEnabled:YES]; [[controlPanel foregroundButton] setEnabled:YES]; [[controlPanel loadButton] setEnabled:YES]; [[controlPanel runButton] setEnabled:YES]; [controlPanel reenableDisplay]; [super interpreterStopped:sender]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.