Annotation of OpenXM_contrib/pari/Odos/pariCE.c, Revision 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>