1 #include "rc_internal.h"
2
3 #include "rc_compat.h"
4
5 #include <string.h>
6 #include <stdio.h>
7
rc_parse_format(const char * format_str)8 int rc_parse_format(const char* format_str) {
9 switch (*format_str++) {
10 case 'F':
11 if (!strcmp(format_str, "RAMES")) {
12 return RC_FORMAT_FRAMES;
13 }
14
15 break;
16
17 case 'T':
18 if (!strcmp(format_str, "IME")) {
19 return RC_FORMAT_FRAMES;
20 }
21 else if (!strcmp(format_str, "IMESECS")) {
22 return RC_FORMAT_SECONDS;
23 }
24
25 break;
26
27 case 'S':
28 if (!strcmp(format_str, "ECS")) {
29 return RC_FORMAT_SECONDS;
30 }
31 if (!strcmp(format_str, "CORE")) {
32 return RC_FORMAT_SCORE;
33 }
34 if (!strcmp(format_str, "ECS_AS_MINS")) {
35 return RC_FORMAT_SECONDS_AS_MINUTES;
36 }
37
38 break;
39
40 case 'M':
41 if (!strcmp(format_str, "ILLISECS")) {
42 return RC_FORMAT_CENTISECS;
43 }
44 if (!strcmp(format_str, "INUTES")) {
45 return RC_FORMAT_MINUTES;
46 }
47
48 break;
49
50 case 'P':
51 if (!strcmp(format_str, "OINTS")) {
52 return RC_FORMAT_SCORE;
53 }
54
55 break;
56
57 case 'V':
58 if (!strcmp(format_str, "ALUE")) {
59 return RC_FORMAT_VALUE;
60 }
61
62 break;
63
64 case 'O':
65 if (!strcmp(format_str, "THER")) {
66 return RC_FORMAT_SCORE;
67 }
68
69 break;
70 }
71
72 return RC_FORMAT_VALUE;
73 }
74
rc_format_value_minutes(char * buffer,int size,unsigned minutes)75 static int rc_format_value_minutes(char* buffer, int size, unsigned minutes) {
76 unsigned hours;
77
78 hours = minutes / 60;
79 minutes -= hours * 60;
80 return snprintf(buffer, size, "%uh%02u", hours, minutes);
81 }
82
rc_format_value_seconds(char * buffer,int size,unsigned seconds)83 static int rc_format_value_seconds(char* buffer, int size, unsigned seconds) {
84 unsigned hours, minutes;
85
86 /* apply modulus math to split the seconds into hours/minutes/seconds */
87 minutes = seconds / 60;
88 seconds -= minutes * 60;
89 if (minutes < 60) {
90 return snprintf(buffer, size, "%u:%02u", minutes, seconds);
91 }
92
93 hours = minutes / 60;
94 minutes -= hours * 60;
95 return snprintf(buffer, size, "%uh%02u:%02u", hours, minutes, seconds);
96 }
97
rc_format_value_centiseconds(char * buffer,int size,unsigned centiseconds)98 static int rc_format_value_centiseconds(char* buffer, int size, unsigned centiseconds) {
99 unsigned seconds;
100 int chars, chars2;
101
102 /* modulus off the centiseconds */
103 seconds = centiseconds / 100;
104 centiseconds -= seconds * 100;
105
106 chars = rc_format_value_seconds(buffer, size, seconds);
107 if (chars > 0) {
108 chars2 = snprintf(buffer + chars, size - chars, ".%02u", centiseconds);
109 if (chars2 > 0) {
110 chars += chars2;
111 } else {
112 chars = chars2;
113 }
114 }
115
116 return chars;
117 }
118
rc_format_value(char * buffer,int size,int value,int format)119 int rc_format_value(char* buffer, int size, int value, int format) {
120 int chars;
121
122 switch (format) {
123 case RC_FORMAT_FRAMES:
124 /* 60 frames per second = 100 centiseconds / 60 frames; multiply frames by 100 / 60 */
125 chars = rc_format_value_centiseconds(buffer, size, value * 10 / 6);
126 break;
127
128 case RC_FORMAT_SECONDS:
129 chars = rc_format_value_seconds(buffer, size, value);
130 break;
131
132 case RC_FORMAT_CENTISECS:
133 chars = rc_format_value_centiseconds(buffer, size, value);
134 break;
135
136 case RC_FORMAT_SECONDS_AS_MINUTES:
137 chars = rc_format_value_minutes(buffer, size, value / 60);
138 break;
139
140 case RC_FORMAT_MINUTES:
141 chars = rc_format_value_minutes(buffer, size, value);
142 break;
143
144 case RC_FORMAT_SCORE:
145 chars = snprintf(buffer, size, "%06d", value);
146 break;
147
148 default:
149 case RC_FORMAT_VALUE:
150 chars = snprintf(buffer, size, "%d", value);
151 break;
152 }
153
154 return chars;
155 }
156