////////////////////////////////////////////////////////////////////////////// // 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 types.c. This file contains "abstract syntax" representation of */ /* type skeletons that is used for parsing those in pervasives.in. */ /****************************************************************************/ #include #include "types.h" #include "../util/util.h" Type mkSortType(char* name) { Type rtPtr = (Type)UTIL_malloc(sizeof(Type_)); rtPtr -> tag = SORT; rtPtr -> data.sort = name; return rtPtr; } Type mkSkVarType(char* index) { Type rtPtr = (Type)UTIL_malloc(sizeof(Type_)); rtPtr -> tag = SKVAR; rtPtr -> data.skvar = index; return rtPtr; } Type mkStrFuncType(char* name, char* arity) { Type rtPtr = (Type)UTIL_malloc(sizeof(Type_)); rtPtr -> tag = FUNC; rtPtr -> data.func.name = name; rtPtr -> data.func.arity = arity; return rtPtr; } Type mkStrType(Type func, int arity, TypeList args) { Type rtPtr = (Type)UTIL_malloc(sizeof(Type_)); rtPtr -> tag = STR; rtPtr -> data.str.functor = func; rtPtr -> data.str.arity = arity; rtPtr -> data.str.args = args; return rtPtr; } Type mkArrowType(Type lop, Type rop) { Type rtPtr = (Type)UTIL_malloc(sizeof(Type_)); rtPtr -> tag = ARROW; rtPtr -> data.arrow.lop = lop; rtPtr -> data.arrow.rop = rop; return rtPtr; } void freeType(Type ty) { if (ty -> tag == SORT) free(ty->data.sort); else if (ty -> tag == SKVAR) free(ty->data.skvar); else if (ty -> tag == FUNC) { free(ty->data.func.name); free(ty->data.func.arity); } free(ty); } TypeList addItem(Type data, TypeList typeList) { TypeList new = (TypeList)UTIL_malloc(sizeof(TypeList_)); new -> oneType = data; if (typeList) new -> next = typeList; else new -> next = NULL; typeList = new; return typeList; } TypeList addItemToEnd(TypeList typeList, Type data) { TypeList new = (TypeList)UTIL_malloc(sizeof(TypeList_)); new -> oneType = data; new -> next = NULL; if (typeList) { TypeList temp = typeList; while (temp -> next) temp = temp -> next; temp -> next = new; } else typeList = new; return typeList; } TypeList append(TypeList typeList1, TypeList typeList2) { if (typeList1) { TypeList temp = typeList1; while (temp -> next) temp = temp -> next; temp -> next = typeList2; } else typeList1 = typeList2; return typeList1; }