about summary refs log tree commit diff stats
path: root/src/command
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2013-07-11 22:57:35 +0100
committerJames Booth <boothj5@gmail.com>2013-07-11 22:57:35 +0100
commit36265dde2fd70f994bc8ee2b2cdff9a398ceff1d (patch)
tree4df05c0207d07e8aa4a16aa73c5f2b05ee46677d /src/command
parent907beb55f6dba952b6b07579c919fad251b7a0c0 (diff)
downloadprofani-tty-36265dde2fd70f994bc8ee2b2cdff9a398ceff1d.tar.gz
Moved functions to parser.c, moved parser to tools
Diffstat (limited to 'src/command')
-rw-r--r--src/command/command.c2
-rw-r--r--src/command/parser.c273
-rw-r--r--src/command/parser.h31
3 files changed, 1 insertions, 305 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 63d003f4..60fe6d6d 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -30,7 +30,6 @@
 #include "chat_session.h"
 #include "command/command.h"
 #include "command/history.h"
-#include "command/parser.h"
 #include "common.h"
 #include "config/accounts.h"
 #include "config/preferences.h"
@@ -41,6 +40,7 @@
 #include "muc.h"
 #include "profanity.h"
 #include "tools/autocomplete.h"
+#include "tools/parser.h"
 #include "tools/tinyurl.h"
 #include "ui/ui.h"
 #include "xmpp/xmpp.h"
