/* © Sociedad Protectora de Diplodocus soft. nov. 1991 */ /* more de todo tipo de archivos sin controles */ #include #include #define MAX_SIZ 1000000 #define MODO_DEC 0 #define MODO_HEX 1 #define MODO_CHAR 2 #define MODO_INT 3 #define PROMPT "\nSPDsoft>>more:%d\n" phelp(argc,argv) int argc; char *argv[]; { printf("\nUsa: %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="Espacio reservado para nombres"; static char *modo="rb+"; /*read & write binary*/ static char buffer[MAX_SIZ]; static int mode,indi; int flag=0,nbytes,siz_bytes=MAX_SIZ; 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 ( mode == MODO_CHAR ) NCOL = 32; archivo=fopen(nombre,modo); if(archivo==NULL){ printf("\n%s no encontrado\n",nombre); exit(1); } nbytes=fread((void*)buffer,1,siz_bytes,archivo); printf("\nleidos %d caracteres\n",nbytes); getchar(); fflush(stdin); output(nbytes,nbytes,0,mode,buffer,NLIN,NCOL); if (fclose(archivo)==EOF){ puts("error en fclose"); exit(1); } } int output(nchar,neof,desde,mode,buffer,nLIN,nCOL) int nchar,neof,desde,mode,nLIN,nCOL; char * buffer; { int ncol=0,nlin=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; nlin++; } if (nlin>=nLIN ) { printf(PROMPT,desde); getchar(); nlin=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; } } printf("\n"); return(0); }