From 8be24a16f55049419bd9481f1918729f269e56dc Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Sat, 15 Sep 2012 17:38:07 +0200 Subject: [PATCH] Remove Babel library from codebase Since we are going to release the library with a minimal player, and work together with Grotesque to produce a cool player, we are removing the Babel library for now. --- Makefile.am | 4 +- babel/MANIFEST | 51 - babel/Makefile.am | 36 - babel/README | 74 -- babel/adrift.c | 89 -- babel/advsys.c | 49 - babel/agt.c | 59 - babel/alan.c | 69 -- babel/babel | Bin 190177 -> 0 bytes babel/babel-makefile | 75 -- babel/babel.a | Bin 240954 -> 0 bytes babel/babel.c | 248 ---- babel/babel.h | 56 - babel/babel_functions.a | Bin 64180 -> 0 bytes babel/babel_handler.c | 366 ------ babel/babel_handler.h | 65 -- babel/babel_ifiction_functions.c | 168 --- babel/babel_multi_functions.c | 312 ----- babel/babel_story_functions.c | 411 ------- babel/blorb.c | 245 ---- babel/executable.c | 62 - babel/glulx.c | 81 -- babel/hugo.c | 79 -- babel/ifiction.a | Bin 33404 -> 0 bytes babel/ifiction.c | 534 --------- babel/ifiction.h | 45 - babel/level9.c | 495 -------- babel/magscrolls.c | 124 -- babel/md5.c | 381 ------- babel/md5.h | 91 -- babel/misc.c | 19 - babel/modules.h | 70 -- babel/modules.h.gch | Bin 1528656 -> 0 bytes babel/register.c | 36 - babel/register_ifiction.c | 29 - babel/tads.c | 1827 ------------------------------ babel/tads.h | 40 - babel/tads2.c | 100 -- babel/tads3.c | 100 -- babel/treaty.h | 91 -- babel/treaty_builder.h | 180 --- babel/zcode.c | 97 -- configure.ac | 3 - tests/Makefile.am | 6 +- tests/babeltest.c | 231 ---- 45 files changed, 3 insertions(+), 7095 deletions(-) delete mode 100644 babel/MANIFEST delete mode 100644 babel/Makefile.am delete mode 100644 babel/README delete mode 100644 babel/adrift.c delete mode 100644 babel/advsys.c delete mode 100644 babel/agt.c delete mode 100644 babel/alan.c delete mode 100644 babel/babel delete mode 100644 babel/babel-makefile delete mode 100644 babel/babel.a delete mode 100644 babel/babel.c delete mode 100644 babel/babel.h delete mode 100644 babel/babel_functions.a delete mode 100644 babel/babel_handler.c delete mode 100644 babel/babel_handler.h delete mode 100644 babel/babel_ifiction_functions.c delete mode 100644 babel/babel_multi_functions.c delete mode 100644 babel/babel_story_functions.c delete mode 100644 babel/blorb.c delete mode 100644 babel/executable.c delete mode 100644 babel/glulx.c delete mode 100644 babel/hugo.c delete mode 100644 babel/ifiction.a delete mode 100644 babel/ifiction.c delete mode 100644 babel/ifiction.h delete mode 100644 babel/level9.c delete mode 100644 babel/magscrolls.c delete mode 100644 babel/md5.c delete mode 100644 babel/md5.h delete mode 100644 babel/misc.c delete mode 100644 babel/modules.h delete mode 100644 babel/modules.h.gch delete mode 100644 babel/register.c delete mode 100644 babel/register_ifiction.c delete mode 100644 babel/tads.c delete mode 100644 babel/tads.h delete mode 100644 babel/tads2.c delete mode 100644 babel/tads3.c delete mode 100644 babel/treaty.h delete mode 100644 babel/treaty_builder.h delete mode 100644 babel/zcode.c delete mode 100644 tests/babeltest.c diff --git a/Makefile.am b/Makefile.am index a43dbac..352b3d3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,9 +2,9 @@ ## Created by Anjuta if TARGET_ILIAD -SUBDIRS = libchimara interpreters babel player po +SUBDIRS = libchimara interpreters player po else -SUBDIRS = libchimara interpreters babel player tests docs po +SUBDIRS = libchimara interpreters player tests docs po endif chimaradocdir = $(datadir)/doc/chimara diff --git a/babel/MANIFEST b/babel/MANIFEST deleted file mode 100644 index 09048bd..0000000 --- a/babel/MANIFEST +++ /dev/null @@ -1,51 +0,0 @@ -adrift.c Treaty of Babel module for Adrift -advsys.c Treaty of Babel module for AdvSys -alan.c Treaty of Babel module for Alan -agt.c Treaty of Babel module for AGT -babel.h babel program header -md5.h L. Peter Deutsch's md5 header -modules.h babel module registry -treaty.h Treaty of Babel header -treaty_builder.h Macros to build treaty modules -babel.c Babel main program -babel_handler.h Babel handler header file -babel_handler.c The babel handler api -babel_ifiction_functions.c Babel program-specific ifiction operations -babel_multi_functions.c Babel program-specific multi operations -babel_story_functions.c Babel program-specific story operations -blorb.c babel handler blorb module -executable.c Treaty of Bable module for executables -glulx.c Treaty of Babel module for glulx -hugo.c Draft Treaty of Babel module for hugo -ifiction.h babel ifiction header -ifiction.c babel ifiction api -level9.c Treaty of Babel module for level9 -magscrolls.c Magnetic Scrolls treaty module -makefile Provisional makefile -md5.c L. Peter Deutsch's md5 implementation -misc.c babel memory allocator -register.c babel module registry -register_ifiction.c babel module registry for ifiction API -tads.h Prototypes for tads2.c and tads3.c -tads.c Common functions for TADS modules -tads2.c Treaty of Babel module for tads2 -tads3.c Treaty of Babel module for tads3 -zcode.c Treaty of Babel module for zcode -README documentation -MANIFEST this file -extras/babel-cache.pl Perl demo of babel interaction -extras/babel-infocom.pl Special bundler for the infocom corpus -extras/babel-list.c Babel API demo -extras/babel-marry.pl Perl simple blorb encapsulator -extras/babel-wed.pl Perl single file blorb encapsulator -extras/hotload.c Dynamic loader replacement for register.c -extras/hotload.h Header file for hotload.c -extras/ifiction-aggregate.c Utility to combine multiple ifiction files -extras/ifiction-xtract.c Ifiction API demo -extras/simple-marry.c Simplified C version of babel-marry -babel-get/babel-get.c The babel-get application -babel-get/get_dir.c Directory source -babel-get/get_ifiction.c ifiction source -babel-get/get_story.c story file source -babel-get/get_url.c URL source -babel-get/makefile Makefile for babel-get diff --git a/babel/Makefile.am b/babel/Makefile.am deleted file mode 100644 index 1e0d78d..0000000 --- a/babel/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -noinst_LTLIBRARIES = libbabel.la libifiction.la libbabel_functions.la - -libbabel_la_SOURCES = babel_handler.c \ - register.c \ - misc.c \ - md5.c \ - zcode.c \ - magscrolls.c \ - blorb.c \ - glulx.c \ - hugo.c \ - agt.c \ - level9.c \ - executable.c \ - advsys.c \ - tads.c \ - tads2.c \ - tads3.c \ - adrift.c \ - alan.c \ - babel.h \ - babel_handler.h \ - md5.h \ - modules.h \ - tads.h \ - treaty_builder.h \ - treaty.h - -libifiction_la_SOURCES = ifiction.c ifiction.h \ - register_ifiction.c - -libbabel_functions_la_SOURCES = babel_story_functions.c \ - babel_ifiction_functions.c \ - babel_multi_functions.c - --include $(top_srcdir)/git.mk diff --git a/babel/README b/babel/README deleted file mode 100644 index b754cab..0000000 --- a/babel/README +++ /dev/null @@ -1,74 +0,0 @@ -Version 0.2b, Treaty of Babel Revision 7 -This is the source code for babel, the Treaty of Babel analysis tool. - -Most of this code is (c) 2006 by L. Ross Raszewski - -The following files are public domain: -zcode.c -glulx.c -executable.c -level9.c -magscrolls.c -agt.c -hugo.c -advsys.c -misc.c -alan.c -adrift.c -treaty.h -treaty_builder.h - -The following files are Copyright (C) 1999, 2000, 2002 Aladdin Enterprises: -md5.c -md5.h - -And are used in accordance with their licenses. - -All other files are (c) 2006 by L. Ross Raszewski and are released under -the Creative Commons Attribution2.5 License. - -To view a copy of this license, visit -http://creativecommons.org/licenses/by/2.5/ or send a letter to - -Creative Commons, -543 Howard Street, 5th Floor, -San Francisco, California, 94105, USA. - - -To build babel: - -1. compile all the source files in this directory -2. link them together -3. the end - -For folks who find makefiles more useful than generalizations, there is a -makefile provided for babel. The makefile is currently configured for -Borland's 32-bit C compiler. Comment out those lines and uncomment the block -which follows for gcc. - -To compile babel-get, first compile babel, then do the same thing in the -babel-get directory. - -To compile ifiction-aggregate, ifiction-xtract, babel-list, and simple-marry, -first compile babel, then compile the relevant C file in the extras/ directory -(These may rely on #include files from the babel directory, so, for example, -to compile ifiction-aggregate, "gcc -c -I.. ifiction-aggregate.c"), then link the -opbject file to the babel and ifiction libraries (babel.lib and ifiction.lib -under Windows, babel.a and ifiction.a most everywhere else. eg. -"gcc -o ifiction-aggregate ifiction-aggregate.o ../babel.a ../ifiction.a") - -Babel is intended to accept contributions in the form of treaty modules -as defined by the treaty of babel section 2.3.2. - -These modules should use the declarations made in treaty.h. -The file treaty_builder.h generates a generic framework which simplifies -the task of writing treaty modules. Its use is not required for treaty -compliance, but it should prove useful. - -Parts of babel are intended for use in other programs. When adapting -babel's source, the files babel.c, babel_story_functions.c and -babel_ifiction_functions.c will probably not prove useful. However, you -may wish to use babel_handler, which provides a framework for loading a -story file, selecting the proper treaty modules, and seamlessly handling -blorb-wrapped files. - diff --git a/babel/adrift.c b/babel/adrift.c deleted file mode 100644 index 3718d6a..0000000 --- a/babel/adrift.c +++ /dev/null @@ -1,89 +0,0 @@ -/* adrift.c Treaty of Babel module for Adrift files - * - * PROVISIONAL - Hold for someone else - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file - * may render it noncompliant with the Treaty of Babel - */ - -#define FORMAT adrift -#define HOME_PAGE "http://www.adrift.org.uk" -#define FORMAT_EXT ".taf" -#define NO_METADATA -#define NO_COVER - -#include "treaty_builder.h" - -#include -#include -#include - -/* VB RNG constants */ -#define VB_RAND1 0x43FD43FD -#define VB_RAND2 0x00C39EC3 -#define VB_RAND3 0x00FFFFFF -#define VB_INIT 0x00A09E86 -static int32 vbr_state; - -/* - Unobfuscates one byte from a taf file. This should be called on each byte - in order, as the ADRIFT obfuscation function is stately. - - The de-obfuscation algorithm works by xoring the byte with the next - byte in the sequence produced by the Visual Basic pseudorandom number - generator, which is simulated here. -*/ -static unsigned char taf_translate (unsigned char c) -{ - int32 r; - - vbr_state = (vbr_state*VB_RAND1+VB_RAND2) & VB_RAND3; - r=UCHAR_MAX * (unsigned) vbr_state; - r/=((unsigned) VB_RAND3)+1; - return r^c; -} - -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - int adv; - unsigned char buf[4]; - unsigned char *sf=(unsigned char *)story_file; - vbr_state=VB_INIT; - - if (extent <12) return INVALID_STORY_FILE_RV; - - buf[3]=0; - /* Burn the first 8 bytes of translation */ - for(adv=0;adv<8;adv++) taf_translate(0); - /* Bytes 8-11 contain the Adrift version number in the formay N.NN */ - buf[0]=taf_translate(sf[8]); - taf_translate(0); - buf[1]=taf_translate(sf[10]); - buf[2]=taf_translate(sf[11]); - adv=atoi((char *) buf); - ASSERT_OUTPUT_SIZE(12); - sprintf(output,"ADRIFT-%03d-",adv); - return INCOMPLETE_REPLY_RV; - -} - -/* The claim algorithm for ADRIFT is to unobfuscate the first - seven bytes, and check for the word "Version". - It seems fairly unlikely that the obfuscated form of that - word would occur in the wild -*/ -static int32 claim_story_file(void *story_file, int32 extent) -{ - unsigned char buf[8]; - int i; - unsigned char *sf=(unsigned char *)story_file; - buf[7]=0; - vbr_state=VB_INIT; - if (extent<12) return INVALID_STORY_FILE_RV; - for(i=0;i<7;i++) buf[i]=taf_translate(sf[i]); - if (strcmp((char *)buf,"Version")) return INVALID_STORY_FILE_RV; - return VALID_STORY_FILE_RV; - -} diff --git a/babel/advsys.c b/babel/advsys.c deleted file mode 100644 index e0e1cf8..0000000 --- a/babel/advsys.c +++ /dev/null @@ -1,49 +0,0 @@ -/* advsys.c Treaty of Babel module for AdvSys files - * 2006 By L. Ross Raszewski - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file - * may render it noncompliant with the Treaty of Babel - */ - -#define FORMAT advsys -#define HOME_PAGE "http://www.ifarchive.org/if-archive/programming/advsys/" -#define FORMAT_EXT ".dat" -#define NO_METADATA -#define NO_COVER - -#include "treaty_builder.h" -#include -#include - -/* IFIDs for AdvSys are formed by prepending ADVSYS- to the default - MD5 ifid -*/ -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - /* This line suppresses a warning from the borland compiler */ - if (story_file || extent) { } - ASSERT_OUTPUT_SIZE(8); - strcpy(output,"ADVSYS-"); - return INCOMPLETE_REPLY_RV; - -} - -/* The Advsys claim algorithm: bytes 2-8 of the file contain the - text "ADVSYS", unobfuscated in the following way: - 30 is added to each byte, then the bits are reversed -*/ -static int32 claim_story_file(void *story_file, int32 extent) -{ - char buf[7]; - int i; - if (extent >=8) - { - for(i=0;i<6;i++) - buf[i]=~(((char *)story_file)[i+2]+30); - buf[6]=0; - if (strcmp(buf,"ADVSYS")==0) return VALID_STORY_FILE_RV; - } - return INVALID_STORY_FILE_RV; -} diff --git a/babel/agt.c b/babel/agt.c deleted file mode 100644 index 66b6575..0000000 --- a/babel/agt.c +++ /dev/null @@ -1,59 +0,0 @@ -/* agt.c Treaty of Babel module for AGX-encapsulated AGT files - * 2006 By L. Ross Raszewski - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file - * may render it noncompliant with the Treaty of Babel - */ - -#define FORMAT agt -#define HOME_PAGE "http://www.ifarchive.org/indexes/if-archiveXprogrammingXagt" -#define FORMAT_EXT ".agx" -#define NO_METADATA -#define NO_COVER - -#include "treaty_builder.h" -#include -#include - - -static char AGX_MAGIC[4] = { 0x58, 0xC7, 0xC1, 0x51 }; - -/* Helper functions to unencode integers from AGT source */ -static int32 read_agt_short(unsigned char *sf) -{ - return sf[0] | (int32) sf[1]<<8; -} -static int32 read_agt_int(unsigned char *sf) -{ - return (read_agt_short(sf+2) << 16) | read_agt_short(sf); - -} - -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - int32 l, game_version, game_sig; - unsigned char *sf=(unsigned char *)story_file; - - /* Read the position of the game desciption block */ - l=read_agt_int(sf+32); - if (extent -#include - -static int32 read_alan_int(unsigned char *from) -{ - return ((unsigned long int) from[3])| ((unsigned long int)from[2] << 8) | - ((unsigned long int) from[1]<<16)| ((unsigned long int)from[0] << 24); -} -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - - if (story_file || extent) { } - ASSERT_OUTPUT_SIZE(6); - strcpy(output,"ALAN-"); - return INCOMPLETE_REPLY_RV; -} -/* - The claim algorithm for Alan files is: - * For Alan 3, check for the magic word - * load the file length in blocks - * check that the file length is correct - * For alan 2, each word between byte address 24 and 81 is a - word address within the file, so check that they're all within - the file - * Locate the checksum and verify that it is correct -*/ -static int32 claim_story_file(void *story_file, int32 extent) -{ - unsigned char *sf = (unsigned char *) story_file; - int32 bf, i, crc=0; - if (extent < 160) return INVALID_STORY_FILE_RV; - if (memcmp(sf,"ALAN",4)) - { /* Identify Alan 2.x */ - bf=read_alan_int(sf+4); - if (bf > extent/4) return INVALID_STORY_FILE_RV; - for (i=24;i<81;i+=4) - if (read_alan_int(sf+i) > extent/4) return INVALID_STORY_FILE_RV; - for (i=160;i<(bf*4);i++) - crc+=sf[i]; - if (crc!=read_alan_int(sf+152)) return INVALID_STORY_FILE_RV; - return VALID_STORY_FILE_RV; - } - else - { /* Identify Alan 3 */ - bf=read_alan_int(sf+12); - if (bf > (extent/4)) return INVALID_STORY_FILE_RV; - for (i=184;i<(bf*4);i++) - crc+=sf[i]; - if (crc!=read_alan_int(sf+176)) return INVALID_STORY_FILE_RV; - - } - return INVALID_STORY_FILE_RV; -} diff --git a/babel/babel b/babel/babel deleted file mode 100644 index 1808ec1bc5960ac816e4915b3e45ede75a440dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190177 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 F{{Xq35t;x1 diff --git a/babel/babel-makefile b/babel/babel-makefile deleted file mode 100644 index 1b31887..0000000 --- a/babel/babel-makefile +++ /dev/null @@ -1,75 +0,0 @@ -# provisional makefile for babel -# -# Note that to compile babel, it is necessary only to compile all the .c -# files in this distribution and link them. -# -# This makefile is provided purely as a convenience. -# -# The following targets are available: -# babel: make babel -# babel.lib: make babel handler library (for Borland) -# ifiction.lib: make babel ifiction library (for Borland) -# babel.a: make babel handler library (for gcc) -# ifiction.a: make babel ifiction library (for gcc) -# dist: make babel.zip, the babel source distribution -# -# Note that this is a GNU makefile, and may not work with other makes -# -# Comment/uncomment the following lines to make the program work - -#CC=bcc32 -#OBJ=.obj -#BABEL_LIB=babel.lib -#IFICTION_LIB=ifiction.lib -#BABEL_FLIB=babel_functions.lib -#OUTPUT_BABEL= - -CC=gcc -g -OBJ=.o -BABEL_LIB=babel.a -BABEL_FLIB=babel_functions.a -IFICTION_LIB=ifiction.a -OUTPUT_BABEL=-o babel - -treaty_objs = zcode${OBJ} magscrolls${OBJ} blorb${OBJ} glulx${OBJ} hugo${OBJ} agt${OBJ} level9${OBJ} executable${OBJ} advsys${OBJ} tads${OBJ} tads2${OBJ} tads3${OBJ} adrift${OBJ} alan${OBJ} -bh_objs = babel_handler${OBJ} register${OBJ} misc${OBJ} md5${OBJ} ${treaty_objs} -ifiction_objs = ifiction${OBJ} register_ifiction${OBJ} -babel_functions = babel_story_functions${OBJ} babel_ifiction_functions${OBJ} babel_multi_functions${OBJ} -babel_objs = babel${OBJ} $(BABEL_FLIB) $(IFICTION_LIB) $(BABEL_LIB) - -babel: ${babel_objs} - ${CC} ${OUTPUT_BABEL} ${babel_objs} - -%${OBJ} : %.c - ${CC} -c $^ - -register${OBJ}: modules.h - -babel.lib: ${foreach dep,${bh_objs},${dep}.bl} - -ifiction.lib: ${foreach dep,${ifiction_objs},${dep}.il} - -babel_functions.lib: ${foreach dep,${babel_functions},${dep}.fl} - -%.obj.bl: %.obj - tlib babel.lib +-$^ - echo made > $@ - -%.obj.il: %.obj - tlib ifiction.lib +-$^ - echo made > $@ -%.obj.fl: %.obj - tlib babel_functions.lib +-$^ - echo made > $@ - -babel.a: $(bh_objs) - ar -r babel.a $^ - -ifiction.a: $(ifiction_objs) - ar -r ifiction.a $^ - -babel_functions.a: $(babel_functions) - ar -r babel_functions.a $^ - -dist: - cut -c0-31 MANIFEST | zip babel.zip -@ diff --git a/babel/babel.a b/babel/babel.a deleted file mode 100644 index 142fb7837dd6341ad127245919ba6c8a894f50b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240954 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 Nox-KwI~6Ya{D1SDlPv%M diff --git a/babel/babel.c b/babel/babel.c deleted file mode 100644 index 5bb7213..0000000 --- a/babel/babel.c +++ /dev/null @@ -1,248 +0,0 @@ -/* babel.c The babel command line program - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon misc.c and babel.h - * - * This file exports one variable: char *rv, which points to the file name - * for an ifiction file. This is used only by babel_ifiction_verify - */ - -#include "babel.h" -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -int chdir(const char *); -char *getcwd(char *, int); -#ifdef __cplusplus -} -#endif - -char *fn; - -/* checked malloc function */ -void *my_malloc(int, char *); - -/* babel performs several fundamental operations, which are specified - by command-line objects. Each of these functions corresponds to - a story function (defined in babel_story_functions.c) or an - ifiction function (defined in babel_ifiction_functions.c) or both. - These are the types of those functions. -*/ - -typedef void (*story_function)(void); -typedef void (*ifiction_function)(char *); -typedef void (*multi_function)(char **, char *, int); -/* This structure tells babel what to do with its command line arguments. - if either of story or ifiction are NULL, babel considers this command line - option inappropriate for that type of file. -*/ -struct function_handler { - char *function; /* the textual command line option */ - story_function story; /* handler for story files */ - ifiction_function ifiction; /* handler for ifiction files */ - char *desc; /* Textual description for help text */ - }; - -struct multi_handler { - char *function; - char *argnames; - multi_function handler; - int nargsm; - int nargsx; - char *desc; - }; -/* This is an array of function_handler objects which specify the legal - arguments. It is terminated by a function_handler with a NULL function - */ -static struct function_handler functions[] = { - { "-ifid", babel_story_ifid, babel_ifiction_ifid, "Deduce IFID"}, - { "-format", babel_story_format, NULL, "Deduce story format" }, - { "-ifiction", babel_story_ifiction, NULL, "Extract iFiction file" }, - { "-meta", babel_story_meta, NULL, "Print story metadata" }, - { "-identify", babel_story_identify, NULL, "Describe story file" }, - { "-cover", babel_story_cover, NULL, "Extract cover art" }, - { "-story", babel_story_story, NULL, "Extract story file (ie. from a blorb)" }, - { "-verify", NULL, babel_ifiction_verify, "Verify integrity of iFiction file" }, - { "-lint", NULL, babel_ifiction_lint, "Verify style of iFiction file" }, - { "-fish", babel_story_fish, babel_ifiction_fish, "Extract all iFiction and cover art"}, - { "-unblorb", babel_story_unblorb, NULL, "As -fish, but also extract story files"}, - { NULL, NULL, NULL } - }; -static struct multi_handler multifuncs[] = { - { "-blorb", " []", babel_multi_blorb, 2, 3, "Bundle story file and (sparse) iFiction into blorb" }, - { "-blorbs", " []", babel_multi_blorb1, 2, 3, "Bundle story file and (sparse) iFiction into sensibly-named blorb" }, - { "-complete", " ", babel_multi_complete, 2, 2, "Create complete iFiction file from sparse iFiction" }, - { NULL, NULL, NULL, 0, 0, NULL } -}; - -int main(int argc, char **argv) -{ - char *todir="."; - char cwd[512]; - int ok=1,i, l, ll; - FILE *f; - char *md=NULL; - /* Set the input filename. Note that if this is invalid, babel should - abort before anyone notices - */ - fn=argv[2]; - - if (argc < 3) ok=0; - /* Detect the presence of the "-to " argument. - */ - if (ok && argc >=5 && strcmp(argv[argc-2], "-to")==0) - { - todir=argv[argc-1]; - argc-=2; - } - if (ok) for(i=0;multifuncs[i].function;i++) - if (strcmp(argv[1],multifuncs[i].function)==0 && - argc>= multifuncs[i].nargsm+2 && - argc <= multifuncs[i].nargsx+2) - { - - multifuncs[i].handler(argv+2, todir, argc-2); - exit(0); - } - - if (argc!=3) ok=0; - - /* Find the apropriate function_handler */ - if (ok) { - for(i=0;functions[i].function && strcmp(functions[i].function,argv[1]);i++); - if (!functions[i].function) ok=0; - else if (strcmp(fn,"-")) { - f=fopen(argv[2],"r"); - if (!f) ok=0; - } - } - - /* Print usage error if anything has gone wrong */ - if (!ok) - { - printf("%s: Treaty of Babel Analysis Tool (%s, %s)\n" - "Usage:\n", argv[0],BABEL_VERSION, TREATY_COMPLIANCE); - for(i=0;functions[i].function;i++) - { - if (functions[i].story) - printf(" babel %s \n",functions[i].function); - if (functions[i].ifiction) - printf(" babel %s \n",functions[i].function); - printf(" %s\n",functions[i].desc); - } - for(i=0;multifuncs[i].function;i++) - { - printf("babel %s %s\n %s\n", - multifuncs[i].function, - multifuncs[i].argnames, - multifuncs[i].desc); - } - - printf ("\nFor functions which extract files, add \"-to \" to the command\n" - "to set the output directory.\n" - "The input file can be specified as \"-\" to read from standard input\n" - "(This may only work for .iFiction files)\n"); - return 1; - } - - /* For story files, we end up reading the file in twice. This - is unfortunate, but unavoidable, since we want to be all - cross-platformy, so the first time we read it in, we - do the read in text mode, and the second time, we do it in binary - mode, and there are platforms where this makes a difference. - */ - ll=0; - if (strcmp(fn,"-")) - { - fseek(f,0,SEEK_END); - l=ftell(f)+1; - fseek(f,0,SEEK_SET); - md=(char *)my_malloc(l,"Input file buffer"); - fread(md,1,l-1,f); - md[l-1]=0; - } - else - while(!feof(stdin)) - { - char *tt, mdb[1024]; - int ii; - ii=fread(mdb,1,1024,stdin); - tt=(char *)my_malloc(ll+ii,"file buffer"); - if (md) { memcpy(tt,md,ll); free(md); } - memcpy(tt+ll,mdb,ii); - md=tt; - ll+=ii; - if (ii<1024) break; - } - - - if (strstr(md,""); - if (pp) *(pp+10)=0; - getcwd(cwd,512); - chdir(todir); - l=0; - if (functions[i].ifiction) - functions[i].ifiction(md); - else - fprintf(stderr,"Error: option %s is not valid for iFiction files\n", - argv[1]); - chdir(cwd); - } - - if (strcmp(fn,"-")) - { - free(md); - fclose(f); - } - if (l) - { /* Appears to be a story */ - char *lt; - if (functions[i].story) - { - if (strcmp(fn,"-")) lt=babel_init(argv[2]); - else { lt=babel_init_raw(md,ll); - free(md); - } - - if (lt) - { - getcwd(cwd,512); - chdir(todir); - if (!babel_get_authoritative() && strcmp(argv[1],"-format")) - printf("Warning: Story format could not be positively identified. Guessing %s\n",lt); - functions[i].story(); - - chdir(cwd); - } - else if (strcmp(argv[1],"-ifid")==0) /* IFID is calculable for all files */ - { - babel_md5_ifid(cwd,512); - printf("IFID: %s\n",cwd); - } - else - fprintf(stderr,"Error: Did not recognize format of story file\n"); - babel_release(); - } - else - fprintf(stderr,"Error: option %s is not valid for story files\n", - argv[1]); - } - - return 0; -} diff --git a/babel/babel.h b/babel/babel.h deleted file mode 100644 index 4108e3d..0000000 --- a/babel/babel.h +++ /dev/null @@ -1,56 +0,0 @@ -/* babel.h declarations for babel - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon treaty.h, babel_ifiction_functions.c, - * babel_story_functions.c, and babel_handler.c - * - */ - -#define BABEL_VERSION "0.2b" - -#include "treaty.h" -#include "babel_handler.h" -#include "ifiction.h" -/* Functions from babel_story_functions.c - * - * Each of these assumes that the story file has been loaded by babel_handler - * - * Each function babel_story_XXXX coresponds to the command line option -XXXX - */ -void babel_story_ifid(void); -void babel_story_cover(void); -void babel_story_ifiction(void); -void babel_story_meta(void); -void babel_story_fish(void); -void babel_story_format(void); -void babel_story_identify(void); -void babel_story_story(void); -void babel_story_unblorb(void); -/* Functions from babel_ifiction_functions.c - * - * as with babel_story_XXXX, but for metadata, which is handed in as the - * C string parameter - */ -void babel_ifiction_ifid(char *); -void babel_ifiction_verify(char *); -void babel_ifiction_fish(char *); -void babel_ifiction_lint(char *); - -/* Functions from babel_multi_functions.c - * - */ -void babel_multi_blorb(char **, char * , int); -void babel_multi_blorb1(char **, char * , int); -void babel_multi_complete(char **, char *, int); - -/* uncomment this line on platforms which limit extensions to 3 characters */ -/* #define THREE_LETTER_EXTENSIONS */ diff --git a/babel/babel_functions.a b/babel/babel_functions.a deleted file mode 100644 index ea8a1f67a8796a1915b554240306b16b6ccc40b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64180 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 N99+iXQ3scP|G!pOYBB%- diff --git a/babel/babel_handler.c b/babel/babel_handler.c deleted file mode 100644 index f7afb78..0000000 --- a/babel/babel_handler.c +++ /dev/null @@ -1,366 +0,0 @@ -/* babel_handler.c dispatches Treaty of Babel queries to the treaty modules - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon register.c, misc.c, babel.h, and treaty.h - * and L. Peter Deutsch's md5.c - * usage: - * char *babel_init(char *filename) - * Initializes babel to use the specified file. MUST be called before - * babel_treaty. Returns the human-readable name of the format - * or NULL if the format is not known. Do not call babel_treaty unless - * babel_init returned a nonzero value. - * The returned string will be the name of a babel format, possibly - * prefixed by "blorbed " to indicate that babel will process this file - * as a blorb. - * int32 babel_treaty(int32 selector, void *output, void *output_extent) - * Dispatches the call to the treaty handler for the currently loaded - * file. - * When processing a blorb, all treaty calls will be deflected to the - * special blorb handler. For the case of GET_STORY_FILE_IFID_SEL, - * The treaty handler for the underlying format will be called if an - * IFID is not found in the blorb resources. - * void babel_release() - * Frees all resources allocated during babel_init. - * You should do this even if babel_init returned NULL. - * After this is called, do not call babel_treaty until after - * another successful call to babel_init. - * char *babel_get_format() - * Returns the same value as the last call to babel_init (ie, the format name) - * int32 babel_md5_ifid(char *buffer, int extent); - * Generates an MD5 IFID from the loaded story. Returns zero if something - * went seriously wrong. - * - * If you wish to use babel in multiple threads, you must use the contextualized - * versions of the above functions. - * Each function above has a companion function whose name ends in _ctx (eg. - * "babel_treaty_ctx") which takes one additional argument. This argument is - * the babel context. A new context is returned by void *ctx=get_babel_ctx(), - * and should be released when finished by calling release_babel_ctx(ctx); - */ - - -#include "treaty.h" -#include -#include -#include -#include -#include "md5.h" - -void *my_malloc(int, char *); - -struct babel_handler -{ - TREATY treaty_handler; - TREATY treaty_backup; - void *story_file; - int32 story_file_extent; - void *story_file_blorbed; - int32 story_file_blorbed_extent; - char blorb_mode; - char *format_name; - char auth; -}; - -static struct babel_handler default_ctx; - -extern TREATY treaty_registry[]; -extern TREATY container_registry[]; - -static char *deeper_babel_init(char *story_name, void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - int i; - char *ext; - - static char buffer[TREATY_MINIMUM_EXTENT]; - int best_candidate; - char buffert[TREATY_MINIMUM_EXTENT]; - - if (story_name) - { - ext=strrchr(story_name,'.'); - if (ext) for(i=0;ext[i];i++) ext[i]=tolower(ext[i]); - } - else ext=NULL; - best_candidate=-1; - if (ext) /* pass 1: try best candidates */ - for(i=0;container_registry[i];i++) - if (container_registry[i](GET_FILE_EXTENSIONS_SEL,NULL,0,buffer,TREATY_MINIMUM_EXTENT) >=0 && - strstr(buffer,ext) && - container_registry[i](CLAIM_STORY_FILE_SEL,bh->story_file,bh->story_file_extent,NULL,0)>=NO_REPLY_RV) - break; - if (!ext || !container_registry[i]) /* pass 2: try all candidates */ - { - - for(i=0;container_registry[i];i++) - {int l=container_registry[i](CLAIM_STORY_FILE_SEL,bh->story_file,bh->story_file_extent,NULL,0); - - if (l==VALID_STORY_FILE_RV) - break; - else if (l==NO_REPLY_RV && best_candidate < 0) best_candidate=i; - } -} - if (!container_registry[i] && best_candidate >=0) { bh->auth=0; i=best_candidate; } - if (container_registry[i]) - { - char buffer2[TREATY_MINIMUM_EXTENT]; - - bh->treaty_handler=container_registry[i]; - container_registry[i](GET_FORMAT_NAME_SEL,NULL,0,buffert,TREATY_MINIMUM_EXTENT); - bh->blorb_mode=1; - - bh->story_file_blorbed_extent=container_registry[i](CONTAINER_GET_STORY_EXTENT_SEL,bh->story_file,bh->story_file_extent,NULL,0); - if (bh->story_file_blorbed_extent>0) bh->story_file_blorbed=my_malloc(bh->story_file_blorbed_extent, "contained story file"); - if (bh->story_file_blorbed_extent<=0 || - container_registry[i](CONTAINER_GET_STORY_FORMAT_SEL,bh->story_file,bh->story_file_extent,buffer2,TREATY_MINIMUM_EXTENT)<0 || - container_registry[i](CONTAINER_GET_STORY_FILE_SEL,bh->story_file,bh->story_file_extent,bh->story_file_blorbed,bh->story_file_blorbed_extent)<=0 - ) - return NULL; - - for(i=0;treaty_registry[i];i++) - if (treaty_registry[i](GET_FORMAT_NAME_SEL,NULL,0,buffer,TREATY_MINIMUM_EXTENT)>=0 && - strcmp(buffer,buffer2)==0 && - treaty_registry[i](CLAIM_STORY_FILE_SEL,bh->story_file_blorbed,bh->story_file_blorbed_extent,NULL,0)>=NO_REPLY_RV) - break; - if (!treaty_registry[i]) - return NULL; - bh->treaty_backup=treaty_registry[i]; - sprintf(buffer,"%sed %s",buffert,buffer2); - return buffer; - } - - bh->blorb_mode=0; - best_candidate=-1; - - if (ext) /* pass 1: try best candidates */ - for(i=0;treaty_registry[i];i++) - if (treaty_registry[i](GET_FILE_EXTENSIONS_SEL,NULL,0,buffer,TREATY_MINIMUM_EXTENT) >=0 && - strstr(buffer,ext) && - treaty_registry[i](CLAIM_STORY_FILE_SEL,bh->story_file,bh->story_file_extent,NULL,0)>=NO_REPLY_RV) - break; - if (!ext || !treaty_registry[i]) /* pass 2: try all candidates */ - { - - for(i=0;treaty_registry[i];i++) - {int l; - l=treaty_registry[i](CLAIM_STORY_FILE_SEL,bh->story_file,bh->story_file_extent,NULL,0); - - if (l==VALID_STORY_FILE_RV) - break; - else if (l==NO_REPLY_RV && best_candidate < 0) best_candidate=i; - } - } - if (!treaty_registry[i]) - if (best_candidate>0) { i=best_candidate; bh->auth=0; } - else return NULL; - bh->treaty_handler=treaty_registry[i]; - - if (bh->treaty_handler(GET_FORMAT_NAME_SEL,NULL,0,buffer,TREATY_MINIMUM_EXTENT)>=0) - return buffer; - return NULL; - - -} - -static char *deep_babel_init(char *story_name, void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - FILE *file; - - bh->treaty_handler=NULL; - bh->treaty_backup=NULL; - bh->story_file=NULL; - bh->story_file_extent=0; - bh->story_file_blorbed=NULL; - bh->story_file_blorbed_extent=0; - bh->format_name=NULL; - file=fopen(story_name, "rb"); - if (!file) return NULL; - fseek(file,0,SEEK_END); - bh->story_file_extent=ftell(file); - fseek(file,0,SEEK_SET); - bh->auth=1; - bh->story_file=my_malloc(bh->story_file_extent,"story file storage"); - fread(bh->story_file,1,bh->story_file_extent,file); - fclose(file); - - return deeper_babel_init(story_name, bhp); -} - -char *babel_init_ctx(char *sf, void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - char *b; - b=deep_babel_init(sf,bh); - if (b) bh->format_name=strdup(b); - return b; -} -char *babel_init(char *sf) -{ - return babel_init_ctx(sf, &default_ctx); -} - -char *babel_init_raw_ctx(void *sf, int32 extent, void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - char *b; - bh->treaty_handler=NULL; - bh->treaty_backup=NULL; - bh->story_file=NULL; - bh->story_file_extent=0; - bh->story_file_blorbed=NULL; - bh->story_file_blorbed_extent=0; - bh->format_name=NULL; - bh->story_file_extent=extent; - bh->auth=1; - bh->story_file=my_malloc(bh->story_file_extent,"story file storage"); - memcpy(bh->story_file,sf,extent); - - b=deeper_babel_init(NULL, bhp); - if (b) bh->format_name=strdup(b); - return b; -} -char *babel_init_raw(void *sf, int32 extent) -{ - return babel_init_raw_ctx(sf, extent, &default_ctx); -} - -void babel_release_ctx(void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - if (bh->story_file) free(bh->story_file); - bh->story_file=NULL; - if (bh->story_file_blorbed) free(bh->story_file_blorbed); - bh->story_file_blorbed=NULL; - if (bh->format_name) free(bh->format_name); - bh->format_name=NULL; -} -void babel_release() -{ - babel_release_ctx(&default_ctx); -} -int32 babel_md5_ifid_ctx(char *buffer, int32 extent, void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - md5_state_t md5; - int i; - unsigned char ob[16]; - if (extent <33 || bh->story_file==NULL) - return 0; - md5_init(&md5); - md5_append(&md5,bh->story_file,bh->story_file_extent); - md5_finish(&md5,ob); - for(i=0;i<16;i++) - sprintf(buffer+(2*i),"%02X",ob[i]); - buffer[32]=0; - return 1; - -} -int32 babel_md5_ifid(char *buffer, int32 extent) -{ - return babel_md5_ifid_ctx(buffer, extent, - &default_ctx); -} - -int32 babel_treaty_ctx(int32 sel, void *output, int32 output_extent,void *bhp) -{ - int32 rv; - struct babel_handler *bh=(struct babel_handler *) bhp; - if (!(sel & TREATY_SELECTOR_INPUT) && bh->blorb_mode) - rv=bh->treaty_backup(sel,bh->story_file_blorbed,bh->story_file_blorbed_extent,output, output_extent); - else - { - rv=bh->treaty_handler(sel,bh->story_file,bh->story_file_extent,output,output_extent); - if ((!rv|| rv==UNAVAILABLE_RV) && bh->blorb_mode) - rv=bh->treaty_backup(sel,bh->story_file_blorbed,bh->story_file_blorbed_extent,output, output_extent); - } - if (!rv && sel==GET_STORY_FILE_IFID_SEL) - return babel_md5_ifid_ctx(output,output_extent, bh); - if (rv==INCOMPLETE_REPLY_RV && sel==GET_STORY_FILE_IFID_SEL) - return babel_md5_ifid_ctx((void *)((char *) output+strlen((char *)output)), - output_extent-strlen((char *)output), - bh); - - return rv; -} -int32 babel_treaty(int32 sel, void *output, int32 output_extent) -{ - return babel_treaty_ctx(sel, output, output_extent, &default_ctx); -} -char *babel_get_format_ctx(void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - return bh->format_name; -} -char *babel_get_format() -{ - return babel_get_format_ctx(&default_ctx); -} -void *get_babel_ctx() -{ - return my_malloc(sizeof(struct babel_handler), "babel handler context"); -} -void release_babel_ctx(void *b) -{ - free(b); -} - -int32 babel_get_length_ctx(void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - return bh->story_file_extent; -} -int32 babel_get_length() -{ - return babel_get_length_ctx(&default_ctx); -} - -int32 babel_get_authoritative_ctx(void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - return bh->auth; -} -int32 babel_get_authoritative() -{ - return babel_get_authoritative_ctx(&default_ctx); -} -void *babel_get_file_ctx(void *bhp) -{ - struct babel_handler *bh=(struct babel_handler *) bhp; - return bh->story_file; -} -void *babel_get_file() -{ - return babel_get_file_ctx(&default_ctx); -} - -int32 babel_get_story_length_ctx(void *ctx) -{ - struct babel_handler *bh=(struct babel_handler *) ctx; - if (bh->blorb_mode) return bh->story_file_blorbed_extent; - return bh->story_file_extent; -} -int32 babel_get_story_length() -{ - - return babel_get_story_length_ctx(&default_ctx); -} -void *babel_get_story_file_ctx(void *ctx) -{ - struct babel_handler *bh=(struct babel_handler *) ctx; - if (bh->blorb_mode) return bh->story_file_blorbed; - return bh->story_file; -} -void *babel_get_story_file() -{ - return babel_get_story_file_ctx(&default_ctx); -} diff --git a/babel/babel_handler.h b/babel/babel_handler.h deleted file mode 100644 index a01194a..0000000 --- a/babel/babel_handler.h +++ /dev/null @@ -1,65 +0,0 @@ -/* babel_handler.h declarations for the babel handler API - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - */ - -#ifndef BABEL_HANDLER_H -#define BABEL_HANDLER_H - -#include "treaty.h" - -/* Functions from babel_handler.c */ -char *babel_init(char *filename); - /* initialize the babel handler */ -char *babel_init_raw(void *sf, int32 extent); - /* Initialize from loaded data */ -int32 babel_treaty(int32 selector, void *output, int32 output_extent); - /* Dispatch treaty calls */ -void babel_release(void); - /* Release babel_handler resources */ -char *babel_get_format(void); - /* return the format of the loaded file */ -int32 babel_md5_ifid(char *buffer, int32 extent); - /* IFID generator of last resort */ -int32 babel_get_length(void); - /* Fetch file length */ -int32 babel_get_story_length(void); - /* Fetch file length */ -int32 babel_get_authoritative(void); - /* Determine if babel handler has a good grasp on the format */ -void *babel_get_file(void); - /* Get loaded story file */ -void *babel_get_story_file(void); - /* Get loaded story file */ - -/* threadsafe versions of above */ -char *babel_init_ctx(char *filename, void *); - /* initialize the babel handler */ -int32 babel_treaty_ctx(int32 selector, void *output, int32 output_extent, void *); - /* Dispatch treaty calls */ -void babel_release_ctx(void *); - /* Release babel_handler resources */ -char *babel_get_format_ctx(void *); - /* return the format of the loaded file */ -int32 babel_md5_ifid_ctx(char *buffer, int extent, void *); - /* IFID generator of last resort */ -int32 babel_get_length_ctx(void *); -int32 babel_get_story_length_ctx(void *); -void *babel_get_file_ctx(void *bhp); -void *babel_get_story_ctx(void *bhp); -int32 babel_get_authoritative_ctx(void *bhp); -char *babel_init_raw_ctx(void *sf, int32 extent, void *bhp); -void *get_babel_ctx(void); -void release_babel_ctx(void *); - /* get and release babel contexts */ - -#endif diff --git a/babel/babel_ifiction_functions.c b/babel/babel_ifiction_functions.c deleted file mode 100644 index e59adf6..0000000 --- a/babel/babel_ifiction_functions.c +++ /dev/null @@ -1,168 +0,0 @@ -/* babel_ifiction_functions.c babel top-level operations for ifiction - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon babel.c (for rv), babel.h, misc.c and ifiction.c - */ - -#include "babel.h" -#include -#include -#include -#include - -#ifndef THREE_LETTER_EXTENSIONS -#define IFICTION_EXT ".iFiction" -#else -#define IFICTION_EXT ".ifi" -#endif - -void *my_malloc(int, char *); - -struct IFiction_Info -{ - char ifid[256]; - int wmode; -}; - -static void write_story_to_disk(struct XMLTag *xtg, void *ctx) -{ - char *b, *ep; - char *begin, *end; - char buffer[TREATY_MINIMUM_EXTENT]; - int32 l, j; - if (ctx) { } - - if (strcmp(xtg->tag,"story")==0) - { - begin=xtg->begin; - end=xtg->end; - l=end-begin+1; - b=(char *)my_malloc(l,"XML buffer"); - memcpy(b,begin,l-1); - b[l]=0; - j=ifiction_get_IFID(b,buffer,TREATY_MINIMUM_EXTENT); - if (!j) - { - fprintf(stderr,"No IFID found for this story\n"); - free(b); - return; - } - ep=strtok(buffer,","); - while(ep) - { - char buf2[256]; - FILE *f; - sprintf(buf2,"%s%s",ep,IFICTION_EXT); - f=fopen(buf2,"w"); - - if (!f || - fputs("\n" - "" - "\n" - " ", - f)==EOF || - fputs(b,f)==EOF || - fputs("/\n\n",f)==EOF - ) - { - fprintf(stderr,"Error writing to file %s\n",buf2); - } else - printf("Extracted %s\n",buf2); - if (f) fclose(f); - - ep=strtok(NULL,","); - } - - free(b); - } -} - -void babel_ifiction_ifid(char *md) -{ - char output[TREATY_MINIMUM_EXTENT]; - int i; - char *ep; - i=ifiction_get_IFID(md,output,TREATY_MINIMUM_EXTENT); - if (!i) - - { - fprintf(stderr,"Error: No IFIDs found in iFiction file\n"); - return; - } - ep=strtok(output,","); - while(ep) - { - printf("IFID: %s\n",ep); - ep=strtok(NULL,","); - } - -} - -static char isok; - -static void examine_tag(struct XMLTag *xtg, void *ctx) -{ - struct IFiction_Info *xti=(struct IFiction_Info *)ctx; - - if (strcmp("ifid",xtg->tag)==0 && strcmp(xti->ifid,"UNKNOWN")==0) - { - memcpy(xti->ifid,xtg->begin,xtg->end-xtg->begin); - xti->ifid[xtg->end-xtg->begin]=0; - } - -} -static void verify_eh(char *e, void *ctx) -{ - if (*((int *)ctx) < 0) return; - if (*((int *)ctx) || strncmp(e,"Warning",7)) - { isok=0; - fprintf(stderr, "%s\n",e); - } -} - - - -void babel_ifiction_fish(char *md) -{ - int i=-1; - ifiction_parse(md,write_story_to_disk,NULL,verify_eh,&i); -} - -void deep_ifiction_verify(char *md, int f) -{ - struct IFiction_Info ii; - int i=0; - ii.wmode=0; - isok=1; - strcpy(ii.ifid,"UNKNOWN"); - ifiction_parse(md,examine_tag,&ii,verify_eh,&i); - if (f&& isok) printf("Verified %s\n",ii.ifid); -} -void babel_ifiction_verify(char *md) -{ - deep_ifiction_verify(md,1); - -} - - -void babel_ifiction_lint(char *md) -{ - struct IFiction_Info ii; - int i=1; - ii.wmode=1; - isok=1; - strcpy(ii.ifid,"UNKNOWN"); - ifiction_parse(md,examine_tag,&ii,verify_eh,&i); - if (isok) printf("%s conforms to iFiction style guidelines\n",ii.ifid); -} - - diff --git a/babel/babel_multi_functions.c b/babel/babel_multi_functions.c deleted file mode 100644 index cd867c6..0000000 --- a/babel/babel_multi_functions.c +++ /dev/null @@ -1,312 +0,0 @@ -#include "babel.h" - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -int chdir(const char *); -char *getcwd(char *, int); -#ifdef __cplusplus -} -#endif - -void deep_ifiction_verify(char *md, int f); -void * my_malloc(int32, char *); -char *blorb_chunk_for_name(char *name); -#ifndef THREE_LETTER_EXTENSIONS -static char *ext_table[] = { "zcode", ".zblorb", - "glulx", ".gblorb", - NULL, NULL - }; -#else -static char *ext_table[] = { "zcode", ".zlb", - "glulx", ".glb", - NULL, NULL - }; - -#endif -char *blorb_ext_for_name(char *fmt) -{ - int i; - for(i=0;ext_table[i];i+=2) - if (strcmp(ext_table[i],fmt)==0) return ext_table[i+1]; -#ifndef THREE_LETTER_EXTENSIONS - return ".blorb"; -#else - return ".blb"; -#endif -} - -char *deep_complete_ifiction(char *fn, char *ifid, char *format) -{ - FILE *f; - int32 i; - char *md; - char *id, *idp; - char *idb; - f=fopen(fn,"r"); - if (!f) { fprintf(stderr,"Error: Can not open file %s\n",fn); - return NULL; - } - fseek(f,0,SEEK_END); - i=ftell(f); - fseek(f,0,SEEK_SET); - md=(char *) my_malloc(i+1,"Metadata buffer"); - fread(md,1,i,f); - md[i]=0; - id=strstr(md,""); - if (id) *(id+10)=0; - fclose(f); - id=strdup(ifid); - idp=strtok(id,","); - /* Find the identification chunk */ - { - char *bp, *ep; - bp=strstr(md,""); - if (!bp) - { - idb=(char *)my_malloc(TREATY_MINIMUM_EXTENT+128,"ident buffer"); - sprintf(idb,"%s\n", format); - } - else - { - int ii; - ep=strstr(bp,""); - idb=(char *)my_malloc(TREATY_MINIMUM_EXTENT+128+(ep-bp),"ident buffer"); - for(ii=16;bp+ii"); - if (bp) - if (memcmp(bp+8,format,strlen(format))) - fprintf(stderr,"Error: Format in sparse .iFiction does not match story\n"); - - } - - } - /* Insert the new ifids */ - while(idp) - { - char bfr[TREATY_MINIMUM_EXTENT]; - sprintf(bfr,"%s",idp); - if (!strstr(idb,bfr)) { strcat(idb,bfr); strcat(idb,"\n"); } - idp=strtok(NULL,","); - - } - free(id); - idp=(char *) my_malloc(strlen(md)+strlen(idb)+64, "Output metadata"); -/* printf("%d bytes for metadata\n",strlen(md)+strlen(idb)+64);*/ - id=strstr(md,""); - id[0]=0; - id+=7; - strcpy(idp,md); - strcat(idp,"\n \n"); - strcat(idp,idb); - free(idb); - strcat(idp," \n"); - strcat(idp,id); - free(md); - md=idp; - deep_ifiction_verify(md, 0); - return md; -} - -void write_int(int32 i, FILE *f) -{ - char bf[4]; - bf[0]=(((unsigned) i) >> 24) & 0xFF; - bf[1]=(((unsigned) i) >> 16) & 0xFF; - bf[2]=(((unsigned) i) >> 8) & 0xFF; - bf[3]=(((unsigned) i)) & 0xFF; - fwrite(bf,1,4,f); -} -static void _babel_multi_blorb(char *outfile, char **args, char *todir , int argc) -{ - int32 total, storyl, coverl, i; - char buffer[TREATY_MINIMUM_EXTENT+10]; - char b2[TREATY_MINIMUM_EXTENT]; - - char cwd[512]; - char *cover, *md, *cvrf, *ep; - - FILE *f, *c; - if (argc!=2 && argc !=3) - { - fprintf(stderr,"Invalid usage\n"); - return; - } - if (!babel_init(args[0])) - { - fprintf(stderr,"Error: Could not determine the format of file %s\n",args[0]); - return; - } - if (babel_treaty(GET_STORY_FILE_IFID_SEL,buffer,TREATY_MINIMUM_EXTENT)<=0 || - babel_treaty(GET_FORMAT_NAME_SEL,b2,TREATY_MINIMUM_EXTENT)<0 - ) - { - fprintf(stderr,"Error: Could not deduce an IFID for file %s\n",args[0]); - return; - } - if (babel_get_length() != babel_get_story_length()) - { - fprintf(stderr,"Warning: Story file will be extacted from container before blorbing\n"); - } -/* printf("Completing ifiction\n");*/ - md=deep_complete_ifiction(args[1],buffer,b2); -/* printf("Ifiction is %d bytes long\n",strlen(md));*/ - ep=strchr(buffer,','); - if (ep) *ep=0; - if (outfile) - strcpy(buffer,outfile); - strcat(buffer,blorb_ext_for_name(b2)); - getcwd(cwd,512); - chdir(todir); - f=fopen(buffer,"wb"); - chdir(cwd); - if (!f) - { - fprintf(stderr,"Error: Error writing to file %s\n",buffer); - return; - } - storyl=babel_get_story_length(); - total=storyl + (storyl%2) + 36; - if (md) total+=8+strlen(md)+strlen(md)%2; - if (argc==3) - { - c=fopen(args[2],"rb"); - if (c) - { - fseek(c,0,SEEK_END); - coverl=ftell(c); - if (coverl > 5){ - - cover=(char *) my_malloc(coverl+2,"Cover art buffer"); - fseek(c,0,SEEK_SET); - fread(cover,1,coverl,c); - if (memcmp(cover+1,"PNG",3)==0) cvrf="PNG "; - else cvrf="JPEG"; - total += 32+coverl + (coverl%2); - } - else argc=2; - fclose(c); - } - else argc=2; - } -/* printf("Writing header\n;");*/ - fwrite("FORM",1,4,f); - write_int(total,f); -/* printf("Writing index\n;");*/ - fwrite("IFRSRIdx",1,8,f); - write_int(argc==3 ? 28:16,f); - write_int(argc==3 ? 2:1,f); -/* printf("Writing story\n;");*/ - fwrite("Exec", 1,4,f); - write_int(0,f); - write_int(argc==3 ? 48:36,f); - if (argc==3) - { -/* printf("Writing image\n;"); */ - fwrite("Pict", 1,4,f); - write_int(1,f); - write_int(56+storyl+(storyl%2),f); - } -/* printf("Invoking chunk for name %s\n",b2); */ - fwrite(blorb_chunk_for_name(b2),1,4,f); - write_int(storyl,f); -/* printf("Writing story data\n"); */ - fwrite(babel_get_story_file(),1,storyl,f); - if (storyl%2) fwrite("\0",1,1,f); - if (argc==3) - { -/* printf("Writing cover data header %s\n",cvrf); */ - fwrite(cvrf,1,4,f); -/* printf("Writing cover data size %d\n",coverl); */ - write_int(coverl,f); -/* printf("Writing cover data\n"); */ - fwrite(cover,1,coverl,f); - if (coverl%2) fwrite("\0",1,1,f); -/* printf("Done with cover\n");*/ -/* free(cover);*/ -/* printf("Writing frontispiece\n;");*/ - fwrite("Fspc\0\0\0\004\0\0\0\001",1,12,f); - } - - if (md) { -/* printf("Writing metadata\n;");*/ - fwrite("IFmd",1,4,f); - write_int(strlen(md),f); - fwrite(md,1,strlen(md),f); - if (strlen(md)%2) - fwrite("\0",1,1,f); - free(md); - } - - fclose(f); - printf("Created %s\n",buffer); - -} -void babel_multi_complete(char **args, char *todir, int argc) -{ - char buffer[TREATY_MINIMUM_EXTENT+10]; - char b2[TREATY_MINIMUM_EXTENT]; - char cwd[512]; - char *ep, *md; - FILE *f; - if (argc!=2) - { - fprintf(stderr,"Invalid usage\n"); - return; - } - if (!babel_init(args[0])) - { - fprintf(stderr,"Error: Could not determine the format of file %s\n",args[0]); - return; - } - if (babel_treaty(GET_STORY_FILE_IFID_SEL,buffer,TREATY_MINIMUM_EXTENT)<=0 - || babel_treaty(GET_FORMAT_NAME_SEL,b2,TREATY_MINIMUM_EXTENT)<0) - { - fprintf(stderr,"Error: Could not deduce an IFID for file %s\n",args[0]); - return; - } - md=deep_complete_ifiction(args[1],buffer, b2); - if (!md) return; - ep=strchr(buffer,','); - if (ep) *ep=0; - strcat(buffer,".iFiction"); - getcwd(cwd,512); - chdir(todir); - f=fopen(buffer,"w"); - chdir(cwd); - if (!f || !fputs(md,f)) - { - fprintf(stderr,"Error: Error writing to file %s\n",buffer); - return; - } - fclose(f); - free(md); - printf("Created %s\n",buffer); -} -void babel_multi_blorb(char **args, char *todir , int argc) -{ - _babel_multi_blorb(NULL,args,todir,argc); -} -void babel_multi_blorb1(char **args, char *todir , int argc) -{ - char *buf; - char *bb; - buf=(char *)my_malloc(strlen(args[0])+1,"blorb name buffer"); - strcpy(buf,args[0]); - bb=strrchr(buf,'.'); - if (bb) *bb=0; - _babel_multi_blorb(buf,args,todir,argc); - free(buf); - - -} diff --git a/babel/babel_story_functions.c b/babel/babel_story_functions.c deleted file mode 100644 index b1cf0e9..0000000 --- a/babel/babel_story_functions.c +++ /dev/null @@ -1,411 +0,0 @@ -/* babel_story_functions.c babel top-level operations for story files - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon babel_handler.c, babel.h, and misc.c - */ - -#include "babel.h" -#include -#include -#include - -#ifndef THREE_LETTER_EXTENSIONS -#define IFICTION_EXT ".iFiction" -#else -#define IFICTION_EXT ".ifi" -#endif -void *my_malloc(int32, char *); - -void babel_story_ifid() -{ - char buffer[TREATY_MINIMUM_EXTENT]; - char *ep; - int i; - i=babel_treaty(GET_STORY_FILE_IFID_SEL,buffer,TREATY_MINIMUM_EXTENT); - ep=strtok(buffer, ","); - while(ep) - { - printf("IFID: %s\n",ep); - ep=strtok(NULL,","); - } - if (!i) - fprintf(stderr,"Unable to create an IFID (A serious problem occurred while loading the file).\n"); - -} - - -void babel_story_format() -{ - char *b; - b=babel_get_format(); - if (!b) b="unknown"; - if (!babel_get_authoritative()) - printf("Format: %s (non-authoritative)\n",b); - else printf("Format: %s\n",b); -} - -static void deep_babel_ifiction(char stopped) -{ - char buffer[TREATY_MINIMUM_EXTENT]; - char *md; - char *ep; - int32 i; - FILE *f; - - if (stopped!=2) - { - i=babel_treaty(GET_STORY_FILE_IFID_SEL,buffer,TREATY_MINIMUM_EXTENT); - if (i==0 && !babel_md5_ifid(buffer, TREATY_MINIMUM_EXTENT)) - { - fprintf(stderr,"Unable to create an IFID (A serious problem occurred while loading the file).\n"); - return; - } - - - ep=strtok(buffer, ","); - } - else ep="-"; - i=babel_treaty(GET_STORY_FILE_METADATA_EXTENT_SEL,NULL,0); - if (i<=0) - { - if (stopped) printf("No iFiction record for %s\n",buffer); - return; - } - md=(char *)my_malloc(i,"Metadata buffer"); - if (babel_treaty(GET_STORY_FILE_METADATA_SEL,md,i)<0) - { - fprintf(stderr,"A serious error occurred while retrieving metadata.\n"); - free(md); - return; - } - while(ep) - { - char epb[TREATY_MINIMUM_EXTENT+9]; - if (stopped!=2) - { - strcpy(epb,ep); - strcat(epb, IFICTION_EXT); - - f=fopen(epb,"w"); - } - else f=stdout; - - if (!f || fputs(md,f)==EOF) - fprintf(stderr,"A serious error occurred writing to disk.\n"); - else if (stopped!=2) printf("Extracted %s\n",epb); - if (f) fclose(f); - if (stopped) break; - ep=strtok(NULL,","); - } - free(md); -} - -void babel_story_ifiction() -{ - deep_babel_ifiction(1); -} -static char *get_jpeg_dim(void *img, int32 extent) -{ - unsigned char *dp=(unsigned char *) img; - unsigned char *ep=dp+extent; - static char buffer[256]; - unsigned int t1, t2, w, h; - - - t1=*(dp++); - t2=*(dp++); - if (t1!=0xff || t2!=0xD8 ) - { - return "(invalid)"; - } - - while(1) - { - if (dp>ep) return "(invalid)"; - for(t1=*(dp++);t1!=0xff;t1=*(dp++)) if (dp>ep) return "(invalid)"; - do { t1=*(dp++); if (dp>ep) return "(invalid 4)";} while (t1 == 0xff); - - if ((t1 & 0xF0) == 0xC0 && !(t1==0xC4 || t1==0xC8 || t1==0xCC)) - { - dp+=3; - if (dp>ep) return "(invalid)"; - h=*(dp++) << 8; - if (dp>ep) return "(invalid)"; - h|=*(dp++); - if (dp>ep) return "(invalid)"; - w=*(dp++) << 8; - if (dp>ep) return "(invalid)"; - w|=*(dp); - sprintf(buffer, "(%dx%d)",w,h); - return buffer; - } - else if (t1==0xD8 || t1==0xD9) - break; - else - { int l; - - if (dp>ep) return "(invalid)"; - l=*(dp++) << 8; - if (dp>ep) return "(invalid)"; - l|= *(dp++); - l-=2; - dp+=l; - if (dp>ep) return "(invalid)"; - } - } - return "(invalid)"; -} - -static int32 read_int(unsigned char *mem) -{ - int32 i4 = mem[0], - i3 = mem[1], - i2 = mem[2], - i1 = mem[3]; - return i1 | (i2<<8) | (i3<<16) | (i4<<24); -} - - -static char *get_png_dim(void *img, int32 extent) -{ - unsigned char *dp=(unsigned char *)img; - static char buffer[256]; - int32 w, h; - if (extent<33 || - !(dp[0]==137 && dp[1]==80 && dp[2]==78 && dp[3]==71 && - dp[4]==13 && dp[5] == 10 && dp[6] == 26 && dp[7]==10)|| - !(dp[12]=='I' && dp[13]=='H' && dp[14]=='D' && dp[15]=='R')) - return "(invalid)"; - w=read_int(dp+16); - h=read_int(dp+20); - sprintf(buffer,"(%dx%d)",w,h); - return buffer; -} -static char *get_image_dim(void *img, int32 extent, int fmt) -{ - if (fmt==JPEG_COVER_FORMAT) return get_jpeg_dim(img,extent); - else if (fmt==PNG_COVER_FORMAT) return get_png_dim(img, extent); - return "(unknown)"; - -} -static void deep_babel_cover(char stopped) -{ - char buffer[TREATY_MINIMUM_EXTENT]; - void *md; - char *ep; - char *ext; - char *dim; - int32 i,j; - FILE *f; - i=babel_treaty(GET_STORY_FILE_IFID_SEL,buffer,TREATY_MINIMUM_EXTENT); - if (i==0) - if (babel_md5_ifid(buffer, TREATY_MINIMUM_EXTENT)) - printf("IFID: %s\n",buffer); - else - { - fprintf(stderr,"Unable to create an IFID (A serious problem occurred while loading the file).\n"); - return; - } - else - - ep=strtok(buffer, ","); - i=babel_treaty(GET_STORY_FILE_COVER_EXTENT_SEL,NULL,0); - j=babel_treaty(GET_STORY_FILE_COVER_FORMAT_SEL,NULL,0); - - if (i<=0 || j<=0) - { - if (stopped) printf("No cover art for %s\n",buffer); - return; - } - if (j==PNG_COVER_FORMAT) ext=".png"; - else if (j==JPEG_COVER_FORMAT) ext=".jpg"; - md=my_malloc(i,"Image buffer"); - if (babel_treaty(GET_STORY_FILE_COVER_SEL,md,i)<0) - { - fprintf(stderr,"A serious error occurred while retrieving cover art.\n"); - free(md); - return; - } - dim=get_image_dim(md,i,j); - while(ep) - { - char epb[TREATY_MINIMUM_EXTENT+9]; - strcpy(epb,ep); - strcat(epb, ext); - - f=fopen(epb,"wb"); - if (!f || fwrite(md,1,i,f)==EOF) - fprintf(stderr,"A serious error occurred writing to disk.\n"); - else printf("Extracted %s %s\n",epb, dim); - if (f) fclose(f); - if (stopped) break; - ep=strtok(NULL,","); - } - free(md); -} - -void babel_story_cover() -{ - deep_babel_cover(1); -} - -void babel_story_fish() -{ - deep_babel_ifiction(0); - deep_babel_cover(0); -} - -static char *get_biblio(void) -{ - int32 i; - char *md; - char *bib="No bibliographic data"; - char *bibb; char *bibe; - char *t; - static char buffer[TREATY_MINIMUM_EXTENT]; - - i=babel_treaty(GET_STORY_FILE_METADATA_EXTENT_SEL,NULL,0); - if (i<=0) return bib; - - md=(char *) my_malloc(i,"Metadata buffer"); - if (babel_treaty(GET_STORY_FILE_METADATA_SEL,md,i)<0) return bib; - - bibb=strstr(md,""); - if (!bibb) { free(md); return bib; } - bibe=strstr(bibb,""); - if (bibe) *bibe=0; - t=strstr(bibb,""); - if (t) - { - t+=7; - bibe=strstr(t,""); - if (bibe) - { - *bibe=0; - bib=buffer; - for(i=0;t[i];i++) if (t[i]<0x20 || t[i]>0x7e) t[i]='_'; - sprintf(buffer, "\"%s\" ",t); - *bibe='<'; - } - else strcpy(buffer," "); - } - t=strstr(bibb,""); - if (t) - { - t+=8; - bibe=strstr(t,""); - if (bibe) - { - bib=buffer; - *bibe=0; - for(i=0;t[i];i++) if (t[i]<0x20 || t[i]>0x7e) t[i]='_'; - strcat(buffer, "by "); - strcat(buffer, t); - *bibe='<'; - } - else strcat(buffer, ""); - } - free(md); - return bib; - -} -void babel_story_identify() -{ - int32 i, j, l; - char *b, *cf, *dim; - char buffer[TREATY_MINIMUM_EXTENT]; - - printf("%s\n",get_biblio()); - babel_story_ifid(); - b=babel_get_format(); - if (!b) b="unknown"; - l=babel_get_length() / 1024; - - - i=babel_treaty(GET_STORY_FILE_COVER_EXTENT_SEL,NULL,0); - j=babel_treaty(GET_STORY_FILE_COVER_FORMAT_SEL,NULL,0); - - if (i<=0 || j<=0) - { - cf="no cover"; - } - else - { - char *md=my_malloc(i,"Image buffer"); - if (babel_treaty(GET_STORY_FILE_COVER_SEL,md,i)<0) - { - cf="no cover"; - } - else - { - dim=get_image_dim(md,i,j)+1; - dim[strlen(dim)-1]=0; - if (j==JPEG_COVER_FORMAT) cf="jpeg"; - else if (j==PNG_COVER_FORMAT) cf="png"; - else cf="unknown format"; - sprintf(buffer,"cover %s %s",dim,cf); - cf=buffer; - } - } - printf("%s, %dk, %s\n",b, l,cf); -} - -void babel_story_meta() -{ - deep_babel_ifiction(2); -} - -void babel_story_story() -{ - int32 j,i; - void *p; - FILE *f; - char *ep; - char buffer[TREATY_MINIMUM_EXTENT+20]; - j=babel_get_story_length(); - p=babel_get_story_file(); - if (!j || !p) - { - fprintf(stderr,"A serious error occurred while retrieving the story file.\n"); - return; - } - - i=babel_treaty(GET_STORY_FILE_IFID_SEL,buffer,TREATY_MINIMUM_EXTENT); - if (i==0 && !babel_md5_ifid(buffer, TREATY_MINIMUM_EXTENT)) - { - fprintf(stderr,"Unable to create an IFID (A serious problem occurred while loading the file).\n"); - return; - } - ep=strchr(buffer, ','); - if (!ep) ep=buffer+strlen(buffer); - *ep=0; - babel_treaty(GET_STORY_FILE_EXTENSION_SEL,ep,19); - f=fopen(buffer,"wb"); - if (!f || !fwrite(p,1,j,f)) - { - fprintf(stderr,"A serious error occurred writing to disk.\n"); - return; - } - fclose(f); - printf("Extracted %s\n",buffer); - - - -} - -void babel_story_unblorb() -{ - deep_babel_ifiction(1); - deep_babel_cover(1); - babel_story_story(); - -} diff --git a/babel/blorb.c b/babel/blorb.c deleted file mode 100644 index ebb84e4..0000000 --- a/babel/blorb.c +++ /dev/null @@ -1,245 +0,0 @@ -/* blorb.c Babel interface to blorb files - * Copyright 2006 by L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon treaty_builder.h, misc.c and ifiction.c - * - * Header note: to add support for new executable chunk types, see - * TranslateExec. - * - * This file defines a Treaty of Babel compatable module for handling blorb - * files. However, blorb files are not themselves a babel format. This module - * is used internally by the babel program to handle blorbs. - * - * As a result, if GET_STORY_FILE_IFID_SEL returns NO_REPLY_RV, - * you should check the story file against the babel registry before resorting - * to the default IFID calculation. - * - */ -#define FORMAT blorb -#define HOME_PAGE "http://eblong.com/zarf/blorb" -#define FORMAT_EXT ".blorb,.blb,.zblorb,.zlb,.gblorb,.glb" -#define CONTAINER_FORMAT -#include "treaty_builder.h" -#include -#include - -extern TREATY treaty_registry[]; -/* The following is the translation table of Blorb chunk types to - babel formats. it is NULL-terminated. */ -static char *TranslateExec[] = { "ZCOD", "zcode", - "GLUL", "glulx", - "TAD2", "tads2", - "TAD3", "tads3", - NULL, NULL }; - -void *my_malloc(int32, char *); -int32 ifiction_get_IFID(char *, char *, int32); - -static int32 read_int(void *inp) -{ - unsigned char *mem=(unsigned char *)inp; - int32 i4 = mem[0], - i3 = mem[1], - i2 = mem[2], - i1 = mem[3]; - return i1 | (i2<<8) | (i3<<16) | (i4<<24); -} - - -static int32 blorb_get_chunk(void *blorb_file, int32 extent, char *id, int32 *begin, int32 *output_extent) -{ - int32 i=12, j; - while(i extent) return NO_REPLY_RV; - *begin=i+8; - return 1; - } - - j=read_int((char *)blorb_file+i+4); - if (j%2) j++; - i+=j+8; - - } - return NO_REPLY_RV; -} -static int32 blorb_get_resource(void *blorb_file, int32 extent, char *rid, int32 number, int32 *begin, int32 *output_extent) -{ - int32 ridx_len; - int32 i,j; - void *ridx; - if (blorb_get_chunk(blorb_file, extent,"RIdx",&i,&ridx_len)==NO_REPLY_RV) - return NO_REPLY_RV; - - ridx=(char *)blorb_file+i+4; - ridx_len=read_int((char *)blorb_file+i); - for(i=0;i -#include - -static char elfmagic[] = { 0x7f, 0x45, 0x4c, 0x46, 0 }; -static char javamagic[] = { 0xCA, 0xFE, 0xBA, 0xBE, 0 }; -static char amigamagic[] = { 0, 0, 3, 0xe7, 0 }; -static char machomagic[] = { 0xFE, 0xED, 0xFA, 0xCE, 0}; -struct exetype -{ - char *magic; - char *name; - int len; -}; -static struct exetype magic[]= { { "MZ", "MZ", 2 }, - { elfmagic, "ELF", 4 }, - { javamagic, "JAVA", 4 }, - { amigamagic, "AMIGA", 4 }, - { "#! ", "SCRIPT", 3 }, - { machomagic, "MACHO",4 }, - { "APPL", "MAC",4 }, - { NULL, NULL, 0 } }; - -static char *deduce_magic(void *sf, int32 extent) -{ - int i; - for(i=0;magic[i].magic;i++) - if (extent >= magic[i].len && memcmp(magic[i].magic,sf,magic[i].len)==0) - return magic[i].name; - return NULL; -} - -static int32 claim_story_file(void *sf, int32 extent) -{ - if (deduce_magic(sf,extent)) return VALID_STORY_FILE_RV; - return NO_REPLY_RV; -} -static int32 get_story_file_IFID(void *sf, int32 extent, char *output, int32 output_extent) -{ - char *o; - o=deduce_magic(sf,extent); - if (!o) return 0; - ASSERT_OUTPUT_SIZE((signed) strlen(o)+2); - strcpy(output,o); - strcat(output,"-"); - return INCOMPLETE_REPLY_RV; -} diff --git a/babel/glulx.c b/babel/glulx.c deleted file mode 100644 index ea1b3c4..0000000 --- a/babel/glulx.c +++ /dev/null @@ -1,81 +0,0 @@ -/* glulx.c Treaty of Babel module for Glulx files - * 2006 By L. Ross Raszewski - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file - * may render it noncompliant with the Treaty of Babel - */ - -#define FORMAT glulx -#define HOME_PAGE "http://eblong.com/zarf/glulx" -#define FORMAT_EXT ".ulx" -#define NO_METADATA -#define NO_COVER - -#include "treaty_builder.h" -#include -#include - -static int32 read_int(unsigned char *mem) -{ - int32 i4 = mem[0], - i3 = mem[1], - i2 = mem[2], - i1 = mem[3]; - return i1 | (i2<<8) | (i3<<16) | (i4<<24); -} - - - -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - int32 i,j, k; - char ser[7]; - char buffer[32]; - - - if (extent<256) return INVALID_STORY_FILE_RV; - for(i=0;i -#include - -static int32 get_story_file_IFID(void *s_file, int32 extent, char *output, int32 output_extent) -{ - - int32 i,j; - char ser[9]; - char buffer[32]; - char *story_file = (char *) s_file; - - - if (extent<0x0B) return INVALID_STORY_FILE_RV; - - for(i=0;i0x7e) return INVALID_STORY_FILE_RV; - for(i=0x0b;i<0x18;i+=2) - if (read_hugo_addx(sf+i) * scale > extent) return INVALID_STORY_FILE_RV; - - return VALID_STORY_FILE_RV; -} diff --git a/babel/ifiction.a b/babel/ifiction.a deleted file mode 100644 index 6dda84f263579912ae2fb3291c96983d5161eca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33404 zcmeHw4R}=5o%fkL$#8){0zr%)=p~4NLc*5{f)JJ9P(WgpieC+rWRe-3%*6S?#4n&Qr*XSbLWDC?&rk|7dp=T z#TU&7_aSW@v$=lFO3UK`7gh3zWg=H%RETYt=kj$jTPMyERbstA`+-0GVTC_?&(P5| z{@zloD}Poj9h00wr5C&ay^Od&yXP=oGlQveMVTJ-WF-sH`T_9gBTMRs;!i2+?|%o? zT?_gafxd(OY-(S2{SW-T^#}9B`?K|j{pouSi`1CsQQeV8;KQG;KkNh2!zSq=AUz~f zqa^9kWN-Zs{M-D!YY+K**B|z0U-!@Ykw5zr|Kfd{M?L?)PMkP#^z%>wm7pT~mVef( z{_I|Vb{8-l25g@{`vyCiBm0qm)_45bgMM%QzTIF*Z~Y-;s6Uu}Yu2mTz3IVG{`7Yj z-K3lY-{yjEAUt&_yZ+rh^`D{#M+3d<-&IDTUa8}wKb$y`tshF?GbHX^m#+WR(_23T zmV1BzG_V!fUBCNbZ~eP{C04c`B;+c95WP6GTg-;g9P&W^Ftl6GVCsJy^=y@t>BAmu z$=Ru~Tmpvw+@B45gw5&h7^Z8FtobYF#*�vZ1 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 -#include -#include -#include - -void *my_malloc(int, char *); -extern char *format_registry[]; - - -static int32 llp; -static char *lnlst; - -static char utfeol[3] = { 0xe2, 0x80, 0xa8 }; -static int32 getln(char *endp) -{ - for(;lnlst"); - if (!ifid_begin) return NO_REPLY_RV; - ifid_begin+=6; - - ifid_end=strstr(ifid_begin,""); - if (!ifid_end) return NO_REPLY_RV; - if (output_extent<=(ifid_end-ifid_begin)) return INVALID_USAGE_RV; - - memcpy(output,ifid_begin,ifid_end-ifid_begin); - - output[ifid_end-ifid_begin]=0; - - return ifid_end-metadata+7; -} - - -int32 ifiction_get_IFID(char *metadata, char *output, int32 output_extent) -{ - int32 j=0, k; - - while(*metadata) - { - if ((k=ifiction_get_first_IFID(metadata,output,output_extent)) <= 0) break; - j++; - metadata+=k; - output_extent-=strlen(output)+1; - output+=strlen(output); - *output=','; - output++; - } - if (*(output-1)==',') *(output-1)=0; - return j; -} - - -static char *leaf_tags[] = { "ifid", - "format", - "bafn", - "title", - "author", - "headline", - "firstpublished", - "genre", - "group", - "description", - "leafname", - "url", - "authoremail", - "height", - "width", - - NULL - }; -static char *one_per[] = { "identification", - "bibliographic", - "format", - "title", - "author", - "headline", - "firstpublished", - "genre", - "group", - "description", - "leafname", - "height", - "width", - "forgiveness", - "colophon", - NULL - }; - -static char *required[] = { - "cover", "height", - "cover", "width", - "cover", "format", - "resources", "auxiliary", - "auxiliary", "leafname", - "auxiliary", "description", - "ifiction", "story", - "story", "identification", - "story", "bibliographic", - "identification", "ifid", - "identification", "format", - "bibliographic", "title", - "bibliographic", "author", - "colophon", "generator", - "colophon", "originated", - NULL, NULL - }; -static char *zarfian[] = { - "Merciful", - "Polite", - "Tough", - "Nasty", - "Cruel", - NULL - }; - -struct ifiction_info { - int32 width; - int32 height; - int format; - }; -static void ifiction_validate_tag(struct XMLTag *xtg, struct ifiction_info *xti, IFErrorHandler err_h, void *ectx) -{ - int i; - char ebuf[512]; - struct XMLTag *parent=xtg->next; - if (parent) - { - for(i=0;leaf_tags[i];i++) - if (strcmp(parent->tag,leaf_tags[i])==0) - { - sprintf(ebuf, "Error: (line %d) Tag <%s> is not permitted within tag <%s>", - xtg->beginl,xtg->tag,parent->tag); - err_h(ebuf,ectx); - } - for(i=0;required[i];i+=2) - if (strcmp(required[i],parent->tag)==0 && strcmp(required[i+1],xtg->tag)==0) - parent->rocurrences[i]=1; - for(i=0;one_per[i];i++) - if (strcmp(one_per[i],xtg->tag)==0) - if (parent->occurences[i]) { - sprintf(ebuf,"Error: (line %d) Found more than one <%s> within <%s>",xtg->beginl,xtg->tag, - parent->tag); - err_h(ebuf,ectx); - } - else parent->occurences[i]=1; - } - for(i=0;required[i];i+=2) - if (strcmp(required[i],xtg->tag)==0 && !xtg->rocurrences[i]) - { - sprintf(ebuf,"Error: (line %d) Tag <%s> is required within <%s>",xtg->beginl, required[i+1],xtg->tag); - err_h(ebuf,ectx); - } - if (parent && strcmp(parent->tag,"identification")==0) - { - if (strcmp(xtg->tag,"format")==0) - { - int i; - for(i=0;format_registry[i];i++) if (memcmp(xtg->begin,format_registry[i],strlen(format_registry[i]))==0) break; - if (format_registry[i]) xti->format=i; - else - { - char bf[256]; - memcpy(bf,xtg->begin,xtg->end-xtg->begin); - bf[xtg->end-xtg->begin]=0; - xti->format=-1; - sprintf(ebuf,"Warning: (line %d) Unknown format %s.",xtg->beginl,bf); - err_h(ebuf,ectx); - } - } - } - if (parent && strcmp(parent->tag,"cover")==0) - { - if (strcmp(xtg->tag,"width")==0) - { - int i; - sscanf(xtg->begin,"%d",&i); - if (i<120) - { - sprintf(ebuf,"Warning: (line %d) Cover art width should not be less than 120.",xtg->beginl); - err_h(ebuf,ectx); - } - if (i>1200) - { - sprintf(ebuf,"Warning: (line %d) Cover art width should not exceed 1200.",xtg->beginl); - err_h(ebuf,ectx); - } - if (!xti->width) xti->width=i; - if (xti->height && (xti->width> 2 * xti->height || xti->height > 2 * xti->width)) - { - sprintf(ebuf,"Warning: (line %d) Cover art aspect ratio exceeds 2:1.",xtg->beginl); - err_h(ebuf,ectx); - } - - } - if (strcmp(xtg->tag,"height")==0) - { - int i; - sscanf(xtg->begin,"%d",&i); - if (i<120) - { - sprintf(ebuf,"Warning: (line %d) Cover art height should not be less than 120.",xtg->beginl); - err_h(ebuf,ectx); - } - if (i>1200) - { - sprintf(ebuf,"Warning: (line %d) Cover art height should not exceed 1200.",xtg->beginl); - err_h(ebuf,ectx); - } - if (!xti->height) xti->height=i; - if (xti->width && (xti->width> 2 * xti->height || xti->height > 2 * xti->width)) - { - sprintf(ebuf,"Warning: (line %d) Cover art aspect ratio exceeds 2:1.",xtg->beginl); - err_h(ebuf,ectx); - } - - } - if (strcmp(xtg->tag,"format")==0 && memcmp(xtg->begin,"jpg",3) && memcmp(xtg->begin,"png",3)) - { - sprintf(ebuf,"Warning: (line %d) should be one of: png, jpg.",xtg->beginl); - err_h(ebuf,ectx); - } - } - if (parent && strcmp(parent->tag,"bibliographic")==0) - { - char *p; - if (isspace(*xtg->begin)|| isspace(*(xtg->end-1))) - { - sprintf(ebuf,"Warning: (line %d) Extraneous spaces at beginning or end of tag <%s>.",xtg->beginl,xtg->tag); - err_h(ebuf,ectx); - } - for(p=xtg->begin;pend-1;p++) -/* Obsoleted by Revision 6 - if (isspace(*p) && isspace(*(p+1))) - { - sprintf(ebuf,"Warning: (line %d) Extraneous spaces found in tag <%s>.",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - } - else if (isspace(*p) && *p!=' ') - { - sprintf(ebuf,"Warning: (line %d) Improper whitespace character found in tag <%s>.",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - - } -*/ - if (strcmp(xtg->tag, "description") && xtg->end-xtg->begin > 240) - { - sprintf(ebuf,"Warning: (line %d) Tag <%s> length exceeds treaty guidelines",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - } - if (strcmp(xtg->tag, "description")==0 && xtg->end-xtg->begin > 2400) - { - sprintf(ebuf,"Warning: (line %d) Tag <%s> length exceeds treaty guidelines",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - } - if (strcmp(xtg->tag,"firstpublished")==0) - { - int l=xtg->end-xtg->begin; - if ((l!=4 && l!=10) || - (!isdigit(xtg->begin[0]) || - !isdigit(xtg->begin[1]) || - !isdigit(xtg->begin[2]) || - !isdigit(xtg->begin[3])) || - (l==10 && ( xtg->begin[4]!='-' || - xtg->begin[7]!='-' || - !isdigit(xtg->begin[5]) || - !isdigit(xtg->begin[6]) || - !(xtg->begin[5]=='0' || xtg->begin[5]=='1') || - !(xtg->begin[5]=='0' || xtg->begin[6]<='2') || - !isdigit(xtg->begin[8]) || - !isdigit(xtg->begin[9])))) - { - sprintf(ebuf,"Warning: (line %d) Tag <%s> should be format YYYY or YYYY-MM-DD",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - } - } - if (strcmp(xtg->tag,"seriesnumber")==0) - { - char *l; - if (*xtg->begin=='0' && xtg->end!=xtg->begin+1) - { - sprintf(ebuf,"Warning: (line %d) Tag <%s> should not use leading zeroes",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - } - - for(l=xtg->begin;lend;l++) if (!isdigit(*l)) - { - sprintf(ebuf,"Warning: (line %d) Tag <%s> should be a positive number",xtg->beginl, xtg->tag); - err_h(ebuf,ectx); - } - } - if (strcmp(xtg->tag,"forgiveness")==0) - { - int l; - for(l=0;zarfian[l];l++) if (memcmp(xtg->begin,zarfian[l],strlen(zarfian[l]))==0) break; - if (!zarfian[l]) - { - sprintf(ebuf,"Warning: (line %d) should be one of: Merciful, Polite, Tough, Cruel",xtg->beginl); - err_h(ebuf,ectx); - } - } - } - if (xti->format>0) - { - for(i=0;format_registry[i];i++) if (strcmp(xtg->tag,format_registry[i])==0) break; - if (format_registry[i] && xti->format !=i) - { - sprintf(ebuf,"Warning: (line %d) Found <%s> tag, but story is identified as %s.",xtg->beginl, xtg->tag, format_registry[xti->format]); - err_h(ebuf,ectx); - } - } - if (strcmp(xtg->tag,"story")==0) - { - xti->format=-1; - xti->width=0; - xti->height=0; - } - -} - - - -void ifiction_parse(char *md, IFCloseTag close_tag, void *close_ctx, IFErrorHandler error_handler, void *error_ctx) -{ -char *xml, buffer[2400], *aep, *mda=md, ebuffer[512]; -struct XMLTag *parse=NULL, *xtg; -struct ifiction_info xti; -char BOM[3]={ 0xEF, 0xBB, 0xBF}; -xti.width=0; -xti.height=0; -xti.format=-1; -llp=1; -lnlst=md; - -while(*mda && isspace(*mda)) mda++; -if (memcmp(mda,BOM,3)==0) -{ mda+=3; - while(*mda && isspace(*mda)) mda++; -} - - -if (strncmp("",mda, - strlen("")) - && - strncmp("",mda, - strlen("")) - ) -{ - error_handler("Error: XML header not found.",error_ctx); - return; -} - -xml=strstr(md," not found",error_ctx); - return; - } -while(xml && *xml) -{ - char *bp, *ep, *tp; - while(*xml&&*xml!='<') xml++; - if (!*xml) break; - bp=xml; - tp=strchr(bp+1,'<'); - ep=strchr(bp+1,'>'); - if (!ep) break; - if (tp && tp < ep) - { xml=tp; continue; } - if (!tp) tp=ep+1; - if (bp[1]=='/') /* end tag */ - { - strncpy(buffer,bp+2,(ep-bp)-2); - buffer[(ep-bp)-2]=0; - if (parse && strcmp(buffer,parse->tag)==0) - { /* copasetic. Close the tag */ - xtg=parse; - parse=xtg->next; - xtg->end=ep-strlen(buffer)-2; - ifiction_validate_tag(xtg,&xti,error_handler, error_ctx); - close_tag(xtg,close_ctx); - free(xtg); - } - else - { - for(xtg=parse;xtg && strcmp(buffer,xtg->tag);xtg=xtg->next); - if (xtg) /* Intervening unclosed tags */ - { for(xtg=parse;xtg && strcmp(buffer,parse->tag);xtg=parse) - { - xtg->end=xml-1; - parse=xtg->next; - sprintf(ebuffer,"Error: (line %d) unclosed <%s> tag",xtg->beginl,xtg->tag); - error_handler(ebuffer,error_ctx); - ifiction_validate_tag(xtg,&xti,error_handler, error_ctx); - close_tag(xtg,close_ctx); - free(xtg); - } - xtg=parse; - if (xtg) - { - xtg->end=xml-1; - parse=xtg->next; - ifiction_validate_tag(xtg,&xti, error_handler, error_ctx); - close_tag(xtg,close_ctx); - free(xtg); - } - } - else - { - sprintf(ebuffer,"Error: (line %d) saw without <%s>",getln(xml), buffer,buffer); - error_handler(ebuffer,error_ctx); - } - } - - } - else if(*(ep-1)=='/' || bp[1]=='!') /* unterminated tag */ - { - /* Do nothing */ - } - else /* Terminated tag beginning */ - { - int i; - xtg=(struct XMLTag *)my_malloc(sizeof(struct XMLTag),"XML Tag"); - xtg->next=parse; - xtg->beginl=getln(bp); - for(i=0;bp[i+1]=='_' || bp[i+1]=='-' || isalnum(bp[i+1]);i++) - xtg->tag[i]=bp[i+1]; - if (i==0) - { xml=tp; - free(xtg); - continue; - } - parse=xtg; - parse->tag[i]=0; - strncpy(parse->fulltag,bp+1,ep-bp-1); - parse->fulltag[ep-bp-1]=0; - parse->begin=ep+1; - } - xml=tp; -} - while (parse) - { - xtg=parse; - xtg->end=aep-1; - parse=xtg->next; - sprintf(ebuffer,"Error: (line %d) Unclosed tag <%s>",xtg->beginl,xtg->tag); - ifiction_validate_tag(xtg,&xti,error_handler, error_ctx); - close_tag(xtg,close_ctx); - free(xtg); - } -} - -struct get_tag -{ - char *tag; - char *parent; - char *output; - char *target; -}; - -static void ifiction_null_eh(char *e, void *c) -{ - if (e || c) { } - -} - -static void ifiction_find_value(struct XMLTag *xtg, void *xti) -{ - struct get_tag *gt=(struct get_tag *)xti; - - if (gt->output && !gt->target) return; - if (gt->target && gt->output && strcmp(gt->output,gt->target)==0) { gt->target=NULL; free(gt->output); gt->output=NULL; } - if (((!xtg->next && !gt->parent) || (xtg->next && gt->parent && strcmp(xtg->next->tag,gt->parent)==0)) && - strcmp(xtg->tag,gt->tag)==0) - { - int32 l = xtg->end-xtg->begin; - - if (gt->output) free(gt->output); - gt->output=(char *)my_malloc(l+1, "ifiction tag buffer"); - memcpy(gt->output, xtg->begin, l); - gt->output[l]=0; - - } -} - - -char *ifiction_get_tag(char *md, char *p, char *t, char *from) -{ - struct get_tag gt; - gt.output=NULL; - gt.parent=p; - gt.tag=t; - gt.target=from; - ifiction_parse(md,ifiction_find_value,>,ifiction_null_eh,NULL); - if (gt.target){ if (gt.output) free(gt.output); return NULL; } - return gt.output; -} diff --git a/babel/ifiction.h b/babel/ifiction.h deleted file mode 100644 index 75ae946..0000000 --- a/babel/ifiction.h +++ /dev/null @@ -1,45 +0,0 @@ -/* ifiction.h declarations for the babel ifiction API - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - */ - -#ifndef IFICTION_H -#define IFICTION_H - -#include "treaty.h" - -/* Babel's notion of an XML tag */ -struct XMLTag -{ - int32 beginl; /* Beginning line number */ - char tag[256]; /* name of the tag */ - char fulltag[256]; /* Full text of the opening tag */ - char *begin; /* Points to the beginning of the tag's content */ - char *end; /* Points to the end of the tag's content. - setting *end=0 will turn begin into a string - containing the tag's content (But if you do this, you - should restore the original value of *end before - allowing control to return to the ifiction parser) */ - char occurences[256]; /* Tables used internally to find missing required tags */ - char rocurrences[256]; - struct XMLTag *next; /* The tag's parent */ - -}; - -typedef void (*IFCloseTag)(struct XMLTag *, void *); -typedef void (*IFErrorHandler)(char *, void *); - - -void ifiction_parse(char *md, IFCloseTag close_tag, void *close_ctx, IFErrorHandler error_handler, void *error_ctx); -int32 ifiction_get_IFID(char *metadata, char *output, int32 output_extent); -char *ifiction_get_tag(char *md, char *p, char *t, char *from); -#endif diff --git a/babel/level9.c b/babel/level9.c deleted file mode 100644 index de855b0..0000000 --- a/babel/level9.c +++ /dev/null @@ -1,495 +0,0 @@ -/* level9.c Treaty of Babel module for Level 9 files - * 2006 By L. Ross Raszewski - * - * Note that this module will handle both bare Level 9 A-Code and - * Spectrum .SNA snapshots. It will not handle compressed .Z80 images. - * - * The Level 9 identification algorithm is based in part on the algorithm - * used by Paul David Doherty's l9cut program. - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file - * may render it noncompliant with the Treaty of Babel - */ - -#define FORMAT level9 -#define HOME_PAGE "http://www.if-legends.org/~l9memorial/html/home.html" -#define FORMAT_EXT ".l9,.sna" -#define NO_METADATA -#define NO_COVER - -#include "treaty_builder.h" -#include -#include -#include - -struct l9rec { - int32 length; - unsigned char chk; - char *ifid; -}; - - -static struct l9rec l9_registry[] = { - { 0x3a31, 0xe5, "LEVEL9-001-1" }, - { 0x8333, 0xb7, "LEVEL9-001-1" }, - { 0x7c6f, 0x0f, "LEVEL9-001-1" }, - { 0x72fa, 0x8b, "LEVEL9-001-1" }, - { 0x38dd, 0x31, "LEVEL9-001-A" }, - { 0x39c0, 0x44, "LEVEL9-001-B" }, - { 0x3a12, 0x8f, "LEVEL9-001-C" }, - { 0x37f1, 0x77, "LEVEL9-001-2" }, - { 0x844d, 0x50, "LEVEL9-001-2" }, - { 0x738e, 0x5b, "LEVEL9-001-2" }, - { 0x3900, 0x1c, "LEVEL9-001-3" }, - { 0x8251, 0x5f, "LEVEL9-001-3" }, - { 0x7375, 0xe5, "LEVEL9-001-3" }, - { 0x3910, 0xac, "LEVEL9-001-4" }, - { 0x7a78, 0x5e, "LEVEL9-001-4" }, - { 0x78d5, 0xe3, "LEVEL9-001-4" }, - { 0x3ad6, 0xa7, "LEVEL9-001-5" }, - { 0x38a5, 0x0f, "LEVEL9-001-6" }, - { 0x361e, 0x7e, "LEVEL9-001-7" }, - { 0x3934, 0x75, "LEVEL9-001-8" }, - { 0x3511, 0xcc, "LEVEL9-001-9" }, - { 0x593a, 0xaf, "LEVEL9-002-1" }, - { 0x7931, 0xb9, "LEVEL9-002-1" }, - { 0x6841, 0x4a, "LEVEL9-002-1" }, - { 0x57e6, 0x8a, "LEVEL9-002-2" }, - { 0x7cdf, 0xa5, "LEVEL9-002-2" }, - { 0x6bc0, 0x62, "LEVEL9-002-2" }, - { 0x5819, 0xcd, "LEVEL9-002-3" }, - { 0x7a0c, 0x97, "LEVEL9-002-3" }, - { 0x692c, 0x21, "LEVEL9-002-3" }, - { 0x579b, 0xad, "LEVEL9-002-4" }, - { 0x7883, 0xe2, "LEVEL9-002-4" }, - { 0x670a, 0x94, "LEVEL9-002-4" }, - { 0x5323, 0xb7, "LEVEL9-003" }, - { 0x6e60, 0x83, "LEVEL9-003" }, - { 0x5b58, 0x50, "LEVEL9-003" }, - { 0x63b6, 0x2e, "LEVEL9-003" }, - { 0x6968, 0x32, "LEVEL9-003" }, - { 0x5b50, 0x66, "LEVEL9-003" }, - { 0x6970, 0xd6, "LEVEL9-003" }, - { 0x5ace, 0x11, "LEVEL9-003" }, - { 0x6e5c, 0xf6, "LEVEL9-003" }, - { 0x1929, 0x00, "LEVEL9-004-DEMO" }, - { 0x40e0, 0x02, "LEVEL9-004-DEMO" }, - { 0x3ebb, 0x00, "LEVEL9-004-en" }, - { 0x3e4f, 0x00, "LEVEL9-004-en" }, - { 0x3e8f, 0x00, "LEVEL9-004-en" }, - { 0x0fd8, 0x00, "LEVEL9-004-en" }, - { 0x14a3, 0x00, "LEVEL9-004-en" }, - { 0x110f, 0x00, "LEVEL9-004-fr" }, - { 0x4872, 0x00, "LEVEL9-004-de" }, - { 0x4846, 0x00, "LEVEL9-004-de" }, - { 0x11f5, 0x00, "LEVEL9-004-de" }, - { 0x11f5, 0x00, "LEVEL9-004-de" }, - { 0x76f4, 0x5e, "LEVEL9-005" }, - { 0x5b16, 0x3b, "LEVEL9-005" }, - { 0x6c8e, 0xb6, "LEVEL9-005" }, - { 0x6f4d, 0xcb, "LEVEL9-005" }, - { 0x6f6a, 0xa5, "LEVEL9-005" }, - { 0x5e31, 0x7c, "LEVEL9-005" }, - { 0x6f70, 0x40, "LEVEL9-005" }, - { 0x6f6e, 0x78, "LEVEL9-005" }, - { 0x5a8e, 0xf2, "LEVEL9-005" }, - { 0x76f4, 0x5a, "LEVEL9-005" }, - { 0x630e, 0x8d, "LEVEL9-006" }, - { 0x630e, 0xbe, "LEVEL9-006" }, - { 0x6f0c, 0x95, "LEVEL9-006" }, - { 0x593a, 0x80, "LEVEL9-006" }, - { 0x6bd2, 0x65, "LEVEL9-006" }, - { 0x6dc0, 0x63, "LEVEL9-006" }, - { 0x58a6, 0x24, "LEVEL9-006" }, - { 0x6de8, 0x4c, "LEVEL9-006" }, - { 0x58a3, 0x38, "LEVEL9-006" }, - { 0x63be, 0xd6, "LEVEL9-007" }, - { 0x378c, 0x8d, "LEVEL9-007" }, - { 0x63be, 0x0a, "LEVEL9-007" }, - { 0x34b3, 0x20, "LEVEL9-008" }, - { 0x34b3, 0xc7, "LEVEL9-008" }, - { 0x34b3, 0x53, "LEVEL9-008" }, - { 0xb1a9, 0x80, "LEVEL9-009-1" }, - { 0x908e, 0x0d, "LEVEL9-009-1" }, - { 0xad41, 0xa8, "LEVEL9-009-1" }, - { 0xb1aa, 0xad, "LEVEL9-009-1" }, - { 0x8aab, 0xc0, "LEVEL9-009-1" }, - { 0xb0ec, 0xc2, "LEVEL9-009-1" }, - { 0xb19e, 0x92, "LEVEL9-009-1" }, - { 0x5ff0, 0xf8, "LEVEL9-009-1" }, - { 0x52aa, 0xdf, "LEVEL9-009-1" }, - { 0xab9d, 0x31, "LEVEL9-009-2" }, - { 0x8f6f, 0x0a, "LEVEL9-009-2" }, - { 0xa735, 0xf7, "LEVEL9-009-2" }, - { 0xab8b, 0xbf, "LEVEL9-009-2" }, - { 0x8ac8, 0x9a, "LEVEL9-009-2" }, - { 0xaf82, 0x83, "LEVEL9-009-2" }, - { 0x6024, 0x01, "LEVEL9-009-2" }, - { 0x6ffa, 0xdb, "LEVEL9-009-2" }, - { 0xae28, 0x87, "LEVEL9-009-3" }, - { 0x9060, 0xbb, "LEVEL9-009-3" }, - { 0xa9c0, 0x9e, "LEVEL9-009-3" }, - { 0xae16, 0x81, "LEVEL9-009-3" }, - { 0x8a93, 0x4f, "LEVEL9-009-3" }, - { 0xb3e6, 0xab, "LEVEL9-009-3" }, - { 0x6036, 0x3d, "LEVEL9-009-3" }, - { 0x723a, 0x69, "LEVEL9-009-3" }, - { 0xd188, 0x13, "LEVEL9-010-1" }, - { 0x9089, 0xce, "LEVEL9-010-1" }, - { 0xb770, 0x03, "LEVEL9-010-1" }, - { 0xd19b, 0xad, "LEVEL9-010-1" }, - { 0x8ab7, 0x68, "LEVEL9-010-1" }, - { 0xd183, 0x83, "LEVEL9-010-1" }, - { 0x5a38, 0xf7, "LEVEL9-010-1" }, - { 0x76a0, 0x3a, "LEVEL9-010-1" }, - { 0xc594, 0x03, "LEVEL9-010-2" }, - { 0x908d, 0x80, "LEVEL9-010-2" }, - { 0xb741, 0xb6, "LEVEL9-010-2" }, - { 0xc5a5, 0xfe, "LEVEL9-010-2" }, - { 0x8b1e, 0x84, "LEVEL9-010-2" }, - { 0xc58f, 0x65, "LEVEL9-010-2" }, - { 0x531a, 0xed, "LEVEL9-010-2" }, - { 0x7674, 0x0b, "LEVEL9-010-2" }, - { 0xd79f, 0xb5, "LEVEL9-010-3" }, - { 0x909e, 0x9f, "LEVEL9-010-3" }, - { 0xb791, 0xa1, "LEVEL9-010-3" }, - { 0xd7ae, 0x9e, "LEVEL9-010-3" }, - { 0x8b1c, 0xa8, "LEVEL9-010-3" }, - { 0xd79a, 0x57, "LEVEL9-010-3" }, - { 0x57e4, 0x19, "LEVEL9-010-3" }, - { 0x765e, 0xba, "LEVEL9-010-3" }, - { 0xbb93, 0x36, "LEVEL9-011-1" }, - { 0x898a, 0x43, "LEVEL9-011-1" }, - { 0x8970, 0x6b, "LEVEL9-011-1" }, - { 0xbb6e, 0xa6, "LEVEL9-011-1" }, - { 0x86d0, 0xb7, "LEVEL9-011-1" }, - { 0xbb6e, 0xad, "LEVEL9-011-1" }, - { 0x46ec, 0x64, "LEVEL9-011-1" }, - { 0x74e0, 0x92, "LEVEL9-011-1" }, - { 0xc58e, 0x4a, "LEVEL9-011-2" }, - { 0x8b9f, 0x61, "LEVEL9-011-2" }, - { 0x8b90, 0x4e, "LEVEL9-011-2" }, - { 0xc58e, 0x43, "LEVEL9-011-2" }, - { 0x8885, 0x22, "LEVEL9-011-2" }, - { 0x6140, 0x18, "LEVEL9-011-2" }, - { 0x6dbc, 0x97, "LEVEL9-011-2" }, - { 0xcb9a, 0x0f, "LEVEL9-011-3" }, - { 0x8af9, 0x61, "LEVEL9-011-3" }, - { 0x8aea, 0x4e, "LEVEL9-011-3" }, - { 0xcb9a, 0x08, "LEVEL9-011-3" }, - { 0x87e5, 0x0e, "LEVEL9-011-3" }, - { 0x640e, 0xc1, "LEVEL9-011-3" }, - { 0x7402, 0x07, "LEVEL9-011-3" }, - { 0xbba4, 0x94, "LEVEL9-012-1" }, - { 0xc0cf, 0x4e, "LEVEL9-012-1" }, - { 0x8afc, 0x07, "LEVEL9-012-1" }, - { 0x8feb, 0xba, "LEVEL9-012-1" }, - { 0xb4c9, 0x94, "LEVEL9-012-1" }, - { 0xc0bd, 0x57, "LEVEL9-012-1" }, - { 0x8ade, 0xf2, "LEVEL9-012-1" }, - { 0x4fd2, 0x9d, "LEVEL9-012-1" }, - { 0x5c7a, 0x44, "LEVEL9-012-1" }, - { 0x768c, 0xe8, "LEVEL9-012-1" }, - { 0xd0c0, 0x56, "LEVEL9-012-2" }, - { 0xd5e9, 0x6a, "LEVEL9-012-2" }, - { 0x8aec, 0x13, "LEVEL9-012-2" }, - { 0x8f6b, 0xfa, "LEVEL9-012-2" }, - { 0xb729, 0x51, "LEVEL9-012-2" }, - { 0xd5d7, 0x99, "LEVEL9-012-2" }, - { 0x8b0e, 0xfb, "LEVEL9-012-2" }, - { 0x4dac, 0xa8, "LEVEL9-012-2" }, - { 0x53a2, 0x1e, "LEVEL9-012-2" }, - { 0x76b0, 0x1d, "LEVEL9-012-2" }, - { 0xb6ac, 0xc6, "LEVEL9-012-3" }, - { 0xbb8f, 0x1a, "LEVEL9-012-3" }, - { 0x8aba, 0x0d, "LEVEL9-012-3" }, - { 0x8f71, 0x2f, "LEVEL9-012-3" }, - { 0xb702, 0xe4, "LEVEL9-012-3" }, - { 0xbb7d, 0x17, "LEVEL9-012-3" }, - { 0x8ab3, 0xc1, "LEVEL9-012-3" }, - { 0x4f96, 0x22, "LEVEL9-012-3" }, - { 0x5914, 0x22, "LEVEL9-012-3" }, - { 0x765e, 0x4f, "LEVEL9-012-3" }, - { 0x5eb9, 0x30, "LEVEL9-013" }, - { 0x5eb9, 0x5d, "LEVEL9-013" }, - { 0x5eb9, 0x6e, "LEVEL9-013" }, - { 0xb257, 0xf8, "LEVEL9-013" }, - { 0xb576, 0x2a, "LEVEL9-013" }, - { 0x8d78, 0x3a, "LEVEL9-013" }, - { 0x9070, 0x43, "LEVEL9-013" }, - { 0xb38c, 0x37, "LEVEL9-013" }, - { 0xb563, 0x6a, "LEVEL9-013" }, - { 0xb57c, 0x44, "LEVEL9-013" }, - { 0xb260, 0xe5, "LEVEL9-013" }, - { 0x8950, 0xa1, "LEVEL9-013" }, - { 0xb579, 0x89, "LEVEL9-013" }, - { 0x579e, 0x97, "LEVEL9-013" }, - { 0x69fe, 0x56, "LEVEL9-013" }, - { 0x6f1e, 0xda, "LEVEL9-013" }, - { 0x5671, 0xbc, "LEVEL9-014" }, - { 0x6fc6, 0x14, "LEVEL9-014" }, - { 0x5aa4, 0xc1, "LEVEL9-014" }, - { 0x7410, 0x5e, "LEVEL9-014" }, - { 0x5aa4, 0xc1, "LEVEL9-014" }, - { 0x5aa4, 0xc1, "LEVEL9-014" }, - { 0xb797, 0x1f, "LEVEL9-014" }, - { 0xbaca, 0x3a, "LEVEL9-014" }, - { 0x8c46, 0xf0, "LEVEL9-014" }, - { 0x8f51, 0xb2, "LEVEL9-014" }, - { 0xb451, 0xa8, "LEVEL9-014" }, - { 0xbab2, 0x87, "LEVEL9-014" }, - { 0xbac7, 0x7f, "LEVEL9-014" }, - { 0xb7a0, 0x7e, "LEVEL9-014" }, - { 0x8a60, 0x2a, "LEVEL9-014" }, - { 0xbac4, 0x80, "LEVEL9-014" }, - { 0x579a, 0x2a, "LEVEL9-014" }, - { 0x5a50, 0xa9, "LEVEL9-014" }, - { 0x6108, 0xdd, "LEVEL9-014" }, - { 0x506c, 0xf0, "LEVEL9-015" }, - { 0x505d, 0x32, "LEVEL9-015" }, - { 0xa398, 0x82, "LEVEL9-015" }, - { 0xa692, 0xd1, "LEVEL9-015" }, - { 0x8d56, 0xd3, "LEVEL9-015" }, - { 0x903f, 0x6b, "LEVEL9-015" }, - { 0xa4e2, 0xa6, "LEVEL9-015" }, - { 0xa67c, 0xb8, "LEVEL9-015" }, - { 0xa69e, 0x6c, "LEVEL9-015" }, - { 0xa3a4, 0xdf, "LEVEL9-015" }, - { 0x8813, 0x11, "LEVEL9-015" }, - { 0xa698, 0x41, "LEVEL9-015" }, - { 0x5500, 0x50, "LEVEL9-015" }, - { 0x6888, 0x8d, "LEVEL9-015" }, - { 0x6da0, 0xb8, "LEVEL9-015" }, - { 0x6064, 0xbd, "LEVEL9-016" }, - { 0x6064, 0x01, "LEVEL9-016" }, - { 0x6047, 0x6c, "LEVEL9-016" }, - { 0x6064, 0xda, "LEVEL9-016" }, - { 0x6064, 0x95, "LEVEL9-016" }, - { 0x60c4, 0x28, "LEVEL9-016" }, - { 0x5cb7, 0xfe, "LEVEL9-016" }, - { 0x5ca1, 0x33, "LEVEL9-016" }, - { 0x5cb7, 0x64, "LEVEL9-016" }, - { 0x7d16, 0xe6, "LEVEL9-016" }, - { 0x639c, 0x8b, "LEVEL9-016" }, - { 0x60f7, 0x68, "LEVEL9-016" }, - { 0x772f, 0xca, "LEVEL9-016" }, - { 0x7cff, 0xf8, "LEVEL9-016" }, - { 0x7cf8, 0x24, "LEVEL9-016" }, - { 0x7d14, 0xe8, "LEVEL9-016" }, - { 0x7c55, 0x18, "LEVEL9-016" }, - { 0x5f43, 0xca, "LEVEL9-016" }, - { 0xc132, 0x14, "LEVEL9-017-1" }, - { 0xbeab, 0x2d, "LEVEL9-017-1" }, - { 0x9058, 0xcf, "LEVEL9-017-1" }, - { 0xbe94, 0xcc, "LEVEL9-017-1" }, - { 0x8a21, 0xf4, "LEVEL9-017-1" }, - { 0x55ce, 0xa1, "LEVEL9-017-1" }, - { 0x5cbc, 0xa5, "LEVEL9-017-1" }, - { 0x762e, 0x82, "LEVEL9-017-1" }, - { 0x99bd, 0x65, "LEVEL9-017-2" }, - { 0x8f43, 0xc9, "LEVEL9-017-2" }, - { 0x8a12, 0xe3, "LEVEL9-017-2" }, - { 0x54a6, 0xa9, "LEVEL9-017-2" }, - { 0x5932, 0x4e, "LEVEL9-017-2" }, - { 0x5bd6, 0x35, "LEVEL9-017-2" }, - { 0xbcb6, 0x7a, "LEVEL9-017-3 (Amiga/PC/ST)" }, - { 0x90ac, 0x68, "LEVEL9-017-3" }, - { 0x8a16, 0xcc, "LEVEL9-017-3" }, - { 0x51bc, 0xe3, "LEVEL9-017-3" }, - { 0x5860, 0x95, "LEVEL9-017-3" }, - { 0x6fa8, 0xa4, "LEVEL9-017-3" }, - { 0x5fab, 0x5c, "LEVEL9-018" }, - { 0x5fab, 0x2f, "LEVEL9-018" }, - { 0x7b31, 0x6e, "LEVEL9-018" }, - { 0x67a3, 0x9d, "LEVEL9-018" }, - { 0x6bf8, 0x3f, "LEVEL9-018" }, - { 0x7363, 0x65, "LEVEL9-018" }, - { 0x7b2f, 0x70, "LEVEL9-018" }, - { 0x7b2f, 0x70, "LEVEL9-018" }, - { 0x6541, 0x02, "LEVEL9-018" }, - { 0x5834, 0x42, "LEVEL9-019-1" }, - { 0x765d, 0xcd, "LEVEL9-019-1" }, - { 0x6ce5, 0x58, "LEVEL9-019-1" }, - { 0x56dd, 0x51, "LEVEL9-019-2" }, - { 0x6e58, 0x07, "LEVEL9-019-2" }, - { 0x68da, 0xc1, "LEVEL9-019-2" }, - { 0x5801, 0x53, "LEVEL9-019-3" }, - { 0x7e98, 0x6a, "LEVEL9-019-3" }, - { 0x6c67, 0x9a, "LEVEL9-019-3" }, - { 0x54a4, 0x01, "LEVEL9-019-4" }, - { 0x81e2, 0xd5, "LEVEL9-019-4" }, - { 0x6d91, 0xb9, "LEVEL9-019-4" }, - { 0x5828, 0xbd, "LEVEL9-020" }, - { 0x6d84, 0xf9, "LEVEL9-020" }, - { 0x6d84, 0xc8, "LEVEL9-020" }, - { 0x6030, 0x47, "LEVEL9-020" }, - { 0x772b, 0xcd, "LEVEL9-020" }, - { 0x546c, 0xb7, "LEVEL9-020" }, - { 0x7cd9, 0x0c, "LEVEL9-020" }, - { 0x60dd, 0xf2, "LEVEL9-020" }, - { 0x6161, 0xf3, "LEVEL9-020" }, - { 0x788d, 0x72, "LEVEL9-020" }, - { 0x7cd7, 0x0e, "LEVEL9-020" }, - { 0x5ebb, 0xf1, "LEVEL9-020" }, - - { 0, 0, NULL } -}; - - - -static int32 read_l9_int(unsigned char *sf) -{ - return ((int32) sf[1]) << 8 | sf[0]; - -} -static int v2_recognition (unsigned char *sf, int32 extent, int32 *l, unsigned char *c) -{ - int32 i, j; - for (i=0;i0x4000) && (*l<=0xdb00))) - if ((*l!=0) && (sf[i+0x0d] == 0)) - for (j=i;j0x0fd0) && (end <= (extent - 2)) && - (((read_l9_int(sf+i+2) + read_l9_int(sf+i+4))==read_l9_int(sf+i+6)) - && (read_l9_int(sf+i+2) != 0) && (read_l9_int(sf+i+4)) != 0) && - (((read_l9_int(sf+i+6) + read_l9_int(sf+i+8)) == read_l9_int(sf+i+10)) - && ((sf[i + 18] == 0x2a) || (sf[i + 18] == 0x2c)) - && (sf[i + 19] == 0) && (sf[i + 20] == 0) && (sf[i + 21] == 0))) - ll = 2; - } - if (ll>1) - { - *c=0; - if (phase==3) ll=1; - else - { char checksum=0; - *c = sf[end]; - for (j=i;j<=end;j++) - checksum += sf[j]; - if (!checksum) ll=1; - else ll=0; - } - } else ll=0; - } - - if (ll) return *l < 0x8500 ? 3:4; - return 0; -} -static char *get_l9_ifid(int32 length, unsigned char chk) -{ - int i; - for(i=0;l9_registry[i].length;i++) - if (length==l9_registry[i].length && chk==l9_registry[i].chk) return l9_registry[i].ifid; - return NULL; -} -static int get_l9_version(unsigned char *sf, int32 extent, char **ifid) -{ - int i; - int32 l; - unsigned char c; - if (v2_recognition(sf,extent, &l, &c)) { *ifid=get_l9_ifid(l,c); return 2; } - l=0; c=0; - i=v3_recognition_phase(1,sf,extent, &l, &c); - if (i) { *ifid=get_l9_ifid(l,c); return i; } - if (v1_recognition(sf,extent, ifid)) return 1; - l=0; c=0; - i=v3_recognition_phase(2,sf,extent, &l, &c); - if (i) { *ifid=get_l9_ifid(l,c); return i; } - i=v3_recognition_phase(3,sf,extent, &l, &c); - *ifid=NULL; - return i; -} - -static int32 claim_story_file(void *story, int32 extent) -{ - char *ifid=NULL; - if (get_l9_version((unsigned char *) story,extent, &ifid)) - if (ifid) return VALID_STORY_FILE_RV; - else return NO_REPLY_RV; - return INVALID_STORY_FILE_RV; -} - - - -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - char *ifid=NULL; - int i=get_l9_version((unsigned char *)story_file, extent, &ifid); - if (!i) return INVALID_STORY_FILE_RV; - if (ifid) - { - ASSERT_OUTPUT_SIZE((signed) strlen(ifid)+1); - strcpy(output,ifid); - return 1; - } - ASSERT_OUTPUT_SIZE(10); - sprintf(output,"LEVEL9-%d-",i); - return INCOMPLETE_REPLY_RV; -} diff --git a/babel/magscrolls.c b/babel/magscrolls.c deleted file mode 100644 index c21c922..0000000 --- a/babel/magscrolls.c +++ /dev/null @@ -1,124 +0,0 @@ -/* magscrolls.c Treaty of Babel module for Z-code files - * 2006 By L. Ross Raszewski - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file - * may render it noncompliant with the Treaty of Babel - */ - -#define FORMAT magscrolls -#define HOME_PAGE "http://www.if-legends.org/~msmemorial/memorial.htm" -#define FORMAT_EXT ".mag" -#define NO_COVER -#define NO_METADATA - -#include "treaty_builder.h" -#include -#include - -struct maginfo -{ - int gv; - char header[21]; - char *title; - int bafn; - int year; - char *ifid; - char *author; - char *meta; -}; - - -static struct maginfo manifest[] = { - { 0, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", - "The Pawn", - 0, - 1985, - "MAGNETIC-1", - "Rob Steggles", - }, - { 1, "\000\004\000\001\007\370\000\000\340\000\000\000\041\064\000\000\040\160\000\000", - "Guild of Thieves", - 0, - 1987, - "MAGNETIC-2", - "Rob Steggles", - }, - { 2, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000", - "Jinxter", - 0, - 1987, - "MAGNETIC-3", - "Georgina Sinclair and Michael Bywater", - }, - { 4, "\000\004\000\001\045\140\000\001\000\000\000\000\161\017\000\000\035\210\000\001", - "Corruption", - 0, - 1988, - "MAGNETIC-4", - "Rob Steggles and Hugh Steers", - }, - { 4, "\000\004\000\001\044\304\000\001\000\000\000\000\134\137\000\000\040\230\000\001", - "Fish!", - 0, - 1988, - "MAGNETIC-5", - "John Molloy, Pete Kemp, Phil South, Rob Steggles", - }, - { 4, "\000\003\000\000\377\000\000\000\340\000\000\000\221\000\000\000\036\000\000\001", - "Corruption", - 0, - 1988, - "MAGNETIC-4", - "Rob Steggles and Hugh Steers", - }, - { 4, "\000\003\000\001\000\000\000\000\340\000\000\000\175\000\000\000\037\000\000\001", - "Fish!", - 0, - 1988, - "MAGNETIC-5", - "John Molloy, Pete Kemp, Phil South, Rob Steggles", - }, - { 4, "\000\003\000\000\335\000\000\000\140\000\000\000\064\000\000\000\023\000\000\000", - "Myth", - 0, - 1989, - "MAGNETIC-6", - "Paul Findley", - }, - { 4, "\000\004\000\001\122\074\000\001\000\000\000\000\114\146\000\000\057\240\000\001", - "Wonderland", - 0, - 1990, - "MAGNETIC-7", - "David Bishop", - }, - { 0, "0", NULL, 0, 0, NULL, NULL } - }; - -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - int i; - unsigned char *sf=(unsigned char *)story_file; - if (extent < 42) return INVALID_STORY_FILE_RV; - - for(i=0;manifest[i].title;i++) - if ((sf[13]<3 && manifest[i].gv==sf[13]) || memcmp(manifest[i].header,sf+12,20)==0) - { - ASSERT_OUTPUT_SIZE(((int32) strlen(manifest[i].ifid)+1)); - strcpy(output,manifest[i].ifid); - return 1; - } - strcpy(output,"MAGNETIC-"); - return INCOMPLETE_REPLY_RV; -} - -static int32 claim_story_file(void *story_file, int32 extent) -{ - if (extent<42 || - memcmp(story_file,"MaSc",4) - ) return INVALID_STORY_FILE_RV; - return VALID_STORY_FILE_RV; -} - diff --git a/babel/md5.c b/babel/md5.c deleted file mode 100644 index c35d96c..0000000 --- a/babel/md5.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. - - This software is provided 'as-is', without any express 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. - - L. Peter Deutsch - ghost@aladdin.com - - */ -/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ -/* - Independent implementation of MD5 (RFC 1321). - - This code implements the MD5 Algorithm defined in RFC 1321, whose - text is available at - http://www.ietf.org/rfc/rfc1321.txt - The code is derived from the text of the RFC, including the test suite - (section A.5) but excluding the rest of Appendix A. It does not include - any code or documentation that is identified in the RFC as being - copyrighted. - - The original and principal author of md5.c is L. Peter Deutsch - . Other authors are noted in the change history - that follows (in reverse chronological order): - - 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order - either statically or dynamically; added missing #include - in library. - 2002-03-11 lpd Corrected argument list for main(), and added int return - type, in test program and T value program. - 2002-02-21 lpd Added missing #include in test program. - 2000-07-03 lpd Patched to eliminate warnings about "constant is - unsigned in ANSI C, signed in traditional"; made test program - self-checking. - 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. - 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). - 1999-05-03 lpd Original version. - */ - -#include "md5.h" -#include - -#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ -#ifdef ARCH_IS_BIG_ENDIAN -# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) -#else -# define BYTE_ORDER 0 -#endif - -#define T_MASK ((md5_word_t)~0) -#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) -#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) -#define T3 0x242070db -#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) -#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) -#define T6 0x4787c62a -#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) -#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) -#define T9 0x698098d8 -#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) -#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) -#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) -#define T13 0x6b901122 -#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) -#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) -#define T16 0x49b40821 -#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) -#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) -#define T19 0x265e5a51 -#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) -#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) -#define T22 0x02441453 -#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) -#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) -#define T25 0x21e1cde6 -#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) -#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) -#define T28 0x455a14ed -#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) -#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) -#define T31 0x676f02d9 -#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) -#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) -#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) -#define T35 0x6d9d6122 -#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) -#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) -#define T38 0x4bdecfa9 -#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) -#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) -#define T41 0x289b7ec6 -#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) -#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) -#define T44 0x04881d05 -#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) -#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) -#define T47 0x1fa27cf8 -#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) -#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) -#define T50 0x432aff97 -#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) -#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) -#define T53 0x655b59c3 -#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) -#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) -#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) -#define T57 0x6fa87e4f -#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) -#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) -#define T60 0x4e0811a1 -#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) -#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) -#define T63 0x2ad7d2bb -#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) - - -static void -md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) -{ - md5_word_t - a = pms->abcd[0], b = pms->abcd[1], - c = pms->abcd[2], d = pms->abcd[3]; - md5_word_t t; -#if BYTE_ORDER > 0 - /* Define storage only for big-endian CPUs. */ - md5_word_t X[16]; -#else - /* Define storage for little-endian or both types of CPUs. */ - md5_word_t xbuf[16]; - const md5_word_t *X; -#endif - - { -#if BYTE_ORDER == 0 - /* - * Determine dynamically whether this is a big-endian or - * little-endian machine, since we can use a more efficient - * algorithm on the latter. - */ - static const int w = 1; - - if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ -#endif -#if BYTE_ORDER <= 0 /* little-endian */ - { - /* - * On little-endian machines, we can process properly aligned - * data without copying it. - */ - if (!((data - (const md5_byte_t *)0) & 3)) { - /* data are properly aligned */ - X = (const md5_word_t *)data; - } else { - /* not aligned */ - memcpy(xbuf, data, 64); - X = xbuf; - } - } -#endif -#if BYTE_ORDER == 0 - else /* dynamic big-endian */ -#endif -#if BYTE_ORDER >= 0 /* big-endian */ - { - /* - * On big-endian machines, we must arrange the bytes in the - * right order. - */ - const md5_byte_t *xp = data; - int i; - -# if BYTE_ORDER == 0 - X = xbuf; /* (dynamic only) */ -# else -# define xbuf X /* (static only) */ -# endif - for (i = 0; i < 16; ++i, xp += 4) - xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); - } -#endif - } - -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - - /* Round 1. */ - /* Let [abcd k s i] denote the operation - a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ -#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + F(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 0, 7, T1); - SET(d, a, b, c, 1, 12, T2); - SET(c, d, a, b, 2, 17, T3); - SET(b, c, d, a, 3, 22, T4); - SET(a, b, c, d, 4, 7, T5); - SET(d, a, b, c, 5, 12, T6); - SET(c, d, a, b, 6, 17, T7); - SET(b, c, d, a, 7, 22, T8); - SET(a, b, c, d, 8, 7, T9); - SET(d, a, b, c, 9, 12, T10); - SET(c, d, a, b, 10, 17, T11); - SET(b, c, d, a, 11, 22, T12); - SET(a, b, c, d, 12, 7, T13); - SET(d, a, b, c, 13, 12, T14); - SET(c, d, a, b, 14, 17, T15); - SET(b, c, d, a, 15, 22, T16); -#undef SET - - /* Round 2. */ - /* Let [abcd k s i] denote the operation - a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ -#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + G(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 1, 5, T17); - SET(d, a, b, c, 6, 9, T18); - SET(c, d, a, b, 11, 14, T19); - SET(b, c, d, a, 0, 20, T20); - SET(a, b, c, d, 5, 5, T21); - SET(d, a, b, c, 10, 9, T22); - SET(c, d, a, b, 15, 14, T23); - SET(b, c, d, a, 4, 20, T24); - SET(a, b, c, d, 9, 5, T25); - SET(d, a, b, c, 14, 9, T26); - SET(c, d, a, b, 3, 14, T27); - SET(b, c, d, a, 8, 20, T28); - SET(a, b, c, d, 13, 5, T29); - SET(d, a, b, c, 2, 9, T30); - SET(c, d, a, b, 7, 14, T31); - SET(b, c, d, a, 12, 20, T32); -#undef SET - - /* Round 3. */ - /* Let [abcd k s t] denote the operation - a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ -#define H(x, y, z) ((x) ^ (y) ^ (z)) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + H(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 5, 4, T33); - SET(d, a, b, c, 8, 11, T34); - SET(c, d, a, b, 11, 16, T35); - SET(b, c, d, a, 14, 23, T36); - SET(a, b, c, d, 1, 4, T37); - SET(d, a, b, c, 4, 11, T38); - SET(c, d, a, b, 7, 16, T39); - SET(b, c, d, a, 10, 23, T40); - SET(a, b, c, d, 13, 4, T41); - SET(d, a, b, c, 0, 11, T42); - SET(c, d, a, b, 3, 16, T43); - SET(b, c, d, a, 6, 23, T44); - SET(a, b, c, d, 9, 4, T45); - SET(d, a, b, c, 12, 11, T46); - SET(c, d, a, b, 15, 16, T47); - SET(b, c, d, a, 2, 23, T48); -#undef SET - - /* Round 4. */ - /* Let [abcd k s t] denote the operation - a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ -#define I(x, y, z) ((y) ^ ((x) | ~(z))) -#define SET(a, b, c, d, k, s, Ti)\ - t = a + I(b,c,d) + X[k] + Ti;\ - a = ROTATE_LEFT(t, s) + b - /* Do the following 16 operations. */ - SET(a, b, c, d, 0, 6, T49); - SET(d, a, b, c, 7, 10, T50); - SET(c, d, a, b, 14, 15, T51); - SET(b, c, d, a, 5, 21, T52); - SET(a, b, c, d, 12, 6, T53); - SET(d, a, b, c, 3, 10, T54); - SET(c, d, a, b, 10, 15, T55); - SET(b, c, d, a, 1, 21, T56); - SET(a, b, c, d, 8, 6, T57); - SET(d, a, b, c, 15, 10, T58); - SET(c, d, a, b, 6, 15, T59); - SET(b, c, d, a, 13, 21, T60); - SET(a, b, c, d, 4, 6, T61); - SET(d, a, b, c, 11, 10, T62); - SET(c, d, a, b, 2, 15, T63); - SET(b, c, d, a, 9, 21, T64); -#undef SET - - /* Then perform the following additions. (That is increment each - of the four registers by the value it had before this block - was started.) */ - pms->abcd[0] += a; - pms->abcd[1] += b; - pms->abcd[2] += c; - pms->abcd[3] += d; -} - -void -md5_init(md5_state_t *pms) -{ - pms->count[0] = pms->count[1] = 0; - pms->abcd[0] = 0x67452301; - pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; - pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; - pms->abcd[3] = 0x10325476; -} - -void -md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) -{ - const md5_byte_t *p = data; - int left = nbytes; - int offset = (pms->count[0] >> 3) & 63; - md5_word_t nbits = (md5_word_t)(nbytes << 3); - - if (nbytes <= 0) - return; - - /* Update the message length. */ - pms->count[1] += nbytes >> 29; - pms->count[0] += nbits; - if (pms->count[0] < nbits) - pms->count[1]++; - - /* Process an initial partial block. */ - if (offset) { - int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); - - memcpy(pms->buf + offset, p, copy); - if (offset + copy < 64) - return; - p += copy; - left -= copy; - md5_process(pms, pms->buf); - } - - /* Process full blocks. */ - for (; left >= 64; p += 64, left -= 64) - md5_process(pms, p); - - /* Process a final partial block. */ - if (left) - memcpy(pms->buf, p, left); -} - -void -md5_finish(md5_state_t *pms, md5_byte_t digest[16]) -{ - static const md5_byte_t pad[64] = { - 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - md5_byte_t data[8]; - int i; - - /* Save the length before padding. */ - for (i = 0; i < 8; ++i) - data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); - /* Pad to 56 bytes mod 64. */ - md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); - /* Append the length. */ - md5_append(pms, data, 8); - for (i = 0; i < 16; ++i) - digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); -} diff --git a/babel/md5.h b/babel/md5.h deleted file mode 100644 index 698c995..0000000 --- a/babel/md5.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. - - This software is provided 'as-is', without any express 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. - - L. Peter Deutsch - ghost@aladdin.com - - */ -/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ -/* - Independent implementation of MD5 (RFC 1321). - - This code implements the MD5 Algorithm defined in RFC 1321, whose - text is available at - http://www.ietf.org/rfc/rfc1321.txt - The code is derived from the text of the RFC, including the test suite - (section A.5) but excluding the rest of Appendix A. It does not include - any code or documentation that is identified in the RFC as being - copyrighted. - - The original and principal author of md5.h is L. Peter Deutsch - . Other authors are noted in the change history - that follows (in reverse chronological order): - - 2002-04-13 lpd Removed support for non-ANSI compilers; removed - references to Ghostscript; clarified derivation from RFC 1321; - now handles byte order either statically or dynamically. - 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. - 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); - added conditionalization for C++ compilation from Martin - Purschke . - 1999-05-03 lpd Original version. - */ - -#ifndef md5_INCLUDED -# define md5_INCLUDED - -/* - * This package supports both compile-time and run-time determination of CPU - * byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be - * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is - * defined as non-zero, the code will be compiled to run only on big-endian - * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to - * run on either big- or little-endian CPUs, but will run slightly less - * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined. - */ - -typedef unsigned char md5_byte_t; /* 8-bit byte */ -typedef unsigned int md5_word_t; /* 32-bit word */ - -/* Define the state of the MD5 Algorithm. */ -typedef struct md5_state_s { - md5_word_t count[2]; /* message length in bits, lsw first */ - md5_word_t abcd[4]; /* digest buffer */ - md5_byte_t buf[64]; /* accumulate block */ -} md5_state_t; - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Initialize the algorithm. */ -void md5_init(md5_state_t *pms); - -/* Append a string to the message. */ -void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); - -/* Finish the message and return the digest. */ -void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); - -#ifdef __cplusplus -} /* end extern "C" */ -#endif - -#endif /* md5_INCLUDED */ diff --git a/babel/misc.c b/babel/misc.c deleted file mode 100644 index 982927f..0000000 --- a/babel/misc.c +++ /dev/null @@ -1,19 +0,0 @@ -/* misc.h : miscellany for babel - * This file is public domain - * 2006 by L. Ross Raszewski - */ - -#include -#include - -void *my_malloc(int size, char *rs) -{ - void *buf=calloc(size,1); - if (size && !buf) - { - fprintf(stderr,"Error: Memory exceeded (%d for %s)!\n",size,rs); - exit(2); - } - return buf; -} - diff --git a/babel/modules.h b/babel/modules.h deleted file mode 100644 index cc799ee..0000000 --- a/babel/modules.h +++ /dev/null @@ -1,70 +0,0 @@ -/* modules.h Declaration of treaty modules for the babel program - * (c) 2006 By L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends upon treaty.h and all the references treaty modules - * - * Persons wishing to add support for a new module to babel need only - * add a line in the form below. New modules should be positioned according - * to their popularity. If this file is being used in tandem with register.c - * (as it is in babel), then being dishonest about the popularity of an added - * system will make the program non-compliant with the treaty of Babel - * - * REGISTER_NAME is used as a placeholder for formats which are specified - * as existing by the treaty but for which no handler yet exists. - * remove the REGISTER_NAME for any format which has a registered treaty. - */ - - -#include "treaty.h" -#undef REGISTER_TREATY -#undef REGISTER_CONTAINER -#undef REGISTER_NAME -#ifdef TREATY_REGISTER -#ifdef CONTAINER_REGISTER -#ifdef FORMAT_REGISTER -#define REGISTER_TREATY(x) #x, -#define REGISTER_NAME(x) #x, -#define REGISTER_CONTAINER(x) -#else -#define REGISTER_TREATY(x) -#define REGISTER_CONTAINER(x) x##_treaty, -#define REGISTER_NAME(x) -#endif -#else -#define REGISTER_TREATY(x) x##_treaty, -#define REGISTER_CONTAINER(x) -#define REGISTER_NAME(x) -#endif -#else -#define REGISTER_TREATY(x) int32 x##_treaty(int32, void *, int32, void *, int32); -#define REGISTER_CONTAINER(x) int32 x##_treaty(int32, void *, int32, void *, int32); -#define REGISTER_NAME(x) -#endif - - -REGISTER_CONTAINER(blorb) -REGISTER_TREATY(zcode) -REGISTER_TREATY(glulx) -REGISTER_TREATY(tads2) -REGISTER_TREATY(tads3) -REGISTER_TREATY(hugo) -REGISTER_TREATY(alan) -REGISTER_TREATY(adrift) -REGISTER_TREATY(level9) -REGISTER_TREATY(agt) -REGISTER_TREATY(magscrolls) -REGISTER_TREATY(advsys) -REGISTER_TREATY(executable) - - - - diff --git a/babel/modules.h.gch b/babel/modules.h.gch deleted file mode 100644 index 99db82c4fbf76956c4563012e878f01626501a46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1528656 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≶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

