|
|
1.1 ! root 1: %{ ! 2: #include <stdio.h> ! 3: #include "pico.h" ! 4: #include "pico2.h" ! 5: ! 6: #define usedboth usedold=usednew=1 ! 7: ! 8: #define YYDEBUG 1 ! 9: ! 10: extern short CURSCRATCH, CUROLD; ! 11: extern char *progr; ! 12: extern struct SRC src[MANY]; ! 13: extern int nsrc, nrparams, LO, linenumber, whichdevice; ! 14: extern char usednew, usedold, faster, frameb, metheus; ! 15: extern char isglobal, seetree, optim, touchedcmap; ! 16: extern FILE *INPUT; ! 17: %} ! 18: ! 19: %union{ ! 20: Node *node; ! 21: Symbol *sym; ! 22: int resu; ! 23: struct SNode *snode; ! 24: } ! 25: ! 26: %type <node> stmnt sstmnt pprog pbody rval assign ifpre whpre ! 27: %type <node> aparams fcall elist expr chann ! 28: %type <snode> iarray lval ! 29: %type <resu> array SPEC eval vval arname ! 30: %type <sym> ANAME XYI pathn defpr ! 31: %token <sym> VARIABLE AUTO ARRAY FCT BLTN NAME ! 32: %token <resu> VAL STRING ! 33: ! 34: %start comm ! 35: %token A WINDOW C DEF DEL SCOM ECOM ! 36: %token UP DOWN RUN F H Q R SET SETF ! 37: %token GET W PCONST RETURN ! 38: %token OPEN CLOSE DECL INT GLOBAL ! 39: %token X Y I OLD TMP CMAP ! 40: %token FOR DO WHILE JUMP IF ELSE ! 41: %token COLOR NOCOLOR ZAP FASTER SLOWER HELP ! 42: %token FRAMEBUFFER METHEUS BLIND SEETREE OPTIM ! 43: %right ',' ! 44: %right ASSIGN ! 45: %right '?' ':' ';' ! 46: %right OPER ! 47: %left OROR ! 48: %left ANDAND ! 49: %left OR ! 50: %left '^' ! 51: %left AND ! 52: %left EQ NE ! 53: %left GT GE LT LE ! 54: %left LSH RSH ! 55: %left '+' '-' ! 56: %left '*' '/' '%' ! 57: %right POST ! 58: %right UNARYMINUS NOT '$' '~' ! 59: %right RCHAN GCHAN BCHAN BW RGB ! 60: %right POW ! 61: %right '.' ! 62: ! 63: %% ! 64: comm: pcom ';' { return 1; } ! 65: | RUN SPEC { munge($2); return 1; } ! 66: | defpr YoN SPEC { postfunct($1); return 1; } ! 67: | R pathn ';' { redirect($2->name); ! 68: checkit(); ! 69: return 1; ! 70: } ! 71: | Q ';' { return 0; } ! 72: ! 73: defpr: DEF NAME '(' rglst ')' { prefunct($2, nrparams); $$ = $2; } ! 74: | DEF FCT '(' rglst ')' { prefunct($2, nrparams); $$ = $2; } ! 75: ! 76: pcom: /* empty */ { /* if (INPUT == stdin) linenumber--; */ } ! 77: | A pathn { append( 0, 0, 0, 0, $2->name); } ! 78: | A vval vval vval vval pathn { append($2, $3, $4, $5, $6->name); } ! 79: | DEL pathn { discard($2->name); } ! 80: | DEL array { if ($2 > 1 && $2 <= nsrc-1) ! 81: discard(src[$2].fname); ! 82: else ! 83: yyerror("unknown file number %d", $2); ! 84: } ! 85: | DEL VAL { if ($2 > 1 && $2 <= nsrc-1) ! 86: discard(src[$2].fname); ! 87: else ! 88: yyerror("unknown file number %d", $2); ! 89: } ! 90: | F { files(); } ! 91: | GET { getscreen(Old); } ! 92: | GET arname { getter($2); } ! 93: | GET pathn { getter(append( 0, 0, 0, 0, $2->name)); } ! 94: | GET vval vval vval vval pathn { getter(append($2, $3, $4, $5, $6->name)); } ! 95: | H hnmlst ! 96: | FASTER { faster = 1; } ! 97: | SLOWER { faster = 0; } ! 98: | SEETREE { seetree = 1 - seetree; } ! 99: | OPTIM { optim = 1 - optim; } ! 100: | NOCOLOR { Old->nchan = Scratch->nchan = 1; } ! 101: | COLOR { Old->nchan = Scratch->nchan = 3; ! 102: checkpix(Old); checkpix(Scratch); ! 103: } ! 104: | HELP { dohelp(); } ! 105: | SET { showvars(); } ! 106: | SET ANAME { showsym($2); } ! 107: | SETF { showfcts(); } ! 108: | WINDOW vval vval vval vval { setwindow($2, $3, $4, $5); } ! 109: | W pathn { putdpix($2->name, PICO); } ! 110: | W '-' pathn { putdpix($3->name, 0); } ! 111: ! 112: arname: array { $$ = $1; } ! 113: | vval vval array { $$ = append($1, $2, 0, 0, src[$3].fname); } ! 114: | vval vval vval vval array { $$ = append($1, $2, $3, $4, src[$5].fname); } ! 115: ! 116: hnmlst: pathn { interpret($1->name); } ! 117: | hnmlst pathn { interpret($2->name); } ! 118: ! 119: rglst: /* empty */ ! 120: | arglst ! 121: ! 122: arglst: NAME { automa($1, nrparams++); } ! 123: | arglst ',' NAME { automa($3, nrparams++); } ! 124: ! 125: SPEC: sstmnt { compile($1, progr); $$ = BLOOP; } ! 126: | chann ';' { compile($1, progr); $$ = SLOOP; } ! 127: | pprog ';' { compile($1, progr); $$ = NLOOP; } ! 128: ! 129: chann: CMAP ASSIGN expr { $$ = mapall(cast($3)); } ! 130: | CMAP '.' RGB ASSIGN expr { $$ = mapall($5); } ! 131: | CMAP '.' RCHAN ASSIGN expr { $$ = mapred(cast($5)); } ! 132: | CMAP '.' GCHAN ASSIGN expr { $$ = mapgrn(cast($5)); } ! 133: | CMAP '.' BCHAN ASSIGN expr { $$ = mapblu(cast($5)); } ! 134: ! 135: YoN: /* empty */ ! 136: | ';' ! 137: ! 138: decls: glob INT declst ';' ! 139: | glob DECL decars ';' ! 140: ! 141: glob: GLOBAL { isglobal = 1; } ! 142: | /* none */ { isglobal = 0; } ! 143: ! 144: declst: declo ! 145: | declst ',' declo ! 146: ! 147: decars: decar ! 148: | decars ',' decar ! 149: ! 150: declo: XYI ! 151: | NAME { decvar($1, 0); } ! 152: | VARIABLE { decvar($1, 0); } ! 153: | NAME ASSIGN eval { decvar($1, $3); } ! 154: | VARIABLE ASSIGN eval { decvar($1, $3); } ! 155: ! 156: decar: NAME '[' eval ']' { decarray($1, $3); } ! 157: | ARRAY '[' eval ']' { decarray($1, $3); } ! 158: ! 159: XYI: X { $$ = newsym("x"); } ! 160: | Y { $$ = newsym("y"); } ! 161: | I { $$ = newsym("i"); } ! 162: ! 163: pprog: OPEN pbody YoN CLOSE { $$ = $2; } ! 164: ! 165: pbody: stmnt { $$ = $1; } ! 166: | pbody stmnt { $$ = new(OCOMMA, $1, $2, Z); } ! 167: ! 168: aparams: '(' ')' { $$ = Z; } ! 169: | '(' elist ')' { $$ = $2; } ! 170: ! 171: elist: expr { $$ = cast($1); } ! 172: | expr ',' elist { $$ = new(ACOMMA, cast($1), $3, Z); } ! 173: ! 174: ifpre: IF '(' expr ')' YoN { $$ = $3; } ! 175: whpre: WHILE '(' expr ')' YoN { $$ = $3; } ! 176: ! 177: ANAME: NAME { $$ = $1; } ! 178: | VARIABLE { $$ = $1; } ! 179: | FCT { $$ = $1; } ! 180: | BLTN { $$ = $1; } ! 181: | AUTO { $$ = $1; } ! 182: | ARRAY { $$ = $1; } ! 183: | XYI { $$ = $1; } ! 184: | STRING { $$ = lookup($1); } ! 185: ! 186: pathn: ANAME { $$ = $1; } ! 187: ! 188: stmnt: pprog ';' { $$ = $1; } ! 189: | ANAME ':' stmnt { $$ = new(LABL,$3, Z, $1); } ! 190: | JUMP ANAME ';' { $$ = new(GOTO, Z, Z, $2); } ! 191: | sstmnt { $$ = $1; } ! 192: | chann ';' { $$ = $1; } ! 193: ! 194: sstmnt: assign ';' { $$ = $1; } ! 195: | decls { $$ = Z; } ! 196: | fcall ';' { $$ = $1; } ! 197: | ifpre stmnt { $$ = new(CONDI, $2, Z, $1); } ! 198: | ifpre stmnt ELSE YoN stmnt { $$ = new(CONDI, $2, $5, $1); } ! 199: | FOR '(' expr ';' expr ';' expr ')' YoN stmnt { ! 200: $$ = newloop($3, $5, $7, $10); } ! 201: | whpre stmnt { $$ = newhile($1, $2); } ! 202: | DO YoN stmnt WHILE '(' expr ')' ';' { $$ = newuntil($3, $6); } ! 203: | RETURN expr ';' { $$ = new(ORETURN, $2, Z, Z); } ! 204: ! 205: iarray: BW { usedboth; $$ = super(CURSCRATCH, Z, BW); } ! 206: | RGB { usedboth; $$ = super(CURSCRATCH, Z, RGB); } ! 207: | RCHAN { usedboth; $$ = super(CURSCRATCH, Z, RCHAN); } ! 208: | GCHAN { usedboth; $$ = super(CURSCRATCH, Z, GCHAN); } ! 209: | BCHAN { usedboth; $$ = super(CURSCRATCH, Z, BCHAN); } ! 210: | array { $$ = super($1, Z, (src[$1].nchan == 1)?BW:RGB); } ! 211: | array '.' RGB { $$ = super($1, Z, RGB); } ! 212: | array '.' BW { $$ = super($1, Z, BW); } ! 213: | array '.' RCHAN { $$ = super($1, Z, RCHAN); } ! 214: | array '.' GCHAN { $$ = super($1, Z, GCHAN); } ! 215: | array '.' BCHAN { $$ = super($1, Z, BCHAN); } ! 216: | array '[' elist ']' { $$ = super($1, $3,(src[$1].nchan == 1)?BW:RGB); } ! 217: | array '[' elist ']' '.' RGB { $$ = super($1, $3, RGB); } ! 218: | array '[' elist ']' '.' BW { $$ = super($1, $3, BW); } ! 219: | array '[' elist ']' '.' RCHAN { $$ = super($1, $3, RCHAN); } ! 220: | array '[' elist ']' '.' GCHAN { $$ = super($1, $3, GCHAN); } ! 221: | array '[' elist ']' '.' BCHAN { $$ = super($1, $3, BCHAN); } ! 222: | array '.' RGB '[' elist ']' { $$ = super($1, $5, RGB); } ! 223: | array '.' BW '[' elist ']' { $$ = super($1, $5, BW); } ! 224: | array '.' RCHAN '[' elist ']' { $$ = super($1, $5, RCHAN); } ! 225: | array '.' GCHAN '[' elist ']' { $$ = super($1, $5, GCHAN); } ! 226: | array '.' BCHAN '[' elist ']' { $$ = super($1, $5, BCHAN); } ! 227: | ARRAY '[' elist ']' { $$=nsup(RL(($1->u.ar->base),Index($3)),0,0,128);} ! 228: | ARRAY { $$=nsup(RL(($1->u.ar->base),DII), 0,0,128); } ! 229: ! 230: assign: lval POST { $$ = weird($1, notnew(LO, $1->n, NR(1))); } ! 231: | lval OPER expr { $$ = weird($1, notnew(LO, $1->n, $3)); } ! 232: | lval ASSIGN expr { $$ = weird($1, $3); } ! 233: ! 234: rval: lval { $$ = $1->n; } ! 235: | fcall { $$ = $1; } ! 236: ! 237: lval: X { $$ = nsup(new(REG, Z, Z, XREG), 0, 0, 128); } ! 238: | Y { $$ = nsup(new(REG, Z, Z, YREG), 0, 0, 128); } ! 239: | I { $$ = nsup(new(REG, Z, Z, IREG), 0, 0, 128); } ! 240: | iarray { $$ = $1; } ! 241: | NAME { yyerror("undeclared variable %s", $1->name); } ! 242: | VARIABLE { $$ = nsup(new(VAR, Z, Z, &$1->u.val), 0,0,128);} ! 243: | AUTO { $$ = nsup(new(OARG, Z, Z, $1->u.val), 0,0,128);} ! 244: ! 245: fcall: FCT aparams { if ($1->u.fu->usednew == -1 && notrecurcall($1)) ! 246: yyerror("undefined function %s", $1->name); ! 247: argcount($1->u.fu->nrparams, $2, $1->name); ! 248: usednew += $1->u.fu->usednew; ! 249: usedold += $1->u.fu->usedold; ! 250: $$ = new(OCALL, $2, Z, $1->u.fu->fct); ! 251: } ! 252: | BLTN aparams { argcount($1->u.bl->nrparams, $2, $1->name); ! 253: usednew += $1->u.bl->usednew; ! 254: $$ = new(CCALL, $2, Z, $1->u.bl->faddr); ! 255: } ! 256: ! 257: vval: VAL { $$ = $1; } ! 258: | '-' VAL { $$ = -$2; } ! 259: ! 260: eval: VAL { $$ = $1; } ! 261: | VARIABLE { $$ = $1->u.val; } ! 262: | fcall { compile($1, progr); $$ = callit(); } ! 263: ! 264: expr: rval { $$ = $1; } ! 265: | assign { $$ = $1; } ! 266: | '(' expr ')' { $$ = $2; } ! 267: | '[' elist ']' { $$ = new(COMP, $2, Z, Z); } ! 268: | VAL { $$ = NR($1); } ! 269: | STRING { $$ = NR($1); } ! 270: | expr '?' expr ':' expr { $$ = new(CONDI, $3, $5, $1); } ! 271: | '-' expr %prec UNARYMINUS { $$ = new(OMINUS, $2, Z, Z); } ! 272: | '~' expr { $$ = new(ONEG, $2, Z, Z); } ! 273: | NOT expr { $$ = new(ONOT, $2, Z, Z); } ! 274: | expr '+' expr { $$ = notnew(OADD, $1, $3); } ! 275: | expr '-' expr { $$ = notnew(OSUB, $1, $3); } ! 276: | expr '*' expr { $$ = notnew(OMUL, $1, $3); } ! 277: | expr '/' expr { $$ = notnew(DIVV, $1, $3); } ! 278: | expr '%' expr { $$ = notnew(MODU, $1, $3); } ! 279: | expr '^' expr { $$ = notnew(OXOR, $1, $3); } ! 280: | expr POW expr { $$ = notnew(OPOW, $1, $3); } ! 281: | expr GT expr { $$ = notnew(OGT, $1, $3); } ! 282: | expr GE expr { $$ = notnew(OGE, $1, $3); } ! 283: | expr LT expr { $$ = notnew(OLT, $1, $3); } ! 284: | expr LE expr { $$ = notnew(OLE, $1, $3); } ! 285: | expr EQ expr { $$ = notnew(OEQ, $1, $3); } ! 286: | expr NE expr { $$ = notnew(ONE, $1, $3); } ! 287: | expr ANDAND expr { $$ = notnew(OANDAND, $1, $3); } ! 288: | expr OROR expr { $$ = notnew(OOROR, $1, $3); } ! 289: | expr OR expr { $$ = notnew(OOR, $1, $3); } ! 290: | expr AND expr { $$ = notnew(OAND, $1, $3); } ! 291: | expr LSH expr { $$ = notnew(OLSH, $1, $3); } ! 292: | expr RSH expr { $$ = notnew(OLSH, $1, notnew(OMINUS, $3, Z)); } ! 293: ! 294: array: TMP { usednew=usedold=1; $$ = CURSCRATCH; } ! 295: | OLD { usedold=1; $$ = CUROLD; } ! 296: | '$' TMP { usednew=usedold=1; $$ = CURSCRATCH; } ! 297: | '$' OLD { usedold=1; $$ = CUROLD; } ! 298: | '$' VAL { int x = $2; ! 299: if (x < 0 || x > nsrc-2) ! 300: yyerror("unknown file number %d", x); ! 301: x = (x == 0) ? CUROLD : x+1; ! 302: if (x == CUROLD) ! 303: usedold=1; ! 304: else ! 305: src[x].used = 1; ! 306: $$ = x; ! 307: } ! 308: | '$' ANAME { int x = whatarray($2->name); ! 309: if (x <= 0) ! 310: x = prepare($2->name); ! 311: if (x <= 0) ! 312: yyerror("unknown file %s", $2->name); ! 313: src[x].used = 1; ! 314: $$ = x; ! 315: } ! 316: %%
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.