*** empty log message ***
This commit is contained in:
383
sys/msdos/def2mak.c
Normal file
383
sys/msdos/def2mak.c
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user