commit 04cc161cccd311227cc8e4fd1d1890b6ccc7d944
Author: David Sorber <david.sorber@gmail.com>
Date:   Mon Feb 1 18:41:30 2016 -0500

    Adding configuration for saga and compeltely unrelated preproc script.

diff --git a/configs/saga/main.conf b/configs/saga/main.conf
new file mode 100644
index 0000000..35b0f0a
--- /dev/null
+++ b/configs/saga/main.conf
@@ -0,0 +1,34 @@
+<VirtualHost *:80>
+        Redirect permanent / https://10.0.0.3
+</VirtualHost>
+<VirtualHost _default_:443>
+        ServerName https://10.0.0.3:443
+        ServerAdmin webmaster@localhost
+        DocumentRoot /var/www
+        <Directory />
+                Options FollowSymLinks
+                AllowOverride None
+        </Directory>
+        <Directory /var/www/>
+                Options Indexes FollowSymLinks MultiViews
+                AllowOverride None
+                Require all granted
+        </Directory>
+        Alias /htdocs /var/htdocs
+        <Directory /var/htdocs>
+                Require all granted
+        </Directory>
+
+        #ErrorDocument 403 /error_pages/404.html
+        #ErrorDocument 404 /error_pages/404.html
+        CustomLog ${APACHE_LOG_DIR}/access.log combined
+        ErrorLog ${APACHE_LOG_DIR}/error.log
+        # Possible values include: debug, info, notice, warn, error, crit,
+        # alert, emerg.
+        LogLevel warn
+        SSLEngine On
+        SSLCertificateFile /etc/apache2/ssl/saga.crt
+        SSLCertificateKeyFile /etc/apache2/ssl/saga.key
+        SSLProtocol -all +TLSv1.2
+        SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
+</VirtualHost>
\ No newline at end of file
diff --git a/configs/saga/saga.crt b/configs/saga/saga.crt
new file mode 100755
index 0000000..eb2189e
--- /dev/null
+++ b/configs/saga/saga.crt
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFyzCCA7OgAwIBAgIJAPQks25IlADLMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNV
+BAYTAlVTMQswCQYDVQQIDAJNRDEUMBIGA1UEBwwLVGFrb21hIFBhcmsxGjAYBgNV
+BAoMEVdheW5lIEVudGVycHJpc2VzMR8wHQYDVQQLDBZFbmdpbmVlcmluZyBEZXBh
+cnRtZW50MQ0wCwYDVQQDDARzYWdhMB4XDTE2MDIwMTIyNTYzNVoXDTIxMDEzMDIy
+NTYzNVowfDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1EMRQwEgYDVQQHDAtUYWtv
+bWEgUGFyazEaMBgGA1UECgwRV2F5bmUgRW50ZXJwcmlzZXMxHzAdBgNVBAsMFkVu
+Z2luZWVyaW5nIERlcGFydG1lbnQxDTALBgNVBAMMBHNhZ2EwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQCtEQ0jIOV1/pBW4LThRqR2H02eayhZ5IRKhNWz
+C4ToGyyYXU8MQresByYEjSsjaLsFw2vyZOD19kNF634GsSgu8PALpCnoLeabXrHQ
+hxfFplHUGjZMSS2kspcKkcUjoPWbnanzeNzH2Ty3opfa5TivlLiPxDxSQ8X+BJRg
+/2nMe2i+islYQvaFphyRAM6wq8UglT8D++28qXYV4TKUI8ie1k/6RqHnT+dYqm3+
+TycwYuhWPA0TyaVsddyBSvr0/PcBjTnjuhdzVpO3kJFdzwjVNyVJObVZZhgNfBjW
+Ps6eAdL6JPL++h4Rh6zIXFc/CwZDf/uBOIMJXsED3sWxtoKqWDZkatApMABq2Lll
+s5XYdtqTS73iFJKnh1YnGz5In7Kb00pHdPsFmKtOA4QN0H5K+LlGLroKFjXtgU55
+rjBnQ8zQpLkdwo0CUUDbFYaa1T/Zb4wzzyqqGf7wa1L6689Kd6R2nQ/ObwTpW/s4
+VriCfwtkqJAUjMEjLpdu/twHaOOqc0X+rJzAJcYdvlCTMb8Qq6yRifkPHhM7YqZ5
+c2TbxLodN8p5mY5UsYM4EI9AY1YI70+oy2EBj2mfyx1crYIcHTInK5y3xgH6eysW
+3/dYxXhoUABUb1H95FjV5oQWY7IrqCtuPWv2TOypbQM1apP3QHxps0ggkBMkjVCB
+ug4fdQIDAQABo1AwTjAdBgNVHQ4EFgQUbBYC0TjzkUHjYad05m/FBYbQEX4wHwYD
+VR0jBBgwFoAUbBYC0TjzkUHjYad05m/FBYbQEX4wDAYDVR0TBAUwAwEB/zANBgkq
+hkiG9w0BAQsFAAOCAgEATxf7eFh6AjxfqCevRs4PJ3Z2N1x1vOSGpH/prkRVID/g
+6ef2vXJkodAhhp8W+tI2r3EIZ5A1URbbZ7nRytnxZHz1HWn+YjN35EFryEaCiUwq
+B3PJITe/mVXmmp6DP34sXOjiBNK5Qaz11pE7uSiS6wxbAdUuigfLuwk65r8rRIQc
+an6Tqesr80zpUic9szsQo00nPcBxVy4CB6BzEUpeCCiFZFYM2zxYTllnTQCWQLmJ
+Gc/taKNHxRazbJaiuzssuHqsOzThsw+Nf1Tzx3smX5SiuytrtaNKNKoNstv+mEX9
+JJreBSsAhnYBxJegmfWRQArMrQzhWQxQJnCmV0ZVVOFuUk0I7w6s0NRgxH/Pz6Za
+wMagA6kREbi57H4ySv0/qQpRHywj0rjaImgKjqGWMpl8nTieUjcJpW7XpRSJd5+l
+o4hdwgOMwr9MS74VGB2MkIS0s4Zlkrgia4Ck3OQdpSc0ivYs2G2BkvublIIU77fO
+DMS/2RCBBdnerKEj5s3Cux/NRKZ6+oXBOHKPWKuOZeJVmPG1ZefOwNpEEBLIxMHp
+6rNDBq5FqUzfMpip0hbCqd9bP10kmh68I+jgtGXgs0JvUSTH1fnfzt46wrcEbwDk
+AjgLR1HjbDjM6YBilUMJ4/9Nwq3Tm9Xd6VZyyI3RAIPdtA1DDe7XxEZU31OHG9k=
+-----END CERTIFICATE-----
diff --git a/configs/saga/saga.key b/configs/saga/saga.key
new file mode 100755
index 0000000..e66a857
--- /dev/null
+++ b/configs/saga/saga.key
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+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
+Ey17uwxmU+OXqtN8ya06/K8Hy5gSnQ==
+-----END PRIVATE KEY-----
diff --git a/software/misc/preproc.py b/software/misc/preproc.py
new file mode 100644
index 0000000..e1c5b6a
--- /dev/null
+++ b/software/misc/preproc.py
@@ -0,0 +1,78 @@
+import sys
+
+from clang.cindex import Config
+from clang.cindex import CursorKind
+from clang.cindex import Index
+from clang.cindex import TranslationUnit
+
+# Set these according to the location and version of libclang on your system
+LIBCLANG_PATH = '/usr/lib/llvm-3.4/lib'
+LIBCLANG_NAME = 'libclang-3.4.so'
+
+
+def display_node(node):
+    """ A helper function to pretty print the particulars of the passed in
+    Cursor object
+    """
+    start_line = node.extent.start.line
+    start_col = node.extent.start.column
+    end_line = node.extent.end.line
+    end_col = node.extent.end.column
+    print '{:s} ({:d}:{:d} - {:d}:{:d})'.format(node.displayname, 
+                                                start_line, start_col,
+                                                end_line, end_col)
+
+def find_function_calls(node):
+    """ A recursive function call to find all function calls that are children 
+    of the passed in Cursor object
+    """
+    results = []
+    for child_node in node.get_children():
+        if child_node.kind == CursorKind.CALL_EXPR:
+            results.append(child_node)
+        else:
+            results.extend(find_function_calls(child_node))
+    return results   
+
+def main():
+    """ This is a very simple utility that uses the Clang compiler frontend
+    to parse a C source file and return a list of function declarations within
+    that file along with the lines on which each declaration starts and ends.
+    """
+    
+    if len(sys.argv) < 2:
+        print 'ERROR: not enough arguments provided\n'
+        print 'USAGE: python ddc_preproc.py <file.c>'
+        return -1
+    
+    # Configure the library (not sure why this has to be done manually)
+    Config.set_library_path(LIBCLANG_PATH)
+    Config.set_library_file(LIBCLANG_NAME)
+    
+    # Build the TU from the passed file argument
+    source_file = sys.argv[1]
+    tu = TranslationUnit.from_source(source_file)
+
+    # Loop through all of the children nodes and extract function definitions
+    # along with their start and end lines from the specified source file
+    print 'Function declarations:'
+    print '-' * 80
+    main_func = None
+    for child in tu.cursor.get_children():
+        if str(child.location.file) == source_file and \
+           child.kind == CursorKind.FUNCTION_DECL:
+            # Store a reference to the main function 
+            if child.spelling == 'main':
+                main_func = child
+            display_node(child)    
+    print '\n'
+    
+    # Find all function calls originating from the main function 
+    print 'Function calls:'
+    print '-' * 80
+    for child in find_function_calls(main_func):
+        display_node(child)
+    
+
+if __name__ == '__main__':
+    sys.exit(main())
