📄 convert.c
字号:
* This because 10^8 = 5^8 * 2^8 = 5^8 * 256 * So dividing 10^8 for 256 make no remainder * So I can split for bytes in an optmized way */ /* transform to packaged one */ for(j=0; j<TDS_VECTOR_SIZE(packed_num); ++j) { TDS_UINT n = mynumber[j*8]; for(i=1;i<8;++i) n = n * 10 + mynumber[j*8+i]; packed_num[j] = n; } memset(cr->n.array,0,sizeof(cr->n.array)); cr->n.array[0] = sign; bytes = g__numeric_bytes_per_prec[cr->n.precision]; while (not_zero) { not_zero = 0; carry = 0; for (i = 0; i < TDS_VECTOR_SIZE(packed_num); ++i) { TDS_UINT tmp; if (packed_num[i] > 0) not_zero = 1; /* divide for 256 for find another byte */ tmp = packed_num[i]; /* carry * (25u*25u*25u*25u) = carry * 10^8 / 256u * using unsigned number is just an optimization * compiler can translate division to a shift and remainder * to a binary and */ packed_num[i] = carry * (25u*25u*25u*25u) + packed_num[i] / 256u; carry = tmp % 256u; if ( i == (TDS_VECTOR_SIZE(packed_num) - 1) && not_zero) { /* source number is limited to 38 decimal digit * 10^39-1 < 2^128 (16 byte) so this cannot make an overflow */ cr->n.array[--bytes] = carry; } } } return sizeof(TDS_NUMERIC);}static int is_numeric_dateformat(char *t){char *instr ;int ret = 1;int slashes = 0;int hyphens = 0;int periods = 0;int digits = 0; for (instr = t; *instr; instr++ ) { if (!isdigit((unsigned char) *instr) && *instr != '/' && *instr != '-' && *instr != '.' ) { ret = 0; break; } if (*instr == '/' ) slashes++; else if (*instr == '-' ) hyphens++; else if (*instr == '.' ) periods++; else digits++; } if (hyphens + slashes + periods != 2) ret = 0; if (hyphens == 1 || slashes == 1 || periods == 1) ret = 0; if (digits < 4 || digits > 8) ret = 0; return(ret);}static int is_monthname(char *datestr){int ret = 0; if (strlen(datestr) == 3) { if (strcasecmp(datestr,"jan") == 0) ret = 1; else if (strcasecmp(datestr,"feb") == 0) ret = 1; else if (strcasecmp(datestr,"mar") == 0) ret = 1; else if (strcasecmp(datestr,"apr") == 0) ret = 1; else if (strcasecmp(datestr,"may") == 0) ret = 1; else if (strcasecmp(datestr,"jun") == 0) ret = 1; else if (strcasecmp(datestr,"jul") == 0) ret = 1; else if (strcasecmp(datestr,"aug") == 0) ret = 1; else if (strcasecmp(datestr,"sep") == 0) ret = 1; else if (strcasecmp(datestr,"oct") == 0) ret = 1; else if (strcasecmp(datestr,"nov") == 0) ret = 1; else if (strcasecmp(datestr,"dec") == 0) ret = 1; else ret = 0; } else { if (strcasecmp(datestr,"january") == 0) ret = 1; else if (strcasecmp(datestr,"february") == 0) ret = 1; else if (strcasecmp(datestr,"march") == 0) ret = 1; else if (strcasecmp(datestr,"april") == 0) ret = 1; else if (strcasecmp(datestr,"june") == 0) ret = 1; else if (strcasecmp(datestr,"july") == 0) ret = 1; else if (strcasecmp(datestr,"august") == 0) ret = 1; else if (strcasecmp(datestr,"september") == 0) ret = 1; else if (strcasecmp(datestr,"october") == 0) ret = 1; else if (strcasecmp(datestr,"november") == 0) ret = 1; else if (strcasecmp(datestr,"december") == 0) ret = 1; else ret = 0; } return(ret);}static int is_ampm(char *datestr){int ret = 0; if (strcasecmp(datestr,"am") == 0) ret = 1; else if (strcasecmp(datestr,"pm") == 0) ret = 1; else ret = 0; return(ret);}static int is_alphabetic(char *datestr){char *s;int ret = 1; for (s = datestr; *s; s++) { if (!isalpha((unsigned char) *s)) ret = 0; } return(ret);}static int is_numeric(char *datestr){char *s;int ret = 1; for (s = datestr; *s; s++) { if (!isdigit((unsigned char) *s)) ret = 0; } return(ret);}static int is_timeformat(char *datestr){char *s;int ret = 1; for (s = datestr; *s; s++) { if (!isdigit((unsigned char) *s) && *s != ':' && *s != '.' ) break; } if ( *s ) { if (strcasecmp(s, "am" ) != 0 && strcasecmp(s, "pm" ) != 0 ) ret = 0; } return(ret);}static int store_year(int year , struct tds_time *t){ if ( year <= 0 ) return 0; if ( year < 100 ) { if (year > 49) t->tm_year = year; else t->tm_year = 100 + year ; return (1); } if ( year < 1753 ) return (0); if ( year <= 9999 ) { t->tm_year = year - 1900; return (1); } return (0);}static int store_mday(char *datestr , struct tds_time *t){int mday = 0; mday = atoi(datestr); if ( mday > 0 && mday < 32 ) { t->tm_mday = mday; return (1); } else return 0; }static int store_numeric_date(char *datestr , struct tds_time *t){int TDS_MONTH = 0;int TDS_DAY = 0;int TDS_YEAR = 0;int state;char last_char = 0; char *s;int month = 0, year = 0, mday = 0; /* Its YYYY-MM-DD format */ if ( strlen(datestr) == 10 && *(datestr + 4) == '-' && *(datestr + 7) == '-' ) { TDS_YEAR = 0; TDS_MONTH = 1; TDS_DAY = 2; state = TDS_YEAR; } /* else we assume MDY */ else { TDS_MONTH = 0; TDS_DAY = 1; TDS_YEAR = 2; state = TDS_MONTH; } for (s = datestr; *s; s++) { if (!isdigit((unsigned char) *s) && isdigit((unsigned char) last_char)) { state++; } else { if (state == TDS_MONTH) month = (month * 10) + (*s - '0'); if (state == TDS_DAY) mday = (mday * 10) + (*s - '0'); if (state == TDS_YEAR) year = (year * 10) + (*s - '0'); } last_char = *s; } if ( month > 0 && month < 13 ) t->tm_mon = month - 1; else return 0; if ( mday > 0 && mday < 32 ) t->tm_mday = mday; else return 0; return store_year(year, t);}static int store_monthname(char *datestr , struct tds_time *t){int ret = 0; if (strlen(datestr) == 3) { if (strcasecmp(datestr,"jan") == 0) t->tm_mon = 0; else if (strcasecmp(datestr,"feb") == 0) t->tm_mon = 1; else if (strcasecmp(datestr,"mar") == 0) t->tm_mon = 2; else if (strcasecmp(datestr,"apr") == 0) t->tm_mon = 3; else if (strcasecmp(datestr,"may") == 0) t->tm_mon = 4; else if (strcasecmp(datestr,"jun") == 0) t->tm_mon = 5; else if (strcasecmp(datestr,"jul") == 0) t->tm_mon = 6; else if (strcasecmp(datestr,"aug") == 0) t->tm_mon = 7; else if (strcasecmp(datestr,"sep") == 0) t->tm_mon = 8; else if (strcasecmp(datestr,"oct") == 0) t->tm_mon = 9; else if (strcasecmp(datestr,"nov") == 0) t->tm_mon = 10; else if (strcasecmp(datestr,"dec") == 0) t->tm_mon = 11; else ret = 0; } else { if (strcasecmp(datestr,"january") == 0) t->tm_mon = 0; else if (strcasecmp(datestr,"february") == 0) t->tm_mon = 1; else if (strcasecmp(datestr,"march") == 0) t->tm_mon = 2; else if (strcasecmp(datestr,"april") == 0) t->tm_mon = 3; else if (strcasecmp(datestr,"june") == 0) t->tm_mon = 5; else if (strcasecmp(datestr,"july") == 0) t->tm_mon = 6; else if (strcasecmp(datestr,"august") == 0) t->tm_mon = 7; else if (strcasecmp(datestr,"september") == 0) t->tm_mon = 8; else if (strcasecmp(datestr,"october") == 0) t->tm_mon = 9; else if (strcasecmp(datestr,"november") == 0) t->tm_mon = 10; else if (strcasecmp(datestr,"december") == 0) t->tm_mon = 11; else ret = 0; } return(ret);}static int store_yymmdd_date(char *datestr , struct tds_time *t){int month = 0, year = 0, mday = 0;int wholedate; wholedate = atoi(datestr); year = wholedate / 10000 ; month = ( wholedate - (year * 10000) ) / 100 ; mday = ( wholedate - (year * 10000) - (month * 100) ); if ( month > 0 && month < 13 ) t->tm_mon = month - 1; else return 0; if ( mday > 0 && mday < 32 ) t->tm_mday = mday; else return 0; return (store_year(year, t));}static int store_time(char *datestr , struct tds_time *t){enum {TDS_HOURS, TDS_MINUTES, TDS_SECONDS, TDS_FRACTIONS};int state = TDS_HOURS;char last_sep = '\0';char *s;int hours = 0, minutes = 0, seconds = 0, millisecs = 0;int ret = 1;int ms_len = 0; for (s = datestr; *s && strchr("apmAPM" , (int) *s) == (char *)NULL; s++) { if ( *s == ':' || *s == '.' ) { last_sep = *s; state++; } else switch(state) { case TDS_HOURS: hours = (hours * 10) + (*s - '0'); break; case TDS_MINUTES: minutes = (minutes * 10) + (*s - '0'); break; case TDS_SECONDS: seconds = (seconds * 10) + (*s - '0'); break; case TDS_FRACTIONS: millisecs = (millisecs * 10) + (*s - '0'); ms_len++; break; } } if (*s) { if(strcasecmp(s,"am") == 0) { if (hours == 12) hours = 0; t->tm_hour = hours; } if(strcasecmp(s,"pm") == 0) { if (hours == 0) ret = 0; if (hours > 0 && hours < 12) t->tm_hour = hours + 12; else t->tm_hour = hours; } } else { if (hours >= 0 && hours < 24 ) t->tm_hour = hours; else ret = 0; } if (minutes >= 0 && minutes < 60) t->tm_min = minutes; else ret = 0; if (seconds >= 0 && minutes < 60) t->tm_sec = seconds; else ret = 0; tdsdump_log(TDS_DBG_FUNC, "%L inside store_time() millisecs = %d\n", millisecs); if (millisecs) { if (millisecs >= 0 && millisecs < 1000 ) { if (last_sep == ':') t->tm_ms = millisecs; else { if (ms_len == 1 ) t->tm_ms = millisecs * 100; else if (ms_len == 2) t->tm_ms = millisecs * 10; else t->tm_ms = millisecs; } } else ret = 0; } return (ret);}static int store_hour(char *hour , char *ampm , struct tds_time *t){int ret = 1;int hours; hours = atoi(hour); if (hours >= 0 && hours < 24 ) { if(strcasecmp(ampm,"am") == 0) { if (hours == 12) hours = 0; t->tm_hour = hours; } if(strcasecmp(ampm,"pm") == 0) { if (hours == 0) ret = 0; if (hours > 0 && hours < 12) t->tm_hour = hours + 12; else t->tm_hour = hours; } } return (ret);}/** * Get same type but nullable * @param srctype type requires * @return nullable type */TDS_INT tds_get_null_type(int srctype){ switch(srctype) { case SYBCHAR: return SYBVARCHAR; break; case SYBINT1: case SYBINT2: case SYBINT4: case SYBINT8: return SYBINTN; break; case SYBREAL: case SYBFLT8: return SYBFLTN; break; case SYBDATETIME: case SYBDATETIME4: return SYBDATETIMN; break; case SYBBIT: return SYBBITN; break; default: return srctype; }#ifndef NCBI_FTDS return srctype;#endif} /** * format a date string according to an "extended" strftime formatting definition. * @param buf output buffer * @param maxsize size of buffer in bytes (space include terminator) * @param format format string similar to strftime. %z for milliseconds * @param dr date to convert * @return length of string returned, 0 for error */ size_t tds_strftime(char *buf, size_t maxsize, const char *format, const TDSDATEREC *dr){ struct tm tm; int length
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -