|
|
1.1 ! root 1: /* ! 2: *-IMPORTS: ! 3: * <sys/compat.h> ! 4: * CONST ! 5: * USE_PROTO ! 6: * ARGS () ! 7: * <stdlib.h> ! 8: * NULL ! 9: * malloc () ! 10: * free () ! 11: */ ! 12: ! 13: #include <sys/compat.h> ! 14: #include <stdlib.h> ! 15: ! 16: #include "ehand.h" ! 17: #include "symbol.h" ! 18: #include "read.h" ! 19: #include "mtune.h" ! 20: #include "input.h" ! 21: ! 22: #include "stune.h" ! 23: ! 24: LOCAL stune_t * _stunes; ! 25: ! 26: ! 27: /* ! 28: * Regenerate an 'stune' line from the stored record. ! 29: */ ! 30: ! 31: #if USE_PROTO ! 32: void (write_stune) (stune_t * stunep, input_t * input) ! 33: #else ! 34: void ! 35: write_stune ARGS ((stunep, input)) ! 36: stune_t * stunep; ! 37: input_t * input; ! 38: #endif ! 39: { ! 40: if ((* input->in_filter) (input, "%s<2>%ld\n", ! 41: stunep->st_name->s_data, ! 42: stunep->st_value) < 0) { ! 43: ! 44: throw_error ("Output error"); ! 45: } ! 46: } ! 47: ! 48: ! 49: /* ! 50: * Read lines from an "stune" file. ! 51: */ ! 52: ! 53: #if USE_PROTO ! 54: LOCAL stune_t * (read_stune) (input_t * input, lex_t * lexp, int * end_char) ! 55: #else ! 56: LOCAL stune_t * ! 57: read_stune ARGS ((input, lexp, end_char)) ! 58: input_t * input; ! 59: lex_t * lexp; ! 60: int * end_char; ! 61: #endif ! 62: { ! 63: VOLATILE int ch = '\n'; ! 64: stune_t * VOLATILE stunep; ! 65: ehand_t err; ! 66: ! 67: if ((stunep = (stune_t *) malloc (sizeof (* stunep))) == NULL) ! 68: throw_error ("out of memory in read_stune ()"); ! 69: ! 70: if (PUSH_HANDLER (err) == 0) { ! 71: /* ! 72: * If the first thing on the line works out to be an EOF, ! 73: * then bail out without an error. ! 74: */ ! 75: ! 76: ch = read_symbol (input, lexp, & stunep->st_name); ! 77: ! 78: if (stunep->st_name == NULL) { ! 79: /* ! 80: * We allow an EOF at the beginning of a line and we ! 81: * also allow a blank line. ! 82: */ ! 83: ! 84: free (stunep); ! 85: stunep = NULL; ! 86: goto at_eof; ! 87: } ! 88: check_not_eol (ch); ! 89: ! 90: /* ! 91: * Pull in the parameter value ! 92: */ ! 93: ! 94: ch = read_longs (input, lexp, & stunep->st_value, NO_RANGE); ! 95: ! 96: ch = expect_eol (input, lexp, ch); ! 97: } else { ! 98: free (stunep); ! 99: CHAIN_ERROR (err); ! 100: } ! 101: ! 102: at_eof: ! 103: POP_HANDLER (err); ! 104: ! 105: * end_char = ch; ! 106: return stunep; ! 107: } ! 108: ! 109: ! 110: /* ! 111: * This function is passed as a parameter to read_dev_string () to read an ! 112: * 'mtune' entry (usually a program argument) and hook it into a global list. ! 113: */ ! 114: ! 115: #if USE_PROTO ! 116: LOCAL int _read_stune_string (input_t * input, lex_t * lexp, ! 117: stune_t ** stlistp) ! 118: #else ! 119: LOCAL int ! 120: _read_stune_string (input, lexp, stlistp) ! 121: input_t * input; ! 122: lex_t * lexp; ! 123: stune_t ** stlistp; ! 124: #endif ! 125: { ! 126: stune_t * stunep; ! 127: int ch; ! 128: ! 129: if ((stunep = read_stune (input, lexp, & ch)) != NULL) { ! 130: stunep->st_next = * stlistp; ! 131: * stlistp = stunep; ! 132: } ! 133: ! 134: return ch; ! 135: } ! 136: ! 137: ! 138: /* ! 139: * This function is called from _read_stune_file () to link an 'stune' entry ! 140: * into the global lists and check it. ! 141: */ ! 142: ! 143: #if USE_PROTO ! 144: LOCAL void (link_stune) (stune_t * stunep, input_t * input) ! 145: #else ! 146: LOCAL void ! 147: link_stune ARGS ((stunep, input)) ! 148: stune_t * stunep; ! 149: input_t * input; ! 150: #endif ! 151: { ! 152: if ((stunep->st_mtune = find_mtune (stunep->st_name)) == NULL) ! 153: throw_error ("Parameter name not in 'mtune' file"); ! 154: ! 155: if (stunep->st_mtune->mt_stune != NULL) ! 156: throw_error ("Two values configured for parameter"); ! 157: ! 158: if (stunep->st_value < stunep->st_mtune->mt_min || ! 159: stunep->st_value > stunep->st_mtune->mt_max) ! 160: throw_error ("Parameter value outside configurable range"); ! 161: ! 162: stunep->st_mtune->mt_stune = stunep; ! 163: ! 164: stunep->st_next = _stunes; ! 165: _stunes = stunep; ! 166: ! 167: write_stune (stunep, input); ! 168: } ! 169: ! 170: ! 171: /* ! 172: * This function is passed as a pointer to read_sdev_file () to read an ! 173: * 'stune' entry and link it into the global lists. ! 174: */ ! 175: ! 176: #if USE_PROTO ! 177: LOCAL int _read_stune_file (input_t * input, lex_t * lexp, ! 178: stune_t ** changes) ! 179: #else ! 180: LOCAL int ! 181: _read_stune_file (input, lexp, changes) ! 182: input_t * input; ! 183: lex_t * lexp; ! 184: stune_t **changes; ! 185: #endif ! 186: { ! 187: stune_t * stunep; ! 188: int ch; ! 189: ! 190: if ((stunep = read_stune (input, lexp, & ch)) == NULL) { ! 191: if (ch == READ_EOF) { ! 192: /* ! 193: * Blow remaining changes out as new entries. ! 194: */ ! 195: ! 196: while ((stunep = * changes) != NULL) { ! 197: * changes = stunep->st_next; ! 198: link_stune (stunep, input); ! 199: } ! 200: } ! 201: return ch; ! 202: } ! 203: ! 204: ! 205: /* ! 206: * Link the freshly-read entry into the global lists. ! 207: */ ! 208: ! 209: if (changes) { ! 210: stune_t ** scan; ! 211: ! 212: for (scan = changes ; * scan != NULL ; ! 213: scan = & (* scan)->st_next) { ! 214: ! 215: if ((* scan)->st_name == stunep->st_name) { ! 216: /* ! 217: * Our current entry is being replaced by a ! 218: * new one; unlink the new entry from the ! 219: * change list and discard the old entry. ! 220: */ ! 221: ! 222: free (stunep); ! 223: ! 224: if (report_mode ()) ! 225: return ch; ! 226: ! 227: stunep = * scan; ! 228: * scan = stunep->st_next; ! 229: break; ! 230: } ! 231: } ! 232: } ! 233: ! 234: link_stune (stunep, input); ! 235: return ch; ! 236: } ! 237: ! 238: ! 239: /* ! 240: * Read in an "mtune" entry from a string and add it to a list. ! 241: */ ! 242: ! 243: #if USE_PROTO ! 244: void read_stune_string (CONST char * string, VOID * extra) ! 245: #else ! 246: void ! 247: read_stune_string (string, extra) ! 248: CONST char * string; ! 249: VOID * extra; ! 250: #endif ! 251: { ! 252: read_dev_string (string, (dev_func_p) _read_stune_string, extra); ! 253: } ! 254: ! 255: ! 256: /* ! 257: * Suck in a complete 'stune' file. ! 258: */ ! 259: ! 260: #if USE_PROTO ! 261: void (read_stune_file) (CONST char * inname, CONST char * outname, ! 262: VOID * extra) ! 263: #else ! 264: void ! 265: read_stune_file ARGS ((inname, outname, extra)) ! 266: CONST char * inname; ! 267: CONST char * outname; ! 268: VOID * extra; ! 269: #endif ! 270: { ! 271: read_dev_file (inname, outname, (dev_func_p) _read_stune_file, extra); ! 272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.