Fixed bug 12931
[pspp] / src / command.c
index 86f776ae643464d38d7c68b72bcac42d15a6b06e..0e5d9d6376f8b4a55a9a31e5e4d9114b3df3f381 100644 (file)
@@ -14,8 +14,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA. */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
 
 #include <config.h>
 #include "error.h"
@@ -27,6 +27,7 @@
 #include "alloc.h"
 #include "dictionary.h"
 #include "error.h"
+#include "glob.h"
 #include "getline.h"
 #include "lexer.h"
 #include "main.h"
@@ -63,20 +64,24 @@ struct command
     int (*func) (void);                /* Function to call. */
     int skip_entire_name;       /* If zero, we don't skip the
                                    final token in the command name. */
+    short debug;                /* Set if this cmd available only in test mode*/
   };
 
 /* Define the command array. */
 #define DEFCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 1},
+       {NAME, {T1, T2, T3, T4}, FUNC, 1, 0},
+#define DBGCMD(NAME, T1, T2, T3, T4, FUNC)             \
+       {NAME, {T1, T2, T3, T4}, FUNC, 1, 1},
 #define SPCCMD(NAME, T1, T2, T3, T4, FUNC)             \
-       {NAME, {T1, T2, T3, T4}, FUNC, 0},
-#define UNIMPL(NAME, T1, T2, T3, T4)                   \
-       {NAME, {T1, T2, T3, T4}, NULL, 1},
+       {NAME, {T1, T2, T3, T4}, FUNC, 0, 0},
+#define UNIMPL(NAME, T1, T2, T3, T4, DESC)             \
+       {NAME, {T1, T2, T3, T4}, NULL, 1, 0},
 static const struct command commands[] = 
   {
 #include "command.def"
   };
 #undef DEFCMD
+#undef DBGCMD
 #undef UNIMPL
 
 
@@ -99,7 +104,7 @@ pspp_completion_function (const char *text,   int state)
 
       cmd = &commands[state + skip];
   
-      if ( cmd->transition[pgm_state] == STATE_ERROR ) 
+      if ( cmd->transition[pgm_state] == STATE_ERROR || ( cmd->debug  &&  ! test_mode ) 
        {
          skip++; 
          continue;
@@ -178,7 +183,7 @@ cmd_parse (void)
     return CMD_SUCCESS;
 
   /* Parse comments. */
-  if ((token == T_ID && !strcmp (tokid, "COMMENT"))
+  if ((token == T_ID && !strcasecmp (tokid, "COMMENT"))
       || token == T_EXP || token == '*' || token == '[')
     {
       lex_skip_comment ();
@@ -276,7 +281,7 @@ match_strings (const char *a, size_t a_len,
   while (a_len > 0 && b_len > 0) 
     {
       /* Mismatch always returns zero. */
-      if (*a++ != *b++)
+      if (toupper ((unsigned char) *a++) != toupper ((unsigned char) *b++))
         return 0;
 
       /* Advance. */
@@ -336,14 +341,14 @@ conflicting_3char_prefixes (const char *a, const char *b)
   assert (aw != NULL && bw != NULL);
 
   /* Words that are the same don't conflict. */
-  if (aw_len == bw_len && !memcmp (aw, bw, aw_len))
+  if (aw_len == bw_len && !mm_case_compare (aw, bw, aw_len))
     return 0;
   
   /* Words that are otherwise the same in the first three letters
      do conflict. */
   return ((aw_len > 3 && bw_len > 3)
           || (aw_len == 3 && bw_len > 3)
-          || (bw_len == 3 && aw_len > 3)) && !memcmp (aw, bw, 3);
+          || (bw_len == 3 && aw_len > 3)) && !mm_case_compare (aw, bw, 3);
 }
 
 /* Returns nonzero if CMD can be confused with another command
@@ -385,7 +390,7 @@ cmd_match_words (const struct command *cmd,
        word != NULL && word_idx < word_cnt;
        word = find_word (word + word_len, &word_len), word_idx++)
     if (word_len != strlen (words[word_idx])
-        || memcmp (word, words[word_idx], word_len))
+        || mm_case_compare (word, words[word_idx], word_len))
       {
         size_t match_chars = match_strings (word, word_len,
                                             words[word_idx],
@@ -543,6 +548,8 @@ parse_command_name (void)
             {
               if (command->skip_entire_name)
                 lex_get ();
+             if ( command->debug & !test_mode ) 
+               goto error;
               free_words (words, word_cnt);
               return command;
             }
@@ -586,10 +593,14 @@ parse_command_name (void)
           free (words[word_cnt]);
         }
 
+      if ( command->debug && !test_mode ) 
+       goto error;
+
       free_words (words, word_cnt);
       return command;
     }
 
+error:
   unknown_command_error (words, word_cnt);
   free_words (words, word_cnt);
   return NULL;