/* Sociedad Protectora de Diplodocus soft. oct. 1992 */ /* Conversion de archivos a distintos formatos */ #include #include #define BFS 2024 /* 2K */ #define MODO_DEC 0 #define MODO_HEX 1 #define MODO_CHAR 2 #define MODO_INT 3 #define STRSPD " SPDsoft >>" phelp(argc,argv) int argc; char *argv[]; { fprintf(stderr,"%s error\n",STRSPD); fprintf(stderr, "Usa: %s [-d(dec)/-i(ent 2 bytes)/-c(caracter)/-h(hex)] nombre\n" ,argv[0]); exit(1); } main(argc,argv) int argc; char *argv[]; { FILE *archivo; static char *nombre=NULL; static char *modo="rb+"; /*read & write binary*/ static char buffer[BFS]; static int mode,indi; int flag=0,nbytes; static int NCOL, NLIN = 16 ; int output(); if((argc>3)|| (argc < 2)) phelp(argc,argv); if(argc!=3) { mode=MODO_CHAR; nombre = argv[1]; } else{ for(indi=1;indi <= argc ;indi++){ if (argv[indi][0]=='-'){ if(strlen(argv[indi])!=2) phelp(argc,argv); switch(argv[indi][1]){ case 'h': mode = MODO_HEX; NCOL = 16; break; case 'c' : mode = MODO_CHAR; break; case 'd' : mode = MODO_DEC; NCOL = 16 ; break; case 'i': mode = MODO_INT; NCOL = 8; break; default: phelp(argc,argv); break; }/* switch */ nombre = argv[indi==2?1:2]; }/* if */ }/* for */ }/*else*/ if (nombre == NULL ) phelp(argc,argv); if ( mode == MODO_CHAR ) NCOL = 32; archivo=fopen(nombre,modo); if(archivo==NULL){ fprintf(stderr,"%s no se pudo acceder a %s\n", STRSPD,nombre); exit(1); } nbytes=BFS; while( BFS==nbytes ){ nbytes=fread((void*)buffer,1,BFS,archivo); output(nbytes,nbytes,0,mode,buffer,NCOL); } if (fclose(archivo)==EOF){ fprintf(stderr,"%s error en fclose\n",STRSPD); exit(1); } } int output(nchar,neof,desde,mode,buffer,nCOL) int nchar,neof,desde,mode,nCOL; char * buffer; { static int ncol=0; unsigned int itemp; nchar--; if ((nchar<0)||(nchar + desde > neof) || (neof<0) ||( desde <0) ||( desde > neof) ) return(-1); for( neof=nchar+desde;desde <= neof;desde++) { if (ncol>=nCOL ) { printf("\n"); ncol=0; } ncol ++; switch (mode) { case MODO_CHAR: printf("%c ", ((buffer[desde])>=32 && (buffer[desde]<=126)? buffer[desde]:'.')); break; case MODO_HEX: printf("%02X ",buffer[desde]&255); break; case MODO_DEC: printf("%3d ",buffer[desde]&255); break; case MODO_INT: itemp=256*(buffer[desde]&255); itemp+=(buffer[++desde]&255); printf("%5d ",itemp); break; } } return(0); }