summaryrefslogtreecommitdiff
path: root/src/inspircd_io.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/inspircd_io.cpp')
-rw-r--r--src/inspircd_io.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/inspircd_io.cpp b/src/inspircd_io.cpp
index 18bee1f18..c69ba3b17 100644
--- a/src/inspircd_io.cpp
+++ b/src/inspircd_io.cpp
@@ -220,6 +220,92 @@ int EnumConf(std::stringstream *config, const char* tag)
return idx;
}
+/* Counts the number of values within a certain tag */
+
+int EnumValues(std::stringstream *config, const char* tag, int index)
+{
+ int ptr = 0;
+ char buffer[MAXBUF], c_tag[MAXBUF], c, lastc;
+ int in_token, in_quotes, tptr, j, idx = 0;
+ char* key;
+
+ bool correct_tag = false;
+ int num_items = 0;
+
+ const char* buf = config->str().c_str();
+ long bptr = 0;
+ long len = strlen(buf);
+
+ ptr = 0;
+ in_token = 0;
+ in_quotes = 0;
+ lastc = '\0';
+ while (bptr<len)
+ {
+ lastc = c;
+ c = buf[bptr++];
+ if ((c == '#') && (lastc == '\n'))
+ {
+ while ((c != '\n') && (bptr<len))
+ {
+ lastc = c;
+ c = buf[bptr++];
+ }
+ }
+ if ((c == '<') && (!in_quotes))
+ {
+ tptr = 0;
+ in_token = 1;
+ do {
+ c = buf[bptr++];
+ if (c != ' ')
+ {
+ c_tag[tptr++] = c;
+ c_tag[tptr] = '\0';
+
+ if ((!strcmp(c_tag,tag)) && (idx == index))
+ {
+ correct_tag = true;
+ }
+ }
+ } while (c != ' ');
+ }
+ if (c == '"')
+ {
+ in_quotes = (!in_quotes);
+ }
+
+ if ( (correct_tag) && (!in_quotes) && ( (c == ' ') || (c == '\n') || (c == '\r') ) )
+ {
+ num_items++;
+ }
+ if ((c == '>') && (!in_quotes))
+ {
+ in_token = 0;
+ if (correct_tag)
+ correct_tag = false;
+ if (!strcmp(c_tag,tag))
+ {
+ /* correct tag, but wrong index */
+ idx++;
+ }
+ c_tag[0] = '\0';
+ buffer[0] = '\0';
+ ptr = 0;
+ tptr = 0;
+ }
+ if (c != '>')
+ {
+ if ((in_token) && (c != '\n') && (c != '\r'))
+ {
+ buffer[ptr++] = c;
+ buffer[ptr] = '\0';
+ }
+ }
+ }
+ return num_items+1;
+}
+
int ConfValueEnum(char* tag, std::stringstream* config)