Merged silc_1_0_branch to trunk.
[silc.git] / lib / silcutil / silcconfig.c
index 1f3e4699fdf79d20891961d4463f4b507dd69a73..03fb2a492e6ac0fdb0b8583580a6ff78ed268bb0 100644 (file)
@@ -2,9 +2,9 @@
 
   silcconfig.c
 
-  Author: Johnny Mnemonic <johnny@themnemonic.org>
+  Author: Giovanni Giacobbi <giovanni@giacobbi.net>
 
-  Copyright (C) 1997 - 2002 Pekka Riikonen
+  Copyright (C) 2002 - 2003 Giovanni Giacobbi
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -95,7 +95,7 @@ char *silc_config_strerror(int errnum)
 static void my_trim_spaces(SilcConfigFile *file)
 {
   register char *r = file->p;
-  while (isspace(*r))
+  while ((*r != '\0' && *r != EOF) && isspace(*r))
     if (*r++ == '\n') file->line++;
   file->p = r;
 }
@@ -103,8 +103,8 @@ static void my_trim_spaces(SilcConfigFile *file)
 static void my_skip_line(SilcConfigFile *file)
 {
   register char *r = file->p;
-  while (*r && (*r != '\n') && (*r != '\r')) r++;
-  file->p = (*r ? r + 1 : r);
+  while ((*r != '\0' && *r != EOF) && (*r != '\n') && (*r != '\r')) r++;
+  file->p = ((*r != '\0' && *r != EOF) ? r + 1 : r);
   file->line++;
 }
 /* Obtains a text token from the current position until first separator.
@@ -172,7 +172,8 @@ static SilcConfigOption *silc_config_find_option(SilcConfigEntity ent,
   }
   return NULL;
 }
-/* ... */
+/* Converts a string in the type specified. returns a dynamically
+ * allocated pointer. */
 static void *silc_config_marshall(SilcConfigType type, const char *val)
 {
   void *pt;
@@ -578,7 +579,7 @@ static int silc_config_main_internal(SilcConfigEntity ent)
     }
     else {
       void *pt;
-      int ret;
+      int ret = 0;     /* very important in case of no cb */
 
       if (*(*p)++ != '=')
        return SILC_CONFIG_EEXPECTEDEQUAL;
@@ -594,15 +595,17 @@ static int silc_config_main_internal(SilcConfigEntity ent)
       pt = silc_config_marshall(thisopt->type, buf);
       if (!pt)
        return SILC_CONFIG_EINVALIDTEXT;
-      if (thisopt->cb) {
+      if (thisopt->cb)
        ret = thisopt->cb(thisopt->type, thisopt->name, file->line,
                          pt, thisopt->context);
-       if (ret) {
-         SILC_CONFIG_DEBUG(("Callback refused the value [ret=%d]", ret));
-         return ret;
-       }
-      }
+
+      /* since we have to free "pt" both on failure and on success, we
+         assume that ret == 0 if we didn't actually call any cb. */
       silc_free(pt);
+      if (ret) {
+       SILC_CONFIG_DEBUG(("Callback refused the value [ret=%d]", ret));
+       return ret;
+      }
     }
     continue;