////////////////////////////////////////////////////////////////////////////// //Copyright 2012 // Krasimir Angelov ////////////////////////////////////////////////////////////////////////////// /*************************************************************************/ /* functions for generating Haskell Instructions.hs */ /*************************************************************************/ #include "../util/util.h" #include #include #include #include static char* addLine(char* str, char* addOn) { size_t length = (str ? strlen(str) : 0) + strlen(addOn) + 2; char* newStr = UTIL_mallocStr(length); if (str) { strcpy(newStr, str); strcat(newStr, addOn); } else strcpy(newStr, addOn); strcat(newStr, "\n"); return newStr; } static char* addStr(char* str, char* addOn) { size_t length = (str ? strlen(str) : 0) + strlen(addOn); char* newStr = UTIL_mallocStr(length); if (str) { strcpy(newStr, str); strcat(newStr, addOn); } else strcpy(newStr, addOn); return newStr; } /**********************************************************************/ /* auxiliary functions for making ocaml language constructs */ /**********************************************************************/ #define TYPE_SUFFIX "type" #define SIZE_SUFFIX "Size" #define PUT_PREFIX "put" #define GET_PREFIX "get" #define DISPLAY_PREFIX "display" #define INDENT " " #define INDENT2 " " #define PUT "putWord" #define GET "getWord" #define DISPLAY "pp" #define INSCAT_PREFIX1 "inscat" #define INSCAT_PREFIX2 "Inscat" #define INS_PREFIX "Ins_" static char* HS_mkVarDef(char* varName, char* varType, char* defs) { size_t length = strlen(varName) + strlen(defs) + strlen(varType) + 10; char* vardef = UTIL_mallocStr(length); strcpy(vardef, varName); strcat(vardef, " = "); strcat(vardef, defs); strcat(vardef, " :: "); strcat(vardef, varType); strcat(vardef, "\n"); return vardef; } static char* HS_mkTypeDec(char* typeName, char* defs) { size_t length = strlen(typeName) + strlen(defs) + 10; char* typedec = UTIL_mallocStr(length); strcpy(typedec, "type "); strcat(typedec, typeName); strcat(typedec, " = "); strcat(typedec, defs); strcat(typedec, "\n"); return typedec; } static char* HS_mkFunc(char* funcName, char* arg, char* body) { size_t length = strlen(funcName) + strlen(arg) + strlen(body) + 20; char* func = UTIL_mallocStr(length); strcpy(func, funcName); strcat(func, " "); strcat(func, arg); strcat(func, " = "); strcat(func, body); strcat(func, "\n"); return func; } static char* HS_mkCrossType(char *lop, char *rop) { size_t length = strlen(lop) + strlen(rop) + 5; char* crossType = UTIL_mallocStr(length); strcpy(crossType, lop); strcat(crossType, ", "); strcat(crossType, rop); return crossType; } static char* HS_mkValueCtr(char* ctrName, char* types) { size_t length = strlen(ctrName) + strlen(types) + 10; char* ctr = UTIL_mallocStr(length); strcpy(ctr, ctrName); strcat(ctr, " "); strcat(ctr, types); return ctr; } static char* HS_mkDisjValueCtrs(char* prev, char* next) { size_t length = strlen(prev) + strlen(next) + 10; char* ctr = UTIL_mallocStr(length); strcpy(ctr, prev); strcat(ctr, "\n"); strcat(ctr, INDENT); strcat(ctr, "| "); strcat(ctr, next); return ctr; } static char* HS_mkCase(char* prev, char* next) { size_t length = strlen(prev) + strlen(next) + 10; char* ctr = UTIL_mallocStr(length); strcpy(ctr, prev); strcat(ctr, "\n"); strcat(ctr, INDENT); strcat(ctr, " "); strcat(ctr, next); return ctr; } static char* HS_mkFuncSeq(char* prev, char* new) { size_t length = strlen(prev) + strlen(new) + 20; char* funcSeq = UTIL_mallocStr(length); strcpy(funcSeq, prev); strcat(funcSeq, " >> "); strcat(funcSeq, new); return funcSeq; } static char* HS_mkArgList(char* prev, char* new) { size_t length = strlen(prev) + strlen(new) + 2; char* args = UTIL_mallocStr(length); strcpy(args, prev); strcat(args, ", "); strcat(args, new); return args; } static char* HS_mkStrConcat(char* prev, char* new) { size_t length = strlen(prev) + strlen(new) + 25; char* str = UTIL_mallocStr(length); strcpy(str, "("); strcat(str, prev); strcat(str, ") ++ \", \" ++ ("); strcat(str, new); strcat(str, ")"); return str; } static char* HS_mkArrow(char* left, char* right) { size_t length = strlen(left) + strlen(right) + 20; char* arrow = UTIL_mallocStr(length); strcpy(arrow, left); strcat(arrow, " -> "); strcat(arrow, right); return arrow; } static char* HS_mkStructure(char* func, char* arg) { size_t length = strlen(func) + strlen(arg) + 5; char* app = UTIL_mallocStr(length); strcpy(app, func); strcat(app, " "); strcat(app, arg); return app; } static char* HS_mkDO(char* varName, char* def) { size_t length = strlen(varName) + strlen(def) + 20; char* str = UTIL_mallocStr(length); strcpy(str, INDENT); strcat(str, varName); strcat(str, " <- "); strcat(str, def); strcat(str, "\n"); return str; } /**************************************************************************/ /* type definitions */ /**************************************************************************/ static char* typeDefs; void ocgenInclude(char* include) { typeDefs = include; } /**************************************************************************/ /* operand types */ /**************************************************************************/ static char* opTypes; static char* opSizes; static char* writeFuncs; static char* readFuncs; static char* ocgenWriteOpFunc(char* typeName, char* compType, int numBytes) { char* funcName = UTIL_appendStr(PUT_PREFIX, typeName); char* numBitsText = UTIL_itoa(numBytes*8); char* funcBody = UTIL_mallocStr(strlen(PUT)+strlen(numBitsText)+20); char* func; if (strcmp(typeName, "F") == 0) { strcpy(funcBody, "putFloat"); strcat(funcBody, numBitsText); if (numBytes > 1) strcat(funcBody, "be"); } else if (strcmp(typeName, "C") == 0 || strcmp(typeName, "K") == 0) { strcpy(funcBody, "put"); } else { strcpy(funcBody, PUT); strcat(funcBody, numBitsText); if (numBytes > 1) strcat(funcBody, "be"); strcat(funcBody, " . fromIntegral"); } free(numBitsText); func = HS_mkFunc(funcName, "", funcBody); free(funcName); free(funcBody); return func; } static char* ocgenReadOpFunc(char* typeName, char* compType, int numBytes) { char* funcName = UTIL_appendStr(GET_PREFIX, typeName); char* numBitsText = UTIL_itoa(numBytes*8); char* funcBody = UTIL_mallocStr(strlen(GET)+strlen(numBitsText)+30); char* func; if (strcmp(typeName, "F") == 0) { strcpy(funcBody, "getFloat"); strcat(funcBody, numBitsText); if (numBytes > 1) strcat(funcBody, "be"); } else if (strcmp(typeName, "C") == 0 || strcmp(typeName, "K") == 0) { strcpy(funcBody, "get"); } else { strcpy(funcBody, "fmap fromIntegral $ "); strcat(funcBody, GET); strcat(funcBody, numBitsText); if (numBytes > 1) strcat(funcBody, "be"); } free(numBitsText); func = HS_mkFunc(funcName, "", funcBody); free(funcName); free(funcBody); return func; } void ocgenOpType(char* typeName, int numBytes, char* compType) { char* myCompType = (strcmp(compType, "int") == 0) ? "Int" : (strcmp(compType, "float") == 0) ? "Float" : (strcmp(compType, "aconstant") == 0) ? "AConstant" : (strcmp(compType, "akind") == 0) ? "AKind" : (strcmp(compType, "intref") == 0) ? "IntRef" : NULL; /* generate type declarations*/ char* myTypeName = UTIL_appendStr(typeName, TYPE_SUFFIX); char* myOpType = HS_mkTypeDec(myTypeName, myCompType); char* myopTypes = addStr(opTypes, myOpType); /* generate write functions */ char* func = ocgenWriteOpFunc(typeName, compType, numBytes); char* myWriteFuncs = addStr(writeFuncs, func); /* generate read functions */ char* readFunc = ocgenReadOpFunc(typeName, compType, numBytes); char* myReadFuncs = addStr(readFuncs, readFunc); /* generate sizes */ if (numBytes < 4) { char* myName = UTIL_lowerCase(typeName); char* mySizeName = UTIL_appendStr(myName, SIZE_SUFFIX); char* size = UTIL_itoa((int)(pow(2,(numBytes * 8))-1)); char* myOpSize = HS_mkVarDef(mySizeName, "Int", size); char* myopSizes = addStr(opSizes, myOpSize); free(myName); free(mySizeName); free(size); free(myOpSize); free(opSizes); opSizes = myopSizes; } free(myTypeName); free(opTypes); free(myOpType); opTypes = myopTypes; free(writeFuncs); free(func); writeFuncs = myWriteFuncs; free(readFuncs); free(readFunc); readFuncs = myReadFuncs; } void ocgenOpCodeType(int numBytes) { char* mySizeName = UTIL_appendStr("opcode", SIZE_SUFFIX); char* size = UTIL_itoa((int)(pow(2,(numBytes * 8))-1)); char* myOpCodeSize = HS_mkVarDef(mySizeName, "Int", size); char* myopSizes = addLine(opSizes, myOpCodeSize); char* func = ocgenWriteOpFunc("opcode", "Int", numBytes); char* myWriteFuncs = addLine(writeFuncs, func); char* readFunc = ocgenReadOpFunc("opcode", "Int", numBytes); char* myReadFuncs = addLine(readFuncs, readFunc); free(size); free(mySizeName); free(opSizes); free(myOpCodeSize); free(writeFuncs); free(func); free(readFuncs); free(readFunc); opSizes = myopSizes; writeFuncs = myWriteFuncs; readFuncs = myReadFuncs; } static char* opHS; void ocgenOps() { char* wordSizeName = "wordSize"; char* wordSize = UTIL_itoa(sizeof(void*)); char* wordSizeHS = HS_mkVarDef(wordSizeName, "Int", wordSize); char* text; free(wordSize); opHS = addLine(NULL, wordSizeHS); free(wordSizeHS); text = addLine(opHS, opSizes); free(opSizes); free(opHS); opHS = addLine(text, opTypes); free(opTypes); free(text); text = addLine(opHS, writeFuncs); free(writeFuncs); free(opHS); opHS = addLine(text, readFuncs); free(readFuncs); free(text); } /****************************************************************************/ /* instruction categories */ /****************************************************************************/ static char* instrCatWriteFunc = NULL; static char* instrCatReadFunc = NULL; static char* instrCatDisplayFunc = NULL; static char* instrCatType = NULL; static int argInd = 1; static char* argList = NULL; void ocgenInstrFormat(char* opName) { char *myOpName, *myFuncName, *myArgInd, *myFuncCall, *myArg, *myArgList, *myinstrCatType, *myinstrCatWriteFunc, *myReadBody, *myinstrCatReadFunc, * myinstrCatDisplayFunc; if (strcmp(opName, "P") == 0 || strcmp(opName, "WP") == 0 || strcmp(opName, "X") == 0) return; //type declaration myOpName = UTIL_appendStr(opName, TYPE_SUFFIX); if (instrCatType) { myinstrCatType = HS_mkCrossType(instrCatType, myOpName); free(instrCatType); free(myOpName); instrCatType = myinstrCatType; } else instrCatType = myOpName; //argument myArgInd = UTIL_itoa(argInd); argInd++; myArg = UTIL_appendStr("arg", myArgInd); free(myArgInd); //argument list if (argList) { myArgList = HS_mkArgList(argList, myArg); free(argList); argList = myArgList; } else argList = myArg; //write function myFuncName = UTIL_appendStr(PUT_PREFIX, opName); myFuncCall = UTIL_mallocStr(strlen(myFuncName) + strlen(myArg) + 5); strcpy(myFuncCall, myFuncName); free(myFuncName); strcat(myFuncCall, " "); strcat(myFuncCall, myArg); if (instrCatWriteFunc) { myinstrCatWriteFunc = HS_mkFuncSeq(instrCatWriteFunc, myFuncCall); free(instrCatWriteFunc); instrCatWriteFunc = myinstrCatWriteFunc; free(myFuncCall); } else instrCatWriteFunc = myFuncCall; //read function myFuncName = UTIL_appendStr(GET_PREFIX, opName); myReadBody = HS_mkDO(myArg, myFuncName); free(myFuncName); if (instrCatReadFunc) { myinstrCatReadFunc = UTIL_appendStr(instrCatReadFunc, myReadBody); free(instrCatReadFunc); instrCatReadFunc = myinstrCatReadFunc; free(myReadBody); } else instrCatReadFunc = myReadBody; //display function myFuncName = UTIL_appendStr(DISPLAY, opName); myFuncCall = UTIL_mallocStr(strlen(myFuncName) + strlen(myArg) + 5); strcpy(myFuncCall, myFuncName); free(myFuncName); strcat(myFuncCall, " "); strcat(myFuncCall, myArg); if (instrCatDisplayFunc) { myinstrCatDisplayFunc = HS_mkStrConcat(instrCatDisplayFunc, myFuncCall); free(instrCatDisplayFunc); instrCatDisplayFunc = myinstrCatDisplayFunc; free(myFuncCall); } else instrCatDisplayFunc = myFuncCall; } static char* instrCatTypes; static char* instrCatWriteFuncs; static char* instrCatReadFuncs; static char* instrCatDisplayFuncs; void ocgenOneInstrCat(char* catName) { char *myCatName, *myInstrCatType, *myInstrCatTypes, *myArgs, *myWriteFuncName, *myWriteFunc, *myInstrCatWriteFuncs, *myReadFuncName, *myReadFunc, *myReadFuncBody, *myInstrCatReadFuncs, *myDisplayFuncName, *myDisplayFunc, *myInstrCatDisplayFuncs, *myArgs2, *temp; if (instrCatType) { char* instrCatType2 = UTIL_mallocStr(strlen(instrCatType) + 3); strcpy(instrCatType2, "("); strcat(instrCatType2, instrCatType); strcat(instrCatType2, ")"); myCatName = UTIL_appendStr(INSCAT_PREFIX2, catName); myInstrCatType = HS_mkTypeDec(myCatName, instrCatType2); myInstrCatTypes = addStr(instrCatTypes, myInstrCatType); myArgs = UTIL_mallocStr(strlen(argList) + 5); strcpy(myArgs, "("); strcat(myArgs, argList); strcat(myArgs, ")"); /* write function */ myWriteFuncName = UTIL_appendStr(PUT_PREFIX, catName); myWriteFunc = HS_mkFunc(myWriteFuncName, myArgs, instrCatWriteFunc); myInstrCatWriteFuncs = addStr(instrCatWriteFuncs, myWriteFunc); /* read function */ myReadFuncName = UTIL_appendStr(GET_PREFIX, catName); temp = UTIL_appendStr(INDENT, "return "); myArgs2 = UTIL_appendStr(temp, myArgs); free(temp); temp = UTIL_appendStr(instrCatReadFunc, myArgs2); free(myArgs2); myReadFuncBody= UTIL_appendStr("do\n", temp); free(temp); myReadFunc = HS_mkFunc(myReadFuncName, "", myReadFuncBody); myInstrCatReadFuncs = addStr(instrCatReadFuncs, myReadFunc); /* display function */ myDisplayFuncName = UTIL_appendStr(DISPLAY_PREFIX, catName); myDisplayFunc = HS_mkFunc(myDisplayFuncName, myArgs, instrCatDisplayFunc); myInstrCatDisplayFuncs = addStr(instrCatDisplayFuncs, myDisplayFunc); free(myCatName); free(myInstrCatType); free(instrCatType); free(instrCatTypes); free(myWriteFuncName); free(myWriteFunc); free(instrCatWriteFunc); free(instrCatWriteFuncs); free(myReadFuncName); free(myReadFunc); free(instrCatReadFunc); free(instrCatReadFuncs); free(myDisplayFuncName); free(myDisplayFunc); free(instrCatDisplayFunc); free(instrCatDisplayFuncs); free(argList); argList = NULL; argInd = 1; instrCatType = NULL; instrCatWriteFunc = NULL; instrCatReadFunc = NULL; instrCatDisplayFunc = NULL; instrCatTypes = myInstrCatTypes; instrCatWriteFuncs = myInstrCatWriteFuncs; instrCatReadFuncs = myInstrCatReadFuncs; instrCatDisplayFuncs = myInstrCatDisplayFuncs; } } static char* instrCatLength; void ocgenInstrLength(char* varName, char* numBytes) { char* myVarName = UTIL_appendStr(INSCAT_PREFIX1, varName); char* varDef = HS_mkVarDef(myVarName, "Int", numBytes); char* myInstrCatLength = addStr(instrCatLength, varDef); free(myVarName); free(varDef); free(instrCatLength); instrCatLength = myInstrCatLength; } static char* instrCat; void ocgenInstrCat() { char* text = instrCatTypes; char* text2 = addLine(text, "\n"); text = addLine(text2, instrCatWriteFuncs); free(instrCatWriteFuncs); free(text2); text2 = addLine(text, instrCatReadFuncs); free(instrCatReadFuncs); free(text); text = addLine(text2, instrCatDisplayFuncs); free(instrCatDisplayFuncs); free(text2); instrCat = addLine(text, instrCatLength); free(text); free(instrCatLength); } /****************************************************************************/ /* instructions */ /****************************************************************************/ #define GETSIZE_PREFIX "getSize_" #define PUTOPCODE "putopcode " static char* instructionTypes; static char* insWriteFuncBody; static char* insReadFuncBody; static char* insDisplayFuncBody; static char* insSizesDec; static char* insSizesDef; static void ocgenReadFuncBody(char* opcode, char* myInsName, char* myInsLength, char* insCat, int last) { char *ins, *readArgs, *returnValue, *myReadFuncBody, *tmp; if (strcmp(insCat, "X") == 0) { readArgs = strdup(""); ins = myInsName; } else { readArgs = UTIL_mallocStr(strlen(GET_PREFIX) + strlen(insCat) + 20); strcpy(readArgs, GET_PREFIX); strcat(readArgs, insCat); strcat(readArgs, " >>= \\x -> "); ins = UTIL_mallocStr(strlen(readArgs) + strlen(myInsName) + 10); strcpy(ins, myInsName); strcat(ins, " x"); } returnValue = UTIL_mallocStr(strlen(readArgs) + strlen(ins) + strlen(myInsLength) + 20); strcpy(returnValue, readArgs); strcat(returnValue, "return ("); strcat(returnValue, ins); strcat(returnValue, ", "); strcat(returnValue, myInsLength); strcat(returnValue, ")"); free(readArgs); char *tmp2 = " "; tmp = addStr(tmp2, opcode); tmp2 = addStr(tmp, " -> "); free(tmp); tmp = addStr(tmp2, returnValue); free(tmp2); tmp2 = addStr(tmp, "\n"); free(tmp); tmp = tmp2; free(returnValue); if (insReadFuncBody) { myReadFuncBody = UTIL_appendStr(insReadFuncBody, tmp); free(insReadFuncBody); free(tmp); insReadFuncBody = myReadFuncBody; } else insReadFuncBody = tmp; } static char* OC_mkWS(int size) { int i; char* text; if (size > 0) { text = UTIL_mallocStr(size); for (i = 0; i < size; i++) text[i]= ' '; text[size] = '\0'; } else text = strdup(" "); return text; } static void ocgenDisplayFuncBody(char* pattern, char* insName, char* insLength, char* insCat) { char *displayargs, *funcBody, *myInsName, *ins, *returnValue, *insText, *myDisplayFuncBody; myInsName = UTIL_appendStr(insName, OC_mkWS(25u - strlen(insName))); insText = UTIL_mallocStr(strlen(myInsName) + 5); strcpy(insText, "\""); strcat(insText, myInsName); free(myInsName); strcat(insText, "\""); if (strcmp(insCat, "X") == 0) ins = insText; else { displayargs = UTIL_appendStr(DISPLAY_PREFIX, insCat); ins = UTIL_mallocStr(strlen(displayargs) + strlen(insText) + 10); strcpy(ins, insText); strcat(ins, " ++ "); strcat(ins, displayargs); strcat(ins, " arg"); free(displayargs); free(insText); } returnValue = UTIL_mallocStr(strlen(ins) + strlen(insLength) + 5); strcpy(returnValue, "("); strcat(returnValue, ins); strcat(returnValue, ", "); strcat(returnValue, insLength); strcat(returnValue, ")"); funcBody = HS_mkArrow(pattern, returnValue); free(returnValue); if (insDisplayFuncBody) { myDisplayFuncBody = HS_mkCase(insDisplayFuncBody, funcBody); free(insDisplayFuncBody); free(funcBody); insDisplayFuncBody = myDisplayFuncBody; } else { insDisplayFuncBody = UTIL_appendStr(INDENT2, funcBody); free(funcBody); } } void ocgenOneInstr(char* opcode, char* insName, char* insCat, char* insLength, int last) { char *myCatName, *myInsName, *myValueCtr, *myInstrTypes; char *myInsSizeName, *myInsLength, *mySizeDef, *mySizeDec, *mySizeDefs, *mySizeDecs; char *myPattern, *myWriteOpCodeFunc, *myfuncBody, *myFunc, *myInsWriteFuncBody; /* value constructors for type instruction */ myInsName = UTIL_appendStr(INS_PREFIX, insName); if (strcmp(insCat, "X") == 0) { myValueCtr = myInsName; } else { myCatName = UTIL_appendStr(INSCAT_PREFIX2, insCat); myValueCtr = HS_mkValueCtr(myInsName, myCatName); free(myCatName); } if (instructionTypes) { myInstrTypes = HS_mkDisjValueCtrs(instructionTypes, myValueCtr); free(instructionTypes); instructionTypes = myInstrTypes; } else instructionTypes = myValueCtr; /* write function body */ myWriteOpCodeFunc = UTIL_appendStr(PUTOPCODE, opcode); if (strcmp(insCat, "X") == 0) { myPattern = strdup(myInsName); myfuncBody = myWriteOpCodeFunc; } else { char* myWriteArgsName = UTIL_appendStr(PUT_PREFIX, insCat); char* myWriteArgs = UTIL_mallocStr(strlen(myWriteArgsName) + 5); myPattern = HS_mkStructure(myInsName, "arg"); strcpy(myWriteArgs, myWriteArgsName); free(myWriteArgsName); strcat(myWriteArgs, " arg"); myfuncBody = HS_mkFuncSeq(myWriteOpCodeFunc, myWriteArgs); free(myWriteArgs); } myFunc = HS_mkArrow(myPattern, myfuncBody); free(myfuncBody); if (insWriteFuncBody) { myInsWriteFuncBody = HS_mkCase(insWriteFuncBody, myFunc); free(insWriteFuncBody); free(myFunc); insWriteFuncBody = myInsWriteFuncBody; } else { insWriteFuncBody = UTIL_appendStr(INDENT2, myFunc); free(myFunc); } /* instruction sizes */ myInsSizeName = UTIL_appendStr(GETSIZE_PREFIX, insName); myInsLength = UTIL_appendStr(INSCAT_PREFIX1, insLength); mySizeDef = HS_mkVarDef(myInsSizeName, "Int", myInsLength); free(myInsSizeName); mySizeDefs = addStr(insSizesDef, mySizeDef); free(insSizesDef); free(mySizeDef); insSizesDef = mySizeDefs; ocgenReadFuncBody(opcode, myInsName, myInsLength, insCat, last); ocgenDisplayFuncBody(myPattern, insName, myInsLength, insCat); free(myInsName); free(myInsLength); free(myPattern); } #define INSTRTYPE_HEAD "data Instruction\n = " #define INSTWRITEFUNC_DEF_HEAD "putInstruction :: Instruction -> Put\n" \ "putInstruction inst =\n" \ " case inst of\n" #define INSTREADFUNC_DEF_HEAD "getInstruction :: Get (Instruction,Int)\n" \ "getInstruction = do\n" \ " opcode <- getopcode\n" \ " case opcode of\n" #define INSTDISPLAYFUNC_DEF_HEAD \ "showInstruction :: Instruction -> (String, Int)\n" \ "showInstruction inst =\n" \ " case inst of\n" static char* instrHS; void ocgenInstr() { char* text = UTIL_appendStr(INSTRTYPE_HEAD, instructionTypes); char* text2 = UTIL_appendStr(text, "\n\n"); free(instructionTypes); free(text); text = addLine(text2, insSizesDef); free(text2); free(insSizesDef); text2 = addStr(text, INSTWRITEFUNC_DEF_HEAD); free(text); instrHS = addStr(text2, insWriteFuncBody); free(text2); free(insWriteFuncBody); text = addStr(instrHS, "\n\n"); free(instrHS); text2 = addStr(text, INSTREADFUNC_DEF_HEAD); free(text); instrHS = addStr(text2, insReadFuncBody); free(text2); free(insReadFuncBody); text = addStr(instrHS, "\n\n"); free(instrHS); text2 = addStr(text, INSTDISPLAYFUNC_DEF_HEAD); free(text); instrHS = addStr(text2, insDisplayFuncBody); free(text2); free(insDisplayFuncBody); } /****************************************************************************/ /* dump files */ /****************************************************************************/ /* dump files */ void ocSpitInstructionHS(char * root) { FILE* outFile; char * loc_path = "../../../compiler/GF/Compile/Instructions.hs"; char * filename = malloc(strlen(root) + strlen(loc_path)+1); strcpy(filename, root); strcat(filename, loc_path); outFile = UTIL_fopenW(filename); fputs("module GF.Compile.Instructions where\n", outFile); fputs("\n", outFile); fputs("import Data.IORef\n", outFile); fputs("import Data.Binary\n", outFile); fputs("import Data.Binary.Put\n", outFile); fputs("import Data.Binary.Get\n", outFile); fputs("import Data.Binary.IEEE754\n", outFile); fputs("import PGF.CId\n", outFile); fputs("import PGF.Binary\n", outFile); fputs("\n", outFile); fputs("type IntRef = Int\n", outFile); fputs("type AConstant = CId\n", outFile); fputs("type AKind = CId\n", outFile); fputs("\n", outFile); fputs("ppE = undefined\n", outFile); fputs("ppF = undefined\n", outFile); fputs("ppL = undefined\n", outFile); fputs("ppC = undefined\n", outFile); fputs("ppN = undefined\n", outFile); fputs("ppR = undefined\n", outFile); fputs("ppK = undefined\n", outFile); fputs("ppS = undefined\n", outFile); fputs("ppI = undefined\n", outFile); fputs("ppI1 = undefined\n", outFile); fputs("ppIT = undefined\n", outFile); fputs("ppCE = undefined\n", outFile); fputs("ppMT = undefined\n", outFile); fputs("ppHT = undefined\n", outFile); fputs("ppSEG = undefined\n", outFile); fputs("ppBVT = undefined\n", outFile); fputs("\n", outFile); fputs(opHS, outFile); free(opHS); fputs(instrCat, outFile); free(instrCat); fputs("\n\n", outFile); fputs(instrHS, outFile); free(instrHS); free(typeDefs); UTIL_fclose(outFile); free(filename); }