Merge branch 'new-sound-api'
[projects/chimara/chimara.git] / babel / babel_ifiction_functions.c
1 /* babel_ifiction_functions.c babel top-level operations for ifiction\r
2  * (c) 2006 By L. Ross Raszewski\r
3  *\r
4  * This code is freely usable for all purposes.\r
5  *\r
6  * This work is licensed under the Creative Commons Attribution2.5 License.\r
7  * To view a copy of this license, visit\r
8  * http://creativecommons.org/licenses/by/2.5/ or send a letter to\r
9  * Creative Commons,\r
10  * 543 Howard Street, 5th Floor,\r
11  * San Francisco, California, 94105, USA.\r
12  *\r
13  * This file depends upon babel.c (for rv), babel.h, misc.c and ifiction.c\r
14  */\r
15 \r
16 #include "babel.h"\r
17 #include <string.h>\r
18 #include <stdlib.h>\r
19 #include <stdio.h>\r
20 #include <ctype.h>\r
21 \r
22 #ifndef THREE_LETTER_EXTENSIONS\r
23 #define IFICTION_EXT ".iFiction"\r
24 #else\r
25 #define IFICTION_EXT ".ifi"\r
26 #endif\r
27 \r
28 void *my_malloc(int, char *);\r
29 \r
30 struct IFiction_Info\r
31 {\r
32  char ifid[256];\r
33  int wmode;\r
34 };\r
35 \r
36 static void write_story_to_disk(struct XMLTag *xtg, void *ctx)\r
37 {\r
38  char *b, *ep;\r
39  char *begin, *end;\r
40  char buffer[TREATY_MINIMUM_EXTENT];\r
41  int32 l, j;\r
42  if (ctx) { }\r
43 \r
44  if (strcmp(xtg->tag,"story")==0)\r
45  {\r
46  begin=xtg->begin;\r
47  end=xtg->end;\r
48  l=end-begin+1;\r
49  b=(char *)my_malloc(l,"XML buffer");\r
50  memcpy(b,begin,l-1);\r
51  b[l]=0;\r
52  j=ifiction_get_IFID(b,buffer,TREATY_MINIMUM_EXTENT);\r
53  if (!j)\r
54  {\r
55   fprintf(stderr,"No IFID found for this story\n");\r
56   free(b);\r
57   return;\r
58  }\r
59  ep=strtok(buffer,",");\r
60  while(ep)\r
61  {\r
62   char buf2[256];\r
63   FILE *f;\r
64   sprintf(buf2,"%s%s",ep,IFICTION_EXT);\r
65   f=fopen(buf2,"w");\r
66 \r
67   if (!f ||\r
68   fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"\r
69         "<!-- Metadata extracted by Babel -->"\r
70         "<ifindex version=\"1.0\" xmlns=\"http://babel.ifarchive.org/protocol/iFiction/\">\n"\r
71         " <story>",\r
72         f)==EOF ||\r
73   fputs(b,f)==EOF ||\r
74   fputs("/<story>\n</ifindex>\n",f)==EOF\r
75   )\r
76   {\r
77    fprintf(stderr,"Error writing to file %s\n",buf2);\r
78   } else\r
79    printf("Extracted %s\n",buf2);\r
80   if (f) fclose(f);\r
81 \r
82   ep=strtok(NULL,",");\r
83  }\r
84 \r
85  free(b);\r
86  }\r
87 }\r
88 \r
89 void babel_ifiction_ifid(char *md)\r
90 {\r
91  char output[TREATY_MINIMUM_EXTENT];\r
92  int i;\r
93  char *ep;\r
94  i=ifiction_get_IFID(md,output,TREATY_MINIMUM_EXTENT);\r
95  if (!i)\r
96 \r
97  {\r
98   fprintf(stderr,"Error: No IFIDs found in iFiction file\n");\r
99   return;\r
100  }\r
101  ep=strtok(output,",");\r
102  while(ep)\r
103  {\r
104   printf("IFID: %s\n",ep);\r
105   ep=strtok(NULL,",");\r
106  }\r
107 \r
108 }\r
109 \r
110 static char isok;\r
111 \r
112 static void examine_tag(struct XMLTag *xtg, void *ctx)\r
113 {\r
114  struct IFiction_Info *xti=(struct IFiction_Info *)ctx;\r
115 \r
116  if (strcmp("ifid",xtg->tag)==0 && strcmp(xti->ifid,"UNKNOWN")==0)\r
117  {\r
118  memcpy(xti->ifid,xtg->begin,xtg->end-xtg->begin);\r
119  xti->ifid[xtg->end-xtg->begin]=0;\r
120  }\r
121 \r
122 }\r
123 static void verify_eh(char *e, void *ctx)\r
124 {\r
125  if (*((int *)ctx) < 0) return;\r
126  if (*((int *)ctx) || strncmp(e,"Warning",7))\r
127   { isok=0;\r
128    fprintf(stderr, "%s\n",e);\r
129   }\r
130 }\r
131 \r
132 \r
133 \r
134 void babel_ifiction_fish(char *md)\r
135 {\r
136  int i=-1;\r
137  ifiction_parse(md,write_story_to_disk,NULL,verify_eh,&i);\r
138 }\r
139 \r
140 void deep_ifiction_verify(char *md, int f)\r
141 {\r
142  struct IFiction_Info ii;\r
143  int i=0;\r
144  ii.wmode=0;\r
145  isok=1;\r
146  strcpy(ii.ifid,"UNKNOWN");\r
147  ifiction_parse(md,examine_tag,&ii,verify_eh,&i);\r
148  if (f&& isok) printf("Verified %s\n",ii.ifid);\r
149 }\r
150 void babel_ifiction_verify(char *md)\r
151 {\r
152  deep_ifiction_verify(md,1);\r
153 \r
154 }\r
155 \r
156 \r
157 void babel_ifiction_lint(char *md)\r
158 {\r
159  struct IFiction_Info ii;\r
160  int i=1;\r
161  ii.wmode=1;\r
162  isok=1;\r
163  strcpy(ii.ifid,"UNKNOWN");\r
164  ifiction_parse(md,examine_tag,&ii,verify_eh,&i);\r
165  if (isok) printf("%s conforms to iFiction style guidelines\n",ii.ifid);\r
166 }\r
167 \r
168 \r