diff --git a/sys/msdos/def2mak.c b/sys/msdos/def2mak.c new file mode 100644 index 000000000..269d33de4 --- /dev/null +++ b/sys/msdos/def2mak.c @@ -0,0 +1,383 @@ +/* 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; +}