TPCCLIB
Loading...
Searching...
No Matches
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/*****************************************************************************/
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/*****************************************************************************/
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/*****************************************************************************/
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 */
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/*****************************************************************************/
void filenameRmPath(char *s)
Definition filename.c:20
void filenameRmExtensions(char *s)
Definition filename.c:89
char * strdup(const char *s)
Definition stringext.c:185
size_t strnlen(const char *s, size_t n)
Definition stringext.c:566
size_t strlcpy(char *dst, const char *src, size_t dstsize)
Definition stringext.c:632
int studynrFromFilename(const char *fname, char *studynr, int force)
Definition studynr.c:79
int studynrStandardize(char *s)
Definition studynr.c:47
int studynrVerify(const char *s, int zero_ok)
Definition studynr.c:22
Header file for library libtpcextensions.