Annotation of researchv10no/cmd/strings.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #include <libc.h>
                      4: #include </usr/include/a.out.h>
                      5: 
                      6: #define INF (~0UL>>1)
                      7: int minlen = 4;
                      8: int oflag;
                      9: int tflag, dflag, sflag, aflag;
                     10: 
                     11: void strings(FILE*, long, long);
                     12: char *flush(char*, long);
                     13: 
                     14: int
                     15: main(int argc, char **argv)
                     16: {
                     17:        int i;
                     18:        int errors = 0;
                     19:        struct exec header;
                     20:        while(argc>1 && argv[1][0]=='-') {
                     21:                if(argv[1][1] == 0)     /* oldthink */
                     22:                        aflag++;
                     23:                while(*++argv[1]) {
                     24:                        switch(*argv[1]) {
                     25:                        case 'o':
                     26:                                oflag++;
                     27:                                continue;
                     28:                        case 't':
                     29:                                tflag++;
                     30:                                continue;
                     31:                        case 'd':
                     32:                                dflag++;
                     33:                                continue;
                     34:                        case 's':
                     35:                                sflag++;
                     36:                                continue;
                     37:                        case 'a':
                     38:                                aflag++;
                     39:                                continue;
                     40:                        case '0':case '1':case '2':case '3':case '4':
                     41:                        case '5':case '6':case '7':case '8':case '9':
                     42:                                minlen = atoi(argv[1]);
                     43:                        }
                     44:                        break;
                     45:                }
                     46:                argc--;
                     47:                argv++;
                     48:        }
                     49:        if(!(tflag|dflag|sflag|aflag)) {
                     50:                tflag++;
                     51:                dflag++;
                     52:        }
                     53:        for(i=1; i<argc; i++) {
                     54:                long base = sizeof header;
                     55:                FILE *f = fopen(argv[i],"r");
                     56:                if(f == 0) {
                     57:                        fprintf(stderr,"strings: ");
                     58:                        perror(argv[i]);
                     59:                        errors++;
                     60:                        continue;
                     61:                }
                     62:                if(argc > 2) {
                     63:                        if(i > 1) printf("\n");
                     64:                        printf("%s:\n", argv[i]);
                     65:                }
                     66:                if(aflag)
                     67:                        goto all;
                     68:                if(fread(&header,sizeof(header),1,f) != 1)                                      goto all;
                     69:                switch(header.a_magic) {
                     70:                all:
                     71:                default:
                     72:                        strings(f, 0, INF);
                     73:                        break;
                     74:                case ZMAGIC:
                     75:                        base = 1024;
                     76:                case OMAGIC:
                     77:                case NMAGIC:
                     78:                        if(tflag)
                     79:                                strings(f, base, header.a_text);
                     80:                        base += header.a_text;
                     81:                        if(dflag)
                     82:                                strings(f, base, header.a_data);
                     83:                        base += header.a_data + header.a_syms +
                     84:                                header.a_trsize + header.a_drsize;
                     85:                        if(sflag)
                     86:                                strings(f, base, INF);
                     87:                }
                     88:                fclose(f);
                     89:        }
                     90:        return errors;
                     91: }
                     92: 
                     93: char string[1024];
                     94: 
                     95: void
                     96: strings(FILE *f, long base, long length)
                     97: {
                     98:        int c;
                     99:        char *cp = string;
                    100:        fseek(f, base, 0);
                    101:        cp = string;
                    102:        for( ; --length>=0 && (c=getc(f))!=EOF; base++) {
                    103:                switch(c) {
                    104:                case '\n':
                    105:                case 0:
                    106:                        cp = flush(cp, base);
                    107:                        continue;
                    108:                case '\t':
                    109:                case '\b':
                    110:                        break;
                    111:                default:
                    112:                        if(isprint(c))
                    113:                                break;
                    114:                        cp = string;
                    115:                        continue;
                    116:                }
                    117:                *cp++ = c;
                    118:                if(cp >= string + sizeof string - 2)
                    119:                        cp = flush(cp, base);
                    120:        }
                    121: }
                    122: 
                    123: char *
                    124: flush(char *cp, long base)
                    125: {
                    126:        if(cp-string >= minlen) {
                    127:                *cp = 0;
                    128:                if(oflag)
                    129:                        printf("%9lo ", base - (cp-string));
                    130:                puts(string);
                    131:        }
                    132:        return string;
                    133: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.