Add custom renderer
[projects/chimara/chimara.git] / babel / glulx.c
1 /* glulx.c  Treaty of Babel module for Glulx files\r
2  * 2006 By L. Ross Raszewski\r
3  *\r
4  * This file depends on treaty_builder.h\r
5  *\r
6  * This file is public domain, but note that any changes to this file\r
7  * may render it noncompliant with the Treaty of Babel\r
8  */\r
9 \r
10 #define FORMAT glulx\r
11 #define HOME_PAGE "http://eblong.com/zarf/glulx"\r
12 #define FORMAT_EXT ".ulx"\r
13 #define NO_METADATA\r
14 #define NO_COVER\r
15 \r
16 #include "treaty_builder.h"\r
17 #include <ctype.h>\r
18 #include <stdio.h>\r
19 \r
20 static int32 read_int(unsigned char  *mem)\r
21 {\r
22   int32 i4 = mem[0],\r
23                     i3 = mem[1],\r
24                     i2 = mem[2],\r
25                     i1 = mem[3];\r
26   return i1 | (i2<<8) | (i3<<16) | (i4<<24);\r
27 }\r
28 \r
29 \r
30 \r
31 static int32 get_story_file_IFID(void *story_file, int32 extent, char *output, int32 output_extent)\r
32 {\r
33  int32 i,j, k;\r
34  char ser[7];\r
35  char buffer[32];\r
36 \r
37 \r
38  if (extent<256) return INVALID_STORY_FILE_RV;\r
39  for(i=0;i<extent;i++) if (memcmp((char *)story_file+i,"UUID://",7)==0) break;\r
40  if (i<extent) /* Found explicit IFID */\r
41   {\r
42    for(j=i+7;j<extent && ((char *)story_file)[j]!='/';j++);\r
43    if (j<extent)\r
44    {\r
45     i+=7;\r
46     ASSERT_OUTPUT_SIZE(j-i);\r
47     memcpy(output,(char *)story_file+i,j-i);\r
48     output[j-i]=0;\r
49     return 1;\r
50    }\r
51   }\r
52 \r
53  /* Did not find intact IFID.  Build one */\r
54 \r
55  j=read_int((unsigned char *)story_file+32);\r
56  k=read_int((unsigned char *)story_file+12);\r
57  if (memcmp((char *)story_file+36,"Info",4)==0)\r
58  { /* Inform generated */\r
59   char *bb=(char *)story_file+52;\r
60   k= (int) bb[0]<<8 | (int) bb[1];\r
61   memcpy(ser,bb+2,6);\r
62   ser[6]=0;\r
63   for(i=0;i<6;i++) if (!isalnum(ser[i])) ser[i]='-';\r
64   sprintf(buffer,"GLULX-%u-%s-%04X",k,ser,j);\r
65  }\r
66  else\r
67   sprintf(buffer,"GLULX-%08X-%08X",k,j);\r
68 \r
69  ASSERT_OUTPUT_SIZE((signed) strlen(buffer)+1);\r
70  strcpy((char *)output,buffer);\r
71  return 1;\r
72 \r
73 }\r
74 \r
75 static int32 claim_story_file(void *story_file, int32 extent)\r
76 {\r
77  if (extent<256 ||\r
78      memcmp(story_file,"Glul",4)\r
79     ) return INVALID_STORY_FILE_RV;\r
80  return VALID_STORY_FILE_RV;\r
81 }\r