-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrade_hueco.c
68 lines (60 loc) · 1.24 KB
/
grade_hueco.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "grade_hueco.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
int GradeHueco_cmp(const GradeHueco a, const GradeHueco b)
{
if (a.grade != b.grade) {
return a.grade - b.grade;
}
return a.modifier - b.modifier;
}
int GradeHueco_str(const GradeHueco grade, char *str, size_t strlen)
{
if (grade.modifier == GRADE_HUECO_MODIFIER_NONE) {
return snprintf(str, strlen, "V%d", grade.grade);
} else {
char mod_str;
switch (grade.modifier) {
case GRADE_HUECO_MODIFIER_MINUS:
mod_str = '-';
break;
default:
mod_str = '+';
break;
}
return snprintf(str, strlen, "V%d%c", grade.grade, mod_str);
}
}
int GradeHueco_fromstr(const char *str, GradeHueco *grade)
{
if (str == NULL || grade == NULL) {
errno = EINVAL;
return 1;
}
int ret;
char mod_char;
int nfilled = sscanf(str, "V%d%c", &grade->grade, &mod_char);
if (nfilled < 1) {
ret = 1;
} else if (nfilled == 1) {
grade->modifier = GRADE_HUECO_MODIFIER_NONE;
ret = 0;
} else {
switch (mod_char) {
case '-':
grade->modifier = GRADE_HUECO_MODIFIER_MINUS;
ret = 0;
break;
case '+':
grade->modifier = GRADE_HUECO_MODIFIER_PLUS;
ret = 0;
break;
default:
ret = 1;
break;
}
}
return ret;
}