| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #pragma once
- #include <string>
- #include <comutil.h>
- #pragma comment(lib, "comsupp.lib")
- #pragma comment(lib, "comsuppw.lib")
- inline std::string ws2s(const std::wstring& ws)
- {
- _bstr_t t = ws.c_str();
- char* pchar = (char*)t;
- return std::string(pchar);
- }
- inline std::wstring s2ws(const std::string& s)
- {
- _bstr_t t = s.c_str();
- wchar_t* pwchar = (wchar_t*)t;
- return std::wstring(pwchar);
- }
- inline int CheckTemplate(char* expr, char* tok_end, const char* group, char* prev, int* deep)
- {
- char tmp = 0;
- char *lastwc, *prev_tok;
- const char *cp;
- //---
- if ((*deep)++ >= 10) return(FALSE);
- //---
- while (*expr == '*' && expr != tok_end) expr++;
- if (expr == tok_end) return(TRUE);
- //---
- lastwc = expr;
- while (*lastwc != '*' && *lastwc != 0) lastwc++;
- //---
- if ((tmp = *(lastwc)) != 0) //
- {
- tmp = *(lastwc); *(lastwc) = 0;
- if ((prev_tok = (char*)strstr(group, expr)) == NULL)
- {
- if (tmp != 0) *(lastwc) = tmp;
- return(FALSE);
- }
- *(lastwc) = tmp;
- }
- else //
- {
- //---
- cp = group + strlen(group);
- for (; cp >= group; cp--)
- if (*cp == expr[0] && strcmp(cp, expr) == 0)
- return(TRUE);
- return(FALSE);
- }
- //---
- if (prev != NULL && prev_tok <= prev) return(FALSE);
- prev = prev_tok;
- //---
- group = prev_tok + (lastwc - expr - 1);
- //---
- if (lastwc != tok_end) return CheckTemplate(lastwc, tok_end, group, prev, deep);
- //---
- return(TRUE);
- }
- inline int CheckTemplate(wchar_t* expr, wchar_t* tok_end, const wchar_t* group, wchar_t* prev, int* deep)
- {
- wchar_t tmp = 0;
- wchar_t *lastwc, *prev_tok;
- const wchar_t *cp;
- //---
- if ((*deep)++ >= 10) return(FALSE);
- //---
- while (*expr == L'*' && expr != tok_end) expr++;
- if (expr == tok_end) return(TRUE);
- //---
- lastwc = expr;
- while (*lastwc != L'*' && *lastwc != 0) lastwc++;
- //---
- if ((tmp = *(lastwc)) != 0) //
- {
- tmp = *(lastwc); *(lastwc) = 0;
- if ((prev_tok = (wchar_t*)wcsstr(group, expr)) == NULL)
- {
- if (tmp != 0) *(lastwc) = tmp;
- return(FALSE);
- }
- *(lastwc) = tmp;
- }
- else //
- {
- //---
- cp = group + wcslen(group);
- for (; cp >= group; cp--)
- if (*cp == expr[0] && wcscmp(cp, expr) == 0)
- return(TRUE);
- return(FALSE);
- }
- //---
- if (prev != NULL && prev_tok <= prev) return(FALSE);
- prev = prev_tok;
- //---
- group = prev_tok + (lastwc - expr - 1);
- //---
- if (lastwc != tok_end) return CheckTemplate(lastwc, tok_end, group, prev, deep);
- //---
- return(TRUE);
- }
- inline int CheckGroup(char* grouplist, const char *group)
- {
- //---
- if (grouplist == NULL || group == NULL) return(FALSE);
- char *tok_start = grouplist, end;
- int res = TRUE, deep = 0, normal_mode;
- while (*tok_start != 0)
- {
- //---
- while (*tok_start == ',') tok_start++;
- //---
- if (*tok_start == '!') { tok_start++; normal_mode = FALSE; }
- else normal_mode = TRUE;
- //---
- char *tok_end = tok_start;
- while (*tok_end != ',' && *tok_end != 0) tok_end++;
- end = *tok_end; *tok_end = NULL;
- //---
- char *tp = tok_start;
- const char *gp = group;
- char *prev = NULL;
- res = TRUE;
- while (tp != tok_end && *gp != NULL)
- {
- if (*tp == '*')
- {
- deep = 0;
- if ((res = CheckTemplate(tp, tok_end, gp, prev, &deep)) == TRUE)
- {
- *tok_end = end;
- return(normal_mode);
- }
- break;
- }
- if (*tp != *gp)
- {
- *tok_end = end;
- res = FALSE;
- break;
- }
- tp++;
- gp++;
- }
- *tok_end = end;
- if (*gp == NULL && (tp == tok_end || *tp == '*') && res == TRUE) return(normal_mode);
- if (*tok_end == 0) break;
- tok_start = tok_end + 1;
- }
- return(FALSE);
- }
- inline int CheckGroup(wchar_t* grouplist, const wchar_t *group)
- {
- //---
- if (grouplist == NULL || group == NULL) return(FALSE);
- wchar_t *tok_start = grouplist, end;
- int res = TRUE, deep = 0, normal_mode;
- while (*tok_start != 0)
- {
- //---
- while (*tok_start == L',') tok_start++;
- //---
- if (*tok_start == L'!') { tok_start++; normal_mode = FALSE; }
- else normal_mode = TRUE;
- //---
- wchar_t *tok_end = tok_start;
- while (*tok_end != L',' && *tok_end != 0) tok_end++;
- end = *tok_end; *tok_end = NULL;
- //---
- wchar_t *tp = tok_start;
- const wchar_t *gp = group;
- wchar_t *prev = NULL;
- res = TRUE;
- while (tp != tok_end && *gp != NULL)
- {
- if (*tp == L'*')
- {
- deep = 0;
- if ((res = CheckTemplate(tp, tok_end, gp, prev, &deep)) == TRUE)
- {
- *tok_end = end;
- return(normal_mode);
- }
- break;
- }
- if (*tp != *gp)
- {
- *tok_end = end;
- res = FALSE;
- break;
- }
- tp++;
- gp++;
- }
- *tok_end = end;
- if (*gp == NULL && (tp == tok_end || *tp == L'*') && res == TRUE) return(normal_mode);
- if (*tok_end == 0) break;
- tok_start = tok_end + 1;
- }
- return(FALSE);
- }
|