home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lifeos2.zip / LIFE-1.02 / SOURCE / TEMPLATE.H < prev    next >
C/C++ Source or Header  |  1996-06-04  |  3KB  |  112 lines

  1. /* Copyright 1991 Digital Equipment Corporation.
  2. ** All Rights Reserved.
  3. *****************************************************************/
  4. /*     $Id: templates.h,v 1.2 1994/12/08 23:34:07 duchier Exp $     */
  5.  
  6.  
  7. /* constants */
  8.  
  9. #define MAXNBARGS 20
  10.  
  11.  
  12. /* defined in templates.c */
  13.  
  14. extern char *numbers[];
  15. extern long set_extra_args[];
  16. extern long get_arg ();
  17.  
  18.  
  19.  
  20. /*  PVR: Dec 17 1992  */
  21. #ifdef X11
  22. #define XPART(argi,vali,numi) \
  23.     if (argi->type == xwindow || argi->type == xpixmap) {\
  24.         vali = GetIntAttr (argi, "id"); \
  25.     if(vali== -34466) \
  26.       numi=FALSE; \
  27.     }
  28.  
  29. #else
  30. #define XPART(argi,vali,numi) if (FALSE) ;
  31. #endif
  32.  
  33.  
  34.  
  35. /* macros */
  36.  
  37.  
  38. #define include_var_builtin(NBARGS) \
  39.         ptr_psi_term g, args[NBARGS]; \
  40.     long num[NBARGS]; \
  41.     long val[NBARGS]; \
  42.     long ii, success=TRUE, resi=FALSE
  43.  
  44.  
  45. #define begin_builtin(FUNCNAME, NBARGS, NBARGSIN, TYPES) \
  46.     if (NBARGS > MAXNBARGS) \
  47.         Errorline ("in template: you have to increase MAXNBARGS at least to %d !\n", NBARGS); \
  48.     \
  49.     g=aim->a; \
  50.     deref_ptr(g); \
  51.     \
  52.     for (ii = 0; success && ii < NBARGS; ii++) \
  53.         success = get_arg (g, &args[ii], numbers[ii]); \
  54.     \
  55.     if (success) \
  56.     { \
  57.     for (ii = 0; ii < NBARGS; ii++) \
  58.         deref (args[ii]); \
  59.     \
  60.     deref_args (g, set_extra_args [NBARGS+1]); \
  61.     \
  62.     for (ii = 0; success && ii < NBARGS; ii++) \
  63.     { \
  64.         success = matches (args[ii]->type, types[ii], &num[ii]); \
  65.         if (args[ii]->value != NULL && num[ii]) \
  66.             if (types[ii] == integer) \
  67.             val[ii] = *(long *) args[ii]->value; \
  68.         else \
  69.         if (types[ii] == real) \
  70.             val[ii] = *(REAL *) args[ii]->value; \
  71.         else \
  72.         if (types[ii] == quoted_string) \
  73.             val[ii] = (long) args[ii]->value; \
  74.         else \
  75.             Errorline ("in template: type %T not expected (built-in FUNCNAME).\n", types[ii]); \
  76.         else \
  77.         if (args[ii]->type == true) \
  78.             val[ii] = TRUE; \
  79.         else \
  80.         if (args[ii]->type == false) \
  81.             val[ii] = FALSE; \
  82.         else \
  83.           XPART(args[ii],val[ii],num[ii]) /* 16.12 */ \
  84.         else \
  85.             num[ii] = FALSE; /* force the residuation */ \
  86.     } \
  87.     \
  88.     if (success) \
  89.     { \
  90.         for (ii = 0; ii < NBARGSIN; ii++) \
  91.             if (args[ii]->resid != NULL || !num[ii]) \
  92.         { \
  93.             residuate (args[ii]); \
  94.             resi = TRUE; \
  95.         } \
  96.     \
  97.         if (success && !resi) \
  98.         {
  99.  
  100.  
  101. #define end_builtin() \
  102.             } \
  103.         } \
  104.     else \
  105.             Errorline ("bad arguments in %P.\n", g); \
  106.     } \
  107.     else \
  108.         Errorline ("missing arguments in %P.\n", g); \
  109.     \
  110.     return success; 
  111.  
  112.