+++ /dev/null
-/* zcode.c Treaty of Babel module for Z-code files\r
- * 2006 By L. Ross Raszewski\r
- *\r
- * This file depends on treaty_builder.h\r
- *\r
- * This file is public domain, but note that any changes to this file\r
- * may render it noncompliant with the Treaty of Babel\r
- */\r
-\r
-#define FORMAT zcode\r
-#define HOME_PAGE "http://www.inform-fiction.org"\r
-#define FORMAT_EXT ".z3,.z4,.z5,.z6,.z7,.z8"\r
-#define NO_METADATA\r
-#define NO_COVER\r
-#define CUSTOM_EXTENSION\r
-#include "treaty_builder.h"\r
-#include <ctype.h>\r
-#include <stdio.h>\r
-\r
-static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent)\r
-{\r
- int32 i,j;\r
- char ser[7];\r
- char buffer[32];\r
-\r
-\r
- if (extent<0x1D) return INVALID_STORY_FILE_RV;\r
- memcpy(ser, (char *) story_file+0x12, 6);\r
- ser[6]=0;\r
- /* Detect vintage story files */\r
- if (!(ser[0]=='8' || ser[0]=='9' ||\r
- (ser[0]=='0' && ser[1]>='0' && ser[1]<='5')))\r
- {\r
- for(i=0;i<extent;i++) if (memcmp((char *)story_file+i,"UUID://",7)==0) break;\r
- if (i<extent) /* Found explicit IFID */\r
- {\r
- for(j=i+7;j<extent && ((char *)story_file)[j]!='/';j++);\r
- if (j<extent)\r
- {\r
- i+=7;\r
- ASSERT_OUTPUT_SIZE(j-i);\r
- memcpy(output,(char *)story_file+i,j-i);\r
- output[j-i]=0;\r
- return 1;\r
- }\r
- }\r
- }\r
- /* Did not find intact IFID. Build one */\r
- i=((unsigned char *)story_file)[2] << 8 |((unsigned char *)story_file)[3];\r
- for(j=0;j<6;j++)\r
- if (!isalnum(ser[j])) ser[j]='-';\r
-\r
- j=((unsigned char *)story_file)[0x1C] << 8 |((unsigned char *)story_file)[0x1D];\r
-\r
- if (strcmp(ser,"000000") && isdigit(ser[0]) && ser[0]!='8')\r
- sprintf(buffer,"ZCODE-%d-%s-%04X",i,ser,j);\r
- else\r
- sprintf(buffer,"ZCODE-%d-%s",i,ser);\r
-\r
- ASSERT_OUTPUT_SIZE((signed) strlen(buffer)+1);\r
- strcpy((char *)output,buffer);\r
- return 1;\r
-\r
-}\r
-\r
-static int32 read_zint(unsigned char *sf)\r
-{\r
- return ((int32)sf[0] << 8) | ((int32) sf[1]);\r
-\r
-}\r
-static int32 claim_story_file(void *story_file, int32 extent)\r
-{\r
- unsigned char *sf=(unsigned char *)story_file;\r
- int32 i,j;\r
- if (extent<0x3c ||\r
- sf[0] < 1 ||\r
- sf[0] > 8\r
- ) return INVALID_STORY_FILE_RV;\r
- for(i=4;i<=14;i+=2)\r
- {\r
- j=read_zint(sf+i);\r
- if (j>extent || j < 0x40) return INVALID_STORY_FILE_RV;\r
- }\r
-\r
- return VALID_STORY_FILE_RV;\r
-}\r
-static int32 get_story_file_extension(void *sf, int32 extent, char *out, int32 output_extent)\r
-{\r
- int v;\r
- if (!extent) return INVALID_STORY_FILE_RV;\r
- v= ((char *) sf)[0];\r
- if (v>9) ASSERT_OUTPUT_SIZE(5);\r
- else ASSERT_OUTPUT_SIZE(4);\r
- sprintf(out,".z%d",v);\r
- return 3+(v>9);\r
-\r
-}\r