diff options
author | unknown <jani@rhols221.adsl.netsonic.fi> | 2002-01-25 23:34:37 +0200 |
---|---|---|
committer | unknown <jani@rhols221.adsl.netsonic.fi> | 2002-01-25 23:34:37 +0200 |
commit | 845db7c20ba28e014c5a36a6c95afd8ed111f316 (patch) | |
tree | ebdc1f846c1fa8a627690099d9a418063625577e /mysys/getvar.c | |
parent | aa166cbd983d28e31e23c096ca360a641de98c00 (diff) | |
download | mariadb-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.c | 77 |
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); +} |