FreeBASIC  0.91.0
drv_intl_gettimeformat.c
Go to the documentation of this file.
1 /* get localized short TIME format */
2 
3 #include "../fb.h"
4 #include <langinfo.h>
5 
6 int fb_DrvIntlGetTimeFormat( char *buffer, size_t len )
7 {
8  int do_esc = FALSE, do_fmt = FALSE;
9  char *pszOutput = buffer;
10  char achAddBuffer[2] = { 0 };
11  const char *pszAdd = NULL;
12  size_t remaining = len - 1, add_len = 0;
13  const char *pszCurrent = nl_langinfo( T_FMT );
14 
15  DBG_ASSERT(buffer!=NULL);
16 
17  while ( *pszCurrent!=0 ) {
18  char ch = *pszCurrent;
19  if( do_esc ) {
20  do_esc = FALSE;
21  achAddBuffer[0] = ch;
22  pszAdd = achAddBuffer;
23  add_len = 1;
24  } else if ( do_fmt ) {
25  int succeeded = TRUE;
26  do_fmt = FALSE;
27  switch (ch) {
28  case 'n':
29  pszAdd = "\n";
30  add_len = 1;
31  break;
32  case 't':
33  pszAdd = "\t";
34  add_len = 1;
35  break;
36  case '%':
37  pszAdd = "%";
38  add_len = 1;
39  break;
40 
41  case 'H':
42  pszAdd = "HH";
43  add_len = 2;
44  break;
45  case 'I':
46  pszAdd = "hh";
47  add_len = 2;
48  break;
49  case 'p':
50  pszAdd = "tt";
51  add_len = 2;
52  break;
53  case 'r':
54  pszAdd = "hh:mm:ss tt";
55  add_len = 11;
56  break;
57  case 'R':
58  pszAdd = "HH:mm";
59  add_len = 5;
60  break;
61  case 'S':
62  pszAdd = "ss";
63  add_len = 2;
64  break;
65  case 'T':
66  case 'X':
67  pszAdd = "HH:mm:ss";
68  add_len = 8;
69  break;
70  default:
71  /* Unsupported format */
72  succeeded = FALSE;
73  break;
74  }
75  if( !succeeded )
76  break;
77  } else {
78  switch (ch) {
79  case '%':
80  do_fmt = TRUE;
81  break;
82  case '\\':
83  do_esc = TRUE;
84  break;
85  default:
86  achAddBuffer[0] = ch;
87  pszAdd = achAddBuffer;
88  add_len = 1;
89  break;
90  }
91  }
92  if( add_len!=0 ) {
93  if( remaining < add_len ) {
94  return FALSE;
95  }
96  strcpy( pszOutput, pszAdd );
97  pszOutput += add_len;
98  remaining -= add_len;
99  add_len = 0;
100  }
101  ++pszCurrent;
102  }
103 
104  return TRUE;
105 }