FreeBASIC  0.91.0
drv_intl_getdateformat.c
Go to the documentation of this file.
1 /* get localized short DATE format */
2 
3 #include "../fb.h"
4 #include <langinfo.h>
5 
6 int fb_DrvIntlGetDateFormat( 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( D_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 'a':
42  pszAdd = "ddd";
43  add_len = 3;
44  break;
45  case 'A':
46  pszAdd = "dddd";
47  add_len = 4;
48  break;
49  case 'h':
50  case 'b':
51  pszAdd = "mmm";
52  add_len = 3;
53  break;
54  case 'B':
55  pszAdd = "mmmm";
56  add_len = 4;
57  break;
58  case 'd':
59  case 'e':
60  pszAdd = "dd";
61  add_len = 2;
62  break;
63  case 'F':
64  pszAdd = "yyyy-MM-dd";
65  add_len = 10;
66  break;
67  case 'm':
68  pszAdd = "MM";
69  add_len = 2;
70  break;
71  case 'D':
72  case 'x':
73  pszAdd = "MM/dd/yyyy";
74  add_len = 10;
75  break;
76  case 'y':
77  pszAdd = "yy";
78  add_len = 2;
79  break;
80  case 'Y':
81  pszAdd = "yyyy";
82  add_len = 4;
83  break;
84  default:
85  /* Unsupported format */
86  succeeded = FALSE;
87  break;
88  }
89  if( !succeeded )
90  break;
91  } else {
92  switch (ch) {
93  case '%':
94  do_fmt = TRUE;
95  break;
96  case '\\':
97  do_esc = TRUE;
98  break;
99  default:
100  achAddBuffer[0] = ch;
101  pszAdd = achAddBuffer;
102  add_len = 1;
103  break;
104  }
105  }
106  if( add_len!=0 ) {
107  if( remaining < add_len ) {
108  return FALSE;
109  }
110  strcpy( pszOutput, pszAdd );
111  pszOutput += add_len;
112  remaining -= add_len;
113  add_len = 0;
114  }
115  ++pszCurrent;
116  }
117 
118  return TRUE;
119 }