extern t_bnifile * load_bni(std::FILE *f) { t_bnifile *b; unsigned int i; if (f == NULL) return NULL; b = (t_bnifile*)xmalloc(sizeof(t_bnifile)); file_rpush(f); b->unknown1 = file_readd_le(); if (b->unknown1 != 0x00000010) std::fprintf(stderr,"load_bni: field 1 is not 0x00000010. Data may be invalid!\n"); b->unknown2 = file_readd_le(); if (b->unknown2 != 0x00000001) std::fprintf(stderr,"load_bni: field 2 is not 0x00000001. Data may be invalid!\n"); b->numicons = file_readd_le(); if (b->numicons > BNI_MAXICONS) { std::fprintf(stderr,"load_bni: more than %d (BNI_MAXICONS) icons. Increase maximum number of icons in \"bni.h\".\n",BNI_MAXICONS); b->numicons = BNI_MAXICONS; } b->dataoffset = file_readd_le(); if (b->numicons<1) { std::fprintf(stderr,"load_bni: strange, no icons present in BNI file\n"); b->icons = NULL; } else { b->icons = (struct bni_iconlist_struct*)xmalloc(b->numicons*sizeof(t_bniicon)); } for (i = 0; i < b->numicons; i++) { b->icons->icon[i].id = file_readd_le(); b->icons->icon[i].x = file_readd_le(); b->icons->icon[i].y = file_readd_le(); if (b->icons->icon[i].id == 0) { b->icons->icon[i].tag = file_readd_le(); } else { b->icons->icon[i].tag = 0; } b->icons->icon[i].unknown = file_readd_le(); } if (std::ftell(f)!=(long)b->dataoffset) std::fprintf(stderr,"load_bni: Warning, %lu bytes of garbage after BNI header\n",(unsigned long)(b->dataoffset-std::ftell(f))); file_rpop(); return b; }
extern int main(int argc, char * argv[]) { char const * bnifile=NULL; char const * tgafile=NULL; FILE * fbni; FILE * ftga; int a; int forcefile=0; char dash[]="-"; /* unique address used as flag */ if (argc<1 || !argv || !argv[0]) { fprintf(stderr,"bad arguments\n"); return STATUS_FAILURE; } for (a=1; a<argc; a++) if (forcefile && !bnifile) bnifile = argv[a]; else if (strcmp(argv[a],"-")==0 && !bnifile) bnifile = dash; else if (argv[a][0]!='-' && !bnifile) bnifile = argv[a]; else if (forcefile && !tgafile) tgafile = argv[a]; else if (strcmp(argv[a],"-")==0 && !tgafile) tgafile = dash; else if (argv[a][0]!='-' && !tgafile) tgafile = argv[a]; else if (forcefile || argv[a][0]!='-' || strcmp(argv[a],"-")==0) { fprintf(stderr,"%s: extra file argument \"%s\"\n",argv[0],argv[a]); usage(argv[0]); } else if (strcmp(argv[a],"--")==0) forcefile = 1; else if (strcmp(argv[a],"-v")==0 || strcmp(argv[a],"--version")==0) { printf("version "PVPGN_VERSION"\n"); return STATUS_SUCCESS; } else if (strcmp(argv[a],"-h")==0 || strcmp(argv[a],"--help")==0 || strcmp(argv[a],"--usage") ==0) usage(argv[0]); else { fprintf(stderr,"%s: unknown option \"%s\"\n",argv[0],argv[a]); usage(argv[0]); } if (!bnifile) bnifile = dash; if (!tgafile) tgafile = dash; if (bnifile==dash) fbni = stdin; else if (!(fbni = fopen(bnifile,"r"))) { fprintf(stderr,"%s: could not open BNI file \"%s\" for reading (fopen: %s)\n",argv[0],bnifile,pstrerror(errno)); exit(STATUS_FAILURE); } if (tgafile==dash) ftga = stdout; else if (!(ftga = fopen(tgafile,"w"))) { fprintf(stderr,"%s: could not open TGA file \"%s\" for reading (fopen: %s)\n",argv[0],tgafile,pstrerror(errno)); exit(STATUS_FAILURE); } { unsigned char buf[BUFSIZE]; size_t rc; t_bnifile bnih; file_rpush(fbni); bnih.unknown1 = file_readd_le(); bnih.unknown2 = file_readd_le(); bnih.numicons = file_readd_le(); bnih.dataoffset = file_readd_le(); fprintf(stderr,"Info: numicons=%d dataoffset=0x%08x(%d)\n",bnih.numicons,bnih.dataoffset,bnih.dataoffset); if (fseek(fbni,bnih.dataoffset,SEEK_SET)<0) { fprintf(stderr,"%s: could not seek to offset %u in BNI file \"%s\" (fseek: %s)\n",argv[0],bnih.dataoffset,bnifile,pstrerror(errno)); return STATUS_FAILURE; } while ((rc = fread(buf,1,sizeof(buf),fbni))>0) { if (fwrite(buf,rc,1,ftga) < 1) { fprintf(stderr,"%s: could not write data to TGA file \"%s\" (fwrite: %s)\n",argv[0],tgafile,pstrerror(errno)); return STATUS_FAILURE; } } file_rpop(); } if (tgafile!=dash && fclose(ftga)<0) fprintf(stderr,"%s: could not close TGA file \"%s\" after writing (fclose: %s)\n",argv[0],tgafile,pstrerror(errno)); if (bnifile!=dash && fclose(fbni)<0) fprintf(stderr,"%s: could not close BNI file \"%s\" after reading (fclose: %s)\n",argv[0],bnifile,pstrerror(errno)); return STATUS_SUCCESS; }