FreeBASIC  0.91.0
time_parsetime.c
Go to the documentation of this file.
1 /* parse a string time */
2 
3 #include "fb.h"
4 #include <ctype.h>
5 
6 /*:::::*/
7 static int fb_hCheckAMPM( const char *text, size_t *pLength )
8 {
9  const char *text_start = text;
10  int result = 0;
11 
12  /* skip WS */
13  while ( isspace( *text ) )
14  ++text;
15 
16  switch( *text ) {
17  case 'a':
18  case 'A':
19  result = 1;
20  ++text;
21  break;
22  case 'p':
23  case 'P':
24  result = 2;
25  ++text;
26  break;
27  }
28  if( result!=0 ) {
29  char ch = *text;
30  if( ch==0 ) {
31  // ignore
32  } else if( ch=='m' || ch=='M' ) {
33  // everything's fine
34  ++text;
35  } else {
36  result = 0;
37  }
38  }
39  if( result!=0 ) {
40  if( isalpha( *text ) )
41  result = 0;
42  }
43  if( result!=0 ) {
44  /* skip WS */
45  while ( isspace( *text ) )
46  ++text;
47  if( pLength )
48  *pLength = text - text_start;
49  }
50  return result;
51 }
52 
53 /*:::::*/
54 int fb_hTimeParse( const char *text, size_t text_len, int *pHour, int *pMinute, int *pSecond, size_t *pLength )
55 {
56  size_t length = 0;
57  const char *text_start = text;
58  int am_pm = 0;
59  int result = FALSE;
60  int hour = 0, minute = 0, second = 0;
61  char *endptr;
62 
63  hour = strtol( text, &endptr, 10 );
64  if( hour >= 0 && hour < 24 && endptr!=text) {
65  int is_ampm_hour = ( hour >= 1 && hour <= 12 );
66  /* skip white spaces */
67  text = endptr;
68  while ( isspace( *text ) )
69  ++text;
70  if( *text==':' ) {
71  ++text;
72  minute = strtol( text, &endptr, 10 );
73  if( minute >= 0 && minute < 60 && endptr!=text ) {
74  text = endptr;
75  while ( isspace( *text ) )
76  ++text;
77 
78  result = TRUE;
79  if( *text==':' ) {
80  ++text;
81  second = strtol( text, &endptr, 10 );
82  if( endptr!=text ) {
83  if( second < 0 || second > 59 ) {
84  result = FALSE;
85  } else {
86  text = endptr;
87  }
88  } else {
89  result = FALSE;
90  }
91  }
92  if( result && is_ampm_hour ) {
93  am_pm = fb_hCheckAMPM( text, &length );
94  if( am_pm ) {
95  text += length;
96  }
97  }
98  }
99  } else if( is_ampm_hour ) {
100  am_pm = fb_hCheckAMPM( text, &length );
101  if( am_pm ) {
102  text += length;
103  result = TRUE;
104  }
105  }
106  }
107  if( result ) {
108  if( am_pm ) {
109  /* test for AM/PM */
110  if( hour==12 ) {
111  if( am_pm==1 )
112  hour -= 12;
113  } else {
114  if( am_pm==2 )
115  hour += 12;
116  }
117  }
118  /* Update used length */
119  length = text - text_start;
120  }
121 
122  if( result ) {
123  if( pHour )
124  *pHour = hour;
125  if( pMinute )
126  *pMinute = minute;
127  if( pSecond )
128  *pSecond = second;
129  if( pLength )
130  *pLength = length;
131  }
132 
133  return result;
134 }