diff --git a/src/command/parser.c b/src/command/parser.c
deleted file mode 100644
index d7dfebab..00000000
--- a/src/command/parser.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * parser.c
- *
- * Copyright (C) 2012, 2013 James Booth <boothj5@gmail.com>
- *
- * This file is part of Profanity.
- *
- * Profanity is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Profanity is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Profanity.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <glib.h>
-
-/*
- * Take a full line of input and return an array of strings representing
- * the arguments of a command.
- * If the number of arguments found is less than min, or more than max
- * NULL is returned.
- *
- * inp - The line of input
- * min - The minimum allowed number of arguments
- * max - The maxmimum allowed number of arguments
- *
- * Returns - An NULL terminated array of strings representing the aguments
- * of the command, or NULL if the validation fails.
- *
- * E.g. the following input line:
- *
- * /cmd arg1 arg2
- *
- * Will return a pointer to the following array:
- *
- * { "arg1", "arg2", NULL }
- *
- */
-gchar **
-parse_args(const char * const inp, int min, int max)
-{
-    if (inp == NULL) {
-        return NULL;
-    }
-
-    // copy and strip input of leading/trailing whitepsace
-    char *copy = strdup(inp);
-    g_strstrip(copy);
-
-    int inp_size = strlen(copy);
-    gboolean in_token = FALSE;
-    gboolean in_quotes = FALSE;
-    char *token_start = &copy[0];
-    int token_size = 0;
-    GSList *tokens = NULL;
-
-    // add tokens to GSList
-    int i;
-    for (i = 0; i <= inp_size; i++) {
-        if (!in_token) {
-            if (copy[i] == ' ') {
-                continue;
-            } else {
-                in_token = TRUE;
-                if (copy[i] == '"') {
-                    in_quotes = TRUE;
-                    i++;
-                }
-                token_start = &copy[i];
-                token_size++;
-            }
-        } else {
-            if (in_quotes) {
-                if ((copy[i] == '\0') || (copy[i] == '"')) {
-                    tokens = g_slist_append(tokens, g_strndup(token_start,
-                        token_size));
-                    token_size = 0;
-                    in_token = FALSE;
-                    in_quotes = FALSE;
-                } else {
-                    token_size++;
-                }
-            } else {
-                if (copy[i] == ' ' || copy[i] == '\0') {
-                    tokens = g_slist_append(tokens, g_strndup(token_start,
-                        token_size));
-                    token_size = 0;
-                    in_token = FALSE;
-                } else {
-                    token_size++;
-                }
-            }
-        }
-    }
-
-    int num = g_slist_length(tokens) - 1;
-
-    // if num args not valid return NULL
-    if ((num < min) || (num > max)) {
-        g_slist_free_full(tokens, free);
-        g_free(copy);
-        return NULL;
-
-    // if min allowed is 0 and 0 found, return empty char* array
-    } else if (min == 0 && num == 0) {
-        g_slist_free_full(tokens, free);
-        gchar **args = malloc((num + 1) * sizeof(*args));
-        args[0] = NULL;
-        g_free(copy);
-        return args;
-
-    // otherwise return args array
-    } else {
-        gchar **args = malloc((num + 1) * sizeof(*args));
-        GSList *token = tokens;
-        token = g_slist_next(token);
-        int arg_count = 0;
-
-        while (token != NULL) {
-            args[arg_count++] = strdup(token->data);
-            token = g_slist_next(token);
-        }
-
-        args[arg_count] = NULL;
-        g_slist_free_full(tokens, free);
-        g_free(copy);
-
-        return args;
-    }
-}
-
-/*
- * Take a full line of input and return an array of strings representing
- * the arguments of a command.  This function handles when the last parameter
- * to the command is free text e.g.
- *
- * /msg user@host here is a message
- *
- * If the number of arguments found is less than min, or more than max
- * NULL is returned.
- *
- * inp - The line of input
- * min - The minimum allowed number of arguments
- * max - The maxmimum allowed number of arguments
- *
- * Returns - An NULL terminated array of strings representing the aguments
- * of the command, or NULL if the validation fails.
- *
- * E.g. the following input line:
- *
- * /cmd arg1 arg2 some free text
- *
- * Will return a pointer to the following array:
- *
- * { "arg1", "arg2", "some free text", NULL }
- *
- */
-gchar **
-parse_args_with_freetext(const char * const inp, int min, int max)
-{
-    if (inp == NULL) {
-        return NULL;
-    }
-
-    // copy and strip input of leading/trailing whitepsace
-    char *copy = strdup(inp);
-    g_strstrip(copy);
-
-    int inp_size = strlen(copy);
-    gboolean in_token = FALSE;
-    gboolean in_freetext = FALSE;
-    gboolean in_quotes = FALSE;
-    char *token_start = &copy[0];
-    int token_size = 0;
-    int num_tokens = 0;
-    GSList *tokens = NULL;
-
-    // add tokens to GSList
-    int i;
-    for (i = 0; i <= inp_size; i++) {
-        if (!in_token) {
-            if (copy[i] == ' ') {
-                continue;
-            } else {
-                in_token = TRUE;
-                num_tokens++;
-                if (num_tokens == max + 1) {
-                    in_freetext = TRUE;
-                } else if (copy[i] == '"') {
-                    in_quotes = TRUE;
-                    i++;
-                }
-                if (copy[i] == '"') {
-                    token_start = &copy[i+1];
-                } else {
-                    token_start = &copy[i];
-                }
-                if (copy[i] != '"') {
-                    token_size++;
-                }
-            }
-        } else {
-            if (in_quotes) {
-                if ((copy[i] == '\0') || (copy[i] == '"')) {
-                    tokens = g_slist_append(tokens, g_strndup(token_start,
-                        token_size));
-                    token_size = 0;
-                    in_token = FALSE;
-                    in_quotes = FALSE;
-                } else {
-                    if (copy[i] != '"') {
-                        token_size++;
-                    }
-                }
-            } else {
-                if ((!in_freetext && copy[i] == ' ') || copy[i] == '\0') {
-                    tokens = g_slist_append(tokens, g_strndup(token_start,
-                        token_size));
-                    token_size = 0;
-                    in_token = FALSE;
-                } else {
-                    if (copy[i] != '"') {
-                        token_size++;
-                    }
-                }
-            }
-        }
-    }
-
-    int num = g_slist_length(tokens) - 1;
-
-    // if num args not valid return NULL
-    if ((num < min) || (num > max)) {
-        g_slist_free_full(tokens, free);
-        free(copy);
-        return NULL;
-
-    // if min allowed is 0 and 0 found, return empty char* array
-    } else if (min == 0 && num == 0) {
-        gchar **args = malloc((num + 1) * sizeof(*args));
-        args[0] = NULL;
-        return args;
-
-    // otherwise return args array
-    } else {
-        gchar **args = malloc((num + 1) * sizeof(*args));
-        GSList *token = tokens;
-        token = g_slist_next(token);
-        int arg_count = 0;
-
-        while (token != NULL) {
-            args[arg_count++] = strdup(token->data);
-            token = g_slist_next(token);
-        }
-
-        args[arg_count] = NULL;
-        g_slist_free_full(tokens, free);
-        free(copy);
-
-        return args;
-    }
-}
diff --git a/src/command/parser.h b/src/command/parser.h
deleted file mode 100644
index f191ed15..00000000
--- a/src/command/parser.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * parser.h
- *
- * Copyright (C) 2012, 2013 James Booth <boothj5@gmail.com>
- *
- * This file is part of Profanity.
- *
- * Profanity is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Profanity is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Profanity.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef PARSER_H
-#define PARSER_H
-
-#include <glib.h>
-
-gchar** parse_args(const char * const inp, int min, int max);
-gchar** parse_args_with_freetext(const char * const inp, int min, int max);
-
-#endif