Merge branch 'master' into browser
[projects/chimara/chimara.git] / babel / babel_ifiction_functions.c
diff --git a/babel/babel_ifiction_functions.c b/babel/babel_ifiction_functions.c
new file mode 100644 (file)
index 0000000..e59adf6
--- /dev/null
@@ -0,0 +1,168 @@
+/* babel_ifiction_functions.c babel top-level operations for ifiction\r
+ * (c) 2006 By L. Ross Raszewski\r
+ *\r
+ * This code is freely usable for all purposes.\r
+ *\r
+ * This work is licensed under the Creative Commons Attribution2.5 License.\r
+ * To view a copy of this license, visit\r
+ * http://creativecommons.org/licenses/by/2.5/ or send a letter to\r
+ * Creative Commons,\r
+ * 543 Howard Street, 5th Floor,\r
+ * San Francisco, California, 94105, USA.\r
+ *\r
+ * This file depends upon babel.c (for rv), babel.h, misc.c and ifiction.c\r
+ */\r
+\r
+#include "babel.h"\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <ctype.h>\r
+\r
+#ifndef THREE_LETTER_EXTENSIONS\r
+#define IFICTION_EXT ".iFiction"\r
+#else\r
+#define IFICTION_EXT ".ifi"\r
+#endif\r
+\r
+void *my_malloc(int, char *);\r
+\r
+struct IFiction_Info\r
+{\r
+ char ifid[256];\r
+ int wmode;\r
+};\r
+\r
+static void write_story_to_disk(struct XMLTag *xtg, void *ctx)\r
+{\r
+ char *b, *ep;\r
+ char *begin, *end;\r
+ char buffer[TREATY_MINIMUM_EXTENT];\r
+ int32 l, j;\r
+ if (ctx) { }\r
+\r
+ if (strcmp(xtg->tag,"story")==0)\r
+ {\r
+ begin=xtg->begin;\r
+ end=xtg->end;\r
+ l=end-begin+1;\r
+ b=(char *)my_malloc(l,"XML buffer");\r
+ memcpy(b,begin,l-1);\r
+ b[l]=0;\r
+ j=ifiction_get_IFID(b,buffer,TREATY_MINIMUM_EXTENT);\r
+ if (!j)\r
+ {\r
+  fprintf(stderr,"No IFID found for this story\n");\r
+  free(b);\r
+  return;\r
+ }\r
+ ep=strtok(buffer,",");\r
+ while(ep)\r
+ {\r
+  char buf2[256];\r
+  FILE *f;\r
+  sprintf(buf2,"%s%s",ep,IFICTION_EXT);\r
+  f=fopen(buf2,"w");\r
+\r
+  if (!f ||\r
+  fputs("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"\r
+        "<!-- Metadata extracted by Babel -->"\r
+        "<ifindex version=\"1.0\" xmlns=\"http://babel.ifarchive.org/protocol/iFiction/\">\n"\r
+        " <story>",\r
+        f)==EOF ||\r
+  fputs(b,f)==EOF ||\r
+  fputs("/<story>\n</ifindex>\n",f)==EOF\r
+  )\r
+  {\r
+   fprintf(stderr,"Error writing to file %s\n",buf2);\r
+  } else\r
+   printf("Extracted %s\n",buf2);\r
+  if (f) fclose(f);\r
+\r
+  ep=strtok(NULL,",");\r
+ }\r
+\r
+ free(b);\r
+ }\r
+}\r
+\r
+void babel_ifiction_ifid(char *md)\r
+{\r
+ char output[TREATY_MINIMUM_EXTENT];\r
+ int i;\r
+ char *ep;\r
+ i=ifiction_get_IFID(md,output,TREATY_MINIMUM_EXTENT);\r
+ if (!i)\r
+\r
+ {\r
+  fprintf(stderr,"Error: No IFIDs found in iFiction file\n");\r
+  return;\r
+ }\r
+ ep=strtok(output,",");\r
+ while(ep)\r
+ {\r
+  printf("IFID: %s\n",ep);\r
+  ep=strtok(NULL,",");\r
+ }\r
+\r
+}\r
+\r
+static char isok;\r
+\r
+static void examine_tag(struct XMLTag *xtg, void *ctx)\r
+{\r
+ struct IFiction_Info *xti=(struct IFiction_Info *)ctx;\r
+\r
+ if (strcmp("ifid",xtg->tag)==0 && strcmp(xti->ifid,"UNKNOWN")==0)\r
+ {\r
+ memcpy(xti->ifid,xtg->begin,xtg->end-xtg->begin);\r
+ xti->ifid[xtg->end-xtg->begin]=0;\r
+ }\r
+\r
+}\r
+static void verify_eh(char *e, void *ctx)\r
+{\r
+ if (*((int *)ctx) < 0) return;\r
+ if (*((int *)ctx) || strncmp(e,"Warning",7))\r
+  { isok=0;\r
+   fprintf(stderr, "%s\n",e);\r
+  }\r
+}\r
+\r
+\r
+\r
+void babel_ifiction_fish(char *md)\r
+{\r
+ int i=-1;\r
+ ifiction_parse(md,write_story_to_disk,NULL,verify_eh,&i);\r
+}\r
+\r
+void deep_ifiction_verify(char *md, int f)\r
+{\r
+ struct IFiction_Info ii;\r
+ int i=0;\r
+ ii.wmode=0;\r
+ isok=1;\r
+ strcpy(ii.ifid,"UNKNOWN");\r
+ ifiction_parse(md,examine_tag,&ii,verify_eh,&i);\r
+ if (f&& isok) printf("Verified %s\n",ii.ifid);\r
+}\r
+void babel_ifiction_verify(char *md)\r
+{\r
+ deep_ifiction_verify(md,1);\r
+\r
+}\r
+\r
+\r
+void babel_ifiction_lint(char *md)\r
+{\r
+ struct IFiction_Info ii;\r
+ int i=1;\r
+ ii.wmode=1;\r
+ isok=1;\r
+ strcpy(ii.ifid,"UNKNOWN");\r
+ ifiction_parse(md,examine_tag,&ii,verify_eh,&i);\r
+ if (isok) printf("%s conforms to iFiction style guidelines\n",ii.ifid);\r
+}\r
+\r
+\r