diff --git a/src/common/fileid.c b/src/common/fileid.c new file mode 100644 index 000000000..8e0a875a5 --- /dev/null +++ b/src/common/fileid.c @@ -0,0 +1,79 @@ +/*****************************************************************************/ +/* */ +/* fileid.c */ +/* */ +/* Determine the id of a file type by extension */ +/* */ +/* */ +/* */ +/* (C) 2003-2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#include +#include + +/* common */ +#include "fileid.h" +#include "fname.h" + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +static int Compare (const void* Key, const void* Id) +/* Compare function for bsearch */ +{ + return strcmp (Key, ((const FileId*) Id)->Ext); +} + + + +const FileId* GetFileId (const char* Name, const FileId* Table, unsigned Count) +/* Determine the id of the given file by looking at file extension of the name. + * The table passed to the function must be sorted alphabetically. If the + * extension is found, a pointer to the matching table entry is returned. If + * no matching table entry was found, the function returns NULL. + */ +{ + /* Determine the file type by the extension */ + const char* Ext = FindExt (Name); + + /* Do we have an extension? */ + if (Ext == 0) { + return 0; + } + + /* Search for a table entry and return it */ + return bsearch (Ext+1, Table, Count, sizeof (FileId), Compare); +} + + + diff --git a/src/common/fileid.h b/src/common/fileid.h new file mode 100644 index 000000000..1faf31ef8 --- /dev/null +++ b/src/common/fileid.h @@ -0,0 +1,77 @@ +/*****************************************************************************/ +/* */ +/* fileid.h */ +/* */ +/* Determine the id of a file type by extension */ +/* */ +/* */ +/* */ +/* (C) 2003-2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef FILEID_H +#define FILEID_H + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* An entry for a table that maps extensions to some sort of identifier. Such + * a table - sorted alphabetically - is passed to GetFileId. + */ +typedef struct FileId FileId; +struct FileId { + const char Ext[4]; + int Id; +}; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +const FileId* GetFileId (const char* Name, const FileId* Table, unsigned Count); +/* Determine the id of the given file by looking at file extension of the name. + * The table passed to the function must be sorted alphabetically. If the + * extension is found, a pointer to the matching table entry is returned. If + * no matching table entry was found, the function returns NULL. + */ + + + +/* End of fileid.h */ +#endif + + + diff --git a/src/common/filetype.c b/src/common/filetype.c index e74c412b6..abd66911f 100644 --- a/src/common/filetype.c +++ b/src/common/filetype.c @@ -6,8 +6,8 @@ /* */ /* */ /* */ -/* (C) 2003-2005, Ullrich von Bassewitz */ -/* Römerstrasse 52 */ +/* (C) 2003-2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ /* */ @@ -37,8 +37,8 @@ #include /* common */ +#include "fileid.h" #include "filetype.h" -#include "fname.h" @@ -48,13 +48,7 @@ -/* Table that maps extensions to file types. Sorted alphabetically. */ -typedef struct { - const char Ext[4]; - FILETYPE Type; -} FileType; - -static const FileType TypeTable[] = { +static const FileId TypeTable[] = { /* Upper case stuff for obsolete operating systems */ { "A", FILETYPE_LIB }, { "A65", FILETYPE_ASM }, @@ -99,34 +93,16 @@ static const FileType TypeTable[] = { -static int Compare (const void* Key, const void* Type) -/* Compare function for bsearch */ -{ - return strcmp (Key, ((const FileType*) Type)->Ext); -} - - - FILETYPE GetFileType (const char* Name) /* Determine the type of the given file by looking at the name. If the file * type could not be determined, the function returns FILETYPE_UNKOWN. */ { - const FileType* FT; - - /* Determine the file type by the extension */ - const char* Ext = FindExt (Name); - - /* Do we have an extension? */ - if (Ext == 0) { - return FILETYPE_UNKNOWN; - } - /* Search for a table entry */ - FT = bsearch (Ext+1, TypeTable, FILETYPE_COUNT, sizeof (FileType), Compare); + const FileId* F = GetFileId (Name, TypeTable, FILETYPE_COUNT); /* Return the result */ - return FT? FT->Type : FILETYPE_UNKNOWN; + return F? F->Id : FILETYPE_UNKNOWN; } diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index 54484a7a7..499080ad3 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -25,6 +25,7 @@ OBJS = abend.o \ cpu.o \ debugflag.o \ exprdefs.o \ + fileid.o \ filepos.o \ filetype.o \ fname.o \ diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index e9d7e01c1..07e39155e 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -67,6 +67,7 @@ OBJS = abend.obj \ cpu.obj \ debugflag.obj \ exprdefs.obj \ + fileid.obj \ filepos.obj \ filetype.obj \ fname.obj \