1 /*--------------------------------------------------
2 Victor 'mgl' Anikeev, mgl@pisem.net
3 --------------------------------------------------*/
4
5 /*#define MGLGRPTST*/
6
7 #ifndef __MGLGROUPS_C__
8 #define __MGLGROUPS_C__
9
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13
14 #include "fidoconf.h"
15 #include "common.h"
16
17 #include "fc2tor_g.h"
18
getGroupSetSize(char * str,char * delms)19 int getGroupSetSize(char *str, char *delms) {
20 int num = 0;
21
22 if (str == NULL) return 0;
23 while (*str) {
24 while ((*str) && strchr(delms, *str)) str++;
25 if (*str) {
26 num++;
27 while ((*str) && !strchr(delms, *str)) str++;
28 }
29 }
30 return num;
31 }
32
isSubSetOfGroups(char * sub,char * groups,char * delms)33 int isSubSetOfGroups(char *sub, char *groups, char *delms) {
34 register char *temp;
35 register char *grp;
36 int len, ok;
37
38 if (sub == NULL) return 1;
39 while (*sub) {
40 while ((*sub) && strchr(delms, *sub)) sub++;
41 if (*sub) {
42 grp = sub; len = 0;
43 while ((*sub) && !strchr(delms, *sub)) {
44 sub++; len++;
45 }
46 temp = groups; ok = 0;
47 while (!ok && *temp) {
48 while (*temp && strchr(delms, *temp)) temp++;
49 if (strncmp(grp, temp, len) == 0) ok = 1;
50 while (*temp && !strchr(delms, *temp)) temp++;
51 }
52 if (!ok) return 0;
53 }
54 }
55 return 1;
56 }
57
areCrossGroupSets(char * grp1,char * grp2,char * delms)58 int areCrossGroupSets(char *grp1, char *grp2, char *delms) {
59 register char *temp;
60 register char *grp;
61 int len;
62
63 if (grp1) while ((*grp1) && strchr(delms, *grp1)) grp1++;
64 if (grp2) while ((*grp2) && strchr(delms, *grp2)) grp2++;
65
66 if ((!grp1 || !*grp1) && (!grp1 || !*grp1)) return 1;
67 while (*grp1) {
68 while ((*grp1) && strchr(delms, *grp1)) grp1++;
69 if (*grp1) {
70 grp = grp1; len = 0;
71 while ((*grp1) && !strchr(delms, *grp1)) {
72 grp1++; len++;
73 }
74 temp = grp2;
75 while (*temp) {
76 while (*temp && strchr(delms, *temp)) temp++;
77 if (strncmp(grp, temp, len) == 0) return 1;
78 while (*temp && !strchr(delms, *temp)) temp++;
79 }
80 }
81 }
82 return 0;
83 }
84
areEqualGroupSets(char * grp1,char * grp2,char * delms)85 int areEqualGroupSets(char *grp1, char *grp2, char *delms) {
86 if (!isSubSetOfGroups(grp1, grp2, delms)) return 0;
87 if (!isSubSetOfGroups(grp2, grp1, delms)) return 0;
88 return 1;
89 }
90
91 /*-----------------25.08.02 00:36-------------------
92 for TEST only (MGLGRPTST must be defined)
93 --------------------------------------------------*/
94 #ifdef MGLGRPTST
main(int argc,char * argv[])95 int main (int argc, char *argv[]) {
96 printf("Groups: %d\n", getGroupSetSize(",, , ,os/2,,,unix,, ,win,,,", ",; "));
97 printf("isSubSet: %d\n", isSubSetOfGroups("quake ,,,doom", "doom;wolf,quake", ", ;"));
98 printf("isSubSet: %d\n", isSubSetOfGroups("quake doom", "quake doom", " "));
99 printf("isSubSet: %d\n", isSubSetOfGroups("quake", "quake doom", " "));
100 printf("isSubSet: %d\n", isSubSetOfGroups("", "quake doom", " "));
101 printf("isSubSet: %d\n", isSubSetOfGroups("quake doom", "wolf quake", " "));
102 printf("isSubSet: %d\n", isSubSetOfGroups("quake", "doom", " "));
103 printf("isSubSet: %d\n", isSubSetOfGroups("quake", "", " "));
104 printf("\n");
105 printf("areCross: %d\n", areCrossGroupSets("quake", "doom", " "));
106 printf("areCross: %d\n", areCrossGroupSets("quake", "", " "));
107 printf("areCross: %d\n", areCrossGroupSets("quake", "quake", " "));
108 printf("areCross: %d\n", areCrossGroupSets("quake doom", "doom wolf", " "));
109 printf("\n");
110 printf("areEqual: %d\n", areEqualGroupSets("", "", " "));
111 printf("areEqual: %d\n", areEqualGroupSets("doom", "quake", " "));
112 printf("areEqual: %d\n", areEqualGroupSets("doom wolf", "wolf doom", " "));
113 printf("\n");
114 return 0;
115 }
116 #endif
117
118 #endif
119