Add rudimentary README.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 11 Apr 2013 23:56:12 +0000 (01:56 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 11 Apr 2013 23:56:12 +0000 (01:56 +0200)
Makefile
README [new file with mode: 0644]
main.cpp
parse.cpp
parse.h

index bc3511a..f99e226 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@ PROTOC=protoc
 CXXFLAGS=-Wall -O2 -g
 LDLIBS=-lpthread -lprotobuf
 
-OBJS=main.o server.o serverpool.o mutexlock.o input.o httpinput.o udpinput.o parse.o markpool.o acceptor.o stats.o thread.o state.pb.o
+OBJS=main.o server.o serverpool.o mutexlock.o input.o httpinput.o udpinput.o parse.o config.o markpool.o acceptor.o stats.o thread.o state.pb.o
 
 all: cubemap
 
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..06c1c64
--- /dev/null
+++ b/README
@@ -0,0 +1,7 @@
+Cubemap is a high-performance, high-availaility video reflector,
+specifically made for use with VLC.
+
+Copyright 2013 Steinar H. Gunderson <sgunderson@bigfoot.com>.
+Licensed under the GNU GPL, version 2.
+
+More information to come here, later. :-)
index d77fb2e..907be07 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -19,6 +19,7 @@
 #include <set>
 
 #include "acceptor.h"
+#include "config.h"
 #include "markpool.h"
 #include "metacube.h"
 #include "parse.h"
index d8706d3..eed7d19 100644 (file)
--- a/parse.cpp
+++ b/parse.cpp
@@ -58,120 +58,6 @@ vector<string> split_lines(const string &str)
        return ret;
 }
 
-vector<ConfigLine> parse_config(const string &filename)
-{
-       vector<ConfigLine> ret;
-
-       FILE *fp = fopen(filename.c_str(), "r");
-       if (fp == NULL) {
-               perror(filename.c_str());
-               exit(1);
-       }
-
-       char buf[4096];
-       while (!feof(fp)) {
-               if (fgets(buf, sizeof(buf), fp) == NULL) {
-                       break;
-               }
-
-               // Chop off the string at the first #, \r or \n.
-               buf[strcspn(buf, "#\r\n")] = 0;
-
-               // Remove all whitespace from the end of the string.
-               size_t len = strlen(buf);
-               while (len > 0 && isspace(buf[len - 1])) {
-                       buf[--len] = 0;
-               }
-
-               // If the line is now all blank, ignore it.
-               if (len == 0) {
-                       continue;
-               }
-
-               vector<string> tokens = split_tokens(buf);
-               assert(!tokens.empty());
-               
-               ConfigLine line;
-               line.keyword = tokens[0];
-
-               for (size_t i = 1; i < tokens.size(); ++i) {
-                       // foo=bar is a parameter; anything else is an argument.
-                       size_t equals_pos = tokens[i].find_first_of('=');
-                       if (equals_pos == string::npos) {
-                               line.arguments.push_back(tokens[i]);
-                       } else {
-                               string key = tokens[i].substr(0, equals_pos);
-                               string value = tokens[i].substr(equals_pos + 1, string::npos);
-                               line.parameters.insert(make_pair(key, value));
-                       }
-               }
-
-               ret.push_back(line);
-       }
-
-       fclose(fp);
-       return ret;
-}
-
-string fetch_config_string(const vector<ConfigLine> &config, const string &keyword,
-                           ParameterType parameter_type, const string &default_value)
-{
-       assert(parameter_type == PARAMATER_MANDATORY || parameter_type == PARAMETER_OPTIONAL);
-       for (unsigned i = 0; i < config.size(); ++i) {
-               if (config[i].keyword != keyword) {
-                       continue;
-               }
-               if (config[i].parameters.size() > 0 ||
-                   config[i].arguments.size() != 1) {
-                       fprintf(stderr, "ERROR: '%s' takes one argument and no parameters\n", keyword.c_str());
-                       exit(1);
-               }
-               return config[i].arguments[0];
-       }
-       if (parameter_type == PARAMATER_MANDATORY) {
-               fprintf(stderr, "ERROR: Missing '%s' statement in config file.\n",
-                       keyword.c_str());
-               exit(1);
-       } else {
-               return default_value;
-       }
-}
-
-int fetch_config_int(const std::vector<ConfigLine> &config, const std::string &keyword,
-                     int min_limit, int max_limit,
-                     ParameterType parameter_type, int default_value)
-{
-       assert(parameter_type == PARAMATER_MANDATORY || parameter_type == PARAMETER_OPTIONAL);
-       bool value_found = false;
-       int value = -1;
-       for (unsigned i = 0; i < config.size(); ++i) {
-               if (config[i].keyword != keyword) {
-                       continue;
-               }
-               if (config[i].parameters.size() > 0 ||
-                   config[i].arguments.size() != 1) {
-                       fprintf(stderr, "ERROR: '%s' takes one argument and no parameters\n", keyword.c_str());
-                       exit(1);
-               }
-               value_found = true;
-               value = atoi(config[i].arguments[0].c_str());  // TODO: verify int validity.
-       }
-       if (!value_found) {
-               if (parameter_type == PARAMETER_OPTIONAL) {
-                       return default_value;
-               }
-               fprintf(stderr, "ERROR: Missing '%s' statement in config file.\n",
-                       keyword.c_str());
-               exit(1);
-       }
-       if (value < min_limit || value > max_limit) {
-               fprintf(stderr, "ERROR: '%s' is set to %d, must be in [%d,%d]\n",
-                       keyword.c_str(), value, min_limit, max_limit);
-               exit(1);
-       }
-       return value;
-}
-
 #define MAX_REQUEST_SIZE 16384  /* 16 kB. */
 
 RequestParseStatus wait_for_double_newline(string *existing_data, const char *new_data, size_t new_data_size)
diff --git a/parse.h b/parse.h
index 3cfa091..6912dd9 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -1,40 +1,17 @@
 #ifndef _PARSE_H
 #define _PARSE_H
 
-// Various routines that deal with parsing; both configuration files and HTTP requests.
+// Various routines that deal with parsing; both HTTP requests and more generic text.
 
-#include <map>
 #include <vector>
 #include <string>
 
-struct ConfigLine {
-       std::string keyword;
-       std::vector<std::string> arguments;
-       std::map<std::string, std::string> parameters;
-};
-
 // Split a line on whitespace, e.g. "foo  bar baz" -> {"foo", "bar", "baz"}.
 std::vector<std::string> split_tokens(const std::string &line);
 
 // Split a string on \n or \r\n, e.g. "foo\nbar\r\n\nbaz\r\n\r\n" -> {"foo", "bar", "baz"}.
 std::vector<std::string> split_lines(const std::string &str);
 
-// Parse the configuration file.
-std::vector<ConfigLine> parse_config(const std::string &filename);
-
-enum ParameterType {
-       PARAMETER_OPTIONAL,
-       PARAMATER_MANDATORY,
-};
-
-std::string fetch_config_string(const std::vector<ConfigLine> &config, const std::string &keyword,
-                                ParameterType parameter_type, const std::string &default_value = "");
-
-// Note: Limits are inclusive.
-int fetch_config_int(const std::vector<ConfigLine> &config, const std::string &keyword,
-                     int min_limit, int max_limit,
-                     ParameterType parameter_type, int default_value = -1);
-
 // Add the new data to an existing string, looking for \r\n\r\n
 // (typical of HTTP requests and/or responses). Will return one
 // of the given statuses.