|
|
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 -y 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 yflag; ! 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: yflag++; ! 46: break; ! 47: ! 48: case 's': ! 49: strip = YES; ! 50: break; ! 51: ! 52: case 'f': ! 53: language = FORTRAN; ! 54: suffix = 'f'; ! 55: break; ! 56: ! 57: case 'r': ! 58: language = RATFOR; ! 59: suffix = 'r'; ! 60: break; ! 61: ! 62: case 'e': ! 63: language = EFL; ! 64: suffix = 'e'; ! 65: break; ! 66: ! 67: default: ! 68: fprintf(stderr, "bad option %c\n", *s); ! 69: exit(1); ! 70: } ! 71: ! 72: --argc; ! 73: ++argv; ! 74: } ! 75: ! 76: if(strip && language!=FORTRAN) ! 77: fprintf(stderr, "implausible to strip non-Fortran programs\n"); ! 78: ! 79: ! 80: if(argc <= 1) ! 81: splitup(stdin); ! 82: ! 83: else for(i = 1 ; i < argc ; ++i) ! 84: { ! 85: if( (fd = fopen(argv[i], "r")) == NULL) ! 86: { ! 87: fprintf(stderr, "cannot open %s\n", argv[i]); ! 88: exit(1); ! 89: } ! 90: splitup(fd); ! 91: fclose(fd); ! 92: } ! 93: ! 94: exit(0); ! 95: } ! 96: ! 97: ! 98: ! 99: splitup(fin) ! 100: FILE *fin; ! 101: { ! 102: FILE *fout; ! 103: char in[BIG], fname[20]; ! 104: int i, c; ! 105: ! 106: while( fgets(in,BIG,fin) ) ! 107: { ! 108: if( *in=='c' || *in=='C' || *in=='\0' || *in=='\n' ) continue; ! 109: if(strip) ! 110: shorten(in); ! 111: getname(in, fname); ! 112: if(yflag) ! 113: lowercase(fname); ! 114: if( (fout = fopen(fname, "w")) == NULL) ! 115: { ! 116: fprintf(stderr, "can't open %s", fname); ! 117: exit(1); ! 118: } ! 119: fputs(in,fout); ! 120: while( !endcard(in) && fgets(in, BIG, fin) ) ! 121: { ! 122: if(strip) ! 123: shorten(in); ! 124: fputs(in, fout); ! 125: } ! 126: fclose(fout); ! 127: } ! 128: } ! 129: ! 130: ! 131: ! 132: lowercase(s) ! 133: register char *s; ! 134: { ! 135: do ! 136: if(isupper(*s)) ! 137: *s=tolower(*s); ! 138: while(*s++); ! 139: } ! 140: ! 141: ! 142: getname(s,f) ! 143: char *s,*f; ! 144: { ! 145: int i,j,c; ! 146: loop: ! 147: if( compar(&s,"subroutine") ) goto bot; ! 148: else if( compar(&s,"function") ) goto bot; ! 149: else if( compar(&s,"procedure") ) goto bot; ! 150: else if( compar(&s,"program") ) goto bot; ! 151: else if( compar(&s,"real") ) goto loop; ! 152: else if( compar(&s,"integer") ) goto loop; ! 153: else if( compar(&s,"logical") ) goto loop; ! 154: else if( compar(&s,"double") ) goto loop; ! 155: else if( compar(&s,"precision") ) goto loop; ! 156: else if( compar(&s,"complex") ) goto loop; ! 157: else if( compar(&s,"character") ) goto loop; ! 158: else if( compar(&s,"*") ) /* complex *16 etc */ ! 159: { ! 160: for( ++s ; isdigit(*s) || isspace(*s) ; ++s) ! 161: ; ! 162: goto loop; ! 163: } ! 164: else if( compar(&s,"blockdata") ) ! 165: { ! 166: SKIP ! 167: if(*s == '\0') /* no block data name */ ! 168: { ! 169: sprintf(f, "BLOCKDATA%d.%c", ++blkdatano, suffix); ! 170: return; ! 171: } ! 172: goto bot; ! 173: } ! 174: else ! 175: s = ""; ! 176: ! 177: bot: ! 178: SKIP ! 179: for(i=0 ; isalpha(*s) || isdigit(*s) ; i++) ! 180: f[i] = *s++; ! 181: if(i > 0) ! 182: { ! 183: f[i++] = '.'; ! 184: f[i++] = suffix; ! 185: f[i++] = '\0'; ! 186: } ! 187: else ! 188: sprintf(f, "MAIN.%c", suffix); ! 189: } ! 190: ! 191: /* compare two strings for equality. assume that ! 192: t is all lower case. ignore blanks and decase s ! 193: during comparison. s0 points to next character after ! 194: successful comparison. ! 195: */ ! 196: compar(s0, t) ! 197: char **s0,*t; ! 198: { ! 199: register char *s; ! 200: register int s1; ! 201: s = *s0; ! 202: while( *t ) ! 203: { ! 204: SKIP ! 205: s1 = *s++; ! 206: if(isupper(s1)) ! 207: s1 = tolower(s1); ! 208: if(s1 != *t++) ! 209: return(NO); ! 210: } ! 211: *s0 = s; ! 212: return(YES); ! 213: } ! 214: ! 215: ! 216: endcard(s) ! 217: char *s; ! 218: { ! 219: register int i; ! 220: ! 221: if( *s==0 ) ! 222: return(YES); ! 223: SKIP ! 224: if( s[0]!='e' && s[0]!='E' ) ! 225: return(NO); ! 226: if( s[1]!='n' && s[1]!='N' ) ! 227: return(NO); ! 228: if( s[2]!='d' && s[2]!='D' ) ! 229: return(NO); ! 230: for(i = 3; i<66; ++i) ! 231: if(s[i] == '\n') ! 232: return(YES); ! 233: else if(s[i] != ' ') ! 234: return(NO); ! 235: return(YES); ! 236: } ! 237: ! 238: ! 239: ! 240: shorten(s0) ! 241: register char *s0; ! 242: { ! 243: register char *s, *s72; ! 244: s72 = s0 + 72; ! 245: ! 246: for(s=s0 ; s<s72; ++s) ! 247: if(*s=='\n' || *s=='\0') ! 248: break; ! 249: ! 250: while(s>s0 && s[-1]==' ') ! 251: --s; ! 252: s[0] = '\n'; ! 253: s[1] = '\0'; ! 254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.