////////////////////////////////////////////////////////////////////////////// // This file is part of Teyjus. // // // // Teyjus is free software: you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation, either version 3 of the License, or // // (at your option) any later version. // // // // Teyjus is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with Teyjus. If not, see . // ////////////////////////////////////////////////////////////////////////////// /*****************************************************************************/ /* File pervgen-c.c. This files contains function definitions for generating */ /* files pervasives.h and pervasives.c. */ /*****************************************************************************/ #include #include #include #include "pervgen-c.h" #include "ccode.h" #include "../util/util.h" //dynamic string array type typedef struct StringArray { char **array; int length; } StringArray; //array initialization static void arrayInit(char **array, int size) { int i ; for (i =0; i < size; i++) array[i] = NULL; } //collect string in a StringArray into a single array static char* collectStringArray(StringArray arr, char* emptyText) { char *myText = NULL; char *myText2 = NULL; int i; int length = 0; for (i = 0; i < arr.length; i++) { char* text = arr.array[i]; if (text == NULL) text = emptyText; if (myText) { myText2 = UTIL_mallocStr(strlen(text) + strlen(myText)); strcpy(myText2, myText); strcat(myText2, text); free(myText); } else { myText2 = UTIL_mallocStr(strlen(text)); strcpy(myText2, text); } if (arr.array[i]) free(arr.array[i]); myText = myText2; } free(arr.array); return myText; } /****************************************************************************/ /* kind relevant components */ /****************************************************************************/ /***********************************************************************/ /* pervasives.h */ /***********************************************************************/ //number of pervasive kinds static char* numKinds = NULL; void cgenNumKinds(char* num) { numKinds = C_mkNumKinds(num); } //pervasive kind indices declaration static StringArray kindIndices; //kind indices declaration void cgenKindIndex(int index, char* name, char* indexT, char* comments) { char* kindIndex; char* kindIndexText; if (index >= kindIndices.length) { fprintf(stderr, "kind index exceed total number of kinds\n"); exit(1); } kindIndex = C_mkIndex(name, indexT, comments); kindIndexText = UTIL_mallocStr(strlen(kindIndex) + 2); strcpy(kindIndexText, kindIndex); free(kindIndex); if (index != (kindIndices.length - 1)) strcat(kindIndexText, ","); strcat(kindIndexText, "\n"); kindIndices.array[index] = kindIndexText; } //pervasive kind relevant information in pervasives.h static char* kindH; void cgenKindH() { char* emptyText = C_mkEmptyComments(); char* kindIndexBody = collectStringArray(kindIndices, emptyText); char* kindIndexTypeDef = C_mkKindIndexType(kindIndexBody); kindH = C_mkKindH(kindIndexTypeDef, numKinds); free(kindIndexBody); free(kindIndexTypeDef); free(numKinds); free(emptyText); } /***********************************************************************/ /* pervasives.c */ /***********************************************************************/ //pervasive kind table entries static StringArray kindData; void cgenKindData(int index, char* name, char* arity, char* comments) { char* oneKindData; char* kindDataText; if (index >= kindData.length) { fprintf(stderr, "kind index exceed total number of kinds\n"); exit(1); } oneKindData = C_mkKindTabEntry(name, arity, comments); kindDataText = UTIL_mallocStr(strlen(oneKindData) + 2); strcpy(kindDataText, oneKindData); free(oneKindData); if (index != kindData.length - 1) strcat(kindDataText, ","); strcat(kindDataText, "\n"); kindData.array[index] = kindDataText; } #define EMPTY_TEXT_KIND_TAB " //nothing \n {NULL, 0},\n" //pervasive kind relevant information in pervasives.c static char* kindC; void cgenKindC() { char* kindTabBody = collectStringArray(kindData, EMPTY_TEXT_KIND_TAB); char* kindTab = C_mkKindTab(kindTabBody); kindC = C_mkKindC(kindTab); free(kindTabBody); free(kindTab); } //kind indices info and kind table info initiation void cgenKindInit(int length) { kindIndices.length = length; kindIndices.array = (char**)UTIL_malloc(sizeof(char*)*length); arrayInit(kindIndices.array, length); kindData.length = length; kindData.array = (char**)UTIL_malloc(sizeof(char*)*length); arrayInit(kindData.array, length); } /****************************************************************************/ /* type skeleton relevant components */ /****************************************************************************/ /***********************************************************************/ /* pervasives.h */ /***********************************************************************/ //number of type skeletons for pervasive constants static char* numTySkels = NULL; void cgenNumTySkels(char* num) { numTySkels = C_mkNumTySkels(num); } //type skeleton relevant information in pervasives.h static char* tySkelsH; void cgenTySkelsH() { tySkelsH = C_mkTySkelsH(numTySkels); free(numTySkels); } /***********************************************************************/ /* pervasives.c */ /***********************************************************************/ //type skeleton creation code static StringArray tySkels; void cgenTySkelTab(int index, Type tyskel, char* comments) { if (index >= tySkels.length){ fprintf(stderr, "type skeleton index exceed total number of type skeletons\n"); exit(1); } tySkels.array[index] = C_genTySkel(tyskel, comments); } //generate types skeleton initialization code static char* cgenTySkelTabInit() { char* body = collectStringArray(tySkels, ""); char* text = C_mkTySkelTabInit(body, C_totalSpace); free(body); return text; } //type skeleton info initiation void cgenTySkelInit(int length) { if (length == 0) { fprintf(stderr, "The number of type skeletons cannot be 0\n"); exit(1); } tySkels.length = length; tySkels.array = (char**)UTIL_malloc(sizeof(char*)*length); arrayInit(tySkels.array, length); } //type skeleton relevant information in pervasives.c static char* tySkelsC; void cgenTySkelsC() { char* tySkelTab = cgenTySkelTabInit(); tySkelsC = C_mkTySkelsC(tySkelTab); free(tySkelTab); } /****************************************************************************/ /* constant relevant components */ /****************************************************************************/ /***********************************************************************/ /* pervasives.h */ /***********************************************************************/ //number of pervasive constants static char* numConsts = NULL; void cgenNumConsts(char* num) { numConsts = C_mkNumConsts(num); } //pervasive constant indices declaration static StringArray constIndices; void cgenConstIndex(int index, char* name, char* indexT, char* comments) { char* constIndex; char* constIndexText; if (index >= constIndices.length) { fprintf(stderr, "constant index exceed total number of constants\n"); exit(1); } constIndex = C_mkIndex(name, indexT, comments); constIndexText = UTIL_mallocStr(strlen(constIndex) + 2); strcpy(constIndexText, constIndex); if (index != (constIndices.length - 1)) strcat(constIndexText, ","); strcat(constIndexText, "\n"); constIndices.array[index] = constIndexText; } /***********************************************************************/ /* constant property functions */ /***********************************************************************/ static StringArray logicSymbTypes; //initiale logic symb types void cgenLogicSymbolInit(int length) { logicSymbTypes.length = length; logicSymbTypes.array = (char**)UTIL_malloc(sizeof(char*)*length); arrayInit(logicSymbTypes.array, length); } //generate logic symbol types void cgenLogicSymbType(int index, char* name, char* indexT) { char* constIndex; char* constIndexText; if (index >= logicSymbTypes.length) { fprintf(stderr, "logic symbol type index exceed the total number of logic symbols\n"); exit(1); } constIndex = C_mkIndex2(name, indexT); constIndexText = UTIL_mallocStr(strlen(constIndex) + 2); strcpy(constIndexText, constIndex); if (index != (constIndices.length - 1)) strcat(constIndexText, ","); strcat(constIndexText, "\n"); logicSymbTypes.array[index] = constIndexText; } static char* lsRange = NULL; //generate logic symbol start/end position void cgenLSRange(char* start, char* end) { lsRange = C_mkLSRange(start, end); } static char* predRange = NULL; //generate predicate symbol start/end position void cgenPREDRange(char* start, char* end) { predRange = C_mkPredRange(start, end); } static char* constProperty = NULL; void cgenConstProperty() { char* emptyText = C_mkEmptyComments(); char* logicSymbTypeBody = collectStringArray(logicSymbTypes, emptyText); char* logicSymbTypeDec = C_mkLSTypeDec(logicSymbTypeBody); constProperty = UTIL_mallocStr(strlen(logicSymbTypeDec) + strlen(lsRange) + strlen(predRange)); strcpy(constProperty, lsRange); strcat(constProperty, predRange); strcat(constProperty , logicSymbTypeDec); free(emptyText); free(logicSymbTypeBody); free(logicSymbTypeDec); free(lsRange); free(predRange); } //pervasive kind relevant information in pervasives.h static char* constH; void cgenConstH() { char* emptyText = C_mkEmptyComments(); char* constIndexBody = collectStringArray(constIndices, emptyText); char* constIndexTypeDef = C_mkConstIndexType(constIndexBody); constH = C_mkConstH(constIndexTypeDef, numConsts, constProperty); free(constIndexBody); free(constIndexTypeDef); free(emptyText); free(constProperty); } /***********************************************************************/ /* pervasives.c */ /***********************************************************************/ //pervasive const table entries static StringArray constData; void cgenConstData(int index, char* name, char* tesize, OP_Prec prec, OP_Fixity fixity, int tySkelInd, char* neededness, char* comments) { char* oneConstData; char* constDataText; char* tySkelIndText = UTIL_itoa(tySkelInd); if (index >= constData.length) { fprintf(stderr, "const index exceed total number of consts\n"); exit(1); } oneConstData = C_mkConstTabEntry(name, tesize, prec, fixity, tySkelIndText, neededness, comments); free(tySkelIndText); constDataText = UTIL_mallocStr(strlen(oneConstData) + 2); strcpy(constDataText, oneConstData); free(oneConstData); if (index != constData.length - 1) strcat(constDataText, ","); strcat(constDataText, "\n"); constData.array[index] = constDataText; } #define EMPTY_TEXT_CONST_TAB \ " //nothing\n {NULL, 0, 0, 0, 0, OP_NONE },\n" //pervasive const relevant information in pervasives.c static char* constC; void cgenConstC() { char* constTabBody = collectStringArray(constData, EMPTY_TEXT_CONST_TAB); char* constTab = C_mkConstTab(constTabBody); constC = C_mkConstC(constTab); free(constTabBody); free(constTab); } //const indices info and const table info initiation void cgenConstInit(int length) { constIndices.length = length; constIndices.array = (char**)UTIL_malloc(sizeof(char*)*length); arrayInit(constIndices.array, length); constData.length = length; constData.array = (char**)UTIL_malloc(sizeof(char*)*length); arrayInit(constData.array, length); } /****************************************************************************/ /* Writing files */ /****************************************************************************/ static char* pervBegH; static char* pervEndH; static void cgenFixedH() { pervBegH = C_mkFixedBegH(); pervEndH = C_mkFixedEndH(); } static char* pervBegC; static char* pervEndC; static void cgenFixedC() { pervBegC = C_mkFixedBegC(); pervEndC = C_mkFixedEndC(); } /* dump peravsives.h */ void spitCPervasivesH(char * root) { FILE* outFile; char * filename = malloc(strlen(root) + 32); strcpy(filename, root); strcat(filename, "tables/pervasives.h"); outFile = UTIL_fopenW(filename); cgenFixedH(); fprintf(outFile, "%s\n", pervBegH); free(pervBegH); fprintf(outFile, "%s\n", kindH); free(kindH); fprintf(outFile, "%s\n", tySkelsH); free(tySkelsH); fprintf(outFile, "%s\n", constH); free(constH); fprintf(outFile, "%s\n", pervEndH); free(pervEndH); UTIL_fclose(outFile); free(filename); } /* dump pervasives.c */ void spitCPervasivesC(char * root) { FILE* outFile; char * filename = malloc(strlen(root) + 32); strcpy(filename, root); strcat(filename, "tables/pervasives.c"); outFile = UTIL_fopenW(filename); cgenFixedC(); fprintf(outFile, "%s\n", pervBegC); free(pervBegC); fprintf(outFile, "%s\n", kindC); free(kindC); fprintf(outFile, "%s\n", tySkelsC); free(tySkelsC); fprintf(outFile, "%s\n", constC); free(constC); fprintf(outFile, "%s\n", pervEndC); free(pervEndC); UTIL_fclose(outFile); free(filename); }