Item file parsing :)
authorJohn Hodge <[email protected]>
Sat, 20 Nov 2010 07:47:58 +0000 (15:47 +0800)
committerJohn Hodge <[email protected]>
Sat, 20 Nov 2010 07:47:58 +0000 (15:47 +0800)
- Added --itemfile to change the item file from the default
- Used the POSIX regex library to parse the item file
- Random cleanups

items.cfg [new file with mode: 0644]
itemsfile.txt
server/src/Makefile
server/src/itemdb.c
server/src/main.c
server/src/server.c

diff --git a/items.cfg b/items.cfg
new file mode 100644 (file)
index 0000000..aa381cd
--- /dev/null
+++ b/items.cfg
@@ -0,0 +1,13 @@
+
+# Drinks
+drink  0       70      Lemonade
+drink  1       71      solo++
+drink  2       70      Solo
+drink  3       70      Orange Foo
+drink  4       255     V Black
+drink  5       101     Coke Zero
+drink  6       96      Coke
+
+# Pseudo items
+pseudo 0       128     clue    # clue.flac
+pseudo 0       10      laserprint      # print 10 pages
index 69ee2d2..cbad61c 100644 (file)
@@ -10,7 +10,7 @@ comments are allowed anywhere on a line and act until the end of the line.
 
 For example, a coke could be
        drink   06      96      Coke
-A pseudo-item could le
+A pseudo-item could be
        pseudo  01      10      Laserprint
 Or a snack
        snack   64      128     Mars Bar
index 3fee2f0..256ba42 100644 (file)
@@ -5,9 +5,9 @@ OBJ := main.o server.o logging.o
 OBJ += dispense.o cokebank.o itemdb.o
 BIN := ../dispsrv
 
-LINKFLAGS := 
+LINKFLAGS := -g
 CPPFLAGS := 
-CFLAGS := -Wall
+CFLAGS := -Wall -g
 
 .PHONY: all clean
 
index 01f801e..0ddcbf7 100644 (file)
@@ -12,6 +12,7 @@
 #include <string.h>
 #include <ctype.h>
 #include "common.h"
+#include <regex.h>
 
 // === GLOBALS ===
  int   giNumItems = 0;
@@ -33,7 +34,22 @@ void Load_Itemlist(void)
        char    buffer[BUFSIZ];
        char    *line;
         int    lineNum = 0;
+        int    i;
+       regex_t regex;
+       regmatch_t      matches[5];
        
+       i = regcomp(&regex, "^([a-zA-Z][a-zA-Z0-9]*)\\s+([0-9]+)\\s+([0-9]+)\\s+(.*)", REG_EXTENDED);
+       //i = regcomp(&regex, "\\(\\d+\\)", 0);//\\s+([0-9]+)\\s+([0-9]+)\\s+(.*)", 0);
+       if( i )
+       {
+               size_t  len = regerror(i, &regex, NULL, 0);
+               char    *errorStr = malloc(len);
+               regerror(i, &regex, errorStr, len);
+               fprintf(stderr, "Rexex compilation failed - %s\n", errorStr);
+               free(errorStr);
+               exit(-1);
+       }
+
        // Error check
        if(!fp) {
                fprintf(stderr, "Unable to open item file '%s'\n", gsItemListFile);
@@ -43,8 +59,9 @@ void Load_Itemlist(void)
        while( fgets(buffer, BUFSIZ, fp) )
        {
                char    *tmp;
-               char    *type, *num, *price, *desc;
-               
+               char    *type, *desc;
+                int    num, price;
+
                lineNum ++;
 
                // Remove comments
@@ -56,31 +73,27 @@ void Load_Itemlist(void)
                // Trim whitespace
                line = trim(buffer);
                
-               // Parse Line
-               // - Type
-               type = line;
-               // - Number
-               num = strchr(type, ' ');
-               if(num) {
-                       while(*num == ' ' || *num == '\t')      num ++;
-               }
-               else {
-                       fprintf(stderr, "Syntax error on line %i of item file\n", lineNum);
-                       continue;
-               }
-               // - Price
-               price = strchr(num, ' ');
-               if( price ) {
-                       while(*num == ' ' || *num == '\t')      num ++;
-               }
-               else {
-                       fprintf(stderr, "Syntax error on line %i of item file\n", lineNum);
-                       continue;
+               if(strlen(line) == 0)   continue;
+               
+               // Pass regex over line
+               if( (i = regexec(&regex, line, 5, matches, 0)) ) {
+                       size_t  len = regerror(i, &regex, NULL, 0);
+                       char    *errorStr = malloc(len);
+                       regerror(i, &regex, errorStr, len);
+                       fprintf(stderr, "Syntax error on line %i of item file '%s'\n%s", lineNum, gsItemListFile, errorStr);
+                       free(errorStr);
+                       exit(-1);
                }
-               // - Name/Description
-               desc = strchr(price, ' ');
-       }
-       
+
+               // Read line data
+               type  = line + matches[1].rm_so;        line[ matches[1].rm_eo ] = '\0';
+               num   = atoi( line + matches[2].rm_so );
+               price = atoi( line + matches[3].rm_so );
+               desc  = line + matches[4].rm_so;
+               
+
+               printf("Item '%s' - %i cents, %s:%i\n", desc, price, type, num);
+       }       
 }
 
 char *trim(char *__str)
index 969ac43..daf209f 100644 (file)
@@ -9,13 +9,15 @@
  */
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 #include "common.h"
 
 // === IMPORTS ===
-extern void    Init_Cokebank(void);
+extern void    Init_Cokebank(void);    // cokebank.c
 extern void    Load_Itemlist(void);
 extern void    Server_Start(void);
 extern int     giServer_Port;
+extern char    *gsItemListFile;
 
 // === GLOBALS ===
  int   giDebugLevel = 0;
@@ -29,7 +31,7 @@ int main(int argc, char *argv[])
        for( i = 1; i < argc; i++ )
        {
                char    *arg = argv[i];
-               if( arg[0] == '-' )
+               if( arg[0] == '-' && arg[1] != '-')
                {
                        switch(arg[1])
                        {
@@ -44,6 +46,14 @@ int main(int argc, char *argv[])
                                break;
                        }
                }
+               else if( arg[0] == '-' && arg[1] == '-' ) {
+                       if( strcmp(arg, "--itemsfile") == 0 ) {
+                               gsItemListFile = argv[++i];
+                       }
+                       else {
+                               // Usage error?
+                       }
+               }
                else {
                        // Usage Error?
                }
index 7f0debb..6bf0434 100644 (file)
@@ -241,7 +241,7 @@ char *Server_ParseClientCommand(tClient *Client, char *CommandString)
                        return gaServer_Commands[i].Function(Client, args);
        }
        
-       return strdup("400      Unknown Command\n");
+       return strdup("400 Unknown Command\n");
 }
 
 // ---

UCC git Repository :: git.ucc.asn.au