--- /dev/null
+/*
+ * unbag
+ *
+ * This program "unbags" files "bagged" by bag. Can be used for non-UNIX
+ * folks that need to unbag stuff.
+ */
+#include <stdio.h>
+
+static int line=0;
+
+main(argc, argv)
+int argc;
+char **argv;
+{
+ FILE *f;
+
+ if ( argc <= 1 )
+ {
+ fprintf(stderr, "unbag: missing bagfile name\n");
+ exit(-1);
+ }
+ f = fopen(argv[1], "r");
+ if ( f == NULL )
+ {
+ fprintf(stderr, "unbag: cannot open %s\n", argv[1]);
+ exit(-1);
+ }
+
+ unbag( f );
+
+ fclose( f );
+}
+
+unbag(f)
+FILE *f;
+{
+ FILE *output;
+ static char text[2048];
+ char *nm, *p;
+
+ while ( fgets(text, 2048, f) != NULL )
+ {
+ line++;
+ if ( strncmp(text, "cat << \\EOF_", strlen("cat << \\EOF_"))!= 0 )
+ {
+ fprintf(stderr, "unbag: line %d: bad file format (missing BEGIN)\n", line);
+ fprintf(stderr, "unbag: text was '%s'\n", text);
+ exit(-1);
+ }
+ nm = &text[strlen("cat << \\EOF_")];
+ for (p=nm; *p!=' '; p++) {;} /* find end of filename */
+ *p = '\0';
+ output = fopen(nm, "w");
+ if ( output == NULL )
+ {
+ fprintf(stderr, "unbag: cannot open ouput file %s\n", nm);
+ exit(-1);
+ }
+ extract(f, output, nm);
+ fclose(output);
+ }
+}
+
+/* Cat a f to f2 (lines <= 2047 characters) stopping after reading 'stop' */
+extract(f, f2, stop)
+FILE *f, *f2;
+char *stop;
+{
+ static char text[2048];
+ char *p;
+
+ while ( fgets(text, 2048, f)!=NULL )
+ {
+ line++;
+ text[strlen(text)-1] = '\0'; /* rm \n */
+ if ( strncmp(text, "EOF_", strlen("EOF_")) == 0 )
+ if ( strcmp(&text[strlen("EOF_")], stop) == 0 ) return;
+ if ( text[0] != '>' )
+ {
+ fprintf(stderr,"unbag: line %d: bad file format: %s\n", line, stop);
+ exit(-1);
+ }
+ fprintf(f2, "%s\n", &text[1]);
+/*
+ for (p=&text[1]; *p!='\0'; p++)
+ {
+ if ( *p=='\\' ) p++;
+ putc(*p, f2);
+ }
+ putc('\n', f2);
+*/
+ }
+}