home *** CD-ROM | disk | FTP | other *** search
/ Doom I/II Collection / DM12.ISO / edit / dmtex09b / lmp2wad.c < prev    next >
Text File  |  1994-02-20  |  3KB  |  139 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos.h>
  4. #include <io.h>
  5. #include <sys\types.h>
  6. #include <sys\stat.h>
  7. #include <malloc.h>
  8. #include <fcntl.h>
  9.  
  10. #define PWAD 0x44415750
  11.  
  12. struct header
  13. {    long    magic;
  14.     long    numentries;
  15.     long    diroff;    };
  16.  
  17. struct dirent
  18. {    long    offset;
  19.     long    length;
  20.     char    name[8];    };
  21.  
  22. int    fhw;
  23. long    offset;
  24.  
  25. void error(char *errstr)
  26. {    printf(errstr);
  27.     exit(1);    }
  28.  
  29. void addlumpdirent(pfind,lump)
  30. struct find_t *pfind;
  31. unsigned int lump;
  32. {
  33.     struct dirent dire;
  34.     char lname[20], fname[20];
  35.     unsigned long dsize;
  36.     int i;
  37.     
  38.     dire.offset=offset;
  39.     dsize=pfind->size;
  40.     dire.length=dsize;
  41.     strcpy(fname, pfind->name);
  42.     strcpy(lname, "\0");
  43.     strncat(lname, fname, strlen(fname)-4);
  44.     for (i=0; i<strlen(lname); i++)
  45.         if ((lname[i]>='a') && (lname[i]<='z'))
  46.             lname[i] &= 0xdf;
  47.     strncpy(dire.name, lname, 8);
  48.     printf("%lx\t%lx\t%s\n",dire.offset,dire.length,lname);
  49.  
  50.     write(fhw,&dire,16);
  51.  
  52.     dsize += 3;
  53.     dsize &= 0xfffffffc;
  54.     offset+=dsize;
  55. }
  56.  
  57. void addlump(pfind)
  58. struct find_t *pfind;
  59. {
  60.     unsigned long dsize;
  61.     char fname[20];
  62.     char *data;
  63.     int fh;
  64.     
  65.     dsize=pfind->size;
  66.     strcpy(fname, pfind->name);
  67.     if ((data=(char *)malloc(dsize))==NULL)
  68.         error("Lump too big for this shite program.\n");
  69.     if (!(fh=open(fname,O_BINARY|O_RDONLY)))
  70.         error("Bizarre problem opening lump.\n");
  71.     read(fh,data,dsize);
  72.     close(fh);
  73.     
  74.     dsize += 3;
  75.     dsize &= 0xfffffffc;
  76.     write(fhw,data,dsize);
  77.     offset += dsize;
  78.     free(data);
  79. }
  80.  
  81.  
  82. main(argc,argv)
  83. int argc;
  84. char *argv[];
  85. {
  86.     struct find_t find;
  87.     char lname[20], wname[20];
  88.     struct header head;
  89.     unsigned int lump, lumpnum;
  90.     
  91.     if (argc != 3)
  92.         error("Usage: lmp2wad <wadname> <wildfilespec>\n"
  93.             "\t(no file extensions)");
  94.     
  95.     strcpy(wname, argv[1]);
  96.     strcat(wname, ".wad");
  97.     strcpy(lname, argv[2]);
  98.     strcat(lname, ".lmp");
  99.     
  100.     //    Count number of entries in directory
  101.     if (!_dos_findfirst(lname, _A_NORMAL, &find))
  102.         lumpnum=1;
  103.     else    error("Nothing to put in wad!\n");
  104.     while (!_dos_findnext(&find))
  105.         lumpnum++;
  106.     printf("Number of lumps in directory: %d\n", lumpnum);
  107.     if (lumpnum>4095)
  108.         error("Max lumps is 4095. Sorry.\n");
  109.     
  110.     head.magic=PWAD;
  111.     head.numentries=lumpnum;
  112.     head.diroff=0;
  113.     
  114.     if (!(fhw=open(wname,O_CREAT|O_BINARY|O_WRONLY,S_IREAD|S_IWRITE)))
  115.         error("Can't create WAD.\n");
  116.     write(fhw,&head,12);
  117.     offset=12;
  118.     
  119.     lump=0;
  120.     _dos_findfirst(lname, _A_NORMAL, &find);
  121.     addlump(&find);
  122.     while(!_dos_findnext(&find))
  123.         addlump(&find);
  124.         
  125.     head.diroff=offset;
  126.     
  127.     lump=0;
  128.     offset=12;
  129.     _dos_findfirst(lname, _A_NORMAL, &find);
  130.     addlumpdirent(&find, lump++);
  131.     while (!_dos_findnext(&find))
  132.         addlumpdirent(&find, lump++);
  133.  
  134.     lseek(fhw,0,SEEK_SET);
  135.     write(fhw,&head,12);
  136.     close(fhw);
  137.     
  138.     exit(0);
  139. }