|
|
1.1 ! root 1: /******************************************************************* ! 2: * * ! 3: * File: CIFPLOT/input.c * ! 4: * Written by Dan Fitzpatrick * ! 5: * copyright 1980 -- Regents of the University of California * ! 6: * * ! 7: ********************************************************************/ ! 8: ! 9: ! 10: #include <stdio.h> ! 11: #include "defs.h" ! 12: #include "globals.h" ! 13: #include "scanner.h" ! 14: ! 15: IMPORT string Concat(); ! 16: IMPORT alloc(); ! 17: IMPORT PrintError(); ! 18: IMPORT expand(); ! 19: ! 20: extern struct ErrorType *ErrorList; /* Need to print line if there ! 21: * is an error */ ! 22: int bad,LineLevel; ! 23: ! 24: InitInput(b,n,v) ! 25: int b,n; ! 26: char **v; ! 27: { ! 28: CharNo = 0; ! 29: LineNo = 1; ! 30: ! 31: /* Allocate space for input buffer */ ! 32: in_buf_size = InBufSize; ! 33: in_buf = (char *) alloc(in_buf_size); ! 34: in_store = (char *) alloc(in_buf_size); ! 35: ! 36: argv = v; ! 37: argb = b; ! 38: argc = n; ! 39: ! 40: if (argb<argc) { ! 41: /* Open first cif file */ ! 42: if (NULL == (in_file[0] = fopen(argv[argb],"r"))) { ! 43: perror(argv[argb]); ! 44: exit(1); ! 45: } ! 46: CurrentFile = FileName[0] = Concat(argv[argb],0); ! 47: return(1); ! 48: } ! 49: else { ! 50: /* Error if no file to read */ ! 51: fprintf(stderr,"Usage: %s options file1.cif file2.cif ...\n",argv[0]); ! 52: exit(0); ! 53: } ! 54: } ! 55: ! 56: Next() ! 57: /* Next gets the next file to be read, ! 58: * and returns 0. It returns 1 when there ! 59: * are no files left. ! 60: */ ! 61: { ! 62: fclose(in_file[FStackPtr]); ! 63: Free(FileName[FStackPtr]); ! 64: /* Check to see that no files are stacked up. If there are ! 65: * some open them before reading next file */ ! 66: if (FStackPtr == 0) { ! 67: if (++argb < argc) { ! 68: if (NULL == (in_file[0] = fopen(argv[argb],"r"))) { ! 69: fprintf(stderr,"Can't read %s\n",argv[argb]); ! 70: perror(""); ! 71: exit(); ! 72: } ! 73: if(debug>1) fprintf(stderr,"Begin next file: %s\n",argv[argb]); ! 74: CurrentFile = FileName[0] = Concat(argv[argb],0); ! 75: return(0); ! 76: } ! 77: else { ! 78: return(1); ! 79: } ! 80: } ! 81: else { ! 82: FStackPtr--; ! 83: CurrentFile = FileName[FStackPtr]; ! 84: if(debug>1) fprintf(stderr,"Finnished with file %s, resume file %s\n",FileName[FStackPtr+1],CurrentFile); ! 85: return(0); ! 86: } ! 87: } ! 88: ! 89: Include(s) ! 90: char *s; ! 91: /* Open file 's', stack current file */ ! 92: { ! 93: if (debug>1) fprintf(stderr,"File switch from %s to %s\n",CurrentFile,s); ! 94: FStackPtr++; ! 95: if (FStackPtr < FStackSize) { ! 96: if (NULL == (in_file[FStackPtr] = fopen(s,"r"))) { ! 97: FStackPtr--; ! 98: fprintf(stderr,"Unable to read %s which was called from %s",s,CurrentFile); ! 99: fprintf(stderr,"---Include command ignored\n"); ! 100: perror(""); ! 101: } ! 102: else { ! 103: CurrentFile = FileName[FStackPtr] = Concat(s,0); ! 104: } ! 105: } ! 106: else { ! 107: fprintf(stderr,"Can't open %s---Too many files already open\n",s); ! 108: FStackPtr--; ! 109: } ! 110: } ! 111: ! 112: input() ! 113: /* Return next input character */ ! 114: { ! 115: char ch; ! 116: int i; ! 117: ! 118: if(EOF == (ch = getc(in_file[FStackPtr]))) ch=0; ! 119: if (0 <= CharNo && CharNo < in_buf_size) in_buf[CharNo] = ch; ! 120: else ! 121: if (CharNo >= in_buf_size) { ! 122: ! 123: /* Buffer is too small - Double its size */ ! 124: if(debug>1) fprintf(stderr,"Increase input buffer size to %d\n",2*in_buf_size); ! 125: in_buf_size = in_buf_size*2; ! 126: in_buf = (char *) expand(in_buf,in_buf_size); ! 127: in_store = (char *) expand(in_store,in_buf_size); ! 128: in_buf[CharNo] = ch; ! 129: } ! 130: CharNo++; ! 131: if (ch == '\n') { ! 132: if ((list || (ErrorList != NIL)) && (! bad)) { ! 133: /* Print the line if we are in listing mode or ! 134: * there is an error on that line */ ! 135: fprintf(stderr,"%6d ",LineNo); ! 136: for(i=0; i<CharNo; i++) if (i < in_buf_size) fprintf(stderr,"%c",in_buf[i]); ! 137: OldLength = CharNo; ! 138: maxlines = LineNo; ! 139: bad++; ! 140: } ! 141: if(!bad) Store(); ! 142: LineNo++; ! 143: CharNo = 0; ! 144: PrintError(); ! 145: if(--bad < 0) bad = 0; ! 146: } ! 147: return(ch); ! 148: } ! 149: ! 150: unput(c) ! 151: char c; ! 152: /* Put 'c' back into the input stream */ ! 153: { ! 154: CharNo--; ! 155: if (c == '\n') { ! 156: LineNo--; ! 157: /* bad indicates how many lines have been put back */ ! 158: bad++; ! 159: } ! 160: ungetc(c,in_file[FStackPtr]); ! 161: return; ! 162: } ! 163: ! 164: Store() ! 165: /* This function saves the last input line */ ! 166: { ! 167: char *q; ! 168: LineLevel = LineNo; ! 169: OldLength = CharNo; ! 170: q = in_store; ! 171: in_store = in_buf; ! 172: in_buf = q; ! 173: return; ! 174: } ! 175: ! 176: ! 177: PrintLine(n) ! 178: int n; ! 179: /* If line n is currently available 'PrintLine' will print it */ ! 180: { ! 181: int i; ! 182: if((LineLevel == n) && (0 < n)) { ! 183: fprintf(stderr,"%6d ",n); ! 184: for(i=0; i<OldLength;i++) fprintf(stderr,"%c",in_store[i]); ! 185: bad++; ! 186: maxlines = n; ! 187: LineLevel = -1; ! 188: } ! 189: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.