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

1.1       root        1: /*
                      2:        Program to split file(s) containing Fortran, Ratfor, or Efl
                      3:        procedures into separate files, one per procedure.
                      4:        Procedure X is put in file X.f, X.r, or X.e depending on
                      5:        the language option (-f, -r, -e); Fortran (-f) is default.
                      6:        The -s option causes Fortran procedures to be stripped to 72
                      7:        or fewer characters, with trailing blanks removed.
                      8:         The -i option forces filenames to lower case.
                      9: */
                     10: 
                     11: #include <stdio.h>
                     12: #include <ctype.h>
                     13: #define BIG 1000
                     14: 
                     15: #define NO     0
                     16: #define YES    1
                     17: 
                     18: #define FORTRAN        0
                     19: #define RATFOR 1
                     20: #define EFL    2
                     21: 
                     22: int blkdatano  = 0;
                     23: int language   = FORTRAN;
                     24: char suffix    = 'f';
                     25: int strip      = NO;
                     26: int iflag;
                     27: 
                     28: #define SKIP   while( isspace(*s) ) ++s;
                     29: 
                     30: 
                     31: main(argc, argv)
                     32: int argc;
                     33: char **argv;
                     34: {
                     35: FILE *fd;
                     36: int i;
                     37: register char *s;
                     38: 
                     39: while(argc>1 && argv[1][0]=='-')
                     40:        {
                     41:        for(s = argv[1]+1 ; *s ; ++s)
                     42:                switch(*s)
                     43:                        {
                     44:                        case 'y':
                     45:                                fprintf(stderr,"split: -y obsolete; -i assumed\n");
                     46:                        case 'i':
                     47:                                iflag++;
                     48:                                break;
                     49: 
                     50:                        case 's':
                     51:                                strip = YES;
                     52:                                break;
                     53: 
                     54:                        case 'f':
                     55:                                language = FORTRAN;
                     56:                                suffix = 'f';
                     57:                                break;
                     58: 
                     59:                        case 'r':
                     60:                                language = RATFOR;
                     61:                                suffix = 'r';
                     62:                                break;
                     63: 
                     64:                        case 'e':
                     65:                                language = EFL;
                     66:                                suffix = 'e';
                     67:                                break;
                     68: 
                     69:                        default:
                     70:                                fprintf(stderr, "bad option %c\n", *s);
                     71:                                exit(1);
                     72:                        }
                     73: 
                     74:        --argc;
                     75:        ++argv;
                     76:        }
                     77: 
                     78: if(strip && language!=FORTRAN)
                     79:        fprintf(stderr, "implausible to strip non-Fortran programs\n");
                     80: 
                     81: 
                     82: if(argc <= 1)
                     83:        splitup(stdin);
                     84: 
                     85: else for(i = 1 ; i < argc ; ++i)
                     86:        {
                     87:        if( (fd = fopen(argv[i], "r")) == NULL)
                     88:                {
                     89:                fprintf(stderr, "cannot open %s\n", argv[i]);
                     90:                exit(1);
                     91:                }
                     92:        splitup(fd);
                     93:        fclose(fd);
                     94:        }
                     95: 
                     96: exit(0);
                     97: }
                     98: 
                     99: 
                    100: 
                    101: splitup(fin)
                    102: FILE *fin;
                    103: {
                    104: FILE *fout;
                    105: char in[BIG], fname[20], *s;
                    106: int i, c;
                    107: 
                    108: while( fgets(in,BIG,fin) )
                    109:        {
                    110:        if( *in=='c' || *in=='C' || *in=='*' )
                    111:                continue;
                    112:        s = in;
                    113:        SKIP
                    114:        if (*s=='\0' || *s=='\n' )
                    115:                continue;
                    116:        if(strip)
                    117:                shorten(in);
                    118: 
                    119:        getname(s, fname);
                    120:        if(iflag)
                    121:                lowercase(fname);
                    122:        if( (fout = fopen(fname, "w")) == NULL)
                    123:                {
                    124:                fprintf(stderr, "can't open %s", fname);
                    125:                exit(1);
                    126:                }
                    127:        fputs(in,fout);
                    128:        while( !endcard(in) && fgets(in, BIG, fin) )
                    129:                {
                    130:                if(strip)
                    131:                        shorten(in);
                    132:                fputs(in, fout);
                    133:                }
                    134:        fclose(fout);
                    135:        }
                    136: }
                    137: 
                    138: 
                    139: 
                    140: lowercase(s)
                    141:        register char *s;
                    142: {
                    143:        do
                    144:                if(isupper(*s))
                    145:                        *s=tolower(*s);
                    146:        while(*s++);
                    147: }
                    148: 
                    149: 
                    150: getname(s,f)
                    151: char *s,*f;
                    152: {
                    153: int i,j,c;
                    154:    loop:
                    155:        if( compar(&s,"subroutine") )   goto bot;
                    156:        else if( compar(&s,"function") )        goto bot;
                    157:        else if( compar(&s,"procedure") )       goto bot;
                    158:        else if( compar(&s,"program") ) goto bot;
                    159:        else if( compar(&s,"real") )    goto loop;
                    160:        else if( compar(&s,"integer") ) goto loop;
                    161:        else if( compar(&s,"logical") ) goto loop;
                    162:        else if( compar(&s,"double") )  goto loop;
                    163:        else if( compar(&s,"precision") )       goto loop;
                    164:        else if( compar(&s,"complex") ) goto loop;
                    165:        else if( compar(&s,"character") ) goto loop;
                    166:        else if( compar(&s,"*") )       /* complex *16  etc */
                    167:                {
                    168:                for( ++s ; isdigit(*s) || isspace(*s)  ; ++s)
                    169:                        ;
                    170:                goto loop;
                    171:                }
                    172:        else if( compar(&s,"blockdata") )
                    173:                {
                    174:                SKIP
                    175:                if(*s == '\0')  /* no block data name */
                    176:                        {
                    177:                        sprintf(f, "BLOCKDATA%d.%c", ++blkdatano, suffix);
                    178:                        return;
                    179:                        }
                    180:                goto bot;
                    181:                }
                    182:        else
                    183:                s = "";
                    184: 
                    185: bot:
                    186:        SKIP
                    187:        for(i=0 ; isalpha(*s) || isdigit(*s) ; i++)
                    188:                f[i] = *s++;
                    189:        if(i > 0)
                    190:                {
                    191:                f[i++] = '.';
                    192:                f[i++] = suffix;
                    193:                f[i++] = '\0';
                    194:                }
                    195:        else
                    196:                sprintf(f, "MAIN.%c", suffix);
                    197: }
                    198: 
                    199: /* compare two strings for equality.  assume that
                    200:    t is all lower case.  ignore blanks and decase s
                    201:    during comparison.  s0 points to next character after
                    202:    successful comparison.
                    203: */
                    204: compar(s0, t)
                    205: char **s0,*t;
                    206: {
                    207: register char *s;
                    208: register int s1;
                    209: s = *s0;
                    210: while( *t )
                    211:        {
                    212:        SKIP
                    213:        s1 = *s++;
                    214:        if(isupper(s1))
                    215:                s1 = tolower(s1);
                    216:        if(s1 != *t++)
                    217:                return(NO);
                    218:        }
                    219: *s0 = s;
                    220: return(YES);
                    221: }
                    222: 
                    223: 
                    224: endcard(s)
                    225: char *s;
                    226: {
                    227: register int i;
                    228: 
                    229: if( *s==0 )
                    230:        return(YES);
                    231: SKIP
                    232: if( s[0]!='e' && s[0]!='E' )
                    233:        return(NO);
                    234: if( s[1]!='n' && s[1]!='N' )
                    235:        return(NO);
                    236: if( s[2]!='d' && s[2]!='D' )
                    237:        return(NO);
                    238: for(i = 3; i<66; ++i)
                    239:        if(s[i] == '\n')
                    240:                return(YES);
                    241:        else if(s[i] != ' ')
                    242:                return(NO);
                    243: return(YES);
                    244: }
                    245: 
                    246: 
                    247: 
                    248: shorten(s0)
                    249: register char *s0;
                    250: {
                    251: register char *s, *s72;
                    252: s72 = s0 + 72;
                    253: 
                    254: for(s=s0 ; s<s72; ++s)
                    255:        if(*s=='\n' || *s=='\0')
                    256:                break;
                    257: 
                    258: while(s>s0 && s[-1]==' ')
                    259:        --s;
                    260: s[0] = '\n';
                    261: s[1] = '\0';
                    262: }

unix.superglobalmegacorp.com

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