15 #include "tm_builder_p.h" 18 #include <gwenhywfar/debug.h> 19 #include <gwenhywfar/misc.h> 81 free(tb->fileNamePublic);
82 free(tb->fileNameLibrary);
83 free(tb->fileNameProtected);
84 free(tb->fileNamePrivate);
85 free(tb->fileNameCode);
96 return tb->declarationsPublic;
104 return tb->declarationsLibrary;
112 return tb->declarationsProtected;
120 return tb->declarationsPrivate;
136 return tb->typeManager;
215 return tb->fileNamePublic;
223 free(tb->fileNamePublic);
225 tb->fileNamePublic=strdup(s);
227 tb->fileNamePublic=
NULL;
235 return tb->fileNameLibrary;
243 free(tb->fileNameLibrary);
245 tb->fileNameLibrary=strdup(s);
247 tb->fileNameLibrary=
NULL;
255 return tb->fileNameProtected;
263 free(tb->fileNameProtected);
265 tb->fileNameProtected=strdup(s);
267 tb->fileNameProtected=
NULL;
275 return tb->fileNamePrivate;
283 free(tb->fileNamePrivate);
285 tb->fileNamePrivate=strdup(s);
287 tb->fileNamePrivate=
NULL;
295 return tb->fileNameCode;
303 free(tb->fileNameCode);
305 tb->fileNameCode=strdup(s);
307 tb->fileNameCode=
NULL;
315 return tb->sourceFileName;
323 free(tb->sourceFileName);
325 tb->sourceFileName=strdup(s);
327 tb->sourceFileName=
NULL;
335 return tb->destFolder;
343 free(tb->destFolder);
345 tb->destFolder=strdup(s);
364 return tb->buildFn(tb, ty);
382 if (tb->typeManager) {
393 TYPEMAKER2_MEMBER_LIST *tml;
418 tmm=Typemaker2_Member_List_First(tml);
422 tmm=Typemaker2_Member_List_Next(tmm);
455 const char *prefix=
NULL;
530 if (prefix && *prefix) {
565 while (*p && *p!=
')')
581 name=(
char *) malloc(len+1);
583 memmove(name, pStart, len);
616 while (*p && *p!=
'#') {
627 if (tolower(p[1])==
'n') {
631 else if (tolower(p[1])==
't') {
635 else if (tolower(p[1])==
'\\') {
657 #define INVOKE_FN(macro_var1) \ 658 int Typemaker2_Builder_Invoke_##macro_var1##Fn(TYPEMAKER2_BUILDER *tb, \ 659 TYPEMAKER2_TYPE *ty, \ 660 TYPEMAKER2_MEMBER *tm, \ 663 GWEN_BUFFER *dbuf) { \ 665 TYPEMAKER2_TYPE *mty; \ 666 TYPEMAKER2_CODE *tc; \ 667 const char *s=NULL; \ 669 mty=Typemaker2_Member_GetTypePtr(tm); \ 671 DBG_ERROR(GWEN_LOGDOMAIN, "No type pointer for member"); \ 672 return GWEN_ERROR_NO_DATA; \ 674 tc=Typemaker2_Type_FindCodeForMember(mty, tm, __STRING(macro_var1));\ 676 s=Typemaker2_Code_GetCode(tc); \ 681 db=Typemaker2_Builder_CreateDbForCall(tb, ty, tm, src, dst); \ 683 DBG_INFO(GWEN_LOGDOMAIN, "here"); \ 684 return GWEN_ERROR_BAD_DATA; \ 688 GWEN_Buffer_AppendString(dbuf, " 694 rv=Typemaker2_Builder_ReplaceVars(s, db, dbuf); \ 695 GWEN_DB_Group_free(db); \ 697 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); \ 703 DBG_INFO(GWEN_LOGDOMAIN, "No code for type [%s]", \ 704 Typemaker2_Type_GetName(mty)); \ 709 DBG_ERROR(GWEN_LOGDOMAIN, "No member information"); \ 710 return GWEN_ERROR_NO_DATA; \ 733 const char *fileName,
740 f=fopen(fileName,
"w");
750 "/**********************************************************\n" 751 " * This file has been automatically created by \"typemaker2\"\n" 752 " * from the file \"%s\".\n" 753 " * Please do not edit this file, all changes will be lost.\n" 754 " * Better edit the mentioned source file instead.\n" 755 " **********************************************************/\n" 761 TYPEMAKER2_HEADER_LIST *hl;
763 fprintf(f,
"#ifdef HAVE_CONFIG_H\n# include <config.h>\n#endif\n\n");
765 s=tb->fileNamePrivate;
767 s=tb->fileNameLibrary;
769 s=tb->fileNameProtected;
771 s=tb->fileNamePublic;
773 fprintf(f,
"#include \"%s\"\n\n", s);
777 fprintf(f,
"#include <gwenhywfar/misc.h>\n");
778 fprintf(f,
"#include <gwenhywfar/debug.h>\n");
782 fprintf(f,
"/* code headers */\n");
787 h=Typemaker2_Header_List_First(hl);
795 h=Typemaker2_Header_List_Next(h);
828 s=tb->fileNamePrivate;
832 s=tb->fileNameLibrary;
836 s=tb->fileNameProtected;
840 s=tb->fileNamePublic;
848 fprintf(f,
"#include \"%s\"\n\n", s);
852 fprintf(f,
"#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
862 fprintf(f,
"%s\n", s);
868 TYPEMAKER2_HEADER_LIST *hl;
872 fprintf(f,
"/* code headers */\n");
877 h=Typemaker2_Header_List_First(hl);
885 h=Typemaker2_Header_List_Next(h);
892 fprintf(f,
"#ifdef __cplusplus\n}\n#endif\n\n");
893 fprintf(f,
"#endif\n\n");
911 const char *fileName)
915 f=fopen(fileName,
"w");
924 fprintf(f,
"<?xml?>\n");
926 fprintf(f,
"<tm2>\n");
928 fprintf(f,
" <typedef id=\"%s\" type=\"pointer\" lang=\"c\" extends=\"struct_base\">\n",
934 fprintf(f,
" </typedef>\n");
935 fprintf(f,
"</tm2>\n");
952 const char *fileName)
956 f=fopen(fileName,
"w");
965 fprintf(f,
"<?xml?>\n");
967 fprintf(f,
"<tm2>\n");
969 fprintf(f,
" <typedef id=\"%s_LIST\" type=\"pointer\" lang=\"c\" extends=\"list1_base\" " 970 "basetype=\"%s\">\n",
977 fprintf(f,
" </typedef>\n");
978 fprintf(f,
"</tm2>\n");
995 const char *fileName)
999 f=fopen(fileName,
"w");
1008 fprintf(f,
"<?xml?>\n");
1010 fprintf(f,
"<tm2>\n");
1012 fprintf(f,
" <typedef id=\"%s_LIST2\" type=\"pointer\" lang=\"c\" extends=\"list2_base\" " 1013 "basetype=\"%s\">\n",
1020 fprintf(f,
" </typedef>\n");
1021 fprintf(f,
"</tm2>\n");
1038 const char *fileName)
1042 f=fopen(fileName,
"w");
1051 fprintf(f,
"<?xml?>\n");
1053 fprintf(f,
"<tm2>\n");
1055 fprintf(f,
" <typedef id=\"%s_TREE\" type=\"pointer\" lang=\"c\" extends=\"tree_base\" " 1056 "basetype=\"%s\">\n",
1063 fprintf(f,
" </typedef>\n");
1064 fprintf(f,
"</tm2>\n");
1081 const char *fileName)
1085 f=fopen(fileName,
"w");
1094 fprintf(f,
"<?xml?>\n");
1096 fprintf(f,
"<tm2>\n");
1098 fprintf(f,
" <typedef id=\"%s_TREE2\" type=\"pointer\" lang=\"c\" extends=\"tree_base\" " 1099 "basetype=\"%s\">\n",
1106 fprintf(f,
" </typedef>\n");
1107 fprintf(f,
"</tm2>\n");
1124 const char *fileName)
1128 f=fopen(fileName,
"w");
1137 fprintf(f,
"<?xml?>\n");
1139 fprintf(f,
"<tm2>\n");
1141 fprintf(f,
" <typedef id=\"%s_IDMAP\" type=\"pointer\" lang=\"c\" extends=\"idmap_base\" " 1142 "basetype=\"%s\">\n",
1149 fprintf(f,
" </typedef>\n");
1150 fprintf(f,
"</tm2>\n");
1172 fname=tb->fileNamePublic;
1173 if (fname==
NULL || *fname==0) {
1179 if (s==
NULL || *s==0) {
1181 if (s==
NULL || *s==0) {
1187 if (tb->destFolder) {
1205 fname=tb->fileNameLibrary;
1206 if (fname==
NULL || *fname==0) {
1212 if (s==
NULL || *s==0) {
1214 if (s==
NULL || *s==0) {
1220 if (tb->destFolder) {
1238 fname=tb->fileNameProtected;
1239 if (fname==
NULL || *fname==0) {
1245 if (s==
NULL || *s==0) {
1247 if (s==
NULL || *s==0) {
1253 if (tb->destFolder) {
1271 fname=tb->fileNamePrivate;
1272 if (fname==
NULL || *fname==0) {
1278 if (s==
NULL || *s==0) {
1280 if (s==
NULL || *s==0) {
1286 if (tb->destFolder) {
1304 fname=tb->fileNameCode;
1305 if (fname==
NULL || *fname==0) {
1311 if (s==
NULL || *s==0) {
1313 if (s==
NULL || *s==0) {
1319 if (tb->destFolder) {
1354 fname=tb->fileNamePublic;
1366 fname=tb->fileNameLibrary;
1378 fname=tb->fileNameProtected;
1390 fname=tb->fileNamePrivate;
1402 fname=tb->fileNameCode;
1422 if (s==
NULL || *s==0) {
1427 if (tb->destFolder) {
1454 if (s==
NULL || *s==0) {
1459 if (tb->destFolder) {
1486 if (s==
NULL || *s==0) {
1491 if (tb->destFolder) {
1518 if (s==
NULL || *s==0) {
1523 if (tb->destFolder) {
1550 if (s==
NULL || *s==0) {
1555 if (tb->destFolder) {
1582 if (s==
NULL || *s==0) {
1587 if (tb->destFolder) {
1624 fprintf(stdout,
"%s\n", tb->fileNamePublic);
1627 fprintf(stdout,
"%s\n", tb->fileNameLibrary);
1630 fprintf(stdout,
"%s\n", tb->fileNameProtected);
1633 fprintf(stdout,
"%s\n", tb->fileNamePrivate);
1636 fprintf(stdout,
"%s\n", tb->fileNameCode);
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE2
TYPEMAKER2_TYPEMANAGER * Typemaker2_Builder_GetTypeManager(const TYPEMAKER2_BUILDER *tb)
#define INVOKE_FN(macro_var1)
void Typemaker2_Builder_SetFileNameProtected(TYPEMAKER2_BUILDER *tb, const char *s)
void Typemaker2_Builder_SetSourceFileName(TYPEMAKER2_BUILDER *tb, const char *s)
void Typemaker2_Builder_SetBuildFn(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_BUILDER_BUILD_FN fn)
TYPEMAKER2_TYPE * Typemaker2_Member_GetTypePtr(const TYPEMAKER2_MEMBER *tm)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
struct GWEN_STRINGLISTENTRYSTRUCT GWEN_STRINGLISTENTRY
uint32_t Typemaker2_Member_GetFlags(const TYPEMAKER2_MEMBER *tm)
const char * Typemaker2_Enum_GetFromStringFn(const TYPEMAKER2_ENUM *p_struct)
#define GWEN_DB_FLAGS_OVERWRITE_VARS
void Typemaker2_Builder_SetFileNameCode(TYPEMAKER2_BUILDER *tb, const char *s)
struct GWEN_DB_NODE GWEN_DB_NODE
#define GWEN_INHERIT_FINI(t, element)
GWEN_STRINGLIST * Typemaker2_Builder_GetProtectedDeclarations(const TYPEMAKER2_BUILDER *tb)
int Typemaker2_Builder_WriteTypedefFile_IdMap(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
#define GWEN_DIR_SEPARATOR_S
const char * Typemaker2_Builder_GetFileNamePrivate(const TYPEMAKER2_BUILDER *tb)
TYPEMAKER2_HEADER_LIST * Typemaker2_Type_GetHeaders(const TYPEMAKER2_TYPE *ty)
const char * Typemaker2_Member_GetFieldId(const TYPEMAKER2_MEMBER *tm)
int(* TYPEMAKER2_BUILDER_BUILD_FN)(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
TYPEMAKER2_ENUM * Typemaker2_Member_GetEnumPtr(const TYPEMAKER2_MEMBER *tm)
void Typemaker2_Builder_SetFileNameLibrary(TYPEMAKER2_BUILDER *tb, const char *s)
#define GWEN_FREE_OBJECT(varname)
void Typemaker2_Builder_free(TYPEMAKER2_BUILDER *tb)
int Typemaker2_Builder_DetermineOutFileNames(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
TYPEMAKER2_TYPE * Typemaker2_Type_GetBaseTypePtr(const TYPEMAKER2_TYPE *ty)
#define TYPEMAKER2_BUILDER_WRITEFILE_FLAGS_WRITE_TYPE
int Typemaker2_Builder_WriteTypedefFile_List1(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
void Typemaker2_Builder_SetTypeManager(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPEMANAGER *tm)
int Typemaker2_Builder_WriteTypedefFile(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
struct TYPEMAKER2_ENUM TYPEMAKER2_ENUM
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
int Typemaker2_Member_GetMaxLen(const TYPEMAKER2_MEMBER *tm)
GWEN_STRINGLISTENTRY * GWEN_StringList_FirstEntry(const GWEN_STRINGLIST *sl)
const char * GWEN_StringListEntry_Data(const GWEN_STRINGLISTENTRY *se)
void Typemaker2_Builder_SetDestFolderName(TYPEMAKER2_BUILDER *tb, const char *s)
void Typemaker2_Builder_AddPrivateDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
void Typemaker2_Builder_SetFileNamePrivate(TYPEMAKER2_BUILDER *tb, const char *s)
int Typemaker2_Builder_ReplaceVars(const char *s, GWEN_DB_NODE *db, GWEN_BUFFER *dbuf)
static void addMemberInfoToCallDb(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, GWEN_DB_NODE *db, int withTypePrefix)
const char * Typemaker2_Member_GetPresetValue(const TYPEMAKER2_MEMBER *tm)
#define GWEN_ERROR_BAD_DATA
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
const char * Typemaker2_Builder_GetFileNameLibrary(const TYPEMAKER2_BUILDER *tb)
void Typemaker2_Builder_AddDeclaration(TYPEMAKER2_BUILDER *tb, int access, const char *s)
#define GWEN_NEW_OBJECT(typ, varname)
int Typemaker2_Builder_Build(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
const char * Typemaker2_Builder_GetFileNamePublic(const TYPEMAKER2_BUILDER *tb)
const char * Typemaker2_Builder_GetSourceFileName(const TYPEMAKER2_BUILDER *tb)
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
GWEN_STRINGLIST * Typemaker2_Builder_GetPrivateDeclarations(const TYPEMAKER2_BUILDER *tb)
const char * Typemaker2_Type_GetIdentifier(const TYPEMAKER2_TYPE *ty)
void Typemaker2_Builder_AddProtectedDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
#define TYPEMAKER2_TYPEFLAGS_WITH_TREE
const char * Typemaker2_Builder_GetFileNameProtected(const TYPEMAKER2_BUILDER *tb)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
int Typemaker2_Builder_WriteTypedefFile_Tree(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
#define GWEN_INHERIT_INIT(t, element)
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
#define TYPEMAKER2_FLAGS_ENUM
TYPEMAKER2_MEMBER_LIST * Typemaker2_Type_GetMembers(const TYPEMAKER2_TYPE *ty)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
const char * Typemaker2_Type_GetName(const TYPEMAKER2_TYPE *ty)
int Typemaker2_Builder_WriteFile(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName, GWEN_STRINGLIST *sl, int acc)
const char * Typemaker2_Member_GetDefaultValue(const TYPEMAKER2_MEMBER *tm)
void Typemaker2_Builder_AddCode(TYPEMAKER2_BUILDER *tb, const char *s)
const char * Typemaker2_Builder_GetFileNameCode(const TYPEMAKER2_BUILDER *tb)
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
#define DBG_ERROR(dbg_logger, format, args...)
struct TYPEMAKER2_TYPE TYPEMAKER2_TYPE
void Typemaker2_Builder_AddPublicDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
int Typemaker2_Builder_WriteTypedefFile_List2(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
#define TYPEMAKER2_TYPEFLAGS_WITH_IDMAP
void Typemaker2_Builder_SetFileNamePublic(TYPEMAKER2_BUILDER *tb, const char *s)
#define GWEN_ERROR_NOT_SUPPORTED
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
#define GWEN_DIR_SEPARATOR
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
GWEN_STRINGLIST * Typemaker2_Builder_GetCode(const TYPEMAKER2_BUILDER *tb)
static void setCharValueWithTypePrefix(GWEN_DB_NODE *db, const char *prefix, const char *varName, const char *value)
#define DBG_INFO(dbg_logger, format, args...)
void Typemaker2_Builder_AddLibraryDeclaration(TYPEMAKER2_BUILDER *tb, const char *s)
const char * Typemaker2_Builder_GetDestFolderName(const TYPEMAKER2_BUILDER *tb)
const char * Typemaker2_Type_GetPrefix(const TYPEMAKER2_TYPE *ty)
TYPEMAKER2_BUILDER * Typemaker2_Builder_new()
int Typemaker2_Builder_PrintFileNames(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
const char * Typemaker2_TypeManager_GetApiDeclaration(const TYPEMAKER2_TYPEMANAGER *tym)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
GWEN_STRINGLIST * Typemaker2_Builder_GetPublicDeclarations(const TYPEMAKER2_BUILDER *tb)
GWEN_STRINGLIST * Typemaker2_Builder_GetLibraryDeclarations(const TYPEMAKER2_BUILDER *tb)
struct TYPEMAKER2_MEMBER TYPEMAKER2_MEMBER
const char * Typemaker2_Enum_GetToStringFn(const TYPEMAKER2_ENUM *p_struct)
int Typemaker2_Builder_WriteTypedefFile_Tree2(GWEN_UNUSED TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
const char * Typemaker2_Member_GetElementName(const TYPEMAKER2_MEMBER *tm)
GWEN_STRINGLIST * GWEN_StringList_new(void)
uint32_t Typemaker2_Type_GetFlags(const TYPEMAKER2_TYPE *ty)
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST2
const char * Typemaker2_Member_GetName(const TYPEMAKER2_MEMBER *tm)
#define TYPEMAKER2_BUILDER_WRITEFILE_FLAGS_WRITE_DEFS
#define GWEN_INHERIT_FUNCTIONS(t)
#define TYPEMAKER2_FLAGS_VOLATILE
int Typemaker2_Builder_WriteFiles(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, uint32_t writeFlags)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
const char * Typemaker2_Type_GetBaseFileName(const TYPEMAKER2_TYPE *ty)
GWEN_DB_NODE * Typemaker2_Builder_CreateDbForCall(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, TYPEMAKER2_MEMBER *tm, const char *src, const char *dst)
#define TYPEMAKER2_TYPEFLAGS_WITH_LIST1