`I9}7Mnd;&NI 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Ýo?$d)k;k;dmlX>7L>&yv12Rxj2 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 VZo%2Jx38V`y;X6D9eo(T{vXo1+aLe{ diff --git a/babel/register.c b/babel/register.c deleted file mode 100644 index 22bbed5..0000000 --- a/babel/register.c +++ /dev/null @@ -1,36 +0,0 @@ -/* register.c Register modules for the babel handler api - * - * 2006 by L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends on modules.h - * - * The purpose of this file is to create the treaty_registry array. - * This array is a null-terminated list of the known treaty modules. - */ - -#include -#include "modules.h" - - -TREATY treaty_registry[] = { - #define TREATY_REGISTER - #include "modules.h" - NULL - }; - -TREATY container_registry[] = { - #define CONTAINER_REGISTER - #include "modules.h" - NULL - -}; - diff --git a/babel/register_ifiction.c b/babel/register_ifiction.c deleted file mode 100644 index 55fe9e2..0000000 --- a/babel/register_ifiction.c +++ /dev/null @@ -1,29 +0,0 @@ -/* register_ifiction.c Register modules for babel's ifiction API - * - * 2006 by L. Ross Raszewski - * - * This code is freely usable for all purposes. - * - * This work is licensed under the Creative Commons Attribution2.5 License. - * To view a copy of this license, visit - * http://creativecommons.org/licenses/by/2.5/ or send a letter to - * Creative Commons, - * 543 Howard Street, 5th Floor, - * San Francisco, California, 94105, USA. - * - * This file depends on modules.h - * - * This version of register.c is stripped down to include only the - * needed functionality for the ifiction api - */ - -#include -#include "treaty.h" - -char *format_registry[] = { - #define TREATY_REGISTER - #define CONTAINER_REGISTER - #define FORMAT_REGISTER - #include "modules.h" - NULL -}; diff --git a/babel/tads.c b/babel/tads.c deleted file mode 100644 index bde1e5a..0000000 --- a/babel/tads.c +++ /dev/null @@ -1,1827 +0,0 @@ -/* - * tads.c - Treaty of Babel common functions for tads2 and tads3 modules - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file may - * render it noncompliant with the Treaty of Babel - * - * Modified - *. 04/08/2006 LRRaszewski - changed babel API calls to threadsafe versions - *. 04/08/2006 MJRoberts - initial implementation - */ - - -#include "treaty.h" -#include -#include -#include -#include -#include "tads.h" -#include "md5.h" - -#define ASSERT_OUTPUT_SIZE(x) \ - do { if (output_extent < (x)) return INVALID_USAGE_RV; } while (0) - -#define T2_SIGNATURE "TADS2 bin\012\015\032" -#define T3_SIGNATURE "T3-image\015\012\032" - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif - -/* ------------------------------------------------------------------------ */ -/* - * private structures - */ - -/* - * resource information structure - this encapsulates the location and size - * of a binary resource object embedded in a story file - */ -typedef struct resinfo resinfo; -struct resinfo -{ - /* pointer and length of the data in the story file buffer */ - const char *ptr; - int32 len; - - /* tads major version (currently, 2 or 3) */ - int tads_version; -}; - -/* - * Name/value pair list entry - */ -typedef struct valinfo valinfo; -struct valinfo -{ - const char *name; - size_t name_len; - - /* value string */ - char *val; - size_t val_len; - - /* next entry in the list */ - valinfo *nxt; -}; - - -/* ------------------------------------------------------------------------ */ -/* - * forward declarations - */ -static valinfo *parse_game_info(const void *story_file, int32 story_len, - int *version); -static int find_resource(const void *story_file, int32 story_len, - const char *resname, resinfo *info); -static int find_cover_art(const void *story_file, int32 story_len, - resinfo *resp, int32 *image_format, - int32 *width, int32 *height); -static int t2_find_res(const void *story_file, int32 story_len, - const char *resname, resinfo *info); -static int t3_find_res(const void *story_file, int32 story_len, - const char *resname, resinfo *info); -static valinfo *find_by_key(valinfo *list_head, const char *key); -static void delete_valinfo_list(valinfo *head); -static int32 generate_md5_ifid(void *story_file, int32 extent, - char *output, int32 output_extent); -static int32 synth_ifiction(valinfo *vals, int tads_version, - char *buf, int32 bufsize, - void *story_file, int32 extent); -static int get_png_dim(const void *img, int32 extent, - int32 *xout, int32 *yout); -static int get_jpeg_dim(const void *img, int32 extent, - int32 *xout, int32 *yout); - - - -/* ------------------------------------------------------------------------ */ -/* - * Get the IFID for a given story file. - */ -int32 tads_get_story_file_IFID(void *story_file, int32 extent, - char *output, int32 output_extent) -{ - valinfo *vals; - - /* if we have GameInfo, try looking for an IFID there */ - if ((vals = parse_game_info(story_file, extent, 0)) != 0) - { - valinfo *val; - int found = 0; - - /* find the "IFID" key */ - if ((val = find_by_key(vals, "IFID")) != 0) - { - char *p; - - /* copy the output as a null-terminated string */ - ASSERT_OUTPUT_SIZE((int32)val->val_len + 1); - memcpy(output, val->val, val->val_len); - output[val->val_len] = '\0'; - - /* - * count up the IFIDs in the buffer - there might be more than - * one, separated by commas - */ - for (found = 1, p = output ; *p != '\0' ; ++p) - { - /* if this is a comma, it delimits a new IFID */ - if (*p == ',') - ++found; - } - } - - /* delete the GameInfo list */ - delete_valinfo_list(vals); - - /* if we found an IFID, indicate how many results we found */ - if (found != 0) - return found; - } - - /* - * we didn't find an IFID in the GameInfo, so generate a default IFID - * using the MD5 method - */ - return generate_md5_ifid(story_file, extent, output, output_extent); -} - -/* - * Get the size of the ifiction metadata for the game - */ -int32 tads_get_story_file_metadata_extent(void *story_file, int32 extent) -{ - valinfo *vals; - int32 ret; - int ver; - - /* - * First, make sure we have a GameInfo record. If we don't, simply - * indicate that there's no metadata to fetch. - */ - if ((vals = parse_game_info(story_file, extent, &ver)) == 0) - return NO_REPLY_RV; - - /* - * Run the ifiction synthesizer with no output buffer, to calculate the - * size we need. - */ - ret = synth_ifiction(vals, ver, 0, 0, story_file, extent); - - /* delete the value list */ - delete_valinfo_list(vals); - - /* return the required size */ - return ret; -} - -/* - * Get the ifiction metadata for the game - */ -int32 tads_get_story_file_metadata(void *story_file, int32 extent, - char *buf, int32 bufsize) -{ - valinfo *vals; - int32 ret; - int ver; - - /* make sure we have metadata to fetch */ - if ((vals = parse_game_info(story_file, extent, &ver)) == 0) - return NO_REPLY_RV; - - /* synthesize the ifiction data into the output buffer */ - ret = synth_ifiction(vals, ver, buf, bufsize, story_file, extent); - - /* if that required more space than we had available, return an error */ - if (ret > bufsize) - ret = INVALID_USAGE_RV; - - /* delete the value list */ - delete_valinfo_list(vals); - - /* return the result */ - return ret; -} - -/* - * Get the size of the cover art - */ -int32 tads_get_story_file_cover_extent(void *story_file, int32 story_len) -{ - resinfo res; - - /* look for the cover art resource */ - if (find_cover_art(story_file, story_len, &res, 0, 0, 0)) - return res.len; - else - return NO_REPLY_RV; -} - -/* - * Get the format of the cover art - */ -int32 tads_get_story_file_cover_format(void *story_file, int32 story_len) -{ - int32 typ; - - /* look for CoverArt.jpg */ - if (find_cover_art(story_file, story_len, 0, &typ, 0, 0)) - return typ; - else - return NO_REPLY_RV; -} - -/* - * Get the cover art data - */ -int32 tads_get_story_file_cover(void *story_file, int32 story_len, - void *outbuf, int32 output_extent) -{ - resinfo res; - - /* look for CoverArt.jpg, then for CoverArt.png */ - if (find_cover_art(story_file, story_len, &res, 0, 0, 0)) - { - /* got it - copy the data to the buffer */ - ASSERT_OUTPUT_SIZE(res.len); - memcpy(outbuf, res.ptr, res.len); - - /* success */ - return res.len; - } - - /* otherwise, we didn't find it */ - return NO_REPLY_RV; -} - -/* ------------------------------------------------------------------------ */ -/* - * Generate a default IFID using the MD5 hash method - */ -static int32 generate_md5_ifid(void *story_file, int32 extent, - char *output, int32 output_extent) -{ - md5_state_t md5; - unsigned char md5_buf[16]; - char *p; - int i; - - /* calculate the MD5 hash of the story file */ - md5_init(&md5); - md5_append(&md5, story_file, extent); - md5_finish(&md5, md5_buf); - - /* make sure we have room to store the result */ - ASSERT_OUTPUT_SIZE(39); - - /* the prefix is "TADS2-" or "TADS3-", depending on the format */ - if (tads_match_sig(story_file, extent, T2_SIGNATURE)) - strcpy(output, "TADS2-"); - else - strcpy(output, "TADS3-"); - - /* the rest is the MD5 hash of the file, as hex digits */ - for (i = 0, p = output + strlen(output) ; i < 16 ; p += 2, ++i) - sprintf(p, "%02X", md5_buf[i]); - - /* indicate that we found one result */ - return 1; -} - -/* ------------------------------------------------------------------------ */ -/* - * Some UTF-8 utility functions and macros. We use our own rather than the - * ctype.h macros because we're parsing UTF-8 text. - */ - -/* is c a space? */ -#define u_isspace(c) ((unsigned char)(c) < 128 && isspace(c)) - -/* is c a horizontal space? */ -#define u_ishspace(c) (u_isspace(c) && (c) != '\n' && (c) != '\r') - -/* is-newline - matches \n, \r, and \u2028 */ -static int u_isnl(const char *p, int32 len) -{ - return (*p == '\n' - || *p == '\r' - || (len >= 3 - && *(unsigned char *)p == 0xe2 - && *(unsigned char *)(p+1) == 0x80 - && *(unsigned char *)(p+2) == 0xa8)); -} - -/* skip to the next utf-8 character */ -static void nextc(const char **p, int32 *len) -{ - /* skip the first byte */ - if (*len != 0) - ++*p, --*len; - - /* skip continuation bytes */ - while (*len != 0 && (**p & 0xC0) == 0x80) - ++*p, --*len; -} - -/* skip to the previous utf-8 character */ -static void prevc(const char **p, int32 *len) -{ - /* move back one byte */ - --*p, ++*len; - - /* keep skipping as long as we're looking at continuation characters */ - while ((**p & 0xC0) == 0x80) - --*p, ++*len; -} - -/* - * Skip a newline sequence. Skips all common conventions, including \n, - * \r, \n\r, \r\n, and \u2028. - */ -static void skip_newline(const char **p, int32 *rem) -{ - /* make sure we have something to skip */ - if (*rem == 0) - return; - - /* check what we have */ - switch (**(const unsigned char **)p) - { - case '\n': - /* skip \n or \n\r */ - nextc(p, rem); - if (**p == '\r') - nextc(p, rem); - break; - - case '\r': - /* skip \r or \r\n */ - nextc(p, rem); - if (**p == '\n') - nextc(p, rem); - break; - - case 0xe2: - /* \u2028 (unicode line separator) - just skip the one character */ - nextc(p, rem); - break; - } -} - -/* - * Skip to the next line - */ -static void skip_to_next_line(const char **p, int32 *rem) -{ - /* look for the next newline */ - for ( ; *rem != 0 ; nextc(p, rem)) - { - /* if this is a newline of some kind, we're at the end of the line */ - if (u_isnl(*p, *rem)) - { - /* skip the newline, and we're done */ - skip_newline(p, rem); - break; - } - } -} - - -/* ------------------------------------------------------------------------ */ -/* - * ifiction synthesizer output context - */ -typedef struct synthctx synthctx; -struct synthctx -{ - /* the current output pointer */ - char *buf; - - /* the number of bytes remaining in the output buffer */ - int32 buf_size; - - /* - * the total number of bytes needed for the output (this might be more - * than we've actually written, since we count up the bytes required - * even if we need more space than the buffer provides) - */ - int32 total_size; - - /* the head of the name/value pair list from the parsed GameInfo */ - valinfo *vals; -}; - -/* initialize a synthesizer context */ -static void init_synthctx(synthctx *ctx, char *buf, int32 bufsize, - valinfo *vals) -{ - /* set up at the beginning of the output buffer */ - ctx->buf = buf; - ctx->buf_size = bufsize; - - /* we haven't written anything to the output buffer yet */ - ctx->total_size = 0; - - /* remember the name/value pair list */ - ctx->vals = vals; -} - -/* - * Write out a chunk to a synthesized ifiction record, updating pointers - * and counters. We won't copy past the end of the buffer, but we'll - * continue counting the output length needed in any case. - */ -static void write_ifiction(synthctx *ctx, const char *src, size_t srclen) -{ - int32 copy_len; - - /* copy as much as we can, up to the remaining buffer size */ - copy_len = srclen; - if (copy_len > ctx->buf_size) - copy_len = ctx->buf_size; - - /* do the copying, if any */ - if (copy_len != 0) - { - /* copy the bytes */ - memcpy(ctx->buf, src, (size_t)copy_len); - - /* adjust the buffer pointer and output buffer size remaining */ - ctx->buf += copy_len; - ctx->buf_size -= copy_len; - } - - /* count this source data in the total size */ - ctx->total_size += srclen; -} - -/* write a null-terminated chunk to the synthesized ifiction record */ -static void write_ifiction_z(synthctx *ctx, const char *src) -{ - write_ifiction(ctx, src, strlen(src)); -} - -/* - * Write a PCDATA string to the synthesized ifiction record. In - * particular, we rewrite '<', '>', and '&' as '<', '>', and '&', - * respectively; we trim off leading and trailing spaces; and we compress - * each run of whitespace down to a single \u0020 (' ') character. - */ -static void write_ifiction_pcdata(synthctx *ctx, const char *p, size_t len) -{ - /* first, skip any leading whitespace */ - for ( ; len != 0 && u_ishspace(*p) ; ++p, --len) ; - - /* keep going until we run out of string */ - for (;;) - { - const char *start; - - /* scan to the next whitespace or markup-significant character */ - for (start = p ; - len != 0 && !u_ishspace(*p) - && *p != '<' && *p != '>' && *p != '&' ; ++p, --len) ; - - /* write the part up to here */ - if (p != start) - write_ifiction(ctx, start, p - start); - - /* if we've reached the end of the string, we can stop */ - if (len == 0) - break; - - /* check what stopped us */ - switch (*p) - { - case '<': - write_ifiction_z(ctx, "<"); - ++p, --len; - break; - - case '>': - write_ifiction_z(ctx, ">"); - ++p, --len; - break; - - case '&': - write_ifiction_z(ctx, "&"); - ++p, --len; - break; - - default: - /* - * The only other thing that could have stopped us is - * whitespace. Skip all consecutive whitespace. - */ - for ( ; len != 0 && u_ishspace(*p) ; ++p, --len); - - /* - * if that's not the end of the string, replace the run of - * whitespace with a single space character in the output; if - * we've reached the end of the string, we don't even want to - * do that, since we want to trim off trailing spaces - */ - if (len != 0) - write_ifiction_z(ctx, " "); - break; - } - } -} - -/* - * Translate a GameInfo keyed value to the corresponding ifiction tagged - * value. We find the GameInfo value keyed by 'gameinfo_key', and write - * out the same string under the ifiction XML tag 'ifiction_tag'. We write - * a complete XML container sequence - value. - * - * If the given GameInfo key doesn't exist, we use the default value string - * 'dflt', if given. If the GameInfo key doesn't exist and 'dflt' is null, - * we don't write anything - we don't even write the open/close tags. - * - * If 'html' is true, we assume the value is in html format, and we write - * it untranslated. Otherwise, we write it as PCDATA, translating markup - * characters into '&' entities and compressing whitespace. - */ -static void write_ifiction_xlat_base(synthctx *ctx, int indent, - const char *gameinfo_key, - const char *ifiction_tag, - const char *dflt, int html) -{ - valinfo *val; - const char *valstr; - size_t vallen; - - /* look up the GameInfo key */ - if ((val = find_by_key(ctx->vals, gameinfo_key)) != 0) - { - /* we found the GameInfo value - use it */ - valstr = val->val; - vallen = val->val_len; - } - else if (dflt != 0) - { - /* the GameInfo value doesn't exist, but we have a default - use it */ - valstr = dflt; - vallen = strlen(dflt); - } - else - { - /* there's no GameInfo value and no default, so write nothing */ - return; - } - - /* write the indentation */ - while (indent != 0) - { - static const char spaces[] = " "; - size_t cur; - - /* figure how much we can write on this round */ - cur = indent; - if (cur > sizeof(spaces) - 1) - cur = sizeof(spaces) - 1; - - /* write it */ - write_ifiction(ctx, spaces, cur); - - /* deduct it from the amount remaining */ - indent -= cur; - } - - /* write the open tag */ - write_ifiction_z(ctx, "<"); - write_ifiction_z(ctx, ifiction_tag); - write_ifiction_z(ctx, ">"); - - /* write the value, applying pcdata translations */ - if (html) - write_ifiction(ctx, valstr, vallen); - else - write_ifiction_pcdata(ctx, valstr, vallen); - - /* write the close tag */ - write_ifiction_z(ctx, "\n"); -} - -#define write_ifiction_xlat(ctx, indent, gikey, iftag, dflt) \ - write_ifiction_xlat_base(ctx, indent, gikey, iftag, dflt, FALSE) - -#define write_ifiction_xlat_html(ctx, indent, gikey, iftag, dflt) \ - write_ifiction_xlat_base(ctx, indent, gikey, iftag, dflt, TRUE) - - -/* - * Retrieve the next author name from the GameInfo "Author" format. The - * format is as follows: - * - * name ... ; ... - * - * That is, each author is listed with a name followed by one or more email - * addresses in angle brackets, and multiple authors are separated by - * semicolons. - */ -static int scan_author_name(const char **p, size_t *len, - const char **start, const char **end) -{ - /* keep going until we find a non-empty author name */ - for (;;) - { - /* skip leading spaces */ - for ( ; *len != 0 && u_ishspace(**p) ; ++*p, --*len) ; - - /* if we ran out of string, there's definitely no author name */ - if (*len == 0) - return FALSE; - - /* - * Find the end of this author name. The author name ends at the - * next semicolon or angle bracket. - */ - for (*start = *p ; *len != 0 && **p != ';' && **p != '<' ; - ++*p, --*len) ; - - /* trim off any trailing spaces */ - for (*end = *p ; *end > *start && u_ishspace(*(*end - 1)) ; --*end) ; - - /* now skip any email addresses */ - while (*len != 0 && **p == '<') - { - /* skip to the closing bracket */ - for (++*p, --*len ; *len != 0 && **p != '>' ; ++*p, --*len) ; - - /* skip the bracket */ - if (*len != 0) - ++*p, --*len; - - /* skip whitespace */ - for ( ; *len != 0 && u_ishspace(**p) ; ++*p, --*len) ; - - /* - * if we're not at a semicolon, another angle bracket, or the - * end of the string, it's a syntax error - */ - if (*len != 0 && **p != '<' && **p != ';') - { - *len = 0; - return FALSE; - } - } - - /* if we're at a semicolon, skip it */ - if (*len != 0 && **p == ';') - ++*p, --*len; - - /* - * if we found a non-empty name, return it; otherwise, continue on - * to the next semicolon section - */ - if (*end != *start) - return TRUE; - } -} - - -/* - * Synthesize an ifiction record for the given GameInfo name/value pair - * list. Returns the number of bytes required for the result, including - * null termination. We'll copy as much as we can to the output buffer, up - * to bufsize; if the buffer size is insufficient to hold the result, we'll - * still indicate the length needed for the full result, but we're careful - * not to actually copy anything past the end of the buffer. - */ -static int32 synth_ifiction(valinfo *vals, int tads_version, - char *buf, int32 bufsize, - void *story_file, int32 extent) -{ - char default_ifid[TREATY_MINIMUM_EXTENT]; - valinfo *ifid = find_by_key(vals, "IFID"); - const char *ifid_val; - size_t ifid_len; - valinfo *author = find_by_key(vals, "AuthorEmail"); - valinfo *url = find_by_key(vals, "Url"); - synthctx ctx; - const char *p; - size_t rem; - int32 art_fmt; - int32 art_wid, art_ht; - - /* initialize the output content */ - init_synthctx(&ctx, buf, bufsize, vals); - - /* make sure the tads version is one we know how to handle */ - if (tads_version != 2 && tads_version != 3) - return NO_REPLY_RV; - - /* - * The IFID is mandatory. If there's not an IFID specifically listed - * in the GameInfo, we need to generate the default IFID based on the - * MD5 hash of the game file. - */ - if (ifid != 0) - { - /* use the explicit IFID(s) listed in the GameInfo */ - ifid_val = ifid->val; - ifid_len = ifid->val_len; - } - else - { - /* generate the default IFID */ - generate_md5_ifid(story_file, extent, - default_ifid, TREATY_MINIMUM_EXTENT); - - /* use this as the IFID */ - ifid_val = default_ifid; - ifid_len = strlen(default_ifid); - } - - /* write the header, and start the section */ - write_ifiction_z( - &ctx, - "\n" - "\n" - " \n" - " \n" - " \n" - " Babel\n" - " " TREATY_VERSION "\n" - " 2006-04-14\n" - " \n" - " \n"); - - /* write each IFID (there might be several) */ - for (p = ifid_val, rem = ifid_len ; rem != 0 ; ) - { - const char *start; - const char *end; - - /* skip leading spaces */ - for ( ; rem != 0 && u_ishspace(*p) ; ++p, --rem) ; - - /* find the end of this IFID */ - for (start = p ; rem != 0 && *p != ',' ; ++p, --rem) ; - - /* remove trailing spaces */ - for (end = p ; end > start && u_ishspace(*(end-1)) ; --end) ; - - /* if we found one, write it out */ - if (end != start) - { - write_ifiction_z(&ctx, " "); - write_ifiction(&ctx, start, end - start); - write_ifiction_z(&ctx, "\n"); - } - - /* skip the comma */ - if (rem != 0 && *p == ',') - ++p, --rem; - } - - /* add the format information */ - write_ifiction_z(&ctx, - tads_version == 2 - ? " tads2\n" - : " tads3\n"); - - /* close the section and start the */ - write_ifiction_z(&ctx, - " \n" - " \n"); - - /* write the various bibliographic data */ - write_ifiction_xlat(&ctx, 6, "Name", "title", "An Interactive Fiction"); - write_ifiction_xlat(&ctx, 6, "Headline", "headline", 0); - write_ifiction_xlat(&ctx, 6, "Desc", "description", 0); - write_ifiction_xlat(&ctx, 6, "Genre", "genre", 0); - write_ifiction_xlat(&ctx, 6, "Forgiveness", "forgiveness", 0); - write_ifiction_xlat(&ctx, 6, "Series", "series", 0); - write_ifiction_xlat(&ctx, 6, "SeriesNumber", "seriesnumber", 0); - write_ifiction_xlat(&ctx, 6, "Language", "language", 0); - write_ifiction_xlat(&ctx, 6, "FirstPublished", "firstpublished", 0); - - /* if there's an author, write the list of author names */ - if (author != 0) - { - int cnt; - int i; - const char *start; - const char *end; - - /* start the tag */ - write_ifiction_z(&ctx, " "); - - /* - * first, count up the number of authors - authors are separated by - * semicolons, so there's one more author than there are semicolons - */ - for (p = author->val, rem = author->val_len, cnt = 1 ; - scan_author_name(&p, &rem, &start, &end) ; ) ; - - /* - * Now generate the list of authors. If there are multiple - * authors, use commas to separate them. - */ - for (p = author->val, rem = author->val_len, i = 0 ; ; ++i) - { - /* scan this author's name */ - if (!scan_author_name(&p, &rem, &start, &end)) - break; - - /* write out this author name */ - write_ifiction_pcdata(&ctx, start, end - start); - - /* if there's another name to come, write a separator */ - if (i + 1 < cnt) - { - /* - * write just "and" to separate two items; write "," - * between items in lists of more than two, with ",and" - * between the last two items - */ - write_ifiction_z(&ctx, - cnt == 2 ? " and " : - i + 2 < cnt ? ", " : ", and "); - } - } - - /* end the tag */ - write_ifiction_z(&ctx, "\n"); - } - - /* end the biblio section */ - write_ifiction_z(&ctx, " \n"); - - /* if there's cover art, add its information */ - if (find_cover_art(story_file, extent, 0, &art_fmt, &art_wid, &art_ht) - && (art_fmt == PNG_COVER_FORMAT || art_fmt == JPEG_COVER_FORMAT)) - { - char buf[200]; - - sprintf(buf, - " \n" - " %s\n" - " %lu\n" - " %lu\n" - " \n", - art_fmt == PNG_COVER_FORMAT ? "png" : "jpg", - (long)art_ht, (long)art_wid); - - write_ifiction_z(&ctx, buf); - } - - /* if there's an author email, include it */ - if (author != 0 || url != 0) - { - const char *p; - size_t rem; - int i; - - /* open the section */ - write_ifiction_z(&ctx, " \n"); - - /* add the author email, if provided */ - if (author != 0) - { - /* write the email list */ - for (i = 0, p = author->val, rem = author->val_len ; ; ++i) - { - const char *start; - - /* skip to the next email address */ - for ( ; rem != 0 && *p != '<' ; ++p, --rem) ; - - /* if we didn't find an email address, we're done */ - if (rem == 0) - break; - - /* find the matching '>' */ - for (++p, --rem, start = p ; rem != 0 && *p != '>' ; - ++p, --rem) ; - - /* - * if this is the first one, open the section; otherwise, - * add a comma - */ - if (i == 0) - write_ifiction_z(&ctx, " "); - else - write_ifiction_z(&ctx, ","); - - /* write this address */ - write_ifiction(&ctx, start, p - start); - - /* - * skip the closing bracket, if there is one; if we're out - * of string, we're done - */ - if (rem != 0) - ++p, --rem; - else - break; - } - - /* if we found any emails to write, end the section */ - if (i != 0) - write_ifiction_z(&ctx, "\n"); - } - - /* if there's a URL, add it */ - if (url != 0) - { - write_ifiction_z(&ctx, " "); - write_ifiction(&ctx, url->val, url->val_len); - write_ifiction_z(&ctx, "\n"); - } - - /* close the section */ - write_ifiction_z(&ctx, " \n"); - } - - /* add the tads-specific section */ - write_ifiction_z(&ctx, " \n"); - - write_ifiction_xlat(&ctx, 6, "Version", "version", 0); - write_ifiction_xlat(&ctx, 6, "ReleaseDate", "releasedate", 0); - write_ifiction_xlat(&ctx, 6, "PresentationProfile", - "presentationprofile", 0); - write_ifiction_xlat(&ctx, 6, "Byline", "byline", 0); - - write_ifiction_z(&ctx, " \n"); - - /* close the story section and the main body */ - write_ifiction_z(&ctx, " \n\n"); - - /* add the null terminator */ - write_ifiction(&ctx, "", 1); - - /* return the total output size */ - return ctx.total_size; -} - -/* ------------------------------------------------------------------------ */ -/* - * Check a data block to see if it starts with the given signature. - */ -int tads_match_sig(const void *buf, int32 len, const char *sig) -{ - /* note the length of the signature string */ - size_t sig_len = strlen(sig); - - /* if matches if the buffer starts with the signature string */ - return (len >= (int32)sig_len && memcmp(buf, sig, sig_len) == 0); -} - - -/* ------------------------------------------------------------------------ */ -/* - * portable-to-native format conversions - */ -#define osbyte(p, ofs) \ - (*(((unsigned char *)(p)) + (ofs))) - -#define osrp1(p) \ - ((unsigned int)osbyte(p, 0)) - -#define osrp2(p) \ - ((unsigned int)osbyte(p, 0) \ - + ((unsigned int)osbyte(p, 1) << 8)) - -#define osrp4(p) \ - (((unsigned long)osbyte(p, 0)) \ - + (((unsigned long)osbyte(p, 1)) << 8) \ - + (((unsigned long)osbyte(p, 2)) << 16) \ - + (((unsigned long)osbyte(p, 3)) << 24)) - - -/* ------------------------------------------------------------------------ */ -/* - * Parse a game file and retrieve the GameInfo data. Returns the head of a - * linked list of valinfo entries. - */ -static valinfo *parse_game_info(const void *story_file, int32 story_len, - int *tads_version) -{ - resinfo res; - const char *p; - int32 rem; - valinfo *val_head = 0; - - /* - * first, find the GameInfo resource - if it's not there, there's no - * game information to parse - */ - if (!find_resource(story_file, story_len, "GameInfo.txt", &res)) - return 0; - - /* if the caller wants the TADS version number, hand it back */ - if (tads_version != 0) - *tads_version = res.tads_version; - - /* parse the data */ - for (p = res.ptr, rem = res.len ; rem != 0 ; ) - { - const char *name_start; - size_t name_len; - const char *val_start; - valinfo *val; - const char *inp; - int32 inlen; - char *outp; - - /* skip any leading whitespace */ - while (rem != 0 && u_isspace(*p)) - ++p, --rem; - - /* if the line starts with '#', it's a comment, so skip it */ - if (rem != 0 && *p == '#') - { - skip_to_next_line(&p, &rem); - continue; - } - - /* we must have the start of a name - note it */ - name_start = p; - - /* skip ahead to a space or colon */ - while (rem != 0 && *p != ':' && !u_ishspace(*p)) - nextc(&p, &rem); - - /* note the length of the name */ - name_len = p - name_start; - - /* skip any whitespace before the presumed colon */ - while (rem != 0 && u_ishspace(*p)) - nextc(&p, &rem); - - /* if we're not at a colon, the line is ill-formed, so skip it */ - if (rem == 0 || *p != ':') - { - /* skip the entire line, and go back for the next one */ - skip_to_next_line(&p, &rem); - continue; - } - - /* skip the colon and any whitespace immediately after it */ - for (nextc(&p, &rem) ; rem != 0 && u_ishspace(*p) ; nextc(&p, &rem)) ; - - /* note where the value starts */ - val_start = p; - - /* - * Scan the value to get its length. The value runs from here to - * the next newline that's not followed immediately by a space. - */ - while (rem != 0) - { - const char *nl; - int32 nlrem; - - /* skip to the next line */ - skip_to_next_line(&p, &rem); - - /* if we're at eof, we can stop now */ - if (rem == 0) - break; - - /* note where this line starts */ - nl = p; - nlrem = rem; - - /* - * if we're at a non-whitespace character, it's definitely not - * a continuation line - */ - if (!u_ishspace(*p)) - break; - - /* - * check for spaces followed by a non-space character - this - * would signify a continuation line - */ - for ( ; rem != 0 && u_ishspace(*p) ; nextc(&p, &rem)) ; - if (rem == 0 || u_isnl(p, rem)) - { - /* - * we're at end of file, we found a line with nothing but - * whitespace, so this isn't a continuation line; go back - * to the start of this line and end the value here - */ - p = nl; - rem = nlrem; - break; - } - - /* - * We found whitespace followed by non-whitespace, so this is a - * continuation line. Keep going for now. - */ - } - - /* remove any trailing newlines */ - while (p > val_start) - { - /* move back one character */ - prevc(&p, &rem); - - /* - * if it's a newline, keep going; otherwise, keep this - * character and stop trimming - */ - if (!u_isnl(p, rem)) - { - nextc(&p, &rem); - break; - } - } - - /* - * Allocate a new value entry. Make room for the entry itself plus - * a copy of the value. We don't need to make a copy of the name, - * since we can just use the original copy from the story file - * buffer. We do need a copy of the value because we might need to - * transform it slightly, to remove newlines and leading spaces on - * continuation lines. - */ - val = (valinfo *)malloc(sizeof(valinfo) + (p - val_start)); - - /* link it into our list */ - val->nxt = val_head; - val_head = val; - - /* point the name directly to the name in the buffer */ - val->name = name_start; - val->name_len = name_len; - - /* point the value to the space allocated along with the valinfo */ - val->val = (char *)(val + 1); - - /* store the name, removing newlines and continuation-line spaces */ - for (outp = val->val, inp = val_start, inlen = p - val_start ; - inlen != 0 ; ) - { - const char *l; - - /* find the next newline */ - for (l = inp ; inlen != 0 && !u_isnl(inp, inlen) ; - nextc(&inp, &inlen)) ; - - /* copy this line to the output */ - memcpy(outp, l, inp - l); - outp += inp - l; - - /* if we're out of input, we're done */ - if (inlen == 0) - break; - - /* we're at a newline: replace it with a space in the output */ - *outp++ = ' '; - - /* skip the newline and subsequent whitespace in the input */ - for (skip_newline(&inp, &inlen) ; - inlen != 0 && u_ishspace(*inp) ; nextc(&inp, &inlen)) ; - } - - /* set the length of the parsed value */ - val->val_len = outp - val->val; - - /* skip to the next line and continue parsing */ - skip_to_next_line(&p, &rem); - } - - /* return the head of the linked list of value entries */ - return val_head; -} -static int my_memicmp(const void *aa, const void *bb, int l) -{ - int s=0,i; - char *a=(char *) aa; - char *b=(char *) bb; - for(i=0;inxt) - { - /* if this one matches the key we're looking for, return it */ - if (p->name_len == key_len && my_memicmp(p->name, key, key_len) == 0) - return p; - } - - /* no luck */ - return 0; -} - -/* ------------------------------------------------------------------------ */ -/* - * Delete a valinfo list obtained from parse_game_info() - */ -static void delete_valinfo_list(valinfo *head) -{ - /* keep going until we run out of entries */ - while (head != 0) - { - /* remember the next entry, before we delete this one */ - valinfo *nxt = head->nxt; - - /* delete this one */ - free(head); - - /* move on to the next one */ - head = nxt; - } -} - -/* ------------------------------------------------------------------------ */ -/* - * Find the cover art resource. We'll look for CoverArt.jpg and - * CoverArt.png, in that order. - */ -static int find_cover_art(const void *story_file, int32 story_len, - resinfo *resp, int32 *image_format, - int32 *width, int32 *height) -{ - resinfo res; - int32 x, y; - - /* if they didn't want the resource info, provide a placeholder */ - if (resp == 0) - resp = &res; - - /* look for CoverArt.jpg first */ - if (find_resource(story_file, story_len, "CoverArt.jpg", resp)) - { - /* get the width and height */ - if (!get_jpeg_dim(resp->ptr, resp->len, &x, &y)) - return FALSE; - - /* hand back the width and height if it was requested */ - if (width != 0) - *width = x; - if (height != 0) - *height = y; - - /* tell them it's a JPEG image */ - if (image_format != 0) - *image_format = JPEG_COVER_FORMAT; - - /* indicate success */ - return TRUE; - } - - /* look for CoverArt.png second */ - if (find_resource(story_file, story_len, "CoverArt.png", resp)) - { - /* get the width and height */ - if (!get_png_dim(resp->ptr, resp->len, &x, &y)) - return FALSE; - - /* hand back the width and height if it was requested */ - if (width != 0) - *width = x; - if (height != 0) - *height = y; - - /* tell them it's a PNG image */ - if (image_format != 0) - *image_format = PNG_COVER_FORMAT; - - /* indicate success */ - return TRUE; - } - - /* didn't find it */ - return FALSE; -} - -/* ------------------------------------------------------------------------ */ -/* - * Find a resource in a TADS 2 or 3 story file that's been loaded into - * memory. On success, fills in the offset and size of the resource and - * returns TRUE; if the resource isn't found, returns FALSE. - */ -static int find_resource(const void *story_file, int32 story_len, - const char *resname, resinfo *info) -{ - /* if there's no file, there's no resource */ - if (story_file == 0) - return FALSE; - - /* check for tads 2 */ - if (tads_match_sig(story_file, story_len, T2_SIGNATURE)) - { - info->tads_version = 2; - return t2_find_res(story_file, story_len, resname, info); - } - - /* check for tads 3 */ - if (tads_match_sig(story_file, story_len, T3_SIGNATURE)) - { - info->tads_version = 3; - return t3_find_res(story_file, story_len, resname, info); - } - - /* it's not one of ours */ - return FALSE; -} - -/* ------------------------------------------------------------------------ */ -/* - * Find a resource in a tads 2 game file - */ -static int t2_find_res(const void *story_file, int32 story_len, - const char *resname, resinfo *info) -{ - const char *basep = (const char *)story_file; - const char *endp = basep + story_len; - const char *p; - size_t resname_len; - - /* note the length of the name we're seeking */ - resname_len = strlen(resname); - - /* - * skip past the tads 2 file header (13 bytes for the signature, 7 - * bytes for the version header, 2 bytes for the flags, 26 bytes for - * the timestamp) - */ - p = basep + 13 + 7 + 2 + 26; - - /* - * scan the sections in the file; stop on $EOF, and skip everything - * else but HTMLRES, which is the section type that - */ - while (p < endp) - { - unsigned long endofs; - - /* - * We're pointing to a section block header, which looks like this: - * - *. type-length - *. type-name - *. next-section-address - */ - - /* read the ending offset */ - endofs = osrp4(p + 1 + osrp1(p)); - - /* check the type */ - if (p[0] == 7 && memcmp(p + 1, "HTMLRES", 7) == 0) - { - unsigned long found_ofs; - int found; - unsigned long entry_cnt; - - /* we haven't found the resource yet */ - found = FALSE; - - /* - * It's a multimedia resource block. Skip the section block - * header and look at the index table - the index table - * consists of a uint32 giving the number of entries, followed - * by a reserved uint32, followed by the entries. - */ - p += 12; - entry_cnt = osrp4(p); - - /* skip to the first index entry */ - p += 8; - - /* scan the index entries */ - for ( ; entry_cnt != 0 ; --entry_cnt) - { - unsigned long res_ofs; - unsigned long res_siz; - size_t name_len; - - /* - * We're at the next index entry, which looks like this: - * - *. resource-address (bytes from end of index) - *. resource-length (in bytes) - *. name-length - *. name - */ - res_ofs = osrp4(p); - res_siz = osrp4(p + 4); - name_len = osrp2(p + 8); - p += 10; - - /* check for a match to the name we're looking for */ - if (name_len == resname_len - && my_memicmp(resname, p, name_len) == 0) - { - /* - * it's the one we want - note its resource location - * and size, but keep scanning for now, since we need - * to find the end of the index before we'll know where - * the actual resources begin - */ - found = TRUE; - found_ofs = res_ofs; - info->len = res_siz; - } - - /* skip this one's name */ - p += name_len; - } - - /* - * if we found our resource, the current seek position is the - * base of the offset we found in the directory; so we can - * finally fix up the offset to give the actual file location - * and return the result - */ - if (found) - { - /* fix up the offset with the actual file location */ - info->ptr = p + found_ofs; - - /* tell the caller we found it */ - return TRUE; - } - } - else if (p[0] == 4 && memcmp(p + 1, "$EOF", 4) == 0) - { - /* - * that's the end of the file - we've finished without finding - * the resource, so return failure - */ - return FALSE; - } - - /* move to the next section */ - p = basep + endofs; - } - - /* - * reached EOF without an $EOF marker - file must be corrupted; return - * 'not found' - */ - return FALSE; -} - -/* ------------------------------------------------------------------------ */ -/* - * Find a resource in a T3 image file - */ -static int t3_find_res(const void *story_file, int32 story_len, - const char *resname, resinfo *info) -{ - const char *basep = (const char *)story_file; - const char *endp = basep + story_len; - const char *p; - size_t resname_len; - - /* note the length of the name we're seeking */ - resname_len = strlen(resname); - - /* - * skip the file header - 11 bytes for the signature, 2 bytes for the - * format version, 32 reserved bytes, and 24 bytes for the timestamp - */ - p = basep + 11 + 2 + 32 + 24; - - /* scan the data blocks */ - while (p < endp) - { - unsigned long siz; - - /* - * We're at the next block header, which looks like this: - * - *. type-name - *. block-size - *. flags - */ - - /* get the block size */ - siz = osrp4(p + 4); - - /* check the type */ - if (memcmp(p, "MRES", 4) == 0) - { - unsigned int entry_cnt; - unsigned int i; - const char *blockp; - - /* skip the header */ - p += 10; - - /* - * remember the location of the base of the block - the data - * seek location for each index entry is given as an offset - * from this location - */ - blockp = p; - - /* the first thing in the table is the number of entries */ - entry_cnt = osrp2(p); - p += 2; - - /* read the entries */ - for (i = 0 ; i < entry_cnt ; ++i) - { - unsigned long entry_ofs; - unsigned long entry_siz; - size_t entry_name_len; - char namebuf[256]; - char *xp; - size_t xi; - - /* - * Parse this index entry: - * - *. address (as offset from the block base) - *. size (in bytes) - *. name-length - *. name (all bytes XORed with 0xFF) - */ - entry_ofs = osrp4(p); - entry_siz = osrp4(p + 4); - entry_name_len = (unsigned char)p[8]; - - /* unmask the name */ - memcpy(namebuf, p + 9, resname_len); - for (xi = resname_len, xp = namebuf ; xi != 0 ; --xi) - *xp++ ^= 0xFF; - - /* if this is the one we're looking for, return it */ - if (entry_name_len == resname_len - && my_memicmp(resname, namebuf, resname_len) == 0) - { - /* - * fill in the return information - note that the entry - * offset given in the header is an offset from data - * block's starting location, so fix this up to an - * absolute seek location for the return value - */ - info->ptr = blockp + entry_ofs; - info->len = entry_siz; - - /* return success */ - return TRUE; - } - - /* skip this entry (header + name length) */ - p += 9 + entry_name_len; - } - - /* - * if we got this far, we didn't find the name; so skip past - * the MRES section by adding the section length to the base - * pointer, and resume the main file scan - */ - p = blockp + siz; - } - else if (memcmp(p, "EOF ", 4) == 0) - { - /* - * end of file - we've finished without finding the resource, - * so return failure - */ - return FALSE; - } - else - { - /* - * we don't care about anything else - just skip this block and - * keep going; to skip the block, simply seek ahead past the - * block header and then past the block's contents, using the - * size given the in block header - */ - p += siz + 10; - } - } - - /* - * reached EOF without an EOF marker - file must be corrupted; return - * 'not found' - */ - return FALSE; -} - -/* ------------------------------------------------------------------------ */ -/* - * JPEG and PNG information extraction (based on the versions in - * babel_story_functions.c) - */ -static int get_jpeg_dim(const void *img, int32 extent, - int32 *xout, int32 *yout) -{ - const unsigned char *dp=(const unsigned char *) img; - const unsigned char *ep=dp+extent; - unsigned int t1, t2, w, h; - - t1 = *dp++; - t2 = *dp++; - if (t1 != 0xff || t2 != 0xD8) - return FALSE; - - while(1) - { - if (dp>ep) return FALSE; - for(t1=*(dp++);t1!=0xff;t1=*(dp++)) if (dp>ep) return FALSE; - do { t1=*(dp++); if (dp>ep) return FALSE;} while (t1 == 0xff); - - if ((t1 & 0xF0) == 0xC0 && !(t1==0xC4 || t1==0xC8 || t1==0xCC)) - { - dp+=3; - if (dp>ep) return FALSE; - h=*(dp++) << 8; - if (dp>ep) return FALSE; - h|=*(dp++); - if (dp>ep) return FALSE; - w=*(dp++) << 8; - if (dp>ep) return FALSE; - w|=*(dp); - - *xout = w; - *yout = h; - return TRUE; - } - else if (t1==0xD8 || t1==0xD9) - break; - else - { - int l; - - if (dp>ep) return FALSE; - l=*(dp++) << 8; - if (dp>ep) return FALSE; - l|= *(dp++); - l-=2; - dp+=l; - if (dp>ep) return FALSE; - } - } - return FALSE; -} - -static int32 png_read_int(const unsigned char *mem) -{ - int32 i4 = mem[0], - i3 = mem[1], - i2 = mem[2], - i1 = mem[3]; - return i1 | (i2<<8) | (i3<<16) | (i4<<24); -} - - -static int get_png_dim(const void *img, int32 extent, - int32 *xout, int32 *yout) -{ - const unsigned char *dp=(const unsigned char *)img; - - if (extent<33 || - !(dp[0]==137 && dp[1]==80 && dp[2]==78 && dp[3]==71 && - dp[4]==13 && dp[5] == 10 && dp[6] == 26 && dp[7]==10)|| - !(dp[12]=='I' && dp[13]=='H' && dp[14]=='D' && dp[15]=='R')) - return FALSE; - - *xout = png_read_int(dp+16); - *yout = png_read_int(dp+20); - return TRUE; -} - -/* ------------------------------------------------------------------------ */ -/* - * Testing main() - this implements a set of unit tests on the tads - * version. - */ - -#ifdef TADS_TEST - -#include "babel_handler.h" - -void main(int argc, char **argv) -{ - FILE *fp; - int32 siz; - void *buf; - valinfo *head; - int32 rv; - int tadsver; - char outbuf[TREATY_MINIMUM_EXTENT]; - - /* check arguments */ - if (argc != 2) - { - printf("usage: tads \n"); - exit(1); - } - - /* initialize the babel subsystems */ - babel_init(argv[1]); - - /* open the story file */ - if ((fp = fopen(argv[1], "rb")) == 0) - { - printf("error opening input file\n"); - exit(2); - } - - /* check the file size */ - fseek(fp, 0, SEEK_END); - siz = ftell(fp); - fseek(fp, 0, SEEK_SET); - - /* allocate space for it */ - if ((buf = malloc(siz)) == 0) - { - printf("error allocating space to load file\n"); - exit(2); - } - - /* load it */ - if ((int32)fread(buf, 1, siz, fp) != siz) - { - printf("error reading file\n"); - exit(2); - } - - /* done with the file */ - fclose(fp); - - - - /* ===== test 1 - basic parse_game_info() test ===== */ - - /* parse the gameinfo record and print the results */ - if ((head = parse_game_info(buf, siz, &tadsver)) != 0) - { - valinfo *val; - - printf("found GameInfo - tads major version = %d\n", tadsver); - for (val = head ; val != 0 ; val = val->nxt) - { - printf("%.*s=[%.*s]\n", - (int)val->name_len, val->name, - (int)val->val_len, val->val); - } - printf("\n"); - } - else - printf("no GameInfo found\n\n"); - - - - /* ===== test 2 - test the get_story_file_IFID generator ===== */ - rv = tads_get_story_file_IFID(buf, siz, outbuf, TREATY_MINIMUM_EXTENT); - if (rv == 1) - printf("IFID = [%s]\n\n", outbuf); - else - printf("IFID return code = %ld\n", rv); - - - - /* ===== test 3 - test the ifiction synthesizer ===== */ - if ((rv = tads_get_story_file_metadata_extent(buf, siz)) > 0) - { - char *ifbuf; - - /* try allocating the space */ - if ((ifbuf = malloc((size_t)rv)) != 0) - { - /* synthesize the story file */ - rv = tads_get_story_file_metadata(buf, siz, ifbuf, rv); - if (rv > 0) - printf("ifiction metadata:\n=====\n%.*s\n=====\n\n", - (int)rv, ifbuf); - else - printf("tads_get_story_file_metadata result = %ld\n", rv); - } - else - printf("unable to allocate %ld bytes for metadata record\n", rv); - } - else - printf("tads_get_story_file_metadata_extent result code = %ld\n", rv); - - - /* free the loaded story file buffer */ - free(buf); -} - - -#endif TADS_TEST - diff --git a/babel/tads.h b/babel/tads.h deleted file mode 100644 index 296b91d..0000000 --- a/babel/tads.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * tads.h - Treaty of Babel common declarations for tads2 and tads3 modules - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file may - * render it noncompliant with the Treaty of Babel - * - * Modified - *. 04/18/2006 MJRoberts - creation - */ - -#ifndef TADS_H -#define TADS_H - -/* match a TADS file signature */ -int tads_match_sig(const void *buf, int32 len, const char *sig); - -/* get the IFID for a tads story file */ -int32 tads_get_story_file_IFID(void *story_file, int32 extent, - char *output, int32 output_extent); - -/* get the synthesized iFiction record from a tads story file */ -int32 tads_get_story_file_metadata(void *story_file, int32 extent, - char *buf, int32 bufsize); - -/* get the size of the synthesized iFiction record for a tads story file */ -int32 tads_get_story_file_metadata_extent(void *story_file, int32 extent); - -/* get the cover art from a tads story file */ -int32 tads_get_story_file_cover(void *story_file, int32 extent, - void *buf, int32 bufsize); - -/* get the size of the cover art from a tads story file */ -int32 tads_get_story_file_cover_extent(void *story_file, int32 extent); - -/* get the image format (jpeg, png) of the covert art in a tads story file */ -int32 tads_get_story_file_cover_format(void *story_file, int32 extent); - -#endif /* TADS_H */ diff --git a/babel/tads2.c b/babel/tads2.c deleted file mode 100644 index 87c1fcc..0000000 --- a/babel/tads2.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * tads2.c - Treaty of Babel module for Tads 2 files - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file may - * render it noncompliant with the Treaty of Babel - * - * Modified - *. 04/15/2006 LRRaszewski - Separated tads2.c and tads3.c - *. 04/08/2006 LRRaszewski - changed babel API calls to threadsafe versions - *. 04/08/2006 MJRoberts - initial implementation - */ - -#define FORMAT tads2 -#define HOME_PAGE "http://www.tads.org" -#define FORMAT_EXT ".gam" - - -#include "treaty_builder.h" -#include "tads.h" - -#define T2_SIGNATURE "TADS2 bin\012\015\032" - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif - -/* - * get a story file's IFID - */ -static int32 get_story_file_IFID(void *story_file, int32 extent, - char *output, int32 output_extent) -{ - /* use the common tads IFID extractor/generator */ - return tads_get_story_file_IFID(story_file, extent, - output, output_extent); -} - -/* - * determine if a given story file is one of ours - */ -static int32 claim_story_file(void *story_file, int32 extent) -{ - /* check our signature */ - if (tads_match_sig(story_file, extent, T2_SIGNATURE)) - return VALID_STORY_FILE_RV; - - /* not one of ours */ - return INVALID_STORY_FILE_RV; -} - -/* - * Get the size of the iFiction metadata for the game - */ -static int32 get_story_file_metadata_extent(void *story_file, int32 extent) -{ - /* use the common tads iFiction synthesizer */ - return tads_get_story_file_metadata_extent(story_file, extent); -} - -/* - * Get the iFiction metadata for the game - */ -static int32 get_story_file_metadata(void *story_file, int32 extent, - char *buf, int32 bufsize) -{ - /* use the common tads iFiction synthesizer */ - return tads_get_story_file_metadata(story_file, extent, buf, bufsize); -} - -static int32 get_story_file_cover_extent(void *story_file, int32 story_len) -{ - /* use the common tads cover file extractor */ - return tads_get_story_file_cover_extent(story_file, story_len); -} - -/* - * Get the format of the cover art - */ -static int32 get_story_file_cover_format(void *story_file, int32 story_len) -{ - /* use the common tads cover file extractor */ - return tads_get_story_file_cover_format(story_file, story_len); -} - -/* - * Get the cover art data - */ -static int32 get_story_file_cover(void *story_file, int32 story_len, - void *outbuf, int32 output_extent) -{ - /* use the common tads cover file extractor */ - return tads_get_story_file_cover(story_file, story_len, - outbuf, output_extent); -} - diff --git a/babel/tads3.c b/babel/tads3.c deleted file mode 100644 index 23d8fb5..0000000 --- a/babel/tads3.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * tads3.c - Treaty of Babel module for Tads 3 files - * - * This file depends on treaty_builder.h - * - * This file is public domain, but note that any changes to this file may - * render it noncompliant with the Treaty of Babel - * - * Modified - *. 04/15/2006 LRRaszewski - Separated tads2.c and tads3.c - *. 04/08/2006 LRRaszewski - changed babel API calls to threadsafe versions - *. 04/08/2006 MJRoberts - initial implementation - */ - -#define FORMAT tads3 -#define HOME_PAGE "http://www.tads.org" -#define FORMAT_EXT ".t3" - - -#include "treaty_builder.h" -#include "tads.h" - -#define T3_SIGNATURE "T3-image\015\012\032" - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE 1 -#endif - -/* - * get a story file's IFID - */ -static int32 get_story_file_IFID(void *story_file, int32 extent, - char *output, int32 output_extent) -{ - /* use the common tads IFID extractor/generator */ - return tads_get_story_file_IFID(story_file, extent, - output, output_extent); -} - -/* - * determine if a given story file is one of ours - */ -static int32 claim_story_file(void *story_file, int32 extent) -{ - /* check our signature */ - if (tads_match_sig(story_file, extent, T3_SIGNATURE)) - return VALID_STORY_FILE_RV; - - /* not one of ours */ - return INVALID_STORY_FILE_RV; -} - -/* - * Get the size of the iFiction metadata for the game - */ -static int32 get_story_file_metadata_extent(void *story_file, int32 extent) -{ - /* use the common tads iFiction synthesizer */ - return tads_get_story_file_metadata_extent(story_file, extent); -} - -/* - * Get the iFiction metadata for the game - */ -static int32 get_story_file_metadata(void *story_file, int32 extent, - char *buf, int32 bufsize) -{ - /* use the common tads iFiction synthesizer */ - return tads_get_story_file_metadata(story_file, extent, buf, bufsize); -} - -static int32 get_story_file_cover_extent(void *story_file, int32 story_len) -{ - /* use the common tads cover file extractor */ - return tads_get_story_file_cover_extent(story_file, story_len); -} - -/* - * Get the format of the cover art - */ -static int32 get_story_file_cover_format(void *story_file, int32 story_len) -{ - /* use the common tads cover file extractor */ - return tads_get_story_file_cover_format(story_file, story_len); -} - -/* - * Get the cover art data - */ -static int32 get_story_file_cover(void *story_file, int32 story_len, - void *outbuf, int32 output_extent) -{ - /* use the common tads cover file extractor */ - return tads_get_story_file_cover(story_file, story_len, - outbuf, output_extent); -} - diff --git a/babel/treaty.h b/babel/treaty.h deleted file mode 100644 index 7155553..0000000 --- a/babel/treaty.h +++ /dev/null @@ -1,91 +0,0 @@ -/* treaty.h Header file for Treaty of Babel compliant format modules - * By L. Ross Raszewski - * Version 3b - * - * This file is public domain, but please note that derived versions - * may not not be compliant with the Treaty of Babel. - * - * It would be wise for derived works to change the value of - * TREATY_COMPLIANCE to reflect deviations - */ - -#ifndef TREATY_H - -#define TREATY_H - -#define TREATY_COMPLIANCE "Treaty of Babel revision 7" -#define TREATY_VERSION "r7" - -/* return codes */ -#define NO_REPLY_RV 0 -#define INVALID_STORY_FILE_RV -1 -#define UNAVAILABLE_RV -2 -#define INVALID_USAGE_RV -3 -#define INCOMPLETE_REPLY_RV -4 -#define VALID_STORY_FILE_RV 1 - -#define PNG_COVER_FORMAT 1 -#define JPEG_COVER_FORMAT 2 - -/* Treaty bitmasks. These are not required by the treaty, but are here - as a convenience. -*/ -#define TREATY_SELECTOR_INPUT 0x100 -#define TREATY_SELECTOR_OUTPUT 0x200 -#define TREATY_SELECTOR_NUMBER 0xFF - -#define TREATY_CONTAINER_SELECTOR 0x400 - -/* Treaty selectors */ -#define GET_HOME_PAGE_SEL 0x201 -#define GET_FORMAT_NAME_SEL 0x202 -#define GET_FILE_EXTENSIONS_SEL 0x203 -#define CLAIM_STORY_FILE_SEL 0x104 -#define GET_STORY_FILE_METADATA_EXTENT_SEL 0x105 -#define GET_STORY_FILE_COVER_EXTENT_SEL 0x106 -#define GET_STORY_FILE_COVER_FORMAT_SEL 0x107 -#define GET_STORY_FILE_IFID_SEL 0x308 -#define GET_STORY_FILE_METADATA_SEL 0x309 -#define GET_STORY_FILE_COVER_SEL 0x30A -#define GET_STORY_FILE_EXTENSION_SEL 0x30B - -/* Container selectors */ -#define CONTAINER_GET_STORY_FORMAT_SEL 0x710 -#define CONTAINER_GET_STORY_EXTENT_SEL 0x511 -#define CONTAINER_GET_STORY_FILE_SEL 0x711 - - - - -/* Other magic size limits */ -#define TREATY_MINIMUM_EXTENT 512 - - -#include - -/* 32-bit integer types */ -#ifndef VAX -#if SCHAR_MAX >= 0x7FFFFFFFL && SCHAR_MIN <= -0x7FFFFFFFL - typedef signed char int32; -#elif SHRT_MAX >= 0x7FFFFFFFL && SHRT_MIN <= -0x7FFFFFFFL - typedef signed short int int32; -#elif INT_MAX >= 0x7FFFFFFFL && INT_MIN <= -0x7FFFFFFFL - typedef signed int int32; -#elif LONG_MAX >= 0x7FFFFFFFL && LONG_MIN <= -0x7FFFFFFFL - typedef signed long int int32; -#else -#error No type large enough to support 32-bit integers. -#endif -#else - /* VAX C does not provide these limit constants, contrary to ANSI */ - typedef int int32; -#endif - - - -/* Pointer to treaty function. Treaty functions must follow this prototype */ - -typedef int32 (*TREATY)(int32 selector, void *, int32, void *, int32); - -#endif - diff --git a/babel/treaty_builder.h b/babel/treaty_builder.h deleted file mode 100644 index d52ae3e..0000000 --- a/babel/treaty_builder.h +++ /dev/null @@ -1,180 +0,0 @@ -/* treaty_builder.h common macros to build a treaty module - * - * 2006 By L. Ross Raszewski - * - * This file is public domain, but be aware that any changes to it may - * cause it to cease to be compliant with the Treaty of Babel. - * - * This file depends on treaty.h - * - * The purpose of this file is to simplify the building of a treaty - * module. It automatically generates a generic treaty function. - * - * Usage: - * - * #define the following values: - * FORMAT The treaty name of the format - * HOME_PAGE A string containing the URL of the format home page - * FORMAT_EXT A string containing a comma separated list of common - * extensions for game files in this format - * NO_METADATA If the format does not support metadata - * NO_COVER If the format does not support cover art - * CUSTOM_EXTENSION If game files should not always use the first listed extension - * - * (Note: Formats which support metadata and cover art via a container should - * define NO_METADATA and NO_COVER as container support is handled separately) - * - * #include "treaty_builder.h" - * Define the following functions: - * static int32 get_story_file_IFID(void *, int32, char *, int32); - * static int32 claim_story_file(void *, int32); - * Define the following functions if NO_METADATA is not defined: - * static int32 get_story_file_metadata_extent(void *, int32); - * static int32 get_story_file_metadata(void *, int32, char *, int32); - * Define the following functions if NO_COVER is not defined - * static int32 get_story_file_cover_extent(void *, int32); - * static int32 get_story_file_cover_format(void *, int32); - * static int32 get_story_file_cover(void *, int32, void *, int32); - * Define the following if CUSTOM_EXTENSION is defined - * static int32 get_story_file_extension(void *, int32, char *, int32); - * - * The two-parameter functions take the story file and story file extent - * as parameters. The four-parameter ones also take the output - * buffer and its extent. They perform the corresponding task to the - * similarly-named selector. - * - * This file also defines the macro ASSERT_OUTPUT_SIZE(x) which - * returns INVALID_USAGE_RV if output_extent is less than x. - * - * #define CONTAINER_FORMAT before inclusion to generate a container - * module. A container module should define three additional functions: - * static int32 get_story_format(void *, int32, char *, int32); - * static int32 get_story_extent(void *, int32); - * static int32 get_story_file(void *, int32, void *, int32); - * - */ - -#ifndef TREATY_BUILDER -#define TREATY_BUILDER - -#include "treaty.h" -#include - -#define ASSERT_OUTPUT_SIZE(x) do { if (output_extent < (x)) return INVALID_USAGE_RV; } while (0) - -#ifndef NO_METADATA -static int32 get_story_file_metadata_extent(void *, int32); -static int32 get_story_file_metadata(void *, int32, char *, int32); -#endif -#ifndef NO_COVER -static int32 get_story_file_cover_extent(void *, int32); -static int32 get_story_file_cover_format(void *, int32); -static int32 get_story_file_cover(void *, int32, void *, int32); -#endif -static int32 get_story_file_IFID(void *, int32, char *, int32); -static int32 claim_story_file(void *, int32); -#ifdef CONTAINER_FORMAT -static int32 get_story_file(void *, int32, void *, int32); -static int32 get_story_format(void *, int32, char *, int32); -static int32 get_story_extent(void *, int32); -#endif -#ifdef CUSTOM_EXTENSION -static int32 get_story_file_extension(void *, int32, char *, int32); -#else -#include -static int32 get_story_file_extension(void *sf, int32 extent, char *out, int32 output_extent) -{ - int i; - - if (!sf || !extent) return INVALID_STORY_FILE_RV; - - for(i=0;FORMAT_EXT[i] && FORMAT_EXT[i]!=',';i++); - ASSERT_OUTPUT_SIZE(i+1); - memcpy(out,FORMAT_EXT,i); - out[i]=0; - return strlen(out); -} - -#endif - -#define TREATY_FUNCTION(X) DEEP_TREATY_FUNCTION(X) -#define DEEP_TREATY_FUNCTION(X) X ## _treaty -#define dSTRFRY(X) #X -#define STRFRY(X) dSTRFRY(X) - -int32 TREATY_FUNCTION(FORMAT)(int32 selector, - void *story_file, int32 extent, - void *output, int32 output_extent) -{ - int32 ll, csf; - if ((TREATY_SELECTOR_INPUT & selector) && - (csf=claim_story_file(story_file, extent)) -#include - -static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent) -{ - int32 i,j; - char ser[7]; - char buffer[32]; - - - if (extent<0x1D) return INVALID_STORY_FILE_RV; - memcpy(ser, (char *) story_file+0x12, 6); - ser[6]=0; - /* Detect vintage story files */ - if (!(ser[0]=='8' || ser[0]=='9' || - (ser[0]=='0' && ser[1]>='0' && ser[1]<='5'))) - { - for(i=0;i 8 - ) return INVALID_STORY_FILE_RV; - for(i=4;i<=14;i+=2) - { - j=read_zint(sf+i); - if (j>extent || j < 0x40) return INVALID_STORY_FILE_RV; - } - - return VALID_STORY_FILE_RV; -} -static int32 get_story_file_extension(void *sf, int32 extent, char *out, int32 output_extent) -{ - int v; - if (!extent) return INVALID_STORY_FILE_RV; - v= ((char *) sf)[0]; - if (v>9) ASSERT_OUTPUT_SIZE(5); - else ASSERT_OUTPUT_SIZE(4); - sprintf(out,".z%d",v); - return 3+(v>9); - -} diff --git a/configure.ac b/configure.ac index 6299c4d..c0f5e90 100644 --- a/configure.ac +++ b/configure.ac @@ -129,8 +129,6 @@ PKG_CHECK_MODULES([PLAYER], [ glib-2.0 >= $GLIB_REQUIRED_VERSION gtk+-3.0 >= $GTK_REQUIRED_VERSION gmodule-2.0 - dnl libgda-4.0 - libsoup-2.4 ]) # Libraries needed to build test programs PKG_CHECK_MODULES([TEST], [ @@ -187,7 +185,6 @@ docs/reference/Makefile docs/reference/version.xml docs/reference/build-selector-table.pl po/Makefile.in -babel/Makefile ]) # Do it diff --git a/tests/Makefile.am b/tests/Makefile.am index 1fed105..6d12176 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -10,7 +10,7 @@ TEST_PLUGIN_LIBTOOL_FLAGS = \ -export-symbols-regex "^glk_main$$" \ -rpath $(abs_builddir) -noinst_PROGRAMS = test-multisession glulxercise plugin-loader test-close babeltest +noinst_PROGRAMS = test-multisession glulxercise plugin-loader test-close test_multisession_SOURCES = test-multisession.c test_multisession_CFLAGS = @TEST_CFLAGS@ $(AM_CFLAGS) @@ -29,10 +29,6 @@ test_close_SOURCES = test-close.c test_close_CFLAGS = @TEST_CFLAGS@ $(AM_CFLAGS) test_close_LDADD = @TEST_LIBS@ $(top_builddir)/libchimara/libchimara.la -babeltest_SOURCES = babeltest.c -babeltest_CFLAGS = @PLAYER_CFLAGS@ $(AM_CFLAGS) -babeltest_LDADD = @PLAYER_LIBS@ $(top_builddir)/babel/libbabel_functions.la $(top_builddir)/babel/libbabel.la $(top_builddir)/babel/libifiction.la - noinst_LTLIBRARIES = first.la model.la gridtest.la splittest.la multiwin.la \ styletest.la soundtest.la test-userstyle.la fileio.la diff --git a/tests/babeltest.c b/tests/babeltest.c deleted file mode 100644 index 2e8827e..0000000 --- a/tests/babeltest.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "babel/babel_handler.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -typedef struct _metadata { - const gchar *element_name; - gchar *ifid; - gchar *title; - gchar *author; - gchar *firstpublished; - gboolean error; - gchar *error_message; - gchar *error_code; -} metadata; - -void start_element( - GMarkupParseContext *context, - const gchar *element_name, - const gchar **attribute_names, - const gchar **attribute_values, - gpointer data, - GError **error) -{ - metadata *md = (metadata*) data; - md->element_name = element_name; - - if( !strcmp(element_name, "errorCode") ) { - md->error = 1; - md->error_message = ""; - md->error_code = ""; - } - - if( !strcmp(element_name, "ifindex") ) { - md->ifid = ""; - md->title = ""; - md->author = ""; - md->firstpublished = ""; - } -} - -void text( - GMarkupParseContext *context, - const gchar *text, - gsize text_len, - gpointer data, - GError **error) -{ - metadata *md = (metadata*) data; - - if( !strcmp(md->element_name, "errorCode") ) { - md->error_code = g_strndup(text, text_len); - } - else if( !strcmp(md->element_name, "errorMessage") ) { - md->error_message = g_strndup(text, text_len); - } - else if( !strcmp(md->element_name, "ifid") ) { - if( strlen(md->ifid) < text_len ) - md->ifid = g_strndup(text, text_len); - } - else if( !strcmp(md->element_name, "title") ) { - if( strlen(md->title) < text_len ) - md->title = g_strndup(text, text_len); - } - else if( !strcmp(md->element_name, "author") ) { - if( strlen(md->author) < text_len ) - md->author = g_strndup(text, text_len); - } - else if( !strcmp(md->element_name, "firstpublished") ) { - if( strlen(md->firstpublished) < text_len ) - md->firstpublished = g_strndup(text, text_len); - } -} - -void end_element( - GMarkupParseContext *context, - const gchar *element_name, - gpointer data, - GError **error) -{ - if( !strcmp(element_name, "ifindex") ) { - metadata *md = (metadata*) data; - printf("IFID: %s\nTitle: %s\nAuthor: %s\nFirst published: %s\n", md->ifid, md->title, md->author, md->firstpublished); - } -} - -/* - * run a non SELECT command and stops if an error occurs - */ -void -run_sql_non_select(GdaConnection *cnc, const gchar *sql) -{ - GdaStatement *stmt; - GError *error = NULL; - gint nrows; - const gchar *remain; - GdaSqlParser *parser; - - parser = g_object_get_data(G_OBJECT(cnc), "parser"); - stmt = gda_sql_parser_parse_string(parser, sql, &remain, &error); - if(remain) - g_print ("REMAINS: %s\n", remain); - - nrows = gda_connection_statement_execute_non_select(cnc, stmt, NULL, NULL, &error); - if(nrows == -1) - g_error("NON SELECT error: %s\n", error && error->message ? error->message : "no detail"); - g_object_unref(stmt); -} - -int main(int argc, char **argv) { - GError *err = NULL; - metadata data; - data.error = 0; - - if(argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - return 1; - } - - g_type_init(); - - babel_init(argv[1]); - int len = babel_treaty(GET_STORY_FILE_METADATA_EXTENT_SEL, NULL, 0); - gchar *ifiction; - if(len) { - printf("Metadata found in file.\n"); - gchar *buffer = malloc(len * sizeof(gchar)); - babel_treaty(GET_STORY_FILE_METADATA_SEL, buffer, len); - ifiction = g_strndup(buffer, len); - g_free(buffer); - } else { - printf("No metadata found in file, performing IFDB lookup.\n"); - gchar *ifid = malloc(TREATY_MINIMUM_EXTENT * sizeof(gchar)); - if( !babel_treaty(GET_STORY_FILE_IFID_SEL, ifid, TREATY_MINIMUM_EXTENT) ) { - fprintf(stderr, "Unable to create an IFID (A serious problem occurred while loading the file).\n"); - babel_release(); - return 1; - } - printf("Looking up IFID: %s.\n", ifid); - babel_release(); - - SoupSession *session = soup_session_async_new(); - char *uri_string = g_strconcat("http://ifdb.tads.org/viewgame?ifiction&ifid=", ifid, NULL); - SoupMessage *message = soup_message_new("GET", uri_string); - g_free(uri_string); - soup_message_headers_append(message->request_headers, "Connection", "close"); - if(soup_session_send_message(session, message) != 200) - g_printerr("ERROR: did not get HTTP status 200\n"); - ifiction = g_strndup(message->response_body->data, message->response_body->length); - g_object_unref(message); - g_object_unref(session); - } - - ifiction = g_strchomp(ifiction); - - GMarkupParser xml_parser = {start_element, end_element, text, NULL, NULL}; - GMarkupParseContext *context = g_markup_parse_context_new(&xml_parser, 0, &data, NULL); - - if( g_markup_parse_context_parse(context, ifiction, strlen(ifiction), &err) == FALSE ) { - fprintf(stderr, "Metadata parse failed: %s\n", err->message); - } - - g_markup_parse_context_free(context); - g_free(ifiction); - - babel_release(); - - // Check for errors - if(data.error) { - fprintf(stderr, "ERROR %s: %s\n", data.error_code, data.error_message); - return 1; - } - - // Open DB connection - GdaConnection *cnc; - GdaSqlParser *sql_parser; - - gda_init(); - cnc = gda_connection_open_from_string("SQLite", "DB_DIR=.;DB_NAME=library", NULL, GDA_CONNECTION_OPTIONS_NONE, &err); - if(!cnc) { - fprintf(stderr, "Could not open connection to SQLite database in library.db file: %s\n", err && err->message ? err->message : "No details"); - return 1; - } - - sql_parser = gda_connection_create_parser(cnc); - if(!sql_parser) // cnc does not provide its own parser, use default one - sql_parser = gda_sql_parser_new(); - - g_object_set_data_full(G_OBJECT(cnc), "parser", sql_parser, g_object_unref); - - // Create stories table - //run_sql_non_select(cnc, "DROP TABLE IF EXISTS stories"); - run_sql_non_select(cnc, "CREATE TABLE IF NOT EXISTS stories (ifid text not null primary key, title text, author text, firstpublished text)"); - - // Populate the table - GValue *v1, *v2, *v3, *v4; - v1 = gda_value_new_from_string(data.ifid, G_TYPE_STRING); - v2 = gda_value_new_from_string(data.title, G_TYPE_STRING); - v3 = gda_value_new_from_string(data.author, G_TYPE_STRING); - v4 = gda_value_new_from_string(data.firstpublished, G_TYPE_STRING); - - if( !gda_insert_row_into_table(cnc, "stories", &err, "ifid", v1, "title", v2, "author", v3, "firstpublished", v4, NULL) ) { - g_warning("Could not INSERT data into the 'stories' table: %s\n", err && err->message ? err->message : "No details"); - } - - gda_value_free(v1); - gda_value_free(v2); - gda_value_free(v3); - gda_value_free(v4); - - // Dump the table contents - GdaDataModel *data_model; - GdaStatement *stmt = gda_sql_parser_parse_string(sql_parser, "SELECT * FROM stories", NULL, NULL); - data_model = gda_connection_statement_execute_select(cnc, stmt, NULL, &err); - if(!data_model) - g_error("Could not get the contents of the 'stories' table: %s\n", err && err->message ? err->message : "No details"); - printf("Dumping library table:\n"); - gda_data_model_dump(data_model, stdout); - - g_object_unref(stmt); - g_object_unref(data_model); - - gda_connection_close(cnc); - return 0; -} -- 2.30.2