15 #include "tm_builder_p.h"
18 #include <gwenhywfar/debug.h>
19 #include <gwenhywfar/misc.h>
56 free(tb->fileNamePublic);
57 free(tb->fileNameLibrary);
58 free(tb->fileNameProtected);
59 free(tb->fileNamePrivate);
60 free(tb->fileNameCode);
70 return tb->declarationsPublic;
77 return tb->declarationsLibrary;
84 return tb->declarationsProtected;
91 return tb->declarationsPrivate;
105 return tb->typeManager;
154 return tb->fileNamePublic;
161 free(tb->fileNamePublic);
162 if (s) tb->fileNamePublic=strdup(s);
163 else tb->fileNamePublic=
NULL;
170 return tb->fileNameLibrary;
177 free(tb->fileNameLibrary);
178 if (s) tb->fileNameLibrary=strdup(s);
179 else tb->fileNameLibrary=
NULL;
186 return tb->fileNameProtected;
193 free(tb->fileNameProtected);
194 if (s) tb->fileNameProtected=strdup(s);
195 else tb->fileNameProtected=
NULL;
202 return tb->fileNamePrivate;
209 free(tb->fileNamePrivate);
210 if (s) tb->fileNamePrivate=strdup(s);
211 else tb->fileNamePrivate=
NULL;
218 return tb->fileNameCode;
225 free(tb->fileNameCode);
226 if (s) tb->fileNameCode=strdup(s);
227 else tb->fileNameCode=
NULL;
234 return tb->sourceFileName;
241 free(tb->sourceFileName);
242 if (s) tb->sourceFileName=strdup(s);
243 else tb->sourceFileName=
NULL;
250 return tb->destFolder;
257 free(tb->destFolder);
258 if (s) tb->destFolder=strdup(s);
259 else tb->destFolder=
NULL;
274 return tb->buildFn(tb, ty);
291 if (tb->typeManager) {
457 name=(
char*) malloc(len+1);
459 memmove(name, pStart, len);
492 while(*p && *p!=
'#') {
503 if (tolower(p[1])==
'n') {
507 else if (tolower(p[1])==
't') {
511 else if (tolower(p[1])==
'\\') {
533 #define INVOKE_FN(macro_var1) \
534 int Typemaker2_Builder_Invoke_##macro_var1##Fn(TYPEMAKER2_BUILDER *tb, \
535 TYPEMAKER2_TYPE *ty, \
536 TYPEMAKER2_MEMBER *tm, \
539 GWEN_BUFFER *dbuf) { \
541 TYPEMAKER2_TYPE *mty; \
542 TYPEMAKER2_CODE *tc; \
543 const char *s=NULL; \
545 mty=Typemaker2_Member_GetTypePtr(tm); \
547 DBG_ERROR(GWEN_LOGDOMAIN, "No type pointer for member"); \
548 return GWEN_ERROR_NO_DATA; \
550 tc=Typemaker2_Type_FindCodeForMember(mty, tm, __STRING(macro_var1));\
552 s=Typemaker2_Code_GetCode(tc); \
557 db=Typemaker2_Builder_CreateDbForCall(tb, ty, tm, src, dst); \
559 DBG_INFO(GWEN_LOGDOMAIN, "here"); \
560 return GWEN_ERROR_BAD_DATA; \
564 GWEN_Buffer_AppendString(dbuf, "
570 rv=Typemaker2_Builder_ReplaceVars(s, db, dbuf); \
571 GWEN_DB_Group_free(db); \
573 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); \
579 DBG_INFO(GWEN_LOGDOMAIN, "No code for type [%s]", \
580 Typemaker2_Type_GetName(mty)); \
585 DBG_ERROR(GWEN_LOGDOMAIN, "No member information"); \
586 return GWEN_ERROR_NO_DATA; \
609 const char *fileName,
615 f=fopen(fileName,
"w");
625 "/**********************************************************\n"
626 " * This file has been automatically created by \"typemaker2\"\n"
627 " * from the file \"%s\".\n"
628 " * Please do not edit this file, all changes will be lost.\n"
629 " * Better edit the mentioned source file instead.\n"
630 " **********************************************************/\n"
636 TYPEMAKER2_HEADER_LIST *hl;
638 fprintf(f,
"#ifdef HAVE_CONFIG_H\n# include <config.h>\n#endif\n\n");
640 s=tb->fileNamePrivate;
642 s=tb->fileNameLibrary;
644 s=tb->fileNameProtected;
646 s=tb->fileNamePublic;
648 fprintf(f,
"#include \"%s\"\n\n", s);
652 fprintf(f,
"#include <gwenhywfar/misc.h>\n");
653 fprintf(f,
"#include <gwenhywfar/debug.h>\n");
657 fprintf(f,
"/* code headers */\n");
662 h=Typemaker2_Header_List_First(hl);
670 h=Typemaker2_Header_List_Next(h);
699 s=tb->fileNamePrivate;
703 s=tb->fileNameLibrary;
707 s=tb->fileNameProtected;
711 s=tb->fileNamePublic;
719 fprintf(f,
"#include \"%s\"\n\n", s);
723 fprintf(f,
"#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
733 fprintf(f,
"%s\n", s);
739 TYPEMAKER2_HEADER_LIST *hl;
743 fprintf(f,
"/* code headers */\n");
748 h=Typemaker2_Header_List_First(hl);
756 h=Typemaker2_Header_List_Next(h);
763 fprintf(f,
"#ifdef __cplusplus\n}\n#endif\n\n");
764 fprintf(f,
"#endif\n\n");
782 const char *fileName) {
785 f=fopen(fileName,
"w");
794 fprintf(f,
"<?xml?>\n");
796 fprintf(f,
"<tm2>\n");
798 fprintf(f,
" <typedef id=\"%s\" type=\"pointer\" lang=\"c\" extends=\"struct_base\">\n",
804 fprintf(f,
" </typedef>\n");
805 fprintf(f,
"</tm2>\n");
822 const char *fileName) {
825 f=fopen(fileName,
"w");
834 fprintf(f,
"<?xml?>\n");
836 fprintf(f,
"<tm2>\n");
838 fprintf(f,
" <typedef id=\"%s_LIST\" type=\"pointer\" lang=\"c\" extends=\"list1_base\" "
839 "basetype=\"%s\">\n",
846 fprintf(f,
" </typedef>\n");
847 fprintf(f,
"</tm2>\n");
864 const char *fileName) {
867 f=fopen(fileName,
"w");
876 fprintf(f,
"<?xml?>\n");
878 fprintf(f,
"<tm2>\n");
880 fprintf(f,
" <typedef id=\"%s_LIST2\" type=\"pointer\" lang=\"c\" extends=\"list2_base\" "
881 "basetype=\"%s\">\n",
888 fprintf(f,
" </typedef>\n");
889 fprintf(f,
"</tm2>\n");
906 const char *fileName) {
909 f=fopen(fileName,
"w");
918 fprintf(f,
"<?xml?>\n");
920 fprintf(f,
"<tm2>\n");
922 fprintf(f,
" <typedef id=\"%s_TREE\" type=\"pointer\" lang=\"c\" extends=\"tree_base\" "
923 "basetype=\"%s\">\n",
930 fprintf(f,
" </typedef>\n");
931 fprintf(f,
"</tm2>\n");
948 const char *fileName) {
951 f=fopen(fileName,
"w");
960 fprintf(f,
"<?xml?>\n");
962 fprintf(f,
"<tm2>\n");
964 fprintf(f,
" <typedef id=\"%s_IDMAP\" type=\"pointer\" lang=\"c\" extends=\"idmap_base\" "
965 "basetype=\"%s\">\n",
972 fprintf(f,
" </typedef>\n");
973 fprintf(f,
"</tm2>\n");
994 fname=tb->fileNamePublic;
995 if (fname==
NULL || *fname==0) {
1001 if (s==
NULL || *s==0) {
1003 if (s==
NULL || *s==0) {
1009 if (tb->destFolder) {
1027 fname=tb->fileNameLibrary;
1028 if (fname==
NULL || *fname==0) {
1034 if (s==
NULL || *s==0) {
1036 if (s==
NULL || *s==0) {
1042 if (tb->destFolder) {
1060 fname=tb->fileNameProtected;
1061 if (fname==
NULL || *fname==0) {
1067 if (s==
NULL || *s==0) {
1069 if (s==
NULL || *s==0) {
1075 if (tb->destFolder) {
1093 fname=tb->fileNamePrivate;
1094 if (fname==
NULL || *fname==0) {
1100 if (s==
NULL || *s==0) {
1102 if (s==
NULL || *s==0) {
1108 if (tb->destFolder) {
1126 fname=tb->fileNameCode;
1127 if (fname==
NULL || *fname==0) {
1133 if (s==
NULL || *s==0) {
1135 if (s==
NULL || *s==0) {
1141 if (tb->destFolder) {
1175 fname=tb->fileNamePublic;
1187 fname=tb->fileNameLibrary;
1199 fname=tb->fileNameProtected;
1211 fname=tb->fileNamePrivate;
1223 fname=tb->fileNameCode;
1242 if (s==
NULL || *s==0) {
1247 if (tb->destFolder) {
1275 if (s==
NULL || *s==0) {
1280 if (tb->destFolder) {
1307 if (s==
NULL || *s==0) {
1312 if (tb->destFolder) {
1339 if (s==
NULL || *s==0) {
1344 if (tb->destFolder) {
1371 if (s==
NULL || *s==0) {
1376 if (tb->destFolder) {
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)
#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)
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)
int Typemaker2_Builder_WriteFiles(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, int defsOnly)
void Typemaker2_Builder_SetTypeManager(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPEMANAGER *tm)
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)
int Typemaker2_Builder_WriteTypedefFile_List1(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
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)
const char * Typemaker2_Member_GetPresetValue(const TYPEMAKER2_MEMBER *tm)
#define GWEN_ERROR_BAD_DATA
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
int Typemaker2_Builder_WriteTypedefFile_List2(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
const char * Typemaker2_Builder_GetFileNameLibrary(const TYPEMAKER2_BUILDER *tb)
int Typemaker2_Builder_WriteTypedefFile(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
#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)
int Typemaker2_Builder_WriteTypedefFile_Tree(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
GWEN_STRINGLIST * Typemaker2_Builder_GetPrivateDeclarations(const TYPEMAKER2_BUILDER *tb)
int(* TYPEMAKER2_BUILDER_BUILD_FN)(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty)
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
int Typemaker2_Builder_WriteTypedefFile_IdMap(TYPEMAKER2_BUILDER *tb, TYPEMAKER2_TYPE *ty, const char *fileName)
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)
#define GWEN_INHERIT_INIT(t, element)
struct TYPEMAKER2_BUILDER TYPEMAKER2_BUILDER
#define TYPEMAKER2_FLAGS_ENUM
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)
#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)
GWEN_STRINGLISTENTRY * GWEN_StringListEntry_Next(const GWEN_STRINGLISTENTRY *se)
struct TYPEMAKER2_TYPEMANAGER TYPEMAKER2_TYPEMANAGER
GWEN_STRINGLIST * Typemaker2_Builder_GetCode(const TYPEMAKER2_BUILDER *tb)
#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()
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)
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 GWEN_INHERIT_FUNCTIONS(t)
#define TYPEMAKER2_FLAGS_VOLATILE
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