]> granicus.if.org Git - nethack/commitdiff
*** empty log message ***
authorjwalz <jwalz>
Sat, 5 Jan 2002 21:05:56 +0000 (21:05 +0000)
committerjwalz <jwalz>
Sat, 5 Jan 2002 21:05:56 +0000 (21:05 +0000)
sys/msdos/def2mak.c [new file with mode: 0644]

diff --git a/sys/msdos/def2mak.c b/sys/msdos/def2mak.c
new file mode 100644 (file)
index 0000000..269d33d
--- /dev/null
@@ -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 <malloc.h>
+#include <ctype.h>
+#ifndef _MSC_VER
+#include <stdlib.h>
+#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;
+}