gbx_subr_test_temp.h
上传用户:hz1717
上传日期:2014-12-23
资源大小:7560k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

C/C++

  1. /***************************************************************************
  2.   subr_test_temp.c
  3.   The test routines templates
  4.   (c) 2000-2004 Beno顃 Minisini <gambas@users.sourceforge.net>
  5.   This program is free software; you can redistribute it and/or modify
  6.   it under the terms of the GNU General Public License as published by
  7.   the Free Software Foundation; either version 1, or (at your option)
  8.   any later version.
  9.   This program is distributed in the hope that it will be useful,
  10.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.   GNU General Public License for more details.
  13.   You should have received a copy of the GNU General Public License
  14.   along with this program; if not, write to the Free Software
  15.   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ***************************************************************************/
  17. #ifndef STT_INEQUALITY
  18. PUBLIC void STT_NAME(void)
  19. {
  20.   static void *jump[17] = {
  21.     &&__VARIANT, &&__BOOLEAN, &&__BYTE, &&__SHORT, &&__INTEGER, &&__LONG, &&__FLOAT, &&__DATE,
  22.     &&__STRING, &&__STRING, &&__ERROR, &&__ERROR, &&__ERROR, &&__ERROR, &&__ERROR,
  23.     &&__NULL,
  24.     &&__OBJECT
  25.     };
  26.   TYPE type;
  27.   VALUE *P1, *P2;
  28.   boolean result, variant;
  29.   P1 = SP - 2;
  30.   P2 = P1 + 1;
  31.   variant = FALSE;
  32.   type = EXEC_code & 0x1F;
  33.   goto *jump[type];
  34. __VARIANT:
  35.   type = Max(P1->type, P2->type);
  36.   if (TYPE_is_variant(P1->type))
  37.   {
  38.     #ifdef STT_CASE
  39.     TEMP = *P1;
  40.     P1 = &TEMP;
  41.     #endif
  42.     VARIANT_undo(P1);
  43.     variant = TRUE;
  44.   }
  45.   if (TYPE_is_variant(P2->type))
  46.   {
  47.     VARIANT_undo(P2);
  48.     variant = TRUE;
  49.   }
  50.   if (variant)
  51.     type = Max(P1->type, P2->type);
  52.   if (TYPE_is_object_null(P1->type) && TYPE_is_object_null(P2->type))
  53.     type = T_OBJECT;
  54.   else if (TYPE_is_object(type))
  55.     THROW(E_TYPE, "Object", TYPE_get_name(Min(P1->type, P2->type)));
  56.   if (!variant)
  57.     *PC |= type;
  58.   goto *jump[type];
  59. __BOOLEAN:
  60. __BYTE:
  61. __SHORT:
  62. __INTEGER:
  63.   result = P1->_integer.value STT_TEST P2->_integer.value;
  64.   goto __END;
  65. __LONG:
  66.   result = FALSE;
  67.   goto __END;
  68. __DATE:
  69.   VALUE_conv(P1, T_DATE);
  70.   VALUE_conv(P2, T_DATE);
  71.   result = (DATE_comp_value(P1, P2) STT_TEST 0);
  72.   goto __END;
  73. __STRING:
  74.   VALUE_conv(P1, T_STRING);
  75.   VALUE_conv(P2, T_STRING);
  76.   result = (STRING_comp_value(P1, P2) STT_TEST 0);
  77.   goto __END_RELEASE;
  78. __FLOAT:
  79.   VALUE_conv(P1, T_FLOAT);
  80.   VALUE_conv(P2, T_FLOAT);
  81.   result = P1->_float.value STT_TEST P2->_float.value;
  82.   goto __END;
  83. __OBJECT:
  84.   result = OBJECT_comp_value(P1, P2) STT_TEST TRUE;
  85.   goto __END_RELEASE;
  86. __NULL:
  87.   result = VALUE_is_null(P1->type == T_NULL ? P2 : P1) STT_TEST TRUE;
  88.   goto __END_RELEASE;
  89. __ERROR:
  90.   THROW(E_TYPE, "Number or Date", TYPE_get_name(type));
  91. __END_RELEASE:
  92. #ifdef STT_CASE
  93.   RELEASE(P2);
  94. #else
  95.   RELEASE(P1);
  96.   RELEASE(P2);
  97. #endif
  98. __END:
  99.   #ifdef STT_CASE
  100.   P2->type = T_BOOLEAN;
  101.   P2->_boolean.value = result ? -1 : 0;
  102.   #else
  103.   P1->type = T_BOOLEAN;
  104.   P1->_boolean.value = result ? -1 : 0;
  105.   SP--;
  106.   #endif
  107. }
  108. #else /* inequality tests */
  109. PUBLIC void STT_NAME(void)
  110. {
  111.   static void *jump[17] = {
  112.     &&__VARIANT, &&__BOOLEAN, &&__BYTE, &&__SHORT, &&__INTEGER, &&__LONG, &&__FLOAT, &&__DATE,
  113.     &&__STRING, &&__STRING, &&__ERROR, &&__ERROR, &&__ERROR, &&__ERROR, &&__ERROR,
  114.     &&__NULL, &&__ERROR
  115.     };
  116.   TYPE type, typem;
  117.   VALUE *P1, *P2;
  118.   boolean result, variant;
  119.   P1 = SP - 2;
  120.   P2 = P1 + 1;
  121.   variant = FALSE;
  122.   type = EXEC_code & 0x1F;
  123.   goto *jump[type];
  124. __VARIANT:
  125.   if (TYPE_is_variant(P1->type))
  126.   {
  127.     VARIANT_undo(P1);
  128.     variant = TRUE;
  129.   }
  130.   if (TYPE_is_variant(P2->type))
  131.   {
  132.     VARIANT_undo(P2);
  133.     variant = TRUE;
  134.   }
  135.   type = Max(P1->type, P2->type);
  136.   if (type == T_NULL || TYPE_is_string(type))
  137.   {
  138.     typem = Min(P1->type, P2->type);
  139.     if (!TYPE_is_string(typem))
  140.       THROW(E_TYPE, TYPE_get_name(typem), TYPE_get_name(type));
  141.   }
  142.   else if (TYPE_is_object(type))
  143.     goto __ERROR;
  144.   if (!variant)
  145.     *PC |= type;
  146.   goto *jump[type];
  147. __BOOLEAN:
  148. __BYTE:
  149. __SHORT:
  150. __INTEGER:
  151.   result = P1->_integer.value STT_TEST P2->_integer.value;
  152.   goto __END;
  153. __LONG:
  154.   result = FALSE;
  155.   goto __END;
  156. __DATE:
  157.   VALUE_conv(P1, T_DATE);
  158.   VALUE_conv(P2, T_DATE);
  159.   result = (DATE_comp_value(P1, P2) STT_TEST 0);
  160.   goto __END;
  161. __NULL:
  162.   VALUE_conv(P1, T_STRING);
  163.   VALUE_conv(P2, T_STRING);
  164. __STRING:
  165.   result = (STRING_comp_value(P1, P2) STT_TEST 0);
  166.   goto __END_RELEASE;
  167. __FLOAT:
  168.   VALUE_conv(P1, T_FLOAT);
  169.   VALUE_conv(P2, T_FLOAT);
  170.   result = P1->_float.value STT_TEST P2->_float.value;
  171.   goto __END;
  172. __ERROR:
  173.   THROW(E_TYPE, "Number, Date or String", TYPE_get_name(type));
  174. __END_RELEASE:
  175.   RELEASE(P1);
  176.   RELEASE(P2);
  177. __END:
  178.   P1->type = T_BOOLEAN;
  179.   P1->_boolean.value = result ? -1 : 0;
  180.   SP--;
  181. }
  182. #endif
  183. #ifdef STT_INEQUALITY
  184. #undef STT_INEQUALITY
  185. #endif
  186. #undef STT_NAME
  187. #undef STT_TEST
  188. #ifdef STT_NO_OBJECT
  189. #undef STT_NO_OBJECT
  190. #endif
  191. #ifdef STT_CASE
  192. #undef STT_CASE
  193. #endif
  194. #ifdef STT_NULL
  195. #undef STT_NULL
  196. #endif