[BACK]Return to pariCE.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / Odos

Annotation of OpenXM_contrib/pari/Odos/pariCE.c, Revision 1.1.1.1

1.1       maekawa     1: #include <stdlib.h>
                      2: #include <windows.h>
                      3:
                      4:
                      5: int isspace(int c) {
                      6:        if ((c >= 0x09) && (c <= 0x0D)) return 1;
                      7:        else if (c == 0x20) return 1;
                      8:        return 0;
                      9: }
                     10:
                     11: int isdigit(int c) {
                     12:        if ((c >= '0') && (c <= '9')) return 1;
                     13:        else return 0;
                     14: }
                     15:
                     16: int isxdigit(int c) {
                     17:        if ((c >= '0') && (c <= '9')) return 1;
                     18:        else if ((c >= 'a') && (c <= 'f')) return 1;
                     19:        else if ((c >= 'A') && (c <= 'F')) return 1;
                     20:        else return 0;
                     21: }
                     22:
                     23: int isalpha(int c) {
                     24:        if ((c >= 'a') && (c <= 'z')) return 1;
                     25:        else if ((c >= 'A') && (c <= 'Z')) return 1;
                     26:        else return 0;
                     27: }
                     28:
                     29: int isalnum(int c) {
                     30:        if ((c >= '0') && (c <= '9')) return 1;
                     31:        else if ((c >= 'a') && (c <= 'z')) return 1;
                     32:        else if ((c >= 'A') && (c <= 'Z')) return 1;
                     33:        else return 0;
                     34: }
                     35:
                     36: static int checkDigit(char ch, int base) {
                     37:        int n;
                     38:
                     39:        if (ch >= '0' && ch <= '9') n = ch - '0';
                     40:        else if (ch >= 'a' && ch <= 'z') n = ch + 10 - 'a';
                     41:        else if (ch >= 'A' && ch <= 'Z') n = ch + 10 - 'A';
                     42:        else return -1;
                     43:
                     44:        return n >= base ? -1 : n;
                     45: }
                     46:
                     47: long strtol(const char *s, char **endptr, int base) {
                     48:        const char *sc;
                     49:        char sign;
                     50:        int actualbase;
                     51:        double result;
                     52:
                     53:        /* if the base is illegal, then return 0; */
                     54:        if (! (base >= 2 && base <= 36) ){
                     55:                if (endptr) *endptr = (char *)s;
                     56:                return 0;
                     57:        }
                     58:
                     59:        /* skip leading spaces */
                     60:        for (sc = s; *sc == ' '; ++sc);
                     61:
                     62:        /* parse the sign */
                     63:        if (*sc == '-' || *sc == '+') {
                     64:                sign = *sc;
                     65:                sc++;
                     66:        }
                     67:        else {
                     68:                sign = '+';
                     69:        }
                     70:
                     71:        /* the default base = 10 */
                     72:        actualbase = base == 0 ? 10 : base;
                     73:
                     74:        /* if base is undefined, and number starts '0x', then we have base 16 */
                     75:        if (base == 0 && sc[0] == '0' && (sc[1] == 'x' || sc[1] == 'X')) { actualbase = 16; sc += 2; }
                     76:
                     77:        /* else if base is undefined, and number starts '0', then we have base 8 */
                     78:        else if (base == 0 && sc[0] == '0') actualbase = 8;
                     79:
                     80:        /* else if base == 16, then skip any leading '0x' */
                     81:        else if (base == 16 && sc[0] == '0' && (sc[1] == 'x' || sc[1] == 'X')) sc += 2;
                     82:
                     83:        /* skip leading zeroes */
                     84:        for (; *sc == '0'; ++sc);
                     85:
                     86:        /* the result so far is 0. We are going to work with doubles because these give 52 bits of accuracy */
                     87:        result = 0.0;
                     88:
                     89:        /* sc now points to the first unprocessed digit. Keep processing until first non digit or overflow */
                     90:        for (;;) {
                     91:                int d = checkDigit(*sc, actualbase);
                     92:
                     93:                /* if the digit was illegal, then we have terminated */
                     94:                if (d < 0) {
                     95:                        if (endptr) *endptr = (char *)sc;
                     96:                        return sign == '-' ? -(long)result : (long)result;
                     97:                }
                     98:
                     99:                /* roll in the new digit */
                    100:                result = result * actualbase + d;
                    101:
                    102:                /* check for overflow */
                    103:                if (sign == '+' && result > (double)LONG_MAX) {
                    104:                        if (endptr) *endptr = (char *)(sc+1);
                    105:                        return LONG_MAX;
                    106:                }
                    107:                if (sign == '-' && result > -(double)LONG_MIN) {
                    108:                        if (endptr) *endptr = (char *)(sc+1);
                    109:                        return LONG_MIN;
                    110:                }
                    111:
                    112:                /* go on to the next character */
                    113:                sc++;
                    114:        }
                    115: }
                    116:
                    117: /*
                    118:  *  Implement rename and unlink in win32 procedures. This is complicated
                    119:  *  by the fact that these procedures take wide chars.
                    120:  */
                    121:
                    122: #define MAX_FILENAME_LEN           128
                    123:
                    124: int rename(const char *oldname, const char *newname) {
                    125:        int succ;
                    126:        short soldname[MAX_FILENAME_LEN];
                    127:        short snewname[MAX_FILENAME_LEN];
                    128:
                    129:        MultiByteToWideChar(CP_ACP, 0, oldname, strlen(oldname)+1, soldname, MAX_FILENAME_LEN);
                    130:        MultiByteToWideChar(CP_ACP, 0, newname, strlen(newname)+1, snewname, MAX_FILENAME_LEN);
                    131:        succ = MoveFile(soldname, snewname);
                    132:        return !succ;
                    133: }
                    134:
                    135: int unlink(char *name) {
                    136:        int succ;
                    137:        short wname[MAX_FILENAME_LEN];
                    138:
                    139:        MultiByteToWideChar(CP_ACP, 0, name, strlen(name)+1, wname, MAX_FILENAME_LEN);
                    140:
                    141:        succ = DeleteFile(wname);
                    142:        return !succ;
                    143: }
                    144:
                    145: void *calloc(size_t nelem, size_t size) {
                    146:        const size_t n = nelem*size;
                    147:        char *p = malloc(n);
                    148:
                    149:        if (p) memset(p, '\0', n);
                    150:        return p;
                    151: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>