rdflib.c
上传用户:yuppie_zhu
上传日期:2007-01-08
资源大小:535k
文件大小:6k
源码类别:

编译器/解释器

开发平台:

C/C++

  1. /* rdflib - manipulate RDOFF library files (.rdl) */
  2. /*
  3.  * an rdoff library is simply a sequence of RDOFF object files, each
  4.  * preceded by the name of the module, an ASCII string of up to 255
  5.  * characters, terminated by a zero. 
  6.  *
  7.  * There may be an optional
  8.  * directory placed on the end of the file. The format of the
  9.  * directory will be 'RDLDD' followed by a version number, followed by
  10.  * the length of the directory, and then the directory, the format of
  11.  * which has not yet been designed. The module name of the directory
  12.  * must be '.dir'. 
  13.  *
  14.  * All module names beginning with '.' are reserved
  15.  * for possible future extensions. The linker ignores all such modules,
  16.  * assuming they have the format of a six byte type & version identifier
  17.  * followed by long content size, followed by data.
  18.  */
  19. #include <stdio.h>
  20. #include <errno.h>
  21. #include <string.h>
  22. /* functions supported:
  23.      create a library (no extra operands required)
  24.      add a module from a library (requires filename and name to give mod.)
  25.      remove a module from a library (requires given name) (not implemented)
  26.      extract a module from the library (requires given name and filename)
  27.      list modules */
  28. const char *usage = 
  29.    "usage:n"
  30.    "  rdflib x libname [extra operands]nn"
  31.    "  where x is one of:n"
  32.    "    c - create libraryn"
  33.    "    a - add module (operands = filename module-name)n"
  34.    "    r - remove                (module-name) [not implemented]n"
  35.    "    x - extract               (module-name filename)n"
  36.    "    t - listn";
  37. char **_argv;
  38. #define _ENDIANNESS 0 /* 0 for little, 1 for big */
  39. static void longtolocal(long * l)
  40. {
  41. #if _ENDIANNESS
  42.     unsigned char t;
  43.     unsigned char * p = (unsigned char *) l;
  44.     t = p[0];
  45.     p[0] = p[3];
  46.     p[3] = t;
  47.     t = p[1];
  48.     p[1] = p[2];
  49.     p[2] = p[1];
  50. #endif
  51. }
  52. char copybytes(FILE *fp, FILE *fp2, int n)
  53. {
  54.     int i, t = 0;
  55.     for (i = 0 ; i < n; i++ )
  56.     {
  57. t = fgetc(fp);
  58. if (t == EOF)
  59. {
  60.     fprintf(stderr,"rdflib: premature end of file in '%s'n",
  61.     _argv[2]);
  62.     exit(1);
  63. }
  64. if (fp2) 
  65.     if (fputc(t, fp2) == EOF)
  66.     {
  67. fprintf(stderr,"rdflib: write errorn");
  68. exit(1);
  69.     }
  70.     }
  71.     return (char) t; /* return last char read */
  72. }
  73. long copylong(FILE *fp, FILE *fp2)
  74. {
  75.     long l;
  76.     int i,t;
  77.     unsigned char * p = (unsigned char *) &l;
  78.     for (i = 0 ; i < 4; i++ ) /* skip magic no */
  79.     {
  80. t = fgetc(fp);
  81. if (t == EOF)
  82. {
  83.     fprintf(stderr,"rdflib: premature end of file in '%s'n",
  84.     _argv[2]);
  85.     exit(1);
  86. }
  87. if (fp2) 
  88.     if (fputc(t, fp2) == EOF)
  89.     {
  90. fprintf(stderr,"rdflib: write errorn");
  91. exit(1);
  92.     }
  93. *p++ = t;
  94.     }
  95.     longtolocal (&l);
  96.     return l;
  97. }
  98. int main(int argc, char **argv)
  99. {
  100.     FILE *fp, *fp2;
  101.     char *p, buf[256], c;
  102.     int i;
  103.     long l;
  104.     _argv = argv;
  105.     if (argc < 3 || !strncmp(argv[1],"-h",2) || !strncmp(argv[1],"--h",3))
  106.     {
  107. printf(usage);
  108. exit(1);
  109.     }
  110.     switch(argv[1][0])
  111.     {
  112.     case 'c': /* create library */
  113. fp = fopen(argv[2],"wb");
  114. if (! fp) {
  115.     fprintf(stderr,"rdflib: could not open '%s'n",argv[2]);
  116.     perror("rdflib");
  117.     exit(1);
  118. }
  119. fclose(fp);
  120. break;
  121.     case 'a': /* add module */
  122. if (argc < 5) {
  123.     fprintf(stderr,"rdflib: required parameter missingn");
  124.     exit(1);
  125. }
  126. fp = fopen(argv[2],"ab");
  127. if (! fp)
  128. {
  129.     fprintf(stderr,"rdflib: could not open '%s'n",argv[2]);
  130.     perror("rdflib");
  131.     exit(1);
  132. }
  133. fp2 = fopen(argv[3],"rb");
  134. if (! fp)
  135. {
  136.     fprintf(stderr,"rdflib: could not open '%s'n",argv[3]);
  137.     perror("rdflib");
  138.     exit(1);
  139. }
  140. p = argv[4];
  141. do {
  142.     if ( fputc(*p,fp) == EOF ) {
  143. fprintf(stderr,"rdflib: write errorn");
  144. exit(1);
  145.     }
  146. } while (*p++);
  147. while (! feof (fp2) ) {
  148.     i = fgetc (fp2);
  149.     if (i == EOF) {
  150. break;
  151.     }
  152.     if ( fputc(i, fp) == EOF ) {
  153. fprintf(stderr,"rdflib: write errorn");
  154. exit(1);
  155.     }
  156. }
  157. fclose(fp2);
  158. fclose(fp);
  159. break;
  160.     case 'x':
  161. if (argc < 5) {
  162.     fprintf(stderr,"rdflib: required parameter missingn");
  163.     exit(1);
  164. }
  165.     case 't':
  166. if (argc < 3) {
  167.     fprintf(stderr, "rdflib: required paramenter missingn");
  168.     exit(1);
  169. }
  170. fp = fopen(argv[2],"rb");
  171. if (! fp)
  172. {
  173.     fprintf(stderr,"rdflib: could not open '%s'n",argv[2]);
  174.     perror("rdflib");
  175.     exit(1);
  176. }
  177. fp2 = NULL;
  178. while (! feof(fp) ) {
  179.     /* read name */
  180.     p = buf;
  181.     while( ( *(p++) = (char) fgetc(fp) ) )  
  182. if (feof(fp)) break;
  183.     if (feof(fp)) break;
  184.     fp2 = NULL;
  185.     if (argv[1][0] == 'x') {
  186. /* check against desired name */
  187. if (! strcmp(buf,argv[3]) )
  188. {
  189.     fp2 = fopen(argv[4],"wb");
  190.     if (! fp2)
  191.     {
  192. fprintf(stderr,"rdflib: could not open '%s'n",argv[4]);
  193. perror("rdflib");
  194. exit(1);
  195.     }
  196. }
  197.     }
  198.     else
  199. printf("%-40s ", buf);
  200.     /* step over the RDOFF file, extracting type information for
  201.      * the listing, and copying it if fp2 != NULL */
  202.     if (buf[0] == '.') {
  203. if (argv[1][0] == 't')
  204.     for (i = 0; i < 6; i++)
  205. printf("%c", copybytes(fp,fp2,1));
  206. else
  207.     copybytes(fp,fp2,6);
  208. l = copylong(fp,fp2);
  209. if (argv[1][0] == 't') printf("   %ld bytes contentn", l);
  210. copybytes(fp,fp2,l);
  211.     }
  212.     else if ((c=copybytes(fp,fp2,6)) >= '2') /* version 2 or above */
  213.     {
  214. l = copylong(fp,fp2);
  215. if (argv[1][0] == 't')
  216.     printf("RDOFF%c   %ld bytes contentn", c, l);
  217. copybytes(fp,fp2, l); /* entire object */
  218.     }
  219.     else
  220.     {
  221. if (argv[1][0] == 't')
  222.     printf("RDOFF1n");
  223. /*
  224.  * version 1 object, so we don't have an object content
  225.  * length field.
  226.  */
  227. copybytes(fp,fp2, copylong(fp,fp2)); /* header */
  228. copybytes(fp,fp2, copylong(fp,fp2)); /* text */
  229. copybytes(fp,fp2, copylong(fp,fp2)); /* data */
  230.     }
  231.     if (fp2)
  232. break;
  233. }
  234. fclose(fp);
  235. if (fp2)
  236.     fclose(fp2);
  237. else if (argv[1][0] == 'x')
  238. {
  239.     fprintf(stderr,"rdflib: module '%s' not found in '%s'n",
  240.     argv[3],argv[2]);
  241.     exit(1);
  242. }
  243. break;
  244.     default:
  245. fprintf(stderr,"rdflib: command '%c' not recognisedn",
  246. argv[1][0]);
  247. exit(1);
  248.     }
  249.     return 0;
  250. }