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

*
;