/*------------------------------------------------------------\
|                                                             |
| Tool    :                     DRUC                          |
|                                                             |
| File    :                  Drucutil.h                       |
|                                                             |
| Authors :                Patrick Renaud                     |
|                                                             |
| Date    :                   03/07/95                        |
|                                                             |
\------------------------------------------------------------*/
/*------------------------------------------------------------\
|                                                             |
|                  Druc          Defines                      |
|                                                             |
| Defines pour le code                                        |
|                                                             |
\------------------------------------------------------------*/
#define DRUC_FALSE                                           0
#define DRUC_TRUE                                            1

#define DRUC_MAX_FILE_BUFFER                               127
#define DRUC_MAX_STRING_BUFFER                              80

#define DRUC_DRC_RULES                             "DRC_RULES"
#define DRUC_END_DRC_RULES                     "END_DRC_RULES"

#define DRUC_DRC_COMMENT                          "DRC_COMMENT"
#define DRUC_DRC_END_COMMENT                  "END_DRC_COMMENT"
/*------------------------------------------------------------\
|                                                             |
|                  Druc          Default Names                |
|                                                             |
\------------------------------------------------------------*/
#define DRUC_ERROR_FILE_NAME                      "DRUC_ERROR"
#define DRUC_ERROR_FILE_SUFFIXE                         ".DRC"
#define DRUC_ERROR_FIGURE_SUFFIXE                       "_ERR"
#define DRUC_ERROR_EXTEND                               "_DRC"

/*------------------------------------------------------------\
|                                                             |
|                  Druc Compiler Defines                      |
|                                                             |
| Defines pour les erreurs                                    |
|                                                             |
\------------------------------------------------------------*/
#define DRUC_ERROR_NOT_DECLARED_LAYER                       21
#define DRUC_ERROR_EMPTY_LAYER                              20
#define DRUC_ERROR_NOT_EMPTY_LAYER                          19
#define DRUC_ERROR_FILE_PARAM                               18
#define DRUC_ERROR_READ_PARAM                               17
#define DRUC_ERROR_CLOSE_DRC_FILE                           16
#define DRUC_ERROR_COMMENT_FILE                             15
#define DRUC_ERROR_BAD_COMMENT                              14
#define DRUC_ERROR_MAX_OPERATOR                             13
#define DRUC_ERROR_CHECKSUMM                                12
#define DRUC_ERROR_MEMOIRE                                  11
#define DRUC_ERROR_DEFINE_USER_LAYER                        10
#define DRUC_ERROR_RULE_NUMBER                               9
#define DRUC_ERROR_IN_FILE                                   8
#define DRUC_ERROR_NO_CHECKSUM                               7
#define DRUC_ERROR_NO_RULE_IN_FILE                           6
#define DRUC_ERROR_NO_RULE_FILE                              5
#define DRUC_ERROR_OUT_FILE                                  4
#define DRUC_ERROR_OUT_NAME                                  3
#define DRUC_ERROR_UNDEFINED_LAYER                           2
#define DRUC_ERROR_UNDEFINED                                 1
#define DRUC_GOOD                                            0

/*------------------------------------------------------------\
|                                                             |
|                  Druc          Defines                      |
|                                                             |
| Defines pour les structures                                 |
|                                                             |
\------------------------------------------------------------*/
#define DRUC_UNDEFINED_CHECKSUMM                            -1
#define DRUC_UNDEFINED_CTM                                  -1
#define DRUC_UNDEFINED_FLAGS                                -1
#define DRUC_FLAG_LAYER_INTERDIT                             1
#define DRUC_FLAG_LAYER_LIBRE                                2
#define DRUC_FLAG_LAYER_OCCUPE                               3

#define DRUC_UNDEFINED_LAYER                                -1
#define DRUC_UNDEFINED_WIDTH                                -1
#define DRUC_UNDEFINED_OP_COMPOSE                           -1
#define DRUC_UNDEFINED_REGLE                                -1
#define DRUC_UNDEFINED_INSTRUCTION                          -1
#define DRUC_UNDEFINED_RELATION                             -1
#define DRUC_UNDEFINED_MESURE                               -1
#define DRUC_UNDEFINED_OPERATEUR                            -1
#define DRUC_UNDEFINED_VALEUR                               -1

