TPCCLIB
Loading...
Searching...
No Matches
roiname.c
Go to the documentation of this file.
1
4/*****************************************************************************/
5#include "tpcclibConfig.h"
6/*****************************************************************************/
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include "tpcextensions.h"
11/*****************************************************************************/
12
13/*****************************************************************************/
22 const char *roiname,
24 const char *dlm,
26 const unsigned int si,
28 char *subpart,
31 const unsigned int slen
32) {
33 if(subpart==NULL || slen<1) return(subpart);
34 subpart[0]=(char)0;
35 if(roiname==NULL || strnlen(roiname, 1)==0) return((char*)NULL);
36 if(dlm==NULL || strnlen(dlm, 1)==0) return((char*)NULL);
37
38 unsigned int i=0;
39 char *s=strdup(roiname);
40 char *sp=s; //printf(" si=%d\n", si);
41 do {
42 //printf(" sp='%s'\n", sp);
43 char *p=strpbrk(sp, dlm);
44 //printf(" i=%d p='%s'\n", i, p);
45 if(!p) {
46 if(si==i) {strlcat(subpart, sp, slen); free(s); return(subpart);}
47 free(s); return((char*)NULL);
48 }
49 *p=(char)0;
50 if(si==i) {strlcat(subpart, sp, slen); free(s); return(subpart);}
51 sp=p+1; i++;
52 } while(*sp);
53
54 if(si==i) {strlcat(subpart, sp, slen); free(s); return(subpart);}
55 free(s);
56 return((char*)NULL);
57}
58/*****************************************************************************/
59
60/*****************************************************************************/
68 const char *template,
71 const char *currname,
73 char *newname,
75 const unsigned int count
76) {
77 if(newname==NULL || count<1) return((char*)NULL);
78 newname[0]=(char)0;
79 if(template==NULL || currname==NULL) return((char*)NULL);
80
81 unsigned int i, len;
82 len=strlen(template); i=strlen(currname); if(i>len) len=i;
83 if(len<1) return(newname);
84 char subpart[++len], *c;
85
86 i=0;
87 c=roinameSubpart(template, "_", i, subpart, len);
88 while(c) {
89 /* If not '@' or if '@' can be replaced with sub-part from original tacname, then copy */
90 if(strcmp(subpart, "@")!=0 || roinameSubpart(currname, " _", i, subpart, 256)) {
91 if(i>0) strlcat(newname, "_", count);
92 strlcat(newname, subpart, count);
93 }
94 c=roinameSubpart(template, "_", ++i, subpart, 256);
95 }
96 return(newname);
97}
98/*****************************************************************************/
99
100/*****************************************************************************/
108 char *roiname,
111 const char *field,
114 const unsigned int in,
117 const unsigned int count
118) {
119 if(roiname==NULL) return(roiname);
120 if(field==NULL) return((char*)NULL);
121 unsigned int slen=strlen(roiname);
122 unsigned int flen=strlen(field);
123 if(count < (slen+flen+2)) return((char*)NULL);
124 if(slen==0) {
125 if(flen==0) {strlcpy(roiname, "_", count); return(roiname);}
126 else {strlcpy(roiname, field, count); return(roiname);}
127 }
128
129 char *c, subpart[slen+1], tmp[slen+1];
130 unsigned int i=0;
131 strcpy(tmp, roiname); strcpy(roiname, "");
132 c=roinameSubpart(tmp, " _", i, subpart, slen+1);
133 while(c) {
134 if(i==in) {
135 if(i>0) strlcat(roiname, "_", count);
136 strlcat(roiname, field, count);
137 }
138 if(i>0 || i==in) strlcat(roiname, "_", count);
139 strlcat(roiname, subpart, count);
140 c=roinameSubpart(tmp, " _", ++i, subpart, slen+1);
141 }
142 if(i<=in) {
143 if(i>0) strlcat(roiname, "_", count);
144 strlcat(roiname, field, count);
145 }
146 return(roiname);
147}
148/*****************************************************************************/
149
150/*****************************************************************************/
160 char *roiname
161) {
162 if(roiname==NULL) return(0);
163 size_t len, n;
164 len=strlen(roiname); if(len==0) return(0);
165 n=strspn(roiname, " _-.\t"); if(n==len) return(0);
166 return(1);
167}
168/*****************************************************************************/
169
170/*****************************************************************************/
185 const char *roiname,
187 const char *test_str,
189 TPCSTATUS *status
190) {
191 int verbose=0; if(status!=NULL) verbose=status->verbose;
192 if(verbose>0) printf("%s()\n", __func__);
193 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_OK);
194 /* If both string are empty, then that is a match */
195 if((roiname==NULL || strlen(roiname)<1) && (test_str==NULL || strlen(test_str)<1)) {
196 return(1);
197 }
198 /* If just either of those is empty, then that is a no match */
199 if(roiname==NULL || strlen(roiname)<1) {
200 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_NO_DATA);
201 return(0);
202 }
203 if(test_str==NULL || strlen(test_str)<1) {
204 statusSet(status, __func__, __FILE__, __LINE__, TPCERROR_NO_DATA);
205 return(0);
206 }
207
208 /* Check the number of name sub-parts */
209 int i, len;
210 len=strlen(roiname); i=strlen(test_str); if(i>len) len=i;
211 char subn1[len+1], subn2[len+1];
212 int roisubnr=0, refsubnr=0;
213 for(i=0; i<6; i++) {
214 if(roinameSubpart(roiname, " _-", i, subn1, len+1)==NULL) break;
215 roisubnr++;
216 }
217 for(i=0; i<6; i++) {
218 if(roinameSubpart(test_str, " _-", i, subn2, len+1)==NULL) break;
219 refsubnr++;
220 }
221 if(verbose>3) printf("roisubnr := %d\nrefsubnr := %d\n", roisubnr, refsubnr);
222 if(roisubnr==0 && refsubnr==0) return(1);
223 if(roisubnr==0 || refsubnr==0) return(0);
224 if(refsubnr>1 && roisubnr!=refsubnr) return(0);
225
226 /* If more than one sub-name to test for, then test against corresponding sub-names with
227 wild cards */
228 if(refsubnr>1) {
229 for(i=0; i<refsubnr; i++) {
230 roinameSubpart(roiname, " _-", i, subn1, len+1);
231 if(!strcmp(subn1, ".")) strcpy(subn1, "");
232 roinameSubpart(test_str, " _-", i, subn2, len+1);
233 if(!strcmp(subn2, ".")) strcpy(subn2, "");
234 if(verbose>3) printf(" '%s' vs '%s'\n", subn1, subn2);
235 if(strnlen(subn1, 1)==0 && strnlen(subn2, 1)==0) continue;
236 if(strnlen(subn2, 1)<1 || fncasematch(subn1, subn2)==0 ) return(0);
237 }
238 return(1);
239 }
240
241 /* So, we have just one sub-name in the test string */
242 /* If it is found in any of sub names, accepting wild cards, then we consider it a match */
243 if(roinameSubpart(test_str, " _-", 0, subn2, len+1)==NULL) return(0);
244 if(!strcmp(subn2, ".")) strcpy(subn2, "");
245 for(i=0; i<roisubnr; i++) {
246 if(roinameSubpart(roiname, " _-", i, subn1, len+1)==NULL) continue;
247 if(!strcmp(subn1, ".")) strcpy(subn1, "");
248 if(fncasematch(subn1, subn2)) return(1);
249 }
250 return(0);
251}
252/*****************************************************************************/
253
254/*****************************************************************************/
int fncasematch(const char *fname, const char *key)
Definition filename.c:139
int roinameMatch(const char *roiname, const char *test_str, TPCSTATUS *status)
Definition roiname.c:183
char * roinameSubpart(const char *roiname, const char *dlm, const unsigned int si, char *subpart, const unsigned int slen)
Definition roiname.c:20
char * roinameAddField(char *roiname, const char *field, const unsigned int in, const unsigned int count)
Definition roiname.c:106
int roinameExists(char *roiname)
Verifies whether TAC name exists or not.
Definition roiname.c:158
char * roinameEditByTemplate(const char *template, const char *currname, char *newname, const unsigned int count)
Definition roiname.c:65
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
Definition statusmsg.c:142
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
size_t strlcat(char *dst, const char *src, size_t dstsize)
Definition stringext.c:592
int verbose
Verbose level, used by statusPrint() etc.
Header file for library libtpcextensions.
@ TPCERROR_OK
No error.
@ TPCERROR_NO_DATA
File contains no data.