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