#define DRUC_MAX_USER_LAYER                                  3
#define DRUC_USER_LAYER_0                    RDS_MAX_LAYER - 4
#define DRUC_USER_LAYER_1                    RDS_MAX_LAYER - 3
#define DRUC_USER_LAYER_2                    RDS_MAX_LAYER - 2
/*\ 
 * RDS_MAX_LAYER -1 correspond a RDS_ABOX
\*/

#define DRUC_NO_ERROR_FILE                                   0
#define DRUC_ERROR_FILE                                      1
#define DRUC_FLATTEN                                         0
#define DRUC_HIERARCHIE                                      1
#define DRUC_SILENT                                          0
#define DRUC_VERBOSE                                         1

/*------------------------------------------------------------\
|                                                             |
|                  Druc  Maximum de mesures                   |
|                                                             |
\------------------------------------------------------------*/
#define DRUC_MAX_MESURES                                     8
#define DRUC_UN_CORPS_TRANS_METAL                         1000
#define DRUC_UN_CORPS_VIRT_METAL                          2000
#define DRUC_DEUX_CORPS_TRANS_METAL                       3000
#define DRUC_DEUX_CORPS_VIRT_METAL                        4000
#define DRUC_DEUX_CORPS_METAL_TRANS                       5000
#define DRUC_DEUX_CORPS_TRANS_TRANS                       6000
#define DRUC_DEUX_CORPS_VIRT_TRANS                        7000
#define DRUC_DEUX_CORPS_METAL_VIRT                        8000
#define DRUC_DEUX_CORPS_TRANS_VIRT                        9000
#define DRUC_DEUX_CORPS_VIRT_VIRT                        10000
#define DRUC_RULES_BASE_ABOX                             11000

/*------------------------------------------------------------\
|                                                             |
|                  Druc          Language                     |
|                                                             |
\------------------------------------------------------------*/
#define DRUC_ASM_BEGIN_LAYER                               128
#define DRUC_ASM_END_LAYER                                 129
#define DRUC_ASM_BEGIN_DEFINE                              130
#define DRUC_ASM_END_DEFINE                                131
#define DRUC_ASM_BEGIN_UNDEFINE                            132
#define DRUC_ASM_END_UNDEFINE                              133
#define DRUC_ASM_BEGIN_REGLE                               134
#define DRUC_ASM_END_REGLE                                 135
#define DRUC_ASM_BEGIN_CHECKSUMM                           136
#define DRUC_ASM_END_CHECKSUMM                             137

#define DRUC_COMPOSE_UNION                                   8
#define DRUC_COMPOSE_INTERSECT                               9
#define DRUC_COMPOSE_EXCLUSION                              10
#define DRUC_COMPOSE_INCLUSION                              11

#define DRUC_COMPOSE_RESIZE                                 12

#define DRUC_INSTR_CARACTERISE                               1
#define DRUC_INSTR_RELATION                                  2

#define DRUC_RELATION_DISTANCE                              16
#define DRUC_RELATION_ENVELOPPE                             17
#define DRUC_RELATION_MARGE                                 18
#define DRUC_RELATION_CROIX                                 19
#define DRUC_RELATION_INTERSECTION                          20
#define DRUC_RELATION_EXTENSION                             21
#define DRUC_RELATION_INCLUSION                             22

#define DRUC_MESURE_SURFACE_INTER                           30
#define DRUC_MESURE_LONGUEUR_INTER                          31
#define DRUC_MESURE_LARGEUR_INTER                           32
#define DRUC_MESURE_PENETRE_INTER                           33
#define DRUC_MESURE_PARALEL_INTER                           34
#define DRUC_MESURE_PERPEND_INTER                           35
#define DRUC_MESURE_LONGUEUR_MIN                            36
#define DRUC_MESURE_LONGUEUR_MAX                            37
#define DRUC_MESURE_LARGEUR_MIN                             38
#define DRUC_MESURE_LARGEUR_MAX                             39
#define DRUC_MESURE_LATERALE_MIN                            40
#define DRUC_MESURE_LATERALE_MAX                            41
#define DRUC_MESURE_FRONTALE                                42
#define DRUC_MESURE_INF                                     43
#define DRUC_MESURE_SUP                                     44
#define DRUC_MESURE_AXIALE                                  45
#define DRUC_MESURE_GEODESIQUE                              46

