/* SCCS Id: @(#)def2mak.c 3.3 95/03/19 */ /* Copyright (c) NetHack PC Development Team, 1994. */ /* NetHack may be freely redistributed. See license for details. */ #include "config.h" #include #include #ifndef _MSC_VER #include #else int __cdecl _strcmpi(const char *, const char *); int __cdecl _stricmp(const char *, const char *); int __cdecl _strnicmp(const char *, const char *,size_t); #endif #define MALLOC(type) (type *)malloc(sizeof(type)) #define MACROID_SIZ 50 #define MACROVAL_SIZ 300 typedef unsigned char bool; struct MacroNode * FDECL(AddMacro, (struct MacroNode *, char *, char *)); char * FDECL(ApplyMacros, (char *, struct MacroNode *)); struct MacroNode * FDECL(DelMacro, (struct MacroNode *)); struct MacroNode * FDECL(DelMacroList, (struct MacroNode *)); void FDECL(COMPILER, (bool, char *, char *, FILE *)); void FDECL(SaveNewLine, (char *, char *)); struct ListItem * FDECL(AddItem, (struct ListItem *, char *)); struct ListItem * FDECL(ReadList, (FILE *, int)); void FDECL(LINKLIST, (bool, struct ListItem *, char *, char *)); struct ListTable * FDECL(AddList, (struct ListTable *, struct ListItem *, char *)); struct ListItem * FDECL(DelTableList, (struct ListItem *)); struct ListTable * FDECL(DelTable, (struct ListTable *)); struct ListItem * FDECL(FindList, (struct ListTable *, char *)); #ifdef strcmpi # undef strcmpi /* don't want to drag in hacklib.c */ #endif #ifdef _MSC_VER #define stricmp _strcmpi #define strnicmp _strnicmp #endif int strcmpi(s1, s2) char *s1, *s2; { char t1, t2; while (*s1 || *s2) { if (!*s2) return 1; /* s1 > s2 */ else if (!*s1) return -1; /* s1 < s2 */ if (isupper(*s1)) t1 = tolower(*s1); else t1 = *s1; if (isupper(*s2)) t2 = tolower(*s2); else t2 = *s2; if (t1 != t2) return (t1 > t2) ? 1 : -1; s1++; s2++; } return 0; /* s1 == s2 */ } struct MacroNode { char Name[MACROID_SIZ]; char Val[MACROVAL_SIZ]; struct MacroNode *Next; }; struct MacroNode * AddMacro (List, MID, MVal) struct MacroNode *List; char *MID; char *MVal; { struct MacroNode *Tmp; Tmp = MALLOC (struct MacroNode); strncpy (Tmp->Name, MID, MACROID_SIZ); strncpy (Tmp->Val, MVal, MACROVAL_SIZ); Tmp->Next = List; return Tmp; } char * ApplyMacros (Line, List) char *Line; struct MacroNode *List; { static char TotalLine[MACROVAL_SIZ + 100]; char TmpLine[MACROVAL_SIZ + 100]; int AfterLine; char MacroName[MACROID_SIZ]; struct MacroNode *TmpList; strcpy (TotalLine, ""); strcpy (TmpLine, Line); if (sscanf (TmpLine, "%[^?]?[%[^]]]%n", TotalLine, MacroName, &AfterLine) <= 1) return Line; for (TmpList = List; TmpList; TmpList = TmpList->Next) if (!strcmp(TmpList->Name, MacroName)) { strcat (TotalLine, TmpList->Val); break; } strcat (TotalLine, TmpLine + AfterLine); return TotalLine; } struct MacroNode * DelMacro (List) struct MacroNode *List; { struct MacroNode *tmp; tmp = List->Next; free (List); return tmp; } struct MacroNode * DelMacroList (List) struct MacroNode *List; { while (List != NULL) List = DelMacro (List); return List; } void COMPILER (display, SavedNewLine, EndString, input) bool display; char *SavedNewLine; char *EndString; FILE *input; { char buffer[100]; fgets (buffer, 100, input); while (strnicmp(buffer, EndString, strlen(EndString))) { if (display) SaveNewLine(buffer, SavedNewLine); fgets (buffer, 100, input); }; } void SaveNewLine (Line, NewLine) char *Line; char *NewLine; { char tempNewLine[2]; strcpy (tempNewLine, ""); if (Line[strlen(Line)-1] == '\n') { Line[strlen(Line)-1] = '\0'; strcpy (tempNewLine, "\n"); }; printf ("%s%s", NewLine, Line); strcpy (NewLine, tempNewLine); } struct ListItem { char Item[40]; struct ListItem *next; }; struct ListTable { char name[40]; struct ListItem *List; struct ListTable *next; }; struct ListItem * AddItem (List, Item) struct ListItem *List; char Item[40]; { struct ListItem *temp; temp = MALLOC(struct ListItem); temp->next = List; strncpy (temp->Item, Item, 39); return temp; } struct ListItem * ReadList (input, LinePos) FILE *input; int LinePos; { char Item[40]; char buffer[100]; struct ListItem *List; List = NULL; fscanf (input, "%39s", Item); while (strncmp(Item, "?ENDLIST?", 9)) { if (LinePos > 60) { LinePos = 18; printf ("\\\n\t\t"); } List = AddItem(List, Item); printf ("%s ", Item); LinePos += 1 + strlen(Item); fscanf (input, "%39s", Item); } printf ("\n"); fgets (buffer, 100, input); return List; } void LINKLIST (BC, List, Listname, SavedNewLine) bool BC; struct ListItem *List; char *Listname; char *SavedNewLine; { int LinePos; printf ("%s\t\t", SavedNewLine); strcpy (SavedNewLine, ""); if (!BC) { printf ("$(%s:^\t=+^\n\t\t)\n", Listname); return; }; if (List == NULL) return; LinePos = 18; while (List != NULL) { if (LinePos > 60) { LinePos = 18; printf ("+\n\t\t"); } printf ("%s ", List->Item); LinePos += 1 + strlen(List->Item); List = List->next; } printf ("\n"); } struct ListTable * AddList (Table, List, Name) struct ListTable *Table; struct ListItem *List; char *Name; { struct ListTable *temp; temp = MALLOC (struct ListTable); temp->next = Table; temp->List = List; strncpy (temp->name, Name, 39); return temp; } struct ListItem * DelTableList (List) struct ListItem *List; { struct ListItem *temp; while (List != NULL) { temp = List->next; free (List); List = temp; }; return List; } struct ListTable * DelTable (Table) struct ListTable *Table; { struct ListTable *temp; while (Table != NULL) { temp = Table->next; Table->List = DelTableList(Table->List); free(Table); Table=temp; }; return Table; } struct ListItem * FindList (Table, Item) struct ListTable *Table; char *Item; { while (Table != NULL) { if (!stricmp(Table->name, Item)) return Table->List; Table = Table->next; } return NULL; } int main (argc, argv) int argc; char *argv[]; { FILE *makfile; char buffer[100]; char SavedNewLine[2]; char Listname[40]; struct ListTable *Table; time_t timer; bool MSC, BC; struct MacroNode *MacroList = NULL; char MacroName[MACROID_SIZ]; char MacroVal[MACROVAL_SIZ]; if (argc < 3) { printf ("Too few arguments. Correct usage is:\n"); printf ("\t%s {/MSC || /BC} template\n\n", "def2mak"); printf ("\t{/MSC || /BC} indicate the compiler to use.\n"); printf ("\ttemplate is the template file to process.\n\n"); printf ("The output makefile goes to standard output.\n"); return 1; }; Table = NULL; if (!strcmpi(argv[1], "/MSC") || !strcmpi(argv[1], "-MSC")) { MSC = TRUE; BC = FALSE; } else if (!strcmpi(argv[1], "/BC") || !strcmpi(argv[1], "-BC")) { MSC = FALSE; BC = TRUE; } else { fprintf (stderr, "Unknown compiler format: %s\n", argv[1]); return 1; }; strcpy (SavedNewLine, ""); if ((makfile = fopen (argv[2], "r")) == NULL) return 2; COMPILER (0, SavedNewLine, "?BEGIN?", makfile); while (!feof(makfile)) { if (fgets(buffer, 100, makfile) == NULL) break; if (!strnicmp(buffer, "?SCCS?", 6)) { time (&timer); printf ("%s#\tSCCS Id: @(#)Makefile.%s\t3.3\t%02d/%02d/%02d\n", SavedNewLine, MSC ? "MSC" : BC ? "BC" : "???", localtime(&timer)->tm_year, localtime(&timer)->tm_mon + 1, localtime(&timer)->tm_mday); printf ("# Copyright (c) %s, %d.\n", BC ? "Yitzhak Sapir" : "NetHack PC Development Team", localtime(&timer)->tm_year + 1900); printf ("# NetHack may be freely distributed. "); printf ("See license for details.\n#\n\n"); strcpy (SavedNewLine, ""); } else if (MSC ? sscanf (buffer, "?MSCMACRO:%[^=]=%[^?]?", MacroName, MacroVal) : BC ? sscanf (buffer, "?BCMACRO:%[^=]=%[^?]?", MacroName, MacroVal) : 0) MacroList = AddMacro(MacroList, MacroName, MacroVal); else if (!strnicmp(buffer, "?BC?", 4)) COMPILER(BC, SavedNewLine, "?ENDBC?", makfile); else if (!strnicmp(buffer, "?MSC?", 5)) COMPILER(MSC, SavedNewLine, "?ENDMSC?", makfile); else if (!strnicmp(buffer, "?COMMENT?", 9)) COMPILER(FALSE, SavedNewLine, "?ENDCOMMENT?", makfile); else if (sscanf(buffer, "?LIST:%[^?]?", Listname) == 1) { printf ("%s%s\t=", SavedNewLine, Listname); Table = AddList (Table, ReadList (makfile, 18), Listname); strcpy (SavedNewLine, ""); } else if (sscanf(buffer, "?LINKLIST:%[^?]?", Listname) == 1) LINKLIST (BC, FindList(Table, Listname), Listname, SavedNewLine); else if (buffer[0] != '?') SaveNewLine(ApplyMacros(buffer, MacroList), SavedNewLine); }; printf ("%s", SavedNewLine); fclose (makfile); Table = DelTable(Table); MacroList = DelMacroList (MacroList); return 0; }