*
; /*+-------------------------------------------------------------+ | 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; *;