/* readDeclaration reads a declaration of a class */ static void readClassDeclaration() { ObjectHandle classObj, metaObj, vars; std::string className, superName; int i, size, instanceTop; // todo: fixed length variables array! ObjectHandle instanceVariables[15]; // todo: horrible fixed length arrays! char metaClassName[100]; char metaSuperClassName[100]; if (ll.nextToken() != nameconst) sysError("bad file format","no name in declaration"); className = ll.strToken(); if (ll.nextToken() == nameconst) { /* read superclass name */ superName = ll.strToken(); ll.nextToken(); } // todo: sprintf eradication! sprintf(metaClassName, "Meta%s", className.c_str()); if(!superName.empty()) sprintf(metaSuperClassName, "Meta%s", superName.c_str()); else sprintf(metaSuperClassName, "Class"); metaObj = createRawClass(metaClassName, "Class", metaSuperClassName); classObj = createRawClass(className.c_str(), metaClassName, superName.c_str()); classObj->_class = metaObj; // Get the current class size, we'll build on this as // we add instance variables. size = getInteger(classObj->basicAt(sizeInClass)); if (ll.currentToken() == nameconst) { /* read instance var names */ instanceTop = 0; while (ll.currentToken() == nameconst) { instanceVariables[instanceTop++] = createSymbol(ll.strToken().c_str()); size++; ll.nextToken(); } vars = newArray(instanceTop); for (i = 0; i < instanceTop; i++) { vars->basicAtPut(i+1, instanceVariables[i]); } classObj->basicAtPut(variablesInClass, vars); } classObj->basicAtPut(sizeInClass, newInteger(size)); classObj->basicAtPut(methodsInClass, newDictionary(39)); }
/* readRawDeclaration reads a declaration of a class */ static void readRawClassDeclaration() { ObjectHandle classObj, vars; std::string className, metaName, superName; int i, size, instanceTop; // todo: fixed length variables array! ObjectHandle instanceVariables[15]; if (ll.nextToken() != nameconst) sysError("bad file format","no name in declaration"); className = ll.strToken(); size = 0; if (ll.nextToken() == nameconst) { /* read metaclass name */ metaName = ll.strToken(); ll.nextToken(); } if (ll.currentToken() == nameconst) { /* read superclass name */ superName = ll.strToken(); ll.nextToken(); } classObj = createRawClass(className.c_str(), metaName.c_str(), superName.c_str()); // Get the current class size, we'll build on this as // we add instance variables. size = getInteger(classObj->basicAt(sizeInClass)); if (ll.currentToken() == nameconst) { /* read instance var names */ instanceTop = 0; while (ll.currentToken() == nameconst) { instanceVariables[instanceTop++] = createSymbol(ll.strToken().c_str()); size++; ll.nextToken(); } vars = newArray(instanceTop); for (i = 0; i < instanceTop; i++) { vars->basicAtPut(i+1, instanceVariables[i]); } classObj->basicAtPut(variablesInClass, vars); } classObj->basicAtPut(sizeInClass, newInteger(size)); classObj->basicAtPut(methodsInClass, newDictionary(39)); }
/* fileIn reads in a module definition */ void fileIn(FILE* fd, bool printit) { textBuffer = new char[TextBufferSize]; while(fgets(textBuffer, TextBufferSize, fd) != NULL) { ll.reset(textBuffer); if (ll.currentToken() == inputend) ; /* do nothing, get next line */ else if ((ll.currentToken() == binary) && ll.strToken().compare("*") == 0) ; /* do nothing, its a comment */ else if ((ll.currentToken() == nameconst) && ll.strToken().compare("RawClass") == 0) readRawClassDeclaration(); else if ((ll.currentToken() == nameconst) && ll.strToken().compare("Class") == 0) readClassDeclaration(); else if ((ll.currentToken() == nameconst) && ll.strToken().compare("Methods") == 0) readMethods(fd, printit); else sysError("unrecognized line", textBuffer); MemoryManager::Instance()->garbageCollect(); } delete[](textBuffer); }