|
|
1.1 ! root 1: %{ ! 2: #include <scnbld.h> ! 3: ! 4: clump *clumps, *lastc, *thisc; ! 5: loc *locs, *last, *this; ! 6: ! 7: /* ! 8: * Generate a unique name. ! 9: */ ! 10: static char * ! 11: genname() ! 12: { ! 13: char buf[20]; ! 14: static int i = 0; ! 15: ! 16: sprintf(buf, "L%04d", ++i); ! 17: return(newcpy(buf)); ! 18: } ! 19: ! 20: %} ! 21: ! 22: %union { ! 23: char *string; ! 24: int val; ! 25: } ! 26: ! 27: %token <string> NAME ! 28: %token <string> STRING ! 29: %token <val> NUMBER ! 30: ! 31: %token EXT /* external field do not define */ ! 32: %token RONLY /* readonly field */ ! 33: %token LONG /* long field */ ! 34: %token DEFAULT /* default for field */ ! 35: %token SKIP /* skip factor */ ! 36: %token GROUP /* group skip */ ! 37: %token HELP /* help message */ ! 38: %token VERIFY /* verify function */ ! 39: %token NL /* new line */ ! 40: %token DO /* repeat group */ ! 41: %token DONE /* end of repeat group */ ! 42: %token DESIG /* change field designator */ ! 43: ! 44: %% ! 45: ! 46: file : line | file line | /* nothing */ ; ! 47: ! 48: line : command NL ! 49: | NL ! 50: | error NL { ! 51: yyerrok; ! 52: }; ! 53: ! 54: command : NAME NUMBER { ! 55: if (0 >= $2) ! 56: yyerror("Invalid field size"); ! 57: this = alloc(sizeof(*this)); ! 58: if (NULL == locs) ! 59: last = locs = this; ! 60: else ! 61: last = last->next = this; ! 62: ! 63: this->field = $1; ! 64: this->len = $2; ! 65: ! 66: if ((NULL != thisc) && (!thisc->count++)) ! 67: thisc->from = this; ! 68: } options ! 69: ! 70: | DESIG STRING { ! 71: extern char fieldDesig; ! 72: ! 73: fieldDesig = $2[1]; ! 74: } ! 75: ! 76: | DO NUMBER NAME { ! 77: if (NULL != thisc) ! 78: yyerror("Nested do statements"); ! 79: if (0 >= $2) ! 80: yyerror("Invalid repeat count"); ! 81: ! 82: thisc = alloc(sizeof(*thisc)); ! 83: if (NULL == clumps) ! 84: lastc = clumps = thisc; ! 85: else ! 86: lastc = lastc->next = thisc; ! 87: ! 88: thisc->times = $2; ! 89: ! 90: fprintf(ohp, "#define %s %d\n", $3, $2); ! 91: } ! 92: ! 93: | DONE { ! 94: if (NULL == thisc) ! 95: yyerror("Unmatched done statement"); ! 96: thisc = NULL; ! 97: }; ! 98: ! 99: options : option | options option | /* nothing */ ; ! 100: ! 101: option : LONG { this->flags |= LONGFIELD; } ! 102: | RONLY { this->flags |= READONLY; } ! 103: | EXT { this->flags |= EXTERNAL; } ! 104: | DEFAULT STRING { ! 105: if (NULL != this->Default) ! 106: yyerror("Default already set"); ! 107: this->Default = genname(); ! 108: fprintf(ofp, "static char %s[] = %s;\n", this->Default, $2); ! 109: } ! 110: | DEFAULT NAME { ! 111: if (NULL != this->Default) ! 112: yyerror("Default already set"); ! 113: this->Default = $2; ! 114: } ! 115: | HELP STRING { ! 116: if (NULL != this->help) ! 117: yyerror("Help already set"); ! 118: this->help = genname(); ! 119: fprintf(ofp, "static char %s[] = %s;\n", this->help, $2); ! 120: } ! 121: | HELP NAME { ! 122: if (NULL != this->help) ! 123: yyerror("Help already set"); ! 124: this->help = $2; ! 125: } ! 126: | SKIP NUMBER { ! 127: if (0 >= $2 || 254 < $2) ! 128: yyerror("Invalid skip number"); ! 129: if (this->skipf) ! 130: yyerror("Skip factor already set"); ! 131: this->skipf = $2; ! 132: } ! 133: | VERIFY NAME { ! 134: if (NULL != this->verify) ! 135: yyerror("Verify already set"); ! 136: this->verify = $2; ! 137: } ! 138: | SKIP GROUP { ! 139: if (this->skipf) ! 140: yyerror("Skip factor already set"); ! 141: if (NULL == thisc) ! 142: yyerror("group must be in do"); ! 143: else ! 144: this->skipf = 255; ! 145: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.