home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TCL228 / TCL228.lzh / DLLSRC.lzh / format.c < prev    next >
C/C++ Source or Header  |  1999-09-18  |  12KB  |  549 lines

  1. //---[s]--- For InternetTime 99/03/16@211 M.Takemura -----
  2.  
  3. /*-----------------------------------------------------
  4.     format.c
  5.     to make a string to display in the clock
  6.     KAZUBON 1997-1998
  7. -------------------------------------------------------*/
  8.  
  9. #include "tcdll.h"
  10.  
  11. int codepage = CP_ACP;
  12. static char DayOfWeekShort[11], DayOfWeekLong[31];
  13. static char MonthShort[11], MonthLong[31];
  14. static char *DayOfWeekEng[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
  15. static char *MonthEng[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  16.     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
  17. static char AM[11], PM[11], SDate[5], STime[5];
  18. static char EraStr[11];
  19. static int AltYear;
  20.  
  21. extern BOOL bHour12, bHourZero;
  22.  
  23. /*------------------------------------------------
  24.   GetLocaleInfo() for 95/NT
  25. --------------------------------------------------*/
  26. int GetLocaleInfoWA(WORD wLanguageID, LCTYPE LCType, char* dst, int n)
  27. {
  28.     int r;
  29.     LCID Locale;
  30.     
  31.     *dst = 0;
  32.     Locale = MAKELCID(wLanguageID, SORT_DEFAULT);
  33.     if(GetVersion() & 0x80000000) // 95
  34.         r = GetLocaleInfoA(Locale, LCType, dst, n);
  35.     else  // NT
  36.     {
  37.         WCHAR* pw;
  38.         pw = (WCHAR*)GlobalAllocPtr(GHND, sizeof(WCHAR)*(n+1));
  39.         *pw = 0;
  40.         r = GetLocaleInfoW(Locale, LCType, pw, n);
  41.         if(r)
  42.             WideCharToMultiByte(codepage, 0, pw, -1, dst, n,
  43.                 NULL, NULL);
  44.         GlobalFreePtr(pw);
  45.     }
  46.     return r;
  47. }
  48.  
  49. /*------------------------------------------------
  50.   GetDateFormat() for 95/NT
  51. --------------------------------------------------*/
  52. int GetDateFormatWA(WORD wLanguageID, DWORD dwFlags, CONST SYSTEMTIME *t,
  53.     char* fmt, char* dst, int n)
  54. {
  55.     int r;
  56.     LCID Locale;
  57.     
  58.     *dst = 0;
  59.     Locale = MAKELCID(wLanguageID, SORT_DEFAULT);
  60.     if(GetVersion() & 0x80000000) // 95
  61.         r = GetDateFormatA(Locale, dwFlags, t, fmt, dst, n);
  62.     
  63.     else  // NT
  64.     {
  65.         WCHAR* pw1, *pw2;
  66.         pw1 = NULL;
  67.         if(fmt)
  68.         {
  69.             pw1 = (WCHAR*)GlobalAllocPtr(GHND,
  70.                 sizeof(WCHAR)*(strlen(fmt)+1));
  71.             MultiByteToWideChar(CP_ACP, 0, fmt, -1,
  72.                 pw1, strlen(fmt));
  73.         }
  74.         pw2 = (WCHAR*)GlobalAllocPtr(GHND, sizeof(WCHAR)*(n+1));
  75.         r = GetDateFormatW(Locale, dwFlags, t, pw1, pw2, n);
  76.         if(r)
  77.             WideCharToMultiByte(CP_ACP, 0, pw2, -1, dst, n,
  78.                 NULL, NULL);
  79.         if(pw1) GlobalFreePtr(pw1);
  80.         GlobalFreePtr(pw2);
  81.     }
  82.     return r;
  83. }
  84.  
  85. /*------------------------------------------------
  86.   GetTimeFormat() for 95/NT
  87. --------------------------------------------------*/
  88. int GetTimeFormatWA(WORD wLanguageID, DWORD dwFlags, CONST SYSTEMTIME *t,
  89.     char* fmt, char* dst, int n)
  90. {
  91.     int r;
  92.     LCID Locale;
  93.     
  94.     *dst = 0;
  95.     Locale = MAKELCID(wLanguageID, SORT_DEFAULT);
  96.     if(GetVersion() & 0x80000000) // 95
  97.         r = GetTimeFormatA(Locale, dwFlags, t, fmt, dst, n);
  98.     
  99.     else  // NT
  100.     {
  101.         WCHAR* pw1, *pw2;
  102.         pw1 = NULL;
  103.         if(fmt)
  104.         {
  105.             pw1 = (WCHAR*)GlobalAllocPtr(GHND,
  106.                 sizeof(WCHAR)*(strlen(fmt)+1));
  107.             MultiByteToWideChar(CP_ACP, 0, fmt, -1,
  108.                 pw1, strlen(fmt));
  109.         }
  110.         pw2 = (WCHAR*)GlobalAllocPtr(GHND, sizeof(WCHAR)*(n+1));
  111.         r = GetTimeFormatW(Locale, dwFlags, t, pw1, pw2, n);
  112.         if(r)
  113.             WideCharToMultiByte(CP_ACP, 0, pw2, -1, dst, n,
  114.                 NULL, NULL);
  115.         if(pw1) GlobalFreePtr(pw1);
  116.         GlobalFreePtr(pw2);
  117.     }
  118.     return r;
  119. }
  120.  
  121. /*------------------------------------------------
  122.   load strings of day, month
  123. --------------------------------------------------*/
  124. void InitFormat(SYSTEMTIME* lt)
  125. {
  126.     char s[80], *p;
  127.     int i, ilang, ioptcal;
  128.     
  129.     ilang = GetMyRegLong(NULL, "Locale", (int)GetUserDefaultLangID());
  130.     
  131.     codepage = CP_ACP;
  132.     if(GetLocaleInfoWA((WORD)ilang, LOCALE_IDEFAULTANSICODEPAGE,
  133.         s, 10) > 0)
  134.     {
  135.         p = s; codepage = 0;
  136.         while('0' <= *p && *p <= '9')
  137.             codepage = codepage * 10 + *p++ - '0';
  138.         if(!IsValidCodePage(codepage)) codepage = CP_ACP;
  139.     }
  140.     
  141.     i = lt->wDayOfWeek; i--; if(i < 0) i = 6;
  142.     GetLocaleInfoWA((WORD)ilang, LOCALE_SABBREVDAYNAME1 + i,
  143.         DayOfWeekShort, 10);
  144.     GetLocaleInfoWA((WORD)ilang, LOCALE_SDAYNAME1 + i,
  145.         DayOfWeekLong, 30);
  146.     i = lt->wMonth; i--;
  147.     GetLocaleInfoWA((WORD)ilang, LOCALE_SABBREVMONTHNAME1 + i,
  148.         MonthShort, 10);
  149.     GetLocaleInfoWA((WORD)ilang, LOCALE_SMONTHNAME1 + i,
  150.         MonthLong, 30);
  151.     
  152.     GetLocaleInfoWA((WORD)ilang, LOCALE_S1159, AM, 10);
  153.     GetMyRegStr(NULL, "AMsymbol", s, 80, AM);
  154.     if(s[0] == 0) strcpy(s, "AM");
  155.     strcpy(AM, s);
  156.     GetLocaleInfoWA((WORD)ilang, LOCALE_S2359, PM, 10);
  157.     GetMyRegStr(NULL, "PMsymbol", s, 80, PM);
  158.     if(s[0] == 0) strcpy(s, "PM");
  159.     strcpy(PM, s);
  160.     
  161.     GetLocaleInfoWA((WORD)ilang, LOCALE_SDATE, SDate, 4);
  162.     GetLocaleInfoWA((WORD)ilang, LOCALE_STIME, STime, 4);
  163.     
  164.     EraStr[0] = 0;
  165.     AltYear = -1;
  166.     
  167.     ioptcal = 0;
  168.     if(GetLocaleInfoWA((WORD)ilang, LOCALE_IOPTIONALCALENDAR,
  169.         s, 10))
  170.     {
  171.         ioptcal = 0;
  172.         p = s;
  173.         while('0' <= *p && *p <= '9')
  174.             ioptcal = ioptcal * 10 + *p++ - '0';
  175.     }
  176.     if(ioptcal < 3) ilang = LANG_USER_DEFAULT;
  177.     
  178.     if(GetDateFormatWA((WORD)ilang,
  179.         DATE_USE_ALT_CALENDAR, lt, "gg", s, 12) != 0);
  180.         strcpy(EraStr, s);
  181.     
  182.     if(GetDateFormatWA((WORD)ilang,
  183.         DATE_USE_ALT_CALENDAR, lt, "yyyy", s, 6) != 0)
  184.     {
  185.         if(s[0])
  186.         {
  187.             p = s;
  188.             AltYear = 0;
  189.             while('0' <= *p && *p <= '9')
  190.                 AltYear = AltYear * 10 + *p++ - '0';
  191.         }
  192.     }
  193. }
  194.  
  195. /*------------------------------------------------
  196.    make a string from date and time format
  197. --------------------------------------------------*/
  198. void MakeFormat(char* s, SYSTEMTIME* pt, int beat100, char* fmt)
  199. {
  200.     char *sp, *dp, *p;
  201.     
  202.     sp = fmt; dp = s;
  203.     while(*sp)
  204.     {
  205.         if(*sp == '\"')
  206.         {
  207.             sp++;
  208.             while(*sp != '\"' && *sp)
  209.             {
  210.                 p = CharNext(sp);
  211.                 while(sp != p) *dp++ = *sp++;
  212.             }
  213.             if(*sp == '\"') sp++;
  214.         }
  215.         else if(*sp == '/')
  216.         {
  217.             p = SDate; while(*p) *dp++ = *p++;
  218.             sp++;
  219.         }
  220.         else if(*sp == ':')
  221.         {
  222.             p = STime; while(*p) *dp++ = *p++;
  223.             sp++;
  224.         }
  225.         else if(*sp == 'y' && *(sp + 1) == 'y')
  226.         {
  227.             if(*(sp + 2) == 'y' && *(sp + 3) == 'y')
  228.             {
  229.                 *dp++ = (char)((int)pt->wYear / 1000) + '0';
  230.                 *dp++ = (char)(((int)pt->wYear % 1000) / 100) + '0';
  231.                 sp += 2;
  232.             }
  233.             *dp++ = (char)(((int)pt->wYear % 100) / 10) + '0';
  234.             *dp++ = (char)((int)pt->wYear % 10) + '0';
  235.             sp += 2;
  236.         }
  237.         else if(*sp == 'm')
  238.         {
  239.             if(*(sp + 1) == 'm' && *(sp + 2) == 'e')
  240.             {
  241.                 *dp++ = MonthEng[pt->wMonth-1][0];
  242.                 *dp++ = MonthEng[pt->wMonth-1][1];
  243.                 *dp++ = MonthEng[pt->wMonth-1][2];
  244.                 sp += 3;
  245.             }
  246.             else if(*(sp + 1) == 'm' && *(sp + 2) == 'm')
  247.             {
  248.                 if(*(sp + 3) == 'm')
  249.                 {
  250.                     p = MonthLong;
  251.                     while(*p) *dp++ = *p++;
  252.                     sp += 4;
  253.                 }
  254.                 else
  255.                 {
  256.                     p = MonthShort;
  257.                     while(*p) *dp++ = *p++;
  258.                     sp += 3;
  259.                 }
  260.             }
  261.             else
  262.             {
  263.                 if(*(sp + 1) == 'm')
  264.                 {
  265.                     *dp++ = (char)((int)pt->wMonth / 10) + '0';
  266.                     sp += 2;
  267.                 }
  268.                 else
  269.                 {
  270.                     if(pt->wMonth > 9)
  271.                         *dp++ = (char)((int)pt->wMonth / 10) + '0';
  272.                     sp++;
  273.                 }
  274.                 *dp++ = (char)((int)pt->wMonth % 10) + '0';
  275.             }
  276.         }
  277.         else if(*sp == 'a' && *(sp + 1) == 'a' && *(sp + 2) == 'a')
  278.         {
  279.             if(*(sp + 3) == 'a')
  280.             {
  281.                 p = DayOfWeekLong;
  282.                 while(*p) *dp++ = *p++;
  283.                 sp += 4;
  284.             }
  285.             else
  286.             {
  287.                 p = DayOfWeekShort;
  288.                 while(*p) *dp++ = *p++;
  289.                 sp += 3;
  290.             }
  291.         }
  292.         else if(*sp == 'd')
  293.         {
  294.             if(*(sp + 1) == 'd' && *(sp + 2) == 'e')
  295.             {
  296.                 p = DayOfWeekEng[pt->wDayOfWeek];
  297.                 while(*p) *dp++ = *p++;
  298.                 sp += 3;
  299.             }
  300.             else if(*(sp + 1) == 'd' && *(sp + 2) == 'd')
  301.             {
  302.                 if(*(sp + 3) == 'd')
  303.                 {
  304.                     p = DayOfWeekLong;
  305.                     while(*p) *dp++ = *p++;
  306.                     sp += 4;
  307.                 }
  308.                 else
  309.                 {
  310.                     p = DayOfWeekShort;
  311.                     while(*p) *dp++ = *p++;
  312.                     sp += 3;
  313.                 }
  314.             }
  315.             else
  316.             {
  317.                 if(*(sp + 1) == 'd')
  318.                 {
  319.                     *dp++ = (char)((int)pt->wDay / 10) + '0';
  320.                     sp += 2;
  321.                 }
  322.                 else
  323.                 {
  324.                     if(pt->wDay > 9)
  325.                         *dp++ = (char)((int)pt->wDay / 10) + '0';
  326.                     sp++;
  327.                 }
  328.                 *dp++ = (char)((int)pt->wDay % 10) + '0';
  329.             }
  330.         }
  331.         else if(*sp == 'h')
  332.         {
  333.             int hour;
  334.             hour = pt->wHour;
  335.             if(bHour12)
  336.             {
  337.                 if(hour > 12) hour -= 12;
  338.                 else if(hour == 0) hour = 12;
  339.                 if(hour == 12 && bHourZero) hour = 0;
  340.             }
  341.             if(*(sp + 1) == 'h')
  342.             {
  343.                 *dp++ = (char)(hour / 10) + '0';
  344.                 sp += 2;
  345.             }
  346.             else
  347.             {
  348.                 if(hour > 9)
  349.                     *dp++ = (char)(hour / 10) + '0';
  350.                 sp++;
  351.             }
  352.             *dp++ = (char)(hour % 10) + '0';
  353.         }
  354.         else if(*sp == 'n')
  355.         {
  356.             if(*(sp + 1) == 'n')
  357.             {
  358.                 *dp++ = (char)((int)pt->wMinute / 10) + '0';
  359.                 sp += 2;
  360.             }
  361.             else
  362.             {
  363.                 if(pt->wMinute > 9)
  364.                     *dp++ = (char)((int)pt->wMinute / 10) + '0';
  365.                 sp++;
  366.             }
  367.             *dp++ = (char)((int)pt->wMinute % 10) + '0';
  368.         }
  369.         else if(*sp == 's')
  370.         {
  371.             if(*(sp + 1) == 's')
  372.             {
  373.                 *dp++ = (char)((int)pt->wSecond / 10) + '0';
  374.                 sp += 2;
  375.             }
  376.             else
  377.             {
  378.                 if(pt->wSecond > 9)
  379.                     *dp++ = (char)((int)pt->wSecond / 10) + '0';
  380.                 sp++;
  381.             }
  382.             *dp++ = (char)((int)pt->wSecond % 10) + '0';
  383.         }
  384.         else if(*sp == 't' && *(sp + 1) == 't')
  385.         {
  386.             if(pt->wHour < 12) p = AM; else p = PM;
  387.             while(*p) *dp++ = *p++;
  388.             sp += 2;
  389.         }
  390.         else if(*sp == 'A' && *(sp + 1) == 'M')
  391.         {
  392.             if(*(sp + 2) == '/' &&
  393.                 *(sp + 3) == 'P' && *(sp + 4) == 'M')
  394.             {
  395.                 if(pt->wHour < 12) *dp++ = 'A';
  396.                 else *dp++ = 'P';
  397.                 *dp++ = 'M'; sp += 5;
  398.             }
  399.             else if(*(sp + 2) == 'P' && *(sp + 3) == 'M')
  400.             {
  401.                 if(pt->wHour < 12) p = AM; else p = PM;
  402.                 while(*p) *dp++ = *p++;
  403.                 sp += 4;
  404.             }
  405.         }
  406.         else if(*sp == 'a' && *(sp + 1) == 'm' && *(sp + 2) == '/' &&
  407.             *(sp + 3) == 'p' && *(sp + 4) == 'm')
  408.         {
  409.             if(pt->wHour < 12) *dp++ = 'a';
  410.             else *dp++ = 'p';
  411.             *dp++ = 'm'; sp += 5;
  412.         }
  413.         else if(*sp == '\\' && *(sp + 1) == 'n')
  414.         {
  415.             *dp++ = 0x0d; *dp++ = 0x0a;
  416.             sp += 2;
  417.         }
  418.         // internet time
  419.         else if (*sp == '@' && *(sp + 1) == '@' && *(sp + 2) == '@')
  420.         {
  421.             *dp++ = '@';
  422.             *dp++ = beat100 / 10000 + '0';
  423.             *dp++ = (beat100 % 10000) / 1000 + '0';
  424.             *dp++ = (beat100 % 1000) / 100 + '0';
  425.             sp += 3;
  426.             if(*sp == '.' && *(sp + 1) == '@')
  427.             {
  428.                 *dp++ = '.';
  429.                 *dp++ = (beat100 % 100) / 10 + '0';
  430.                 sp += 2;
  431.             }
  432.         }
  433.         // alternate calendar
  434.         else if(*sp == 'Y' && AltYear > -1)
  435.         {
  436.             int n = 1;
  437.             while(*sp == 'Y') { n *= 10; sp++; }
  438.             if(n < AltYear)
  439.             {
  440.                 n = 1; while(n < AltYear) n *= 10;
  441.             }
  442.             while(1)
  443.             {
  444.                 *dp++ = (AltYear % n) / (n/10) + '0';
  445.                 if(n == 10) break;
  446.                 n /= 10;
  447.             }
  448.         }
  449.         else if(*sp == 'g')
  450.         {
  451.             char *p2;
  452.             p = EraStr;
  453.             while(*p && *sp == 'g')
  454.             {
  455.                 p2 = CharNextExA((WORD)codepage, p, 0);
  456.                 while(p != p2) *dp++ = *p++;
  457.                 sp++;
  458.             }
  459.             while(*sp == 'g') sp++;
  460.         }
  461.         else if(_strncmp(sp, "LDATE", 5) == 0)
  462.         {
  463.             char s[80], *p;
  464.             GetDateFormatWA(MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
  465.                 DATE_LONGDATE, pt, NULL, s, 80);
  466.             p = s;
  467.             while(*p) *dp++ = *p++;
  468.             sp += 5;
  469.         }
  470.         else if(_strncmp(sp, "DATE", 4) == 0)
  471.         {
  472.             char s[80], *p;
  473.             GetDateFormatWA(MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
  474.                 DATE_SHORTDATE, pt, NULL, s, 80);
  475.             p = s;
  476.             while(*p) *dp++ = *p++;
  477.             sp += 4;
  478.         }
  479.         else if(_strncmp(sp, "TIME", 4) == 0)
  480.         {
  481.             char s[80], *p;
  482.             GetTimeFormatWA(MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
  483.                 TIME_FORCE24HOURFORMAT, pt, NULL, s, 80);
  484.             p = s;
  485.             while(*p) *dp++ = *p++;
  486.             sp += 4;
  487.         }
  488.         else
  489.         {
  490.             p = CharNext(sp);
  491.             while(sp != p) *dp++ = *sp++;
  492.         }
  493.     }
  494.     *dp = 0;
  495. }
  496.  
  497. /*------------------------------------------------
  498.   need to display second?
  499. --------------------------------------------------*/
  500. BOOL IsDispSecond(char* fmt)
  501. {
  502.     char *sp;
  503.     
  504.     sp = fmt;
  505.     while(*sp)
  506.     {
  507.         if(*sp == '\"')
  508.         {
  509.             sp++;
  510.             while(*sp != '\"' && *sp) sp++;
  511.             if(*sp == '\"') sp++;
  512.         }
  513.         else if(*sp == 's')
  514.         {
  515.             return TRUE;
  516.         }
  517.         else sp = CharNext(sp);
  518.     }
  519.     return FALSE;
  520. }
  521.  
  522. /*------------------------------------------------
  523.   need to display beats?
  524. --------------------------------------------------*/
  525. int IsDispBeat(char* fmt)
  526. {
  527.     char *sp;
  528.     
  529.     sp = fmt;
  530.     while(*sp)
  531.     {
  532.         if(*sp == '\"')
  533.         {
  534.             sp++;
  535.             while(*sp != '\"' && *sp) sp++;
  536.             if(*sp == '\"') sp++;
  537.         }
  538.         else if (*sp == '@' && *(sp + 1) == '@' && *(sp + 2) == '@')
  539.         {
  540.             sp += 3;
  541.             if(*sp == '.' && *(sp + 1) == '@')
  542.                 return 2;
  543.             return 1;
  544.         }
  545.         else sp = CharNext(sp);
  546.     }
  547.     return 0;
  548. }
  549.