-int d_print(void)
-{
- char prntstr[LNSIZ]; // String for PRINT directive
- char format[LNSIZ]; // Format for PRINT directive
- int formatting = 0; // Formatting on/off
- int wordlong = 0; // WORD = 0, LONG = 1
- int outtype = 0; // 0:hex, 1:decimal, 2:unsigned
-
- VALUE eval; // Expression value
- WORD eattr; // Expression attributes
- SYM *esym; // External symbol involved in expr.
- TOKEN r_expr[EXPRSIZE];
-
- while(*tok != EOL) {
- switch(*tok) {
- case STRING:
- sprintf(prntstr, "%s", (char*)tok[1]);
- printf("%s", prntstr);
- if(list_fd)
- write(list_fd, prntstr, (LONG)strlen(prntstr));
- tok+=2;
- break;
- case '/':
- formatting = 1;
- if(tok[1] != SYMBOL) goto token_err;
- strcpy(prntstr, (char*)tok[2]);
- switch(prntstr[0]) {
- case 'l': case 'L': wordlong = 1; break;
- case 'w': case 'W': wordlong = 0; break;
- case 'x': case 'X': outtype = 0; break;
- case 'd': case 'D': outtype = 1; break;
- case 'u': case 'U': outtype = 2; break;
- default:
- error("unknown print format flag");
- return(ERROR);
- }
- tok += 3;
- break;
- case ',':
- tok++;
- break;
- default:
- if(expr(r_expr, &eval, &eattr, &esym) != OK)
- goto token_err;
- else {
- switch(outtype) {
- case 0: strcpy(format, "%X"); break;
- case 1: strcpy(format, "%d" ); break;
- case 2: strcpy(format, "%u" ); break;
- }
- if(wordlong) sprintf(prntstr, format, eval);
- else sprintf(prntstr, format, eval & 0xFFFF);
- printf("%s", prntstr);
- if(list_fd)
- write(list_fd, prntstr, (LONG)strlen(prntstr));
- formatting = 0;
- wordlong = 0;
- outtype = 0;
- }
- break;
- }
- }
-
- printf("\n");
- println("\n");
-
- return(0);
-
- token_err:
- error("illegal print token");
- return(ERROR);
-}