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