mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Enhance the logest.c utility with new operators: "dup", "inv", "log", and
"nlogn". Provide help on an invalid input. FossilOrigin-Name: b4bd2a062c4baf5f622d61b7411f00de5904ef56
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Add\san\sextra\stest\scase\sfor\sthe\spotential\sbuffer\soverread\spatched\sby\s[28ddecff04].
|
C Enhance\sthe\slogest.c\sutility\swith\snew\soperators:\s"dup",\s"inv",\s"log",\sand\n"nlogn".\s\sProvide\shelp\son\san\sinvalid\sinput.
|
||||||
D 2014-03-26T15:14:59.762
|
D 2014-03-27T14:05:38.733
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
|
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -1121,7 +1121,7 @@ F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5
|
|||||||
F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
|
F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce
|
||||||
F tool/lemon.c 07aba6270d5a5016ba8107b09e431eea4ecdc123
|
F tool/lemon.c 07aba6270d5a5016ba8107b09e431eea4ecdc123
|
||||||
F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
|
F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
|
||||||
F tool/logest.c 7ad625cac3d54012b27d468b7af6612f78b9ba75
|
F tool/logest.c 388c318c7ac8b52b7c08ca1e2de0f4ca9a8f7e81
|
||||||
F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383
|
F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383
|
||||||
F tool/mkkeywordhash.c c9e05e4a7bcab8fab9f583d5b321fb72f565ad97
|
F tool/mkkeywordhash.c c9e05e4a7bcab8fab9f583d5b321fb72f565ad97
|
||||||
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
|
F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
|
||||||
@@ -1159,7 +1159,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
|
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
|
||||||
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
|
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
|
||||||
P 2b28e8d582cf10936fa1faca04a16ca2eeead66f
|
P f585f5d7a0f9bf8c590388654a3638231eba8892
|
||||||
R 76c12b0a4284d7654cb2771b2fc9c8eb
|
R fc449dde2f7cf3aac00c9e1a5da52aee
|
||||||
U dan
|
U drh
|
||||||
Z 22c3e1f8cdae5a20dae420dc313d8edd
|
Z ebedee01c152a936b8dfbac0e8a85bc4
|
||||||
|
@@ -1 +1 @@
|
|||||||
f585f5d7a0f9bf8c590388654a3638231eba8892
|
b4bd2a062c4baf5f622d61b7411f00de5904ef56
|
@@ -17,13 +17,7 @@
|
|||||||
**
|
**
|
||||||
** ./LogEst ARGS
|
** ./LogEst ARGS
|
||||||
**
|
**
|
||||||
** Arguments:
|
** See the showHelp() routine for a description of valid arguments.
|
||||||
**
|
|
||||||
** 'x' Multiple the top two elements of the stack
|
|
||||||
** '+' Add the top two elements of the stack
|
|
||||||
** NUM Convert NUM from integer to LogEst and push onto the stack
|
|
||||||
** ^NUM Interpret NUM as a LogEst and push onto stack.
|
|
||||||
**
|
|
||||||
** Examples:
|
** Examples:
|
||||||
**
|
**
|
||||||
** To convert 123 from LogEst to integer:
|
** To convert 123 from LogEst to integer:
|
||||||
@@ -97,12 +91,31 @@ static LogEst logEstFromDouble(double x){
|
|||||||
return e*10;
|
return e*10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isInteger(const char *z){
|
||||||
|
while( z[0]>='0' && z[0]<='9' ) z++;
|
||||||
|
return z[0]==0;
|
||||||
|
}
|
||||||
|
|
||||||
int isFloat(const char *z){
|
int isFloat(const char *z){
|
||||||
while( z[0] ){
|
char c;
|
||||||
if( z[0]=='.' || z[0]=='E' || z[0]=='e' ) return 1;
|
while( ((c=z[0])>='0' && c<='9') || c=='.' || c=='E' || c=='e'
|
||||||
z++;
|
|| c=='+' || c=='-' ) z++;
|
||||||
}
|
return z[0]==0;
|
||||||
return 0;
|
}
|
||||||
|
|
||||||
|
static void showHelp(const char *zArgv0){
|
||||||
|
printf("Usage: %s ARGS...\n", zArgv0);
|
||||||
|
printf("Arguments:\n"
|
||||||
|
" NUM Convert NUM from integer to LogEst and push onto the stack\n"
|
||||||
|
" ^NUM Interpret NUM as a LogEst and push onto stack\n"
|
||||||
|
" x Multiple the top two elements of the stack\n"
|
||||||
|
" + Add the top two elements of the stack\n"
|
||||||
|
" dup Dupliate the top element on the stack\n"
|
||||||
|
" inv Take the reciprocal of the top of stack. N = 1/N.\n"
|
||||||
|
" log Find the LogEst of the number on top of stack\n"
|
||||||
|
" nlogn Compute NlogN where N is the top of stack\n"
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv){
|
||||||
@@ -111,30 +124,43 @@ int main(int argc, char **argv){
|
|||||||
LogEst a[100];
|
LogEst a[100];
|
||||||
for(i=1; i<argc; i++){
|
for(i=1; i<argc; i++){
|
||||||
const char *z = argv[i];
|
const char *z = argv[i];
|
||||||
if( z[0]=='+' ){
|
if( strcmp(z,"+")==0 ){
|
||||||
if( n>=2 ){
|
if( n>=2 ){
|
||||||
a[n-2] = logEstAdd(a[n-2],a[n-1]);
|
a[n-2] = logEstAdd(a[n-2],a[n-1]);
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
}else if( z[0]=='x' ){
|
}else if( strcmp(z,"x")==0 ){
|
||||||
if( n>=2 ){
|
if( n>=2 ){
|
||||||
a[n-2] = logEstMultiply(a[n-2],a[n-1]);
|
a[n-2] = logEstMultiply(a[n-2],a[n-1]);
|
||||||
n--;
|
n--;
|
||||||
}
|
}
|
||||||
|
}else if( strcmp(z,"dup")==0 ){
|
||||||
|
if( n>0 ){
|
||||||
|
a[n] = a[n-1];
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
}else if( strcmp(z,"log")==0 ){
|
||||||
|
if( n>0 ) a[n-1] = logEstFromInteger(a[n-1]) - 33;
|
||||||
|
}else if( strcmp(z,"nlogn")==0 ){
|
||||||
|
if( n>0 ) a[n-1] += logEstFromInteger(a[n-1]) - 33;
|
||||||
|
}else if( strcmp(z,"inv")==0 ){
|
||||||
|
if( n>0 ) a[n-1] = -a[n-1];
|
||||||
}else if( z[0]=='^' ){
|
}else if( z[0]=='^' ){
|
||||||
a[n++] = atoi(z+1);
|
a[n++] = atoi(z+1);
|
||||||
}else if( isFloat(z) ){
|
}else if( isInteger(z) ){
|
||||||
|
a[n++] = logEstFromInteger(atoi(z));
|
||||||
|
}else if( isFloat(z) && z[0]!='-' ){
|
||||||
a[n++] = logEstFromDouble(atof(z));
|
a[n++] = logEstFromDouble(atof(z));
|
||||||
}else{
|
}else{
|
||||||
a[n++] = logEstFromInteger(atoi(z));
|
showHelp(argv[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(i=n-1; i>=0; i--){
|
for(i=n-1; i>=0; i--){
|
||||||
if( a[i]<0 ){
|
if( a[i]<0 ){
|
||||||
printf("%d (%f)\n", a[i], 1.0/(double)logEstToInt(-a[i]));
|
printf("%5d (%f)\n", a[i], 1.0/(double)logEstToInt(-a[i]));
|
||||||
}else{
|
}else{
|
||||||
sqlite3_uint64 x = logEstToInt(a[i]+100)*100/1024;
|
sqlite3_uint64 x = logEstToInt(a[i]+100)*100/1024;
|
||||||
printf("%d (%lld.%02lld)\n", a[i], x/100, x%100);
|
printf("%5d (%lld.%02lld)\n", a[i], x/100, x%100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user