Annotation of researchv10dc/cmd/fsplit.c, revision 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.