/***************************************************************** * SQUID - a library of functions for biological sequence analysis * Copyright (C) 1992-2002 Washington University School of Medicine * * This source code is freely distributed under the terms of the * GNU General Public License. See the files COPYRIGHT and LICENSE * for details. *****************************************************************/ /* file: types.c * * Finicky type checkers for strings. Return 1 (TRUE) if ok, 0 elsewise. * Also, finicky type converters (sre_ntoh32() and friends) * * CVS $Id: types.c,v 1.5 2001/01/08 22:58:12 eddy Exp) */ #include #include #include "squid.h" /* Function: IsInt() * * Returns TRUE if s points to something that atoi() will parse * completely and convert to an integer. */ int IsInt(char *s) { int hex = 0; if (s == NULL) {squid_errno = SQERR_PARAMETER; return 0; } /* skip whitespace */ while (isspace((int) (*s))) s++; /* skip leading sign */ if (*s == '-' || *s == '+') s++; /* skip leading conversion signals */ if ((strncmp(s, "0x", 2) == 0 && (int) strlen(s) > 2) || (strncmp(s, "0X", 2) == 0 && (int) strlen(s) > 2)) { s += 2; hex = 1; } else if (*s == '0' && (int) strlen(s) > 1) s++; /* examine remainder for garbage chars */ if (!hex) while (*s != '\0') { if (!isdigit((int) (*s))) return 0; s++; } else while (*s != '\0') { if (!isxdigit((int) (*s))) return 0; s++; } return 1; } /* Function: IsReal() * * Purpose: Returns TRUE if s is a string representation * of a valid floating point number. */ int IsReal(char *s) { int gotdecimal = 0; int gotexp = 0; int gotreal = 0; if (s == NULL) return 0; while (isspace((int) (*s))) s++; /* skip leading whitespace */ if (*s == '-' || *s == '+') s++; /* skip leading sign */ /* Examine remainder for garbage. Allowed one '.' and * one 'e' or 'E'; if both '.' and e/E occur, '.' * must be first. */ while (*s != '\0') { if (isdigit((int) (*s))) gotreal++; else if (*s == '.') { if (gotdecimal) return 0; /* can't have two */ if (gotexp) return 0; /* e/E preceded . */ else gotdecimal++; } else if (*s == 'e' || *s == 'E') { if (gotexp) return 0; /* can't have two */ else gotexp++; } else if (isspace((int) (*s))) break; s++; } while (isspace((int) (*s))) s++; /* skip trailing whitespace */ if (*s == '\0' && gotreal) return 1; else return 0; } /* Function: Byteswap() * * Purpose: Swap between big-endian and little-endian. * For example: * int foo = 0x12345678; * byteswap((char *) &foo, sizeof(int)); * printf("%x\n", foo) * gives 78563412. * * I don't fully understand byte-swapping issues. * However, I have tested this on chars through floats, * on various machines: * SGI IRIX 4.0.5, SunOS 4.1.3, DEC Alpha OSF/1, Alliant * * Date: Sun Feb 12 10:26:22 1995 */ void Byteswap(char *swap, int nbytes) { int x; char byte; for (x = 0; x < nbytes / 2; x++) { byte = swap[nbytes - x - 1]; swap[nbytes - x - 1] = swap[x]; swap[x] = byte; } } /* Functions: sre_ntoh16(), etc. * Date: SRE, Sun Dec 31 11:26:53 2000 [St. Louis] * * Purpose: Provide functionality of ntohs(), etc; extended * to 64-bit unsigned ints, and explicitly provided * in case a machine doesn't have the ntohs() * family. * * If we're using the host functions, * USE_HOST_BYTESWAP_FUNCTIONS was set to 1 in * squidconf.h, and we #define'd sre_hton16(x)=hton(x), etc. * in squid.h. In doing this, we assumed that the * host functions work on 16- and 32-bit unsigned quantities. * If for some reason that's not true, set * USE_HOST_BYTESWAP_FUNCTIONS to 0. */ #ifndef USE_HOST_BYTESWAP_FUNCTIONS sqd_uint16 sre_ntoh16(sqd_uint16 netshort) { #ifdef WORDS_BIGENDIAN return netshort; #else Byteswap((char *) &netshort, 2); return netshort; #endif } sqd_uint32 sre_ntoh32(sqd_uint32 netlong) { #ifdef WORDS_BIGENDIAN return netlong; #else Byteswap((char *) &netlong, 4); return netlong; #endif } sqd_uint16 sre_hton16(sqd_uint16 hostshort) { #ifdef WORDS_BIGENDIAN return hostshort; #else Byteswap((char *) &hostshort, 2); return hostshort; #endif } sqd_uint32 sre_hton32(sqd_uint32 hostlong) { #ifdef WORDS_BIGENDIAN return hostlong; #else Byteswap((char *) &hostlong, 4); return hostlong; #endif } #endif /*USE_HOST_BYTESWAP_FUNCTIONS*/ sqd_uint64 sre_ntoh64(sqd_uint64 net_int64) { #ifdef WORDS_BIGENDIAN return net_int64; #else Byteswap((char *) &net_int64, 8); return net_int64; #endif } sqd_uint64 sre_hton64(sqd_uint64 host_int64) { #ifdef WORDS_BIGENDIAN return host_int64; #else Byteswap((char *) &host_int64, 8); return host_int64; #endif }