summaryrefslogtreecommitdiff
path: root/mysys/getvar.c
diff options
context:
space:
mode:
authorunknown <jani@rhols221.adsl.netsonic.fi>2002-01-25 23:34:37 +0200
committerunknown <jani@rhols221.adsl.netsonic.fi>2002-01-25 23:34:37 +0200
commit845db7c20ba28e014c5a36a6c95afd8ed111f316 (patch)
treeebdc1f846c1fa8a627690099d9a418063625577e /mysys/getvar.c
parentaa166cbd983d28e31e23c096ca360a641de98c00 (diff)
downloadmariadb-git-845db7c20ba28e014c5a36a6c95afd8ed111f316.tar.gz
Added my_getopt struct and modified myisamchk to the bk tree.
include/Makefile.am: Added my_getopt.h myisam/myisamchk.c: myisamcheck is using my_getopt struct now. Old code left: changeable_var[], will be changed later. mysys/Makefile.am: added my_getopt.c mysys/getvar.c: Added my_set_changeable_var. This is not being used yet, and is mostly a copy of set_changeable_var still. BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
Diffstat (limited to 'mysys/getvar.c')
-rw-r--r--mysys/getvar.c77
1 files changed, 76 insertions, 1 deletions
diff --git a/mysys/getvar.c b/mysys/getvar.c
index 49b321f592e..1a2adc10e62 100644
--- a/mysys/getvar.c
+++ b/mysys/getvar.c
@@ -19,7 +19,7 @@
#include "mysys_priv.h"
#include <m_string.h>
#include <m_ctype.h>
-
+#include <my_getopt.h>
/* set all changeable variables */
void set_all_changeable_vars(CHANGEABLE_VAR *vars)
@@ -109,3 +109,78 @@ my_bool set_changeable_var(my_string str,CHANGEABLE_VAR *vars)
}
DBUG_RETURN(1);
}
+
+my_bool my_set_changeable_var(my_string str, const struct my_option *vars)
+{
+ char endchar;
+ my_string end;
+ DBUG_ENTER("my_set_changeable_var");
+ DBUG_PRINT("enter",("%s",str));
+
+ if (str)
+ {
+ if (!(end=strchr(str,'=')))
+ fprintf(stderr,"Can't find '=' in expression '%s' to option -O\n",str);
+ else
+ {
+ uint length,found_count=0;
+ const struct my_option *var, *found;
+ my_string var_end;
+ const char *name;
+ longlong num;
+
+ /* Skip end space from variable */
+ for (var_end=end ; end > str && isspace(var_end[-1]) ; var_end--) ;
+ length=(uint) (var_end-str);
+ /* Skip start space from argument */
+ for (end++ ; isspace(*end) ; end++) ;
+
+ for (var= vars, found= 0; (name= var->name); var++)
+ {
+ if (var->changeable_var)
+ {
+ if (!my_casecmp(name, str, length))
+ {
+ found= var; found_count++;
+ if (!name[length])
+ {
+ found_count=1;
+ break;
+ }
+ }
+ }
+ }
+ if (found_count == 0)
+ {
+ fprintf(stderr,"No variable match for: -O '%s'\n",str);
+ DBUG_RETURN(1);
+ }
+ if (found_count > 1)
+ {
+ fprintf(stderr,"Variable prefix '%*s' is not unique\n",length,str);
+ DBUG_RETURN(1);
+ }
+
+ num=strtoll(end, (char **)NULL, 10); endchar=strend(end)[-1];
+ if (endchar == 'k' || endchar == 'K')
+ num*=1024;
+ else if (endchar == 'm' || endchar == 'M')
+ num*=1024L*1024L;
+ else if (endchar == 'g' || endchar == 'G')
+ num*=1024L*1024L*1024L;
+ else if (!isdigit(endchar))
+ {
+ fprintf(stderr,"Unknown prefix used for variable value '%s'\n",str);
+ DBUG_RETURN(1);
+ }
+ if (num < (longlong) found->min_value)
+ num=(longlong) found->min_value;
+ else if (num > 0 && (ulonglong) num > (ulonglong) (ulong) found->max_value)
+ num=(longlong) (ulong) found->max_value;
+ num=((num- (longlong) found->sub_size) / (ulonglong) found->block_size);
+ /* (*found->varptr)= (long) (num*(ulonglong) found->block_size);*/
+ DBUG_RETURN(0);
+ }
+ }
+ DBUG_RETURN(1);
+}