#define DRUC_MESURE_SURFACE                                 48
#define DRUC_MESURE_LONGUEUR                                49
#define DRUC_MESURE_LARGEUR                                 50
#define DRUC_MESURE_NOTCH                                   51

#define DRUC_OPERATION_MIN                                  64
#define DRUC_OPERATION_MAX                                  65
#define DRUC_OPERATION_INFEQ                                66
#define DRUC_OPERATION_SUPEQ                                67
#define DRUC_OPERATION_EQUAL                                68
#define DRUC_OPERATION_DIFF                                 69
#define DRUC_OPERATION_INF                                  70
#define DRUC_OPERATION_SUP                                  71

/*------------------------------------------------------------\
|                                                             |
|                  Druc          Types                        |
|                                                             |
\------------------------------------------------------------*/
typedef char boolean;

typedef struct struct_instruction
              {
               struct struct_instruction *NEXT;
                int                       INSTRUCTION;
                int                       LAYER_DEST;
                int                       LAYER_1;
                int                       LAYER_2;
                int                       OP_COMPOSE;
                int                       OP_UNAIRE;
                long                      DEF_VALEUR;
                int                       REGLE_NUM  [ DRUC_MAX_MESURES ];
                int                       RELATION   [ DRUC_MAX_MESURES ];
                int                       MESURE     [ DRUC_MAX_MESURES ];
                int                       OP_COMPARE [ DRUC_MAX_MESURES ];
                int                       VALEUR     [ DRUC_MAX_MESURES ];
              } DrucTypeStructInstruction;

typedef struct struct_rdslayer
              {
               int   RDS_INDEX;
               int   WIDTH;
               int   CTM;
               int   FLAGS;
              } DrucTypeStructRdsLayer;

typedef struct struct_stat
              {
                unsigned long  ERROR_NUMBER;
                boolean        FLAG_FLATTEN_MODE;
                boolean        FLAG_VERBOSE_MODE;
                boolean        FLAG_VIEW_RULE_MODE;
                boolean        FILE_ERROR;
              } DrucTypeStructStat;

typedef struct struct_comment
              {
                struct struct_comment *NEXT;
                long                   RULE;
                char                  *COMMENT;
              } DrucTypeStructRuleComment;

/*------------------------------------------------------------\
|                                                             |
|                  Druc          variables                    |
|                                                             |
\------------------------------------------------------------*/
extern DrucTypeStructRdsLayer     DrucStructRdsLayer[];
extern char                      *DrucCompilErrorMessage[];
extern DrucTypeStructInstruction *DrucTabInstruction;
extern int                        DrucNombreInstructions;
extern long                       DrucCtmMax;
extern DrucTypeStructRuleComment *DrucRuleCommentList;

extern char                      *DrucErrorMessage [];

extern DrucTypeStructStat         DrucStructStat;

/*------------------------------------------------------------\
|                                                             |
|                  Druc Variables RDS                         |
|                                                             |
\------------------------------------------------------------*/
/*
 extern char   RDS_LAYER_NAME [] [];
*/
/*------------------------------------------------------------\
|                                                             |
|                  Druc  Macros                               |
|                                                             |
\------------------------------------------------------------*/

#define DRUC_EXIT(Entier)                            \
   do{                                               \
   extern int vrd_y_lineno;                              \
   fprintf ( stdout,                                 \
             "\nline %d DRUC ERROR %d : %s\n",       \
             vrd_y_lineno, Entier,                       \
             DrucCompilErrorMessage [ Entier ]);     \
   EXIT( Entier );                                   \
   } while (0)

/*------------------------------------------------------------\
|                                                             |
|                  Druc Fonctions                             |
|                                                             |
\------------------------------------------------------------*/
extern void        DrucComputeCheckSumm();
extern char*       DrucGetRuleComment  ();
extern void        DrucViewRuleComment ();
extern chain_list* getrdswindow        ();
extern void        DrucStatInit        ();
extern void        DrucViewNumber      ();
