⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convert.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 5 页
字号:
   * 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 + -