📄 int_misc.c
字号:
ymd = Index2Date((((int) sec) / (3600*24)) + Date2Index(19700101)); sec -= (((int) sec) / (3600*24))*3600*24; h = ((int) sec)/3600; sec -= h*3600; mn = ((int) sec)/60; sec -= mn*60; s = ((int) sec); hms = h*10000+mn*100+s; lv = TNewListv(); AppendFloat2Listv(lv,ymd); AppendFloat2Listv(lv,hms); SetResultValue((VALUE) lv); return; } // time s2hms if (!strcmp(action,"s2hms")) { argv = ParseArgv(argv,tFLOAT,&sec,0); h = ((int) sec)/3600; sec -= h*3600; mn = ((int) sec)/60; sec -= mn*60; lv = TNewListv(); AppendFloat2Listv(lv,h); AppendFloat2Listv(lv,mn); AppendFloat2Listv(lv,sec); SetResultValue((VALUE) lv); return; } // time date if (!strcmp(action,"current")) { flagDate = NO; flagListv = NO; flagGMT = NO; while(opt = ParseOption(&argv)) { switch(opt) { case 'd': flagDate = YES; break; case 'g': flagGMT = YES; break; case 'l': flagListv = YES; break; default : ErrorOption(opt); } } NoMoreArgs(argv); GetCurrentDate(&d,&m,&y,&h,&mn,&s,flagGMT); if (flagDate) { if (flagListv) { lv = TNewListv(); AppendInt2Listv(lv,d); AppendInt2Listv(lv,m); AppendInt2Listv(lv,y); AppendInt2Listv(lv,h); AppendInt2Listv(lv,mn); AppendInt2Listv(lv,s); NoMoreArgs(argv); SetResultValue(lv); return; } else { lv = TNewListv(); AppendFloat2Listv(lv,YYYYMMDD(y,m,d)); AppendFloat2Listv(lv,h*10000+mn*100+s); SetResultValue(lv); return; } } else { if (flagListv) { lv = TNewListv(); AppendInt2Listv(lv,h); AppendInt2Listv(lv,mn); AppendInt2Listv(lv,s); NoMoreArgs(argv); SetResultValue(lv); return; } else { SetResultFloat(h*10000+mn*100+s); return; } } return; } Errorf("Unknown action '%s'",action);} /* Test for bissextile years */static char IsBissextile(int n){ if ((n % 400 == 0) || (n % 4 == 0) && (!(n % 100 == 0))) return(YES); else return(NO);}// Returns the year from format YYYYMMDDint YYYY(int yymmdd){ int dd,mm; dd = yymmdd % 100; mm = (yymmdd-dd) % 10000; return ((yymmdd-mm-dd)/10000);}// Returns the month from format YYYYMMDDint MM(int yymmdd){ int dd; dd = yymmdd % 100; return (((yymmdd-dd) % 10000)/100);}// Returns the day from format YYYYMMDDint DD(int yymmdd){ return((yymmdd % 100));}// Returns the date index (i.e., number of days since 1/01/1900)#define YEAR_ORIGIN 1900int Date2Index(int yymmdd){ int yy = YYYY(yymmdd); int mm = MM(yymmdd); int dd = DD(yymmdd); int nb,i; char flagB; if (yy < YEAR_ORIGIN) Errorf("Date2Index: The year must be after (or equal to) YEAR_ORIGIN"); nb=0; for(i=YEAR_ORIGIN;i<yy;++i) { if (IsBissextile(i)) nb += 366; else nb += 365; } flagB = IsBissextile(yy); for(i=1;i<mm;++i) switch(i) { case 1: case 3: case 5: case 7: case 8: case 10: nb += 31; break; case 2: if (flagB) nb+= 29; else nb += 28; break; case 4: case 6: case 9: case 11: nb += 30; break; } nb += dd; return(nb);}// Returns the date under format YYYYMMDDint YYYYMMDD(int yy, int mm, int dd){ return(yy*10000+mm*100+dd);}// Inverse function of the previous oneint Index2Date(LWFLOAT ndays1){ int ndays = (int) ndays1; int yy=YEAR_ORIGIN,mm=1,dd=1; if (ndays != ndays1) Errorf("Index2Date() : index is a float (%g)\n",ndays1); if (ndays < 0) Errorf("Index2Date: The year must be after TimeOrigin"); while (Date2Index(YYYYMMDD(yy,1,1)) <= ndays) yy++; yy -= 1; while ((Date2Index(YYYYMMDD(yy,mm,1)) <= ndays) && (mm <= 12)) mm++; if (mm > 1) mm -= 1; else mm = 1; while ((Date2Index(YYYYMMDD(yy,mm,dd)) <= ndays) && (dd <= 31)) dd++; if (dd > 1) dd -= 1; else dd = 1; return(YYYYMMDD(yy,mm,dd));}// Get the week day number from index#define DATEREF 20040326#define DAYREF 5int Index2Day(LWFLOAT ndays1){ static int base = -1; int ndays = (int) ndays1; if (ndays != ndays1) Errorf("Index2Day() : index is a float (%g)\n",ndays1); if (base == -1) base = ((DAYREF-1) - Date2Index(DATEREF)) % 7; return (((ndays + base) %7) + 1);}// Check if a date is a valid YYYYMMDD datechar IsValidYYYYMMDD(int yyyymmdd){ int dd,mm,yyyy; dd = yyyymmdd % 100; mm = (yyyymmdd-dd) % 10000; yyyy = (yyyymmdd-mm-dd)/10000; mm /= 100; if (mm<1 || mm>12) return(NO); if (dd<1) return(NO); switch (mm) { case 1 : if (dd>31) return(NO); break; case 2 : if (dd>29) return(NO); if (!((yyyy % 400 == 0) || (yyyy % 4 == 0) && (!(yyyy % 100 == 0))) && dd==29) return(NO); break; case 3 : if (dd>31) return(NO); break; case 4 : if (dd>30) return(NO); break; case 5 : if (dd>31) return(NO); break; case 6 : if (dd>30) return(NO); break; case 7 : if (dd>31) return(NO); break; case 8 : if (dd>31) return(NO); break; case 9 : if (dd>30) return(NO); break; case 10 : if (dd>31) return(NO); break; case 11 : if (dd>30) return(NO); break; case 12 : if (dd>31) return(NO); break; } return(YES);}// Corresponding commandvoid C_Date(char **argv){ LISTV lv; int d,m,y,h,mn,s,date,index; char *action,opt; int flagGMT,flagListv; argv = ParseArgv(argv,tWORD,&action,-1); // date current if (!strcmp(action,"current")) { flagGMT = NO; flagListv = NO; while(opt = ParseOption(&argv)) { switch(opt) { case 'l': flagListv = YES; break; case 'g': flagGMT = YES; break; default : ErrorOption(opt); } } NoMoreArgs(argv); GetCurrentDate(&d,&m,&y,&h,&mn,&s,flagGMT); if (flagListv) { lv = TNewListv(); AppendInt2Listv(lv,d); AppendInt2Listv(lv,m); AppendInt2Listv(lv,y); NoMoreArgs(argv); SetResultValue(lv); return; } SetResultFloat(y*10000+m*100+d); return; } // date 2index if (!strcmp(action,"2index")) { argv = ParseArgv(argv,tINT,&date,0); if (!IsValidYYYYMMDD(date)) Errorf("Invalid date yyyymmdd '%d'",date); SetResultInt(Date2Index(date)); return; } // date index2 if (!strcmp(action,"index2")) { argv = ParseArgv(argv,tINT,&index,0); SetResultInt(Index2Date(index)); return; } // date day if (!strcmp(action,"day")) { argv = ParseArgv(argv,tINT,&index,0); SetResultInt(Index2Day(index)); return; } Errorf("Unknown action '%s'",action);} /************************************************** * * Functions that deal with little/big endian * **************************************************//* Test whether we are running on big endian or little endian and set the corresponding variable */char cpuBinaryMode;void InitCPUBinaryMode(void) { short unsigned int i; char *c; i = 1; c = (char *) (&i); if (*c == 0) cpuBinaryMode = BinaryBigEndian; else cpuBinaryMode = BinaryLittleEndian;} /* * Function to convert a Big (resp. Little) Endian array of values to a Little (resp. Big) array of values * * array : is the array of values * n : the number of values * sizeval : the number of bytes of each value */void BigLittleValues(void *array, int n, size_t sizeval){ size_t i; int j; unsigned char c; unsigned char *pvar; for (j=0;j<n*sizeval;j+=sizeval) { pvar = ((unsigned char *) array) + j; for(i=0;i<sizeval/2;i++) { c = *(pvar+i); *(pvar+i) = *(pvar+sizeval-1-i); *(pvar+sizeval-1-i) = c; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -