*
;
/*+-------------------------------------------------------------+
| S A S S A M P L E L I B R A R Y |
| |
| NAME: METATATE |
| TITLE: CREATES AN ANNOTATE DATASET TO REPRODUCE GRAPHICS |
| PRODUCT: GRAPH |
| SYSTEM: ALL |
| KEYS: META |
| PROCS: GPLOT |
| DATA: INTERNAL |
| |
| SUPPORT: GRAPHICS STAFF UPDATE: 19DEC89 |
| REF: SAS/GRAPH INTRODUCTORY GUIDE |
| MISC: |
| |
+-------------------------------------------------------------+*/
* ---------------------------------------------------------------------
* NAME: METATATE
* AUTHOR: CHENOWETH,R
* PURPOSE: CREATE AN ANNOTATE DATASET TO REPRODUCE GRAPHICS
* PROCEDURE OUTPUT FROM METAGRAPHICS DRIVERS.
* USE: THIS ROUTINE WILL READ CHARACTER
* METAFILES AND SUPPORTS ALL POSSIBLE HARDWARE FEATURES
* OF THE METAGRAPHICS FACILITY.
* THE RESULTING ANNOTATE DATASET (METATATE) CAN BE VIEWED
* PROC GANNO ANNO=METATATE;
* SPECIFY THE HPOS/VPOS IN EFFECT WHEN PICTURE WAS CREATED
* ---------------------------------------------------------------------
*----------------------------------------------------------------*
- CREATE A SIMPLE EXAMPLE METAFILE
*----------------------------------------------------------------*;
/* X 'DEL METAFILE.DAT'; DELETE THIS FILE IF ONE EXIST */
FILENAME METAFILE 'METAFILE.DAT'; /*
GOPTIONS DEV=GXTDUMMY;
DATA TEST;
DO DATE=TODAY() TO TODAY()+5;
DO LINE=10 TO 30 BY 10;
VALUE=(UNIFORM(12345)+1)*LINE;
OUTPUT;
END;
END;
FORMAT DATE DATE7.;
RUN;
PATTERN V=S;
SYMBOL I=JOIN;
RUN;
PROC GPLOT DATA=TEST;
PLOT VALUE*DATE=LINE /AREAS=4;
RUN;
*/
GOPTIONS DEV=; /*INDICATE YOUR DEVICE DRIVER HERE*/
%macro metatate;
*----------------------------------------------------------------*
- SET-UP GLOBAL PARAMETERS
*----------------------------------------------------------------*;
%LET MAXCOLOR=16; *SET NUMBER OF MAXCOLOR FROM PARAMETERS SCREEN
IN THE DEVICE CATALOG ENTRY YOU USED OR
PENMOUNTS+1 FROM THE DRIVER ATTRIBUTE FILE;
%LET TEXTL=80; *SET MAXIMUM HAREWARE TEXT STRING (200 MAX);
DATA METATATE;
KEEP FUNCTION X Y XSYS YSYS POSITION SIZE ANGLE ROTATE STYLE COLOR
LINE TEXT NAME HSYS;
LENGTH DECODE $ 1 TEXT $ &TEXTL FUNCTION STYLE COLOR NAME $ 8
DES $ 48;
INFILE METAFILE;
NEG_ONE=-1;
RETAIN INITY INITX COLOR POSITION SIZE STYLE ROTATE ANGLE
LINE XSYS YSYS TROTATE TANGLE NAME;
XSYS='4'; YSYS='4'; HSYS='4';
ARRAY COLORS{*} $ 8 COLOR1-COLOR&MAXCOLOR;
RETAIN COLOR1-COLOR&MAXCOLOR;
LINK CHAR;
IF CODE=0 THEN; *NO OPERATION;
ELSE IF CODE<9 THEN PUT 'INVALID OPERATION CODE' CODE=;
*----------------------------------------------------------------*
- CODES 10 THROUGH 29 INDICATE HEADER OR TRAILER TEXT FOLLOWS. -
- IGNORED FOR ANNOTATE. -
*----------------------------------------------------------------*;
ELSE IF CODE>9 AND CODE<29 THEN DO; *HEADER TEXT FOLLOWS;
LINK CHAR;
J=CODE;
DO I=1 TO J;
LINK DECODE;
END;
END;
*----------------------------------------------------------------*
- DEVICE INITIALIZATION. -
- IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=30 THEN DO J=1 TO 8; *INITIALIZATION;
LINK CHAR;
END;
*----------------------------------------------------------------*
- AUTOFEED OPTION SELECTED. -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=31 THEN;
*----------------------------------------------------------------*
- TERMINATE THE DRIVER - CLOSE UP THE FILES. -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=32 THEN;
*----------------------------------------------------------------*
- SHUTDOWN THE DEVICE -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=33 THEN;
*----------------------------------------------------------------*
- ERASE THE GRAPH - CLEAR THE SCREEN -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=34 THEN;
*----------------------------------------------------------------*
- PROMPT -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=35 THEN DO;
LINK CHAR; J=CODE;
DO I=1 TO J;
LINK CHAR;
END;
LINK CHAR; J=CODE;
DO I=1 TO J;
LINK CHAR; *NO NEED TO DECODE;
END;
END;
*----------------------------------------------------------------*
- LOAD THE COLOR TABLE -
- PARAMETERS - COLOR TYPE (NAMES, RGB, HLS, GRAY SCALE) -
- NUMBER OF COLORS -
- COLOR PARAMETER (DEPENDENT ON TYPE) -
*----------------------------------------------------------------*;
ELSE IF CODE=36 THEN DO; *LOAD COLOR TABLE;
LINK CHAR;
TYPE=CODE; *TYPE OF COLORS;
LINK CHAR;
C=CODE; *NUMBER OF COLORS;
IF C>&MAXCOLOR THEN PUT
'ERROR - NUMBER OF COLORS EXCEEDS MAXCOLOR PARAMETER.'
COLOR=;
DO I=1 TO C; *ONCE FOR EACH COLOR;
COLORS{I}='';
IF TYPE=0 THEN DO; *COLOR NAME TYPE;
DO J=1 TO 8;
LINK DECODE;
SUBSTR(COLORS{I},J)=DECODE;
END;
END; ELSE
IF TYPE=1 THEN DO; *RGB COLOR TYPE;
LINK CHAR; RED=PUT(CODE,HEX2.);
LINK CHAR; GREEN=PUT(CODE,HEX2.);
LINK CHAR; BLUE=PUT(CODE,HEX2.);
COLORS{I}='CX'||RED||GREEN||BLUE;
END; ELSE
IF TYPE=2 THEN DO; *HLS COLOR TYPE;
LINK CHAR; HUE=PUT(CODE,HEX3.);
LINK CHAR; LIGHT=PUT(CODE,HEX2.);
LINK CHAR; SAT=PUT(CODE,HEX2.);
COLORS{I}='H'||HUE||LIGHT||SAT;
END; ELSE
IF TYPE=3 THEN DO; *GRAY SCALE COLOR TYPE;
LINK CHAR; COLORS{I}='GRAY'||PUT(CODE,HEX3.);
END;
END;
END;
*----------------------------------------------------------------*
- IDENTIFICATION - LISTS ID STRING FROM ATTRIBUTE FILE IF YOU -
- ARE READING A VERSION 5 METAFILE, LISTS THE DESCRIPTION= -
- FIELD FROM THE PROC IF IT IS A VERSION 6 METAFILE -
*----------------------------------------------------------------*;
ELSE IF CODE=37 THEN DO; *IDENTIFICATION STRING;
LINK CHAR; J=CODE;
DO I=1 TO J;
LINK DECODE;
SUBSTR(DES,I)=DECODE;
END;
NAME=SUBSTR(DES,1,8);
DES=SUBSTR(DES,9);
CALL SYMPUT('NAME',NAME);
CALL SYMPUT('DES',DES);
END;
*----------------------------------------------------------------*
- DIGITIZE AND DECODE WILL BE IMPLEMENTED IN A FUTURE RELEASE. -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=38 OR CODE=39 THEN LINK CHAR;
*NOT CURRENTLY IMPLEMEMTED;
*----------------------------------------------------------------*
- MOVE COMMAND -
- PARAMETERS - X,Y COORDINATES -
*----------------------------------------------------------------*;
ELSE IF CODE=40 THEN DO; *MOVE COMMAND;
FUNCTION='MOVE';
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
OUTPUT;
END;
*----------------------------------------------------------------*
- DRAW COMMAND -
- PARAMETERS - X,Y COORDINATES -
*----------------------------------------------------------------*;
ELSE IF CODE=41 THEN DO; *DRAW COMMAND;
FUNCTION='DRAW';
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
OUTPUT;
END;
*----------------------------------------------------------------*
- DRAW ARC COMMAND -
- PARAMETERS - X,Y COORDINATES, RADIUS, START ANGLE, -
- END ANGLE. -
*----------------------------------------------------------------*;
ELSE IF CODE=42 THEN DO; *DRAW ARC COMMAND;
SAVELINE=LINE; SAVESIZE=SIZE;
FUNCTION='PIE';LINE=0;STYLE='E';
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
LINK INPUTY; SIZE=CODE; PUT CODE=; CODE=CODE*INITY;PUT CODE=;
LINK CHAR; ANGLE=CODE;
LINK CHAR; ROTATE=CODE-ANGLE;
OUTPUT;
LINE=SAVELINE; SIZE=SAVESIZE;
END;
*----------------------------------------------------------------*
- DRAW FILL PIE COMMAND -
- PARAMETERS - X,Y COORDINATES, RADIUS, START ANGLE, -
- END ANGLE. -
*----------------------------------------------------------------*;
ELSE IF CODE=43 THEN DO; *FILL PIE SLICE;
SAVELINE=LINE; SAVESIZE=SIZE;
FUNCTION='PIE';LINE=3;
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
LINK INPUTY; SIZE=CODE;
LINK CHAR; ANGLE=CODE;
LINK CHAR; ROTATE=CODE-ANGLE;
OUTPUT;
LINE=SAVELINE; SIZE=SAVESIZE;
END;
*----------------------------------------------------------------*
- RECTANGLE FILL COMMAND -
- PARAMETERS - X,Y COORDINATES OF LOWER LEFT -
- X,Y COORDINATES OF UPPER RIGHT -
*----------------------------------------------------------------*;
ELSE IF CODE=44 THEN DO; *RECTANGLE FILL COMMAND;
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
FUNCTION='MOVE'; OUTPUT;
FUNCTION='BAR'; SAVELINE=LINE; LINE=0;
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
OUTPUT;
LINE=SAVELINE;
END;
*----------------------------------------------------------------*
- POLYGON FILL -
- PARAMETERS - NUMBER OF VERTICES -
- X,Y COORDINATE PAIRS OF VERTICIES -
*----------------------------------------------------------------*;
ELSE IF CODE=45 THEN DO; *POLYGON FILL COMMAND;
FUNCTION='POLY';
LINK CHAR;J=CODE;
DO I=1 TO J;
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
IF X<0 THEN DO; *INTERIOR POLYGON;
X=.; Y=.;
END;
OUTPUT;
FUNCTION='POLYCONT';
END;
END;
*----------------------------------------------------------------*
- HARDWARE TEXT COMMAND -
- PARAMETERS - X,Y COORDINATES OF LOWER LEFT FIRST CHARACTER-
- NUMBER OF CHARACTERS -
- TEXT STRING -
*----------------------------------------------------------------*;
ELSE IF CODE=46 THEN DO; *HARDWARE TEXT COMMAND;
FUNCTION='LABEL'; POSITION='C'; STYLE='NONE';
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
LINK CHAR; J=CODE;
IF J>&TEXTL THEN
PUT 'ERROR - TEXT STRING EXCEEDS MAXIMUM';
DO I=1 TO J;
LINK DECODE;
SUBSTR(TEXT,I)=DECODE;
END;
ROTATE=TROTATE; ANGLE=TANGLE;
OUTPUT;
END;
*----------------------------------------------------------------*
- HARDWARE SYMBOL COMMAND -
- PARAMETERS - X,Y COORDINATE OF SYMBOL CENTER -
- SYMBOL NUMBER -
*----------------------------------------------------------------*;
ELSE IF CODE=47 THEN DO; *HARDWARE SYMBOL COMMAND;
FUNCTION='SYMBOL'; POSITION='5'; STYLE='NONE';
LINK INPUTX; X=CODE;
LINK INPUTY; Y=CODE;
LINK CHAR;
IF CODE=1 THEN TEXT='PLUS';ELSE
IF CODE=2 THEN TEXT='X'; ELSE
IF CODE=3 THEN TEXT='STAR';ELSE
IF CODE=4 THEN TEXT='DIAMOND';ELSE
IF CODE=5 THEN TEXT='TRIANGLE';ELSE
IF CODE=6 THEN TEXT='HASH'; ELSE
IF CODE=7 THEN TEXT='Y'; ELSE
IF CODE=8 THEN TEXT='Z'; ELSE
IF CODE=9 THEN TEXT='PAW'; ELSE
IF CODE=10 THEN TEXT='_'; ELSE
IF CODE=11 THEN TEXT='"'; ELSE
IF CODE=12 THEN TEXT='#'; ELSE
IF CODE=13 THEN TEXT='$'; ELSE
IF CODE=14 THEN TEXT='%'; ELSE
IF CODE=15 THEN TEXT='&'; ELSE
IF CODE=16 THEN TEXT="'"; ELSE
IF CODE=17 THEN TEXT='='; ELSE
IF CODE=18 THEN TEXT='-'; ELSE
IF CODE=19 THEN TEXT='*'; ELSE
IF CODE=20 THEN TEXT='@'; ELSE
IF CODE=21 THEN TEXT='+'; ELSE
IF CODE=22 THEN TEXT='>'; ELSE
IF CODE=23 THEN TEXT='.'; ELSE
IF CODE=24 THEN TEXT='/'; ELSE
IF CODE=25 THEN TEXT='?'; ELSE
IF CODE=26 THEN TEXT="("; ELSE
IF CODE=27 THEN TEXT=')'; ELSE
IF CODE=28 THEN TEXT=':'; ELSE
IF CODE=29 THEN TEXT='*';
OUTPUT;
END;
*----------------------------------------------------------------*
- DOT COMMAND (TO BE IMPLEMENTED IN A FUTURE RELEASE) -
- PARAMETERS - X,Y COORDINATES OF DOT -
*----------------------------------------------------------------*;
ELSE IF CODE=48 THEN DO; * NOT CURRENTLY IMPLEMENTED;
LINK CHAR;
LINK CHAR;
END;
*----------------------------------------------------------------*
- MACHINE IDENTIFICATION - (HOST COMPUTER, FOR EXAMPLE, IBM) -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=50 THEN DO; *MACHINE IDENTIFICATION;
LINK CHAR;J=CODE;
DO I=1 TO J;
LINK CHAR; *NO NEED TO DECODE;
END;
END;
*----------------------------------------------------------------*
- SAS/GRAPH SOFTWARE VERSION (5.0) -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=51 THEN DO; *SAS/GRAPH VERSION;
LINK CHAR; J=CODE;
DO I=1 TO J;
LINK CHAR; *NO NEED TO DECODE;
END;
END;
*----------------------------------------------------------------*
- INTERACTION LEVEL OF THE EXTERNAL DRIVER -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=52 THEN DO; *INTERACTION LEVEL;
LINK CHAR;
END;
*----------------------------------------------------------------*
- CODES 53 THROUGH 59 RESERVED FOR FUTURE DEVELOPMENT. -
*----------------------------------------------------------------*;
ELSE IF CODE>52 AND CODE<60 THEN
PUT 'INVALID OPTION CODE ' CODE=;
*----------------------------------------------------------------*
- SELECT COLOR COMMAND -
- PARAMETERS - COLOR NUMBER -
*----------------------------------------------------------------*;
ELSE IF CODE=60 THEN DO; *SELECT COLOR COMMAND;
LINK CHAR; I=CODE+1; COLOR=COLORS{I};
END;
*----------------------------------------------------------------*
- SELECT LINE TYPE COMMAND -
- PARAMETERS - LINE TYPE NUMBER -
*----------------------------------------------------------------*;
ELSE IF CODE=61 THEN DO; *SELECT LINE COMMAND;
LINK CHAR; LINE=CODE;
END;
*----------------------------------------------------------------*
- SELECT CHARACTER TYPE COMMAND -
- PARAMETERS - TYPE NUMBER -
*----------------------------------------------------------------*;
ELSE IF CODE=62 THEN DO; *SELECT CHARACTER TYPE;
LINK CHAR; STYLE='NONE';
END;
*----------------------------------------------------------------*
- SET TEXT DIRECTION COMMAND -
- PARAMETERS - CHARACTER ORIENTATION -
- CHARACTER PATH -
*----------------------------------------------------------------*;
ELSE IF CODE=63 THEN DO; *SET TEXT DIRECTION;
LINK CHAR; TROTATE=CODE;
LINK CHAR; TANGLE=CODE; TROTATE=TROTATE-CODE;
END;
*----------------------------------------------------------------*
- SET CHARACTER SIZE COMMAND -
- PARAMETERS - HEIGHT, WIDTH -
- YES - THIS HANDLES SCALEABLE CHARACTERS! -
*----------------------------------------------------------------*;
ELSE IF CODE=64 THEN DO; *SET CHARACTER SIZE;
LINK CHAR;
IF INITY=. THEN INITY=CODE; *FIRST TIME ONLY;
SIZE=CODE/INITY;
LINK CHAR; INITX=CODE;
END;
*----------------------------------------------------------------*
- SET WINDOW SIZE -
- PARAMETERS - NUMBER OF HORIZONTAL PIXELS -
- NUMBER OF VERTICAL PIXELS -
*----------------------------------------------------------------*;
ELSE IF CODE=65 THEN DO; *SET WINDOW SIZE;
LINK CHAR; HPIXELS=CODE;
LINK CHAR; YPIXELS=CODE;
END;
*----------------------------------------------------------------*
- FILL PATTERN COMMAND -
- PARAMETERS - PATTERN NUMBER -
*----------------------------------------------------------------*;
ELSE IF CODE=66 THEN DO; *SELECT FILL PATTERN;
LINK CHAR;
IF CODE=0 THEN STYLE='E '; ELSE
IF CODE=1 THEN STYLE='R1'; ELSE
IF CODE=2 THEN STYLE='R2'; ELSE
IF CODE=3 THEN STYLE='R3'; ELSE
IF CODE=4 THEN STYLE='R4'; ELSE
IF CODE=5 THEN STYLE='R5'; ELSE
IF CODE=6 THEN STYLE='L1'; ELSE
IF CODE=7 THEN STYLE='L2'; ELSE
IF CODE=8 THEN STYLE='L3'; ELSE
IF CODE=9 THEN STYLE='L4'; ELSE
IF CODE=10 THEN STYLE='L5'; ELSE
IF CODE=11 THEN STYLE='X1'; ELSE
IF CODE=12 THEN STYLE='X2'; ELSE
IF CODE=13 THEN STYLE='X3'; ELSE
IF CODE=14 THEN STYLE='X4'; ELSE
IF CODE=15 THEN STYLE='X5'; ELSE
IF CODE=64 THEN STYLE='S '; ELSE
PUT 'FILL ERROR ' CODE=;
END;
*----------------------------------------------------------------*
- CHARACTER SLANT COMMAND -
- PARAMETERS - DEGREES COUNTER-CLOCKWISE FROM VERTICAL -
*----------------------------------------------------------------*;
ELSE IF CODE=67 THEN DO; *SET CHARACTER SLANT;
LINK CHAR; ROTATE=CODE;
END;
*----------------------------------------------------------------*
- SET LINE WIDTH COMMAND -
- PARAMETERS - MULTIPLE OF DEFAULT WIDTH TO USE -
*----------------------------------------------------------------*;
ELSE IF CODE=68 THEN DO; *SET LINE WIDTH COMMAND;
LINK CHAR; SIZE=CODE;
END;
*----------------------------------------------------------------*
- ROTATE COMMAND (GOPTION ROTATE SELECTED) -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=69 THEN;
*----------------------------------------------------------------*
- CODES 70-81 ARE NOT CURRENTLY IMPLEMENTED. -
- THIS CAN BE IGNORED FOR ANNOTATE -
*----------------------------------------------------------------*;
ELSE IF CODE=70
OR CODE=71
OR CODE=73
OR CODE=74
OR CODE=76
OR CODE=81 THEN LINK CHAR;
ELSE IF CODE=72
OR CODE=75
OR CODE=77
OR CODE=78
OR CODE=79
OR CODE=80
THEN DO;
LINK CHAR;
LINK CHAR;
END;
ELSE IF CODE>81 THEN
PUT 'CODE IS GREATER THAN 81 -- INVALID OPERATION' CODE=;
RETURN;
*----------------------------------------------------------------*
- THIS ROUTINE IS USED TO TRANSLATE TEXT STRINGS FROM DECIMAL -
- ASCII TO CHARACTER FORMAT. -
*----------------------------------------------------------------*;
DECODE: LINK CHAR;
IF CODE > 127 THEN PUT 'DECODE ERROR ' CODE=;ELSE
IF CODE=0 THEN DECODE=' '; ELSE
IF CODE>=1 AND CODE <=31 THEN PUT 'DECODE ERROR' CODE=; ELSE
IF CODE=32 THEN DECODE=' '; ELSE
IF CODE=33 THEN DECODE='!'; ELSE
IF CODE=34 THEN DECODE='"'; ELSE
IF CODE=35 THEN DECODE='#'; ELSE
IF CODE=36 THEN DECODE='$'; ELSE
IF CODE=37 THEN DECODE='%'; ELSE
IF CODE=38 THEN DECODE='&'; ELSE
IF CODE=39 THEN DECODE=''''; ELSE
IF CODE=40 THEN DECODE='('; ELSE
IF CODE=41 THEN DECODE=')'; ELSE
IF CODE=42 THEN DECODE='*'; ELSE
IF CODE=43 THEN DECODE='+'; ELSE
IF CODE=44 THEN DECODE=','; ELSE
IF CODE=45 THEN DECODE='-'; ELSE
IF CODE=46 THEN DECODE='.'; ELSE
IF CODE=47 THEN DECODE='/'; ELSE
IF CODE=48 THEN DECODE='0'; ELSE
IF CODE=49 THEN DECODE='1'; ELSE
IF CODE=50 THEN DECODE='2'; ELSE
IF CODE=51 THEN DECODE='3'; ELSE
IF CODE=52 THEN DECODE='4'; ELSE
IF CODE=53 THEN DECODE='5'; ELSE
IF CODE=54 THEN DECODE='6'; ELSE
IF CODE=55 THEN DECODE='7'; ELSE
IF CODE=56 THEN DECODE='8'; ELSE
IF CODE=57 THEN DECODE='9'; ELSE
IF CODE=58 THEN DECODE=':'; ELSE
IF CODE=59 THEN DECODE=';'; ELSE
IF CODE=60 THEN DECODE='<'; ELSE
IF CODE=61 THEN DECODE='='; ELSE
IF CODE=62 THEN DECODE='>'; ELSE
IF CODE=63 THEN DECODE='?'; ELSE
IF CODE=64 THEN DECODE='@'; ELSE
IF CODE=65 THEN DECODE='A'; ELSE
IF CODE=66 THEN DECODE='B'; ELSE
IF CODE=67 THEN DECODE='C'; ELSE
IF CODE=68 THEN DECODE='D'; ELSE
IF CODE=69 THEN DECODE='E'; ELSE
IF CODE=70 THEN DECODE='F'; ELSE
IF CODE=71 THEN DECODE='G'; ELSE
IF CODE=72 THEN DECODE='H'; ELSE
IF CODE=73 THEN DECODE='I'; ELSE
IF CODE=74 THEN DECODE='J'; ELSE
IF CODE=75 THEN DECODE='K'; ELSE
IF CODE=76 THEN DECODE='L'; ELSE
IF CODE=77 THEN DECODE='M'; ELSE
IF CODE=78 THEN DECODE='N'; ELSE
IF CODE=79 THEN DECODE='O'; ELSE
IF CODE=80 THEN DECODE='P'; ELSE
IF CODE=81 THEN DECODE='Q'; ELSE
IF CODE=82 THEN DECODE='R'; ELSE
IF CODE=83 THEN DECODE='S'; ELSE
IF CODE=84 THEN DECODE='T'; ELSE
IF CODE=85 THEN DECODE='U'; ELSE
IF CODE=86 THEN DECODE='V'; ELSE
IF CODE=87 THEN DECODE='W'; ELSE
IF CODE=88 THEN DECODE='X'; ELSE
IF CODE=89 THEN DECODE='Y'; ELSE
IF CODE=90 THEN DECODE='Z'; ELSE
IF CODE=91 THEN DECODE='{'; ELSE
IF CODE=92 THEN DECODE='\'; ELSE
IF CODE=93 THEN DECODE='}'; ELSE
IF CODE=94 THEN DECODE='^'; ELSE
IF CODE=95 THEN DECODE='-'; ELSE
IF CODE=96 THEN DECODE='`'; ELSE
IF CODE=97 THEN DECODE='A'; ELSE
IF CODE=98 THEN DECODE='B'; ELSE
IF CODE=99 THEN DECODE='C'; ELSE
IF CODE=100 THEN DECODE='D'; ELSE
IF CODE=101 THEN DECODE='E'; ELSE
IF CODE=102 THEN DECODE='F'; ELSE
IF CODE=103 THEN DECODE='G'; ELSE
IF CODE=104 THEN DECODE='H'; ELSE
IF CODE=105 THEN DECODE='I'; ELSE
IF CODE=106 THEN DECODE='J'; ELSE
IF CODE=107 THEN DECODE='K'; ELSE
IF CODE=108 THEN DECODE='L'; ELSE
IF CODE=109 THEN DECODE='M'; ELSE
IF CODE=110 THEN DECODE='N'; ELSE
IF CODE=111 THEN DECODE='O'; ELSE
IF CODE=112 THEN DECODE='P'; ELSE
IF CODE=113 THEN DECODE='Q'; ELSE
IF CODE=114 THEN DECODE='R'; ELSE
IF CODE=115 THEN DECODE='S'; ELSE
IF CODE=116 THEN DECODE='T'; ELSE
IF CODE=117 THEN DECODE='U'; ELSE
IF CODE=118 THEN DECODE='V'; ELSE
IF CODE=119 THEN DECODE='W'; ELSE
IF CODE=120 THEN DECODE='X'; ELSE
IF CODE=121 THEN DECODE='Y'; ELSE
IF CODE=122 THEN DECODE='Z'; ELSE
IF CODE=123 THEN DECODE='{'; ELSE
IF CODE=124 THEN DECODE='|'; ELSE /*BROKEN VERTICAL BAR*/
IF CODE=125 THEN DECODE='}'; ELSE
IF CODE=126 THEN DECODE='~'; ELSE
IF CODE=127 THEN DECODE=' ';
RETURN;
*----------------------------------------------------------------*
- INPUT FOR CHARACTER FORMAT METAFILES. -
*----------------------------------------------------------------*;
CHAR: INPUT CODE 5. @@;
RETURN;
INPUTX: INPUT CODE 5. @@; CODE=CODE/INITX;
RETURN;
INPUTY: INPUT CODE 5. @@; CODE=CODE/INITY;
RETURN;
RUN;
%mend metatate;
*;