TPCCLIB
Toggle main menu visibility
Loading...
Searching...
No Matches
libtpcextensions
studynr.c
Go to the documentation of this file.
1
6
/*****************************************************************************/
7
#include "tpcclibConfig.h"
8
/*****************************************************************************/
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include <string.h>
12
#include "
tpcextensions.h
"
13
/*****************************************************************************/
14
15
/*****************************************************************************/
22
int
studynrVerify
(
24
const
char
*s,
26
int
zero_ok
27
) {
28
if
(s==NULL)
return
(2);
29
size_t
len, i, j;
30
len=strlen(s);
if
(len<2 || len>10)
return
(1);
31
for
(i=0; i<len; i++)
if
(!isalnum((
int
)s[i]))
return
(1);
32
for
(i=0; i<len; i++)
if
(!isalpha((
int
)s[i]))
break
;
33
if
(i<1 || i>5)
return
(1);
34
if
(zero_ok==0 && s[i]==
'0'
)
return
(1);
/* first digit must be >0 */
35
for
(j=0; (i+j)<len; j++)
if
(!isdigit((
int
)s[i+j]))
return
(1);
36
if
(j<1 || j>5)
return
(1);
37
return
(0);
38
}
39
/*****************************************************************************/
40
41
/*****************************************************************************/
47
int
studynrStandardize
(
49
char
*s
50
) {
51
if
(s==NULL)
return
(1);
52
size_t
i, j, len;
53
len=strlen(s);
if
(len<2)
return
(1);
54
if
(isdigit((
int
)s[0]))
return
(2);
55
if
(!isdigit((
int
)s[len-1]))
return
(3);
56
/* Convert to lower-case */
57
for
(i=0; i<len; i++) {
58
if
(isdigit((
int
)s[i]))
break
;
59
s[i]=(char)tolower((
int
)s[i]);
60
}
61
/* Remove initial zeroes */
62
for
(i=1; i<len; i++)
if
(isdigit((
int
)s[i]))
break
;
63
for
(j=i; j<len; j++)
if
(s[j]!=
'0'
)
break
;
64
if
(i==j)
return
(0);
/* no initial zeroes */
65
for
(;j<=len; i++, j++) s[i]=s[j];
66
return
(0);
67
}
68
/*****************************************************************************/
69
70
/*****************************************************************************/
79
int
studynrFromFilename
(
81
const
char
*fname,
84
char
*studynr,
86
int
force
87
) {
88
if
(studynr==NULL)
return
(1);
89
strcpy(studynr,
""
);
90
if
(fname==NULL ||
strnlen
(fname, 2)<2)
return
(1);
91
/* Work with copy of file name */
92
char
*temp=
strdup
(fname);
93
/* Remove path and extensions */
94
filenameRmPath
(temp);
filenameRmExtensions
(temp);
95
/* Check if any part of base file name could be a valid study number */
96
int
ret=0, j;
97
size_t
i, k, n, len;
98
len=strlen(temp);
if
(len<1) {free(temp);
return
(2);}
99
for
(i=1; i<len; i++)
if
(isalpha(temp[i-1]) && isdigit(temp[i])) {
100
j=i-1;
while
(j>0 && isalpha(temp[j-1])) j--;
101
k=i;
while
(k<len-1 && isdigit(temp[k+1])) k++;
102
n=k-j+1;
if
(n>=2 && n<=10) {
103
strlcpy
(studynr, temp+j, n+1);
104
if
(force==1) {ret=1;
break
;}
105
if
(
studynrStandardize
(studynr)==0 &&
studynrVerify
(studynr, 0)==0) {
106
ret=2;
break
;}
107
}
108
}
109
if
(ret) {free(temp);
return
0;}
110
if
(force==0) {free(temp);
return
3;}
111
/* ok we have to take something */
112
for
(j=0; j<(int)len; j++)
if
(isalpha(temp[j]) || isdigit(temp[j]))
break
;
113
for
(k=j; k<len-1; k++)
if
(!isalpha(temp[k+1]) && !isdigit(temp[k+1]))
break
;
114
n=k-j+1;
if
(n<1) {free(temp);
return
4;}
115
if
(n>10) n=10;
116
strlcpy
(studynr, temp+j, n+1);
117
free(temp);
118
return
0;
119
}
120
/*****************************************************************************/
121
122
/*****************************************************************************/
filenameRmPath
void filenameRmPath(char *s)
Definition
filename.c:20
filenameRmExtensions
void filenameRmExtensions(char *s)
Definition
filename.c:89
strdup
char * strdup(const char *s)
Definition
stringext.c:185
strnlen
size_t strnlen(const char *s, size_t n)
Definition
stringext.c:565
strlcpy
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition
stringext.c:630
studynrFromFilename
int studynrFromFilename(const char *fname, char *studynr, int force)
Definition
studynr.c:79
studynrStandardize
int studynrStandardize(char *s)
Definition
studynr.c:47
studynrVerify
int studynrVerify(const char *s, int zero_ok)
Definition
studynr.c:22
tpcextensions.h
Header file for library libtpcextensions.
Generated on
for TPCCLIB by
1.17.0