Skip to content

Commit f414591

Browse files
author
sthsieh
committed
更改tag與content的單複數,修正毫秒單位
1 parent 779bc19 commit f414591

15 files changed

+340
-341
lines changed

README

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,29 @@
66
===lyric格式===
77
針對單首歌曲的格式如下:
88
{
9-
"tag": {
9+
"tags": {
1010
"title": "歌曲標題",
1111
"author": "作詞者姓名"
1212
},
1313
"singers": [
1414
{
15-
"tag": {
15+
"tags": {
1616
"name": "歌手姓名",
1717
"gender": "女"
1818
},
19-
"content": [
20-
["00:00.00", "這", 10, "是", 6, "測", 12, "試。", 12],
21-
["00:02,50", "另", 20, "一行(標音)", 18]
19+
"contents": [
20+
["00:00.000", "這", 100, "是", 60, "測", 120, "試。", 120],
21+
["00:02.500", "另", 200, "一行(標音)", 180]
2222
]
2323
},
2424
{
25-
"tag": {
25+
"tags": {
2626
"name": "合音歌手姓名",
2727
"gender": "男"
2828
},
29-
"content": [
30-
["00:00.00", "喔", 40],
31-
["00:02.50", "阿", 38]
29+
"contents": [
30+
["00:00.000", "喔", 400],
31+
["00:02.500", "阿", 380]
3232
]
3333
}
3434
]

json.lyric

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{
2-
"tag": {
2+
"tags": {
33
"name": "Unknow Name",
44
"lyricist": "Unknow Lyricist"
55
},
66
"singers": [
77
{
8-
"tag": {
8+
"tags": {
99
"name": "Unknow Singer",
1010
"gender": "Unknow Gender"
1111
},
12-
"content": [
13-
["00:00", "This", 10, "is", 5, "a", 12, "test.", 12]
12+
"contents": [
13+
["00:00.000", "This", 100, "is", 50, "a", 120, "test.", 120]
1414
]
1515
}
1616
]

lib/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -pedantic -fstrict-aliasing -Wall -Wextra -Wstrict-aliasing -Wno-declaration-after-statement -Wno-unused-parameter")
22
include_directories(../libjson)
3-
add_library(lyric lyric.c singer.c tag.c line.c word.c time.c parser.c ../libjson/json.c)
3+
add_library(lyric lyric.c singer.c tags.c line.c word.c time.c parser.c ../libjson/json.c)

lib/lyric.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "helpers.h"
33

44
bool lyric_lyric_create(Lyric *const restrict lyric) {
5-
if (unlikely(!lyric_tag_create(&lyric->tag))) {
5+
if (unlikely(!lyric_tags_create(&lyric->tags))) {
66
goto err0;
77
}
88
lyric->singer_size = 0;
@@ -13,7 +13,7 @@ bool lyric_lyric_create(Lyric *const restrict lyric) {
1313
}
1414
return true;
1515
err1:
16-
lyric_tag_clean(&lyric->tag);
16+
lyric_tags_clean(&lyric->tags);
1717
err0:
1818
return false;
1919
}
@@ -25,7 +25,7 @@ bool lyric_lyric_copy(Lyric* const restrict lyric, const Lyric *const restrict _
2525
if (unlikely(lyric == _lyric)) {
2626
return true;
2727
}
28-
if (unlikely(!lyric_tag_copy(&lyric->tag, &_lyric->tag))) {
28+
if (unlikely(!lyric_tags_copy(&lyric->tags, &_lyric->tags))) {
2929
goto err0;
3030
}
3131
const size_t size = _lyric->singer_size;
@@ -46,7 +46,7 @@ bool lyric_lyric_copy(Lyric* const restrict lyric, const Lyric *const restrict _
4646
}
4747
lyric_free(lyric->singers);
4848
err1:
49-
lyric_tag_clean(&lyric->tag);
49+
lyric_tags_clean(&lyric->tags);
5050
err0:
5151
return false;
5252
}
@@ -82,7 +82,7 @@ Lyric* lyric_lyric_new_copy(const Lyric *const restrict _lyric) {
8282
}
8383

8484
void lyric_lyric_clean(Lyric *const restrict lyric) {
85-
lyric_tag_clean(&lyric->tag);
85+
lyric_tags_clean(&lyric->tags);
8686
if (likely(lyric != NULL)) {
8787
for (size_t i = 0; i < lyric->singer_size; ++i) {
8888
lyric_singer_clean(&lyric->singers[i]);

lib/lyric.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
#define __LYRIC_H__
33

44
#include "helpers.h"
5-
#include "tag.h"
5+
#include "tags.h"
66
#include "singer.h"
77
#include "parser.h"
88

99
struct _Lyric {
10-
struct _Tag tag;
10+
struct _Tags tags;
1111
struct _Singer *singers;
1212
size_t singer_size;
1313
size_t _malloc_singer_size;

lib/parser.c

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#include <json.h>
22
#include "parser.h"
33

4-
static const char lyric_string_tag[] = {'t', 'a', 'g'};
4+
static const char lyric_string_tags[] = {'t', 'a', 'g', 's'};
55
static const char lyric_string_singers[] = {'s', 'i', 'n', 'g', 'e', 'r', 's'};
6-
static const char lyric_string_content[] = {'c', 'o', 'n', 't', 'e', 'n', 't'};
6+
static const char lyric_string_contents[] = {'c', 'o', 'n', 't', 'e', 'n', 't', 's'};
77

88
static const char *const string_of_errors[] = {
99
[JSON_ERROR_NO_MEMORY] = "out of memory",
@@ -51,9 +51,9 @@ static int _json_parser_callback(void *const restrict userdata, const int type,
5151
} return 0;
5252
case lyric_parser_status_lyric: {
5353
if (type == JSON_KEY) {
54-
if (length == sizeof(lyric_string_tag) && lyric_strncasecmp(data, lyric_string_tag, sizeof(lyric_string_tag)) == 0) {
55-
parser->_d1.t = &parser->_d0->tag;
56-
parser->status = lyric_parser_status_lyric_tag;
54+
if (length == sizeof(lyric_string_tags) && lyric_strncasecmp(data, lyric_string_tags, sizeof(lyric_string_tags)) == 0) {
55+
parser->_d1.t = &parser->_d0->tags;
56+
parser->status = lyric_parser_status_lyric_tags;
5757
} else if (length == sizeof(lyric_string_singers) && lyric_strncasecmp(data, lyric_string_singers, sizeof(lyric_string_singers)) == 0) {
5858
parser->status = lyric_parser_status_lyric_singers;
5959
} else {
@@ -65,32 +65,32 @@ static int _json_parser_callback(void *const restrict userdata, const int type,
6565
return JSON_ERROR_CALLBACK;
6666
}
6767
} return 0;
68-
case lyric_parser_status_lyric_tag: {
68+
case lyric_parser_status_lyric_tags: {
6969
if (type == JSON_OBJECT_BEGIN) {
70-
parser->status = lyric_parser_status_lyric_tag_name;
70+
parser->status = lyric_parser_status_lyric_tags_name;
7171
} else {
7272
return JSON_ERROR_CALLBACK;
7373
}
7474
} return 0;
75-
case lyric_parser_status_lyric_tag_name: {
75+
case lyric_parser_status_lyric_tags_name: {
7676
if (type == JSON_KEY) {
7777
parser->_d2.k = lyric_strndup(data, length);
78-
parser->status = lyric_parser_status_lyric_tag_value;
78+
parser->status = lyric_parser_status_lyric_tags_value;
7979
} else if (type == JSON_OBJECT_END) {
8080
parser->status = lyric_parser_status_lyric;
8181
} else {
8282
return JSON_ERROR_CALLBACK;
8383
}
8484
} return 0;
85-
case lyric_parser_status_lyric_tag_value: {
85+
case lyric_parser_status_lyric_tags_value: {
8686
if (type == JSON_STRING) {
8787
char *value = lyric_strndup(data, length);
88-
bool result = lyric_tag_insert(parser->_d1.t, parser->_d2.k, value);
88+
bool result = lyric_tags_insert(parser->_d1.t, parser->_d2.k, value);
8989
lyric_free(value);
9090
lyric_free(parser->_d2.k);
9191
if (!result)
9292
return JSON_ERROR_NO_MEMORY;
93-
parser->status = lyric_parser_status_lyric_tag_name;
93+
parser->status = lyric_parser_status_lyric_tags_name;
9494
} else {
9595
return JSON_ERROR_CALLBACK;
9696
}
@@ -114,11 +114,11 @@ static int _json_parser_callback(void *const restrict userdata, const int type,
114114
} return 0;
115115
case lyric_parser_status_lyric_singer: {
116116
if (type == JSON_KEY) {
117-
if (length == sizeof(lyric_string_tag) && lyric_strncasecmp(data, lyric_string_tag, sizeof(lyric_string_tag)) == 0) {
118-
parser->_d2.t = &parser->_d1.s->tag;
119-
parser->status = lyric_parser_status_lyric_singer_tag;
120-
} else if (length == sizeof(lyric_string_content) && lyric_strncasecmp(data, lyric_string_content, sizeof(lyric_string_content)) == 0) {
121-
parser->status = lyric_parser_status_lyric_singer_content;
117+
if (length == sizeof(lyric_string_tags) && lyric_strncasecmp(data, lyric_string_tags, sizeof(lyric_string_tags)) == 0) {
118+
parser->_d2.t = &parser->_d1.s->tags;
119+
parser->status = lyric_parser_status_lyric_singer_tags;
120+
} else if (length == sizeof(lyric_string_contents) && lyric_strncasecmp(data, lyric_string_contents, sizeof(lyric_string_contents)) == 0) {
121+
parser->status = lyric_parser_status_lyric_singer_contents;
122122
} else {
123123
return JSON_ERROR_CALLBACK;
124124
}
@@ -128,55 +128,55 @@ static int _json_parser_callback(void *const restrict userdata, const int type,
128128
return JSON_ERROR_CALLBACK;
129129
}
130130
} return 0;
131-
case lyric_parser_status_lyric_singer_tag: {
131+
case lyric_parser_status_lyric_singer_tags: {
132132
if (type == JSON_OBJECT_BEGIN) {
133-
parser->status = lyric_parser_status_lyric_singer_tag_name;
133+
parser->status = lyric_parser_status_lyric_singer_tags_name;
134134
} else {
135135
return JSON_ERROR_CALLBACK;
136136
}
137137
} return 0;
138-
case lyric_parser_status_lyric_singer_tag_name: {
138+
case lyric_parser_status_lyric_singer_tags_name: {
139139
if (type == JSON_KEY) {
140140
parser->_d3.k = lyric_strndup(data, length);
141-
parser->status = lyric_parser_status_lyric_singer_tag_value;
141+
parser->status = lyric_parser_status_lyric_singer_tags_value;
142142
} else if (type == JSON_OBJECT_END) {
143143
parser->status = lyric_parser_status_lyric_singer;
144144
} else {
145145
return JSON_ERROR_CALLBACK;
146146
}
147147
} return 0;
148-
case lyric_parser_status_lyric_singer_tag_value: {
148+
case lyric_parser_status_lyric_singer_tags_value: {
149149
if (type == JSON_STRING) {
150150
char *value = lyric_strndup(data, length);
151-
bool result = lyric_tag_insert(parser->_d2.t, parser->_d3.k, value);
151+
bool result = lyric_tags_insert(parser->_d2.t, parser->_d3.k, value);
152152
lyric_free(value);
153153
lyric_free(parser->_d3.k);
154154
if (!result)
155155
return JSON_ERROR_NO_MEMORY;
156-
parser->status = lyric_parser_status_lyric_singer_tag_name;
156+
parser->status = lyric_parser_status_lyric_singer_tags_name;
157157
} else {
158158
return JSON_ERROR_CALLBACK;
159159
}
160160
} return 0;
161-
case lyric_parser_status_lyric_singer_content: {
161+
case lyric_parser_status_lyric_singer_contents: {
162162
if (type == JSON_ARRAY_BEGIN) {
163-
parser->status = lyric_parser_status_lyric_singer_content_line;
163+
parser->status = lyric_parser_status_lyric_singer_contents_line;
164164
} else if (type == JSON_ARRAY_END) {
165165
parser->status = lyric_parser_status_lyric_singer;
166166
} else {
167167
return JSON_ERROR_CALLBACK;
168168
}
169169
} return 0;
170-
case lyric_parser_status_lyric_singer_content_line: {
170+
case lyric_parser_status_lyric_singer_contents_line: {
171171
if (type == JSON_ARRAY_BEGIN) {
172-
parser->status = lyric_parser_status_lyric_singer_content_line_offset;
172+
parser->status = lyric_parser_status_lyric_singer_contents_line_offset;
173173
} else if (type == JSON_ARRAY_END) {
174174
parser->status = lyric_parser_status_lyric_singer;
175175
} else {
176176
return JSON_ERROR_CALLBACK;
177177
}
178178
} return 0;
179-
case lyric_parser_status_lyric_singer_content_line_offset: {
179+
case lyric_parser_status_lyric_singer_contents_line_offset: {
180180
if (type == JSON_STRING) {
181181
// TODO: no mem detect
182182
Line line;
@@ -189,22 +189,22 @@ static int _json_parser_callback(void *const restrict userdata, const int type,
189189
lyric_singer_push_back(parser->_d1.s, &line);
190190
lyric_line_clean(&line);
191191
parser->_d2.l = &parser->_d1.s->lines[parser->_d1.s->line_size - 1];
192-
parser->status = lyric_parser_status_lyric_singer_content_line_word;
192+
parser->status = lyric_parser_status_lyric_singer_contents_line_word;
193193
} else {
194194
return JSON_ERROR_CALLBACK;
195195
}
196196
} return 0;
197-
case lyric_parser_status_lyric_singer_content_line_word: {
197+
case lyric_parser_status_lyric_singer_contents_line_word: {
198198
if (type == JSON_STRING) {
199199
parser->_d3.k = lyric_strndup(data, length);
200-
parser->status = lyric_parser_status_lyric_singer_content_line_time;
200+
parser->status = lyric_parser_status_lyric_singer_contents_line_time;
201201
} else if (type == JSON_ARRAY_END) {
202-
parser->status = lyric_parser_status_lyric_singer_content_line;
202+
parser->status = lyric_parser_status_lyric_singer_contents_line;
203203
} else {
204204
return JSON_ERROR_CALLBACK;
205205
}
206206
} return 0;
207-
case lyric_parser_status_lyric_singer_content_line_time: {
207+
case lyric_parser_status_lyric_singer_contents_line_time: {
208208
if (type == JSON_INT) {
209209
Time time;
210210
lyric_time_create_from_literal(&time, data, length);
@@ -214,7 +214,7 @@ static int _json_parser_callback(void *const restrict userdata, const int type,
214214
lyric_time_clean(&time);
215215
lyric_line_push_back(parser->_d2.l, &word);
216216
lyric_word_clean(&word);
217-
parser->status = lyric_parser_status_lyric_singer_content_line_word;
217+
parser->status = lyric_parser_status_lyric_singer_contents_line_word;
218218
} else {
219219
return JSON_ERROR_CALLBACK;
220220
}
@@ -341,20 +341,20 @@ void lyric_write_file(const Lyric *const restrict lyric, FILE *const restrict fi
341341
if (unlikely(lyric == NULL || file == NULL))
342342
return;
343343
fprintf(file, "{\n");
344-
fprintf(file, " \"tag\": {\n");
345-
for (size_t i = 0; i < lyric->tag.size; ++i) {
346-
fprintf(file, " \"%s\": \"%s\",\n", lyric->tag.name[i], lyric->tag.value[i]);
344+
fprintf(file, " \"tags\": {\n");
345+
for (size_t i = 0; i < lyric->tags.size; ++i) {
346+
fprintf(file, " \"%s\": \"%s\",\n", lyric->tags.name[i], lyric->tags.value[i]);
347347
}
348348
fprintf(file, " },\n");
349349
fprintf(file, " \"singers\": [\n");
350350
for (size_t i = 0; i < lyric->singer_size; ++i) {
351351
fprintf(file, " {\n");
352-
fprintf(file, " \"tag\": {\n");
353-
for (size_t j = 0; j < lyric->singers[i].tag.size; ++j) {
354-
fprintf(file, " \"%s\": \"%s\",\n", lyric->singers[i].tag.name[j], lyric->singers[i].tag.value[j]);
352+
fprintf(file, " \"tags\": {\n");
353+
for (size_t j = 0; j < lyric->singers[i].tags.size; ++j) {
354+
fprintf(file, " \"%s\": \"%s\",\n", lyric->singers[i].tags.name[j], lyric->singers[i].tags.value[j]);
355355
}
356356
fprintf(file, " },\n");
357-
fprintf(file, " \"content\": [\n");
357+
fprintf(file, " \"contents\": [\n");
358358
for (size_t j = 0; j < lyric->singers[i].line_size; ++j) {
359359
char *const time_string = lyric_time_to_new_string(&lyric->singers[i].lines[j].time);
360360
fprintf(file, " [\"%s\"", time_string);

lib/parser.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ enum lyric_parser_error {
1212
enum lyric_parser_status {
1313
lyric_parser_status_start,
1414
lyric_parser_status_lyric,
15-
lyric_parser_status_lyric_tag,
16-
lyric_parser_status_lyric_tag_name,
17-
lyric_parser_status_lyric_tag_value,
15+
lyric_parser_status_lyric_tags,
16+
lyric_parser_status_lyric_tags_name,
17+
lyric_parser_status_lyric_tags_value,
1818
lyric_parser_status_lyric_singers,
1919
lyric_parser_status_lyric_singer,
20-
lyric_parser_status_lyric_singer_tag,
21-
lyric_parser_status_lyric_singer_tag_name,
22-
lyric_parser_status_lyric_singer_tag_value,
23-
lyric_parser_status_lyric_singer_content,
24-
lyric_parser_status_lyric_singer_content_line,
25-
lyric_parser_status_lyric_singer_content_line_offset,
26-
lyric_parser_status_lyric_singer_content_line_word,
27-
lyric_parser_status_lyric_singer_content_line_time,
20+
lyric_parser_status_lyric_singer_tags,
21+
lyric_parser_status_lyric_singer_tags_name,
22+
lyric_parser_status_lyric_singer_tags_value,
23+
lyric_parser_status_lyric_singer_contents,
24+
lyric_parser_status_lyric_singer_contents_line,
25+
lyric_parser_status_lyric_singer_contents_line_offset,
26+
lyric_parser_status_lyric_singer_contents_line_word,
27+
lyric_parser_status_lyric_singer_contents_line_time,
2828
lyric_parser_status_finish,
2929
};
3030

@@ -37,12 +37,12 @@ struct _Parser {
3737
size_t _malloc_size;
3838
struct _Lyric *_d0;
3939
union {
40-
struct _Tag *t;
40+
struct _Tags *t;
4141
struct _Singer *s;
4242
} _d1;
4343
union {
4444
char *k;
45-
struct _Tag *t;
45+
struct _Tags *t;
4646
struct _Line *l;
4747
} _d2;
4848
union {

0 commit comments

Comments
 (0)