home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / epm603b.zip / EPMCSAMP.ZIP / EPMCSAMP / INCLUDE / ATTR.H next >
Text File  |  1994-01-24  |  5KB  |  108 lines

  1. #ifndef ATTR_INCLUDED
  2.    #define ATTR_INCLUDED
  3.    typedef unsigned char   ATTRIBCLASSTYPE;
  4.    typedef signed long     ATTRIBVALUETYPE;
  5.    #define INVALIDCLASS    ((ATTRIBCLASSTYPE)0)
  6.    #define COLORCLASS      ((ATTRIBCLASSTYPE)1)
  7.    #define MAXCOLOR        ((ATTRIBVALUETYPE)255)
  8.    #define FLOWCLASS       ((ATTRIBCLASSTYPE)2)
  9.    #define JUSTIFYCLASS    ((ATTRIBCLASSTYPE)3)
  10.    #define TABCLASS        ((ATTRIBCLASSTYPE)4)
  11.    #define TAB2CLASS       ((ATTRIBCLASSTYPE)5)
  12.    #define PAGEBRK1CLASS   ((ATTRIBCLASSTYPE)6)
  13.    #define FONTCLASS       ((ATTRIBCLASSTYPE)16)
  14.    #define BREAKCLASS      ((ATTRIBCLASSTYPE)17)
  15.    #define LINEBREAKLEVEL  0x10
  16.    #define COLMBREAKLEVEL  0x40
  17.    #define STACKBREAKLEVEL 0x60
  18.    #define DIVNBREAKLEVEL  0x80
  19.    #define HSPACECLASS     ((ATTRIBCLASSTYPE)18)
  20.    #define DIVISIONCLASS   ((ATTRIBCLASSTYPE)19)
  21.  
  22.    typedef struct ATTRIBRECTYPE {
  23.      USHORT          Col;
  24.      ATTRIBCLASSTYPE Class;
  25.      UCHAR           IsPush;
  26.      ATTRIBVALUETYPE Value;
  27.    } ATTRIBRECTYPE;
  28.    typedef ATTRIBRECTYPE * PATTRIBRECTYPE;
  29.    typedef PATTRIBRECTYPE * PPATTRIBRECTYPE;
  30.  
  31.    #define MAXATTRBPL       255
  32.    #define MAXATTRBSPACE    (MAXATTRBPL*sizeof(ATTRIBRECTYPE))
  33.  
  34.    // the following type is allocated by AllocNullAttrString() and freed
  35.    // via FreeAttrString(); The Text will grow from s[0] toward the
  36.    // end of the record and the attributes will positioned so that
  37.    // the last one is flush with the end of the allocated space for
  38.    // this structure.
  39.    typedef struct _ATTRSTRING {
  40.       PATTRIBRECTYPE ALAttr;
  41.       PATTRIBRECTYPE Attrs;
  42.       PCHAR SelfPtr;      // this is a redundant field that points to itself.
  43.                           //   This field is automatically initialized when
  44.                           //   when the attrstring is created.
  45.                           // procedures that receive attrstring's that
  46.                           //   may have been created before the previous
  47.                           //   heap compact should check this field to
  48.                           //   insure that it still points to the Text
  49.                           //   field.  They can do this by using the
  50.                           //   ATTRSTRING_REVALIDATE() macro.  This is
  51.                           //   necessary since the Attrs and ALAttr fields
  52.                           //   become invalid when the heap compacter moves
  53.                           //   the attrstring.
  54.       SHORT  TextLen;
  55.       CHAR   Text[1];
  56.    } ATTRSTRING;
  57.    typedef ATTRSTRING  *PATTRSTRING;
  58.    typedef PATTRSTRING *PPATTRSTRING;
  59.    #define access_as(a)   (*((PPATTRSTRING)(a)))
  60.    #if 1
  61.       /* 
  62.       \  Note that ATTRSTRING_REVALIDATE is not thread reentrant.  Therefore
  63.        \ it should only be called in the interpretter thread.  It can also be
  64.        / called from another thread if one can be sure that another copy
  65.       /  is not executing.  A reentrant version could be made easily with
  66.       \  DosEnter/ExitCritSec or with more difficulty via normal C if we
  67.        \ can assume pointer fetch/set is an atomic action.
  68.       */
  69.  
  70.       #define BUGFIX00236
  71.       #ifdef BUGFIX00236
  72.          /* We only set the high part because if we are using 16bit code, the assignment 
  73.          \     is not atomic, so there can be a thread switch between two halfs if the 
  74.           \     value is 32bit.  We don't do this for the second assignment because
  75.            \    we know that our 16 bit compiler assigns the low 16 bits first.
  76.            /    Warning: optimizing compilers might strip the first assignment which
  77.           /     renders this locking code useless.
  78.           */
  79.          #define ASREVALSELECTOROF(p)       (((PUSHORT)&(p))[1])
  80.  
  81.          #define ATTRSTRING_REVALIDATE(ina) \
  82.                 { \
  83.                    PATTRSTRING as = *(ina); \
  84.                    if (((PVOID)&(as->SelfPtr))!=(PVOID)as->SelfPtr) { \
  85.                       PCHAR spOld = as->SelfPtr; \
  86.                       ASREVALSELECTOROF(as->SelfPtr) = 0; \
  87.                       as->Attrs  = (PATTRIBRECTYPE) ((PCHAR)&(as->SelfPtr) + ((PCHAR)as->Attrs  - spOld)); \
  88.                       as->ALAttr = (PATTRIBRECTYPE) ((PCHAR)&(as->SelfPtr) + ((PCHAR)as->ALAttr - spOld)); \
  89.                       as->SelfPtr= (PCHAR)&(as->SelfPtr); \
  90.                    } /* endif */ \
  91.                 }
  92.       #else
  93.          #define ATTRSTRING_REVALIDATE(ina) \
  94.                 { \
  95.                    PATTRSTRING as = *(ina); \
  96.                    if (((PVOID)&(as->SelfPtr))!=(PVOID)as->SelfPtr) { \
  97.                       as->Attrs  = (PATTRIBRECTYPE) ((PCHAR)&(as->SelfPtr) + ((PCHAR)as->Attrs  - as->SelfPtr)); \
  98.                       as->ALAttr = (PATTRIBRECTYPE) ((PCHAR)&(as->SelfPtr) + ((PCHAR)as->ALAttr - as->SelfPtr)); \
  99.                       as->SelfPtr= (PCHAR)&(as->SelfPtr); \
  100.                    } /* endif */ \
  101.                 }
  102.       #endif
  103.  
  104.  
  105.    #endif
  106. #endif
  107.  
  108.