cmpftn.c
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:4k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  cmpftn.c  -
  3.  *
  4.  * This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by  Vera Ponomarenko
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts:   gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: cmpftn.c,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include <stdio.h>
  29. #include "rnmtp.h"
  30. #include "cmpdecl.h"
  31. #include "sctp.h"
  32. #include "totdecl.h"
  33. #define size2b sizeof(i2_t)
  34. #define size4b sizeof(i4_t)
  35. #define BETWEEN_CMP  (at == SS || at == SES || at == SSE || at == SESE)
  36. #define _1 ((u2_t) ~0)
  37. static  i4_t cmpm[3][3] =
  38. {/* 0 other _1 <- n1    n2   */
  39.   { 0,  1,  1   },   /*   0   */
  40.   {-1,  2,  1   },   /* Other */
  41.   {-1, -1,  0   }    /*  _1   */
  42. };
  43. #define CMP(n1,n2) {
  44.   i4_t ret; ret = cmpm [(n1==0?0:(n1==_1?2:1))][(n2==0?0:(n2==_1?2:1))];  
  45.   if (ret != 2) return ret; }
  46.                                                                            
  47. int
  48. f1b (char *a1, char *b1, u2_t n1, u2_t n2)
  49. {
  50.   CMP(n1,n2);
  51.   return *(i1_t *)a1 - *(i1_t *)b1;
  52. }
  53. int
  54. f2b (char *a1, char *b1, u2_t n1, u2_t n2)
  55. {
  56.   CMP(n1,n2);
  57.   return t2bunpack(a1) - t2bunpack(b1);
  58. }
  59. int
  60. f4b (char *a1, char *b1, u2_t n1, u2_t n2)
  61. {
  62.   i4_t a, b;
  63.   
  64.   CMP(n1,n2);
  65.   a = t4bunpack(a1);
  66.   b = t4bunpack(b1);  
  67.   if (a > b) return ( 1);
  68.   if (a < b) return (-1);
  69.   return (0);
  70. }
  71. int
  72. flcmp (char *a1, char *b1, u2_t n1, u2_t n2)
  73. {
  74.   float a, b;
  75.   CMP(n1,n2);
  76.   *((i4_t*)&a) = t4bunpack(a1);
  77.   *((i4_t*)&b) = t4bunpack(b1);  
  78.   if (a > b)  return ( 1);
  79.   if (a < b)  return (-1);
  80.   return (0);
  81. }
  82. char *
  83. ftint (i4_t at, char *a, char **a1, char **a2, i4_t n)
  84. /* function defines intervals' ranges */
  85. {
  86.   *a1 = a;
  87.   a += n;
  88.   
  89.   if (BETWEEN_CMP)
  90.     {
  91.       *a2 = a;
  92.       a += n;
  93.     }
  94.   else
  95.     *a2 = *a1;
  96.   return (a);
  97. }
  98. char *
  99. ftch (i4_t at, char *a, char **a1, char **a2, u2_t *n1, u2_t *n2)
  100. /* function defines intervals' ranges */
  101. /* function returns the same result to a1 and a2 for single predicate.  *
  102.  * For double predicate (between) - to a1 and a2 - interval bounds.     */
  103. {
  104.   u2_t n;
  105.   
  106.   n = t2bunpack (a);
  107.   a += size2b;
  108.   
  109.   *a1 = a;
  110.   a += n;
  111.   *n1 = n;
  112.   
  113.   if (BETWEEN_CMP)
  114.     {
  115.       n = t2bunpack (a);
  116.       a += size2b;      
  117.       *a2 = a;
  118.       *n2 = n;
  119.       a += n;
  120.     }
  121.   else
  122.     {
  123.       *a2 = *a1;
  124.       *n2 = n;
  125.     }
  126.   return (a);
  127. }
  128. int
  129. chcmp (char *a, char *b, u2_t n1, u2_t n2)
  130. {
  131.   CMP(n1,n2);
  132.   for (; *a == *b; a++, b++, n1--, n2--)
  133.     {
  134.       if (n1 == 1)
  135. return (n1 - n2);
  136.       if (n2 == 1)
  137. return (1);
  138.     }
  139.   return (*a - *b);
  140. }
  141. int
  142. ffloat (char *a, char *b, u2_t n1, u2_t n2)
  143. {
  144.   i4_t msa, msb, rsa, rsb;
  145.   i4_t i;
  146.   char *ra, *rb;
  147.   CMP(n1,n2);
  148.   for (msa = 0, ra = a; *ra != 'e' && *ra != 'E'; ra++)
  149.     msa++;
  150.   rsa = n1 - msa - 1;
  151.   ra++;
  152.   for (msb = 0, rb = b; *rb != 'e' && *rb != 'E'; rb++)
  153.     msb++;
  154.   rsb = n2 - msb - 1;
  155.   rb++;
  156.   if ((i = digcmp (ra, rb, rsa, rsb)) != 0)
  157.     return (i); /* POWER COMPARISON */
  158.   return (digcmp (a, b, msa, msb));
  159. }
  160. int
  161. digcmp (char *a, char *b, u2_t n1, u2_t n2)
  162. {
  163.   if (n1 == 0)
  164.     {
  165.       if (n2 == 0)
  166. return (0);
  167.       else
  168. return (-1);
  169.     }
  170.   if (*a == '-')
  171.     {
  172.       if (*b == '+' || *b != '-')
  173. return (-1); /* unequal signs */
  174.       return (-chcmp (a, b, n1, n2));
  175.     }
  176.   if (*b == '-')
  177.     return (1); /* unequal signs */
  178.   return (chcmp (a, b, n1, n2));
  179. }