summaryrefslogtreecommitdiffstats
path: root/lib/libsqlite3/tool/logest.c
diff options
context:
space:
mode:
authorsthen <sthen@openbsd.org>2016-09-23 09:21:58 +0000
committersthen <sthen@openbsd.org>2016-09-23 09:21:58 +0000
commit25e4f8ab5acd0ef40feec6767a572bebbbe294b3 (patch)
tree20197c0e46bb6d260f4a310b6d5dd73b8d826f01 /lib/libsqlite3/tool/logest.c
parentremove usr.bin/sqlite3, it has moved back to ports (diff)
downloadwireguard-openbsd-25e4f8ab5acd0ef40feec6767a572bebbbe294b3.tar.xz
wireguard-openbsd-25e4f8ab5acd0ef40feec6767a572bebbbe294b3.zip
remove lib/libsqlite3, it has moved back to ports
Diffstat (limited to 'lib/libsqlite3/tool/logest.c')
-rw-r--r--lib/libsqlite3/tool/logest.c170
1 files changed, 0 insertions, 170 deletions
diff --git a/lib/libsqlite3/tool/logest.c b/lib/libsqlite3/tool/logest.c
deleted file mode 100644
index 347fa68a4f4..00000000000
--- a/lib/libsqlite3/tool/logest.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
-** 2013-06-10
-**
-** The author disclaims copyright to this source code. In place of
-** a legal notice, here is a blessing:
-**
-** May you do good and not evil.
-** May you find forgiveness for yourself and forgive others.
-** May you share freely, never taking more than you give.
-**
-*************************************************************************
-** This file contains a simple command-line utility for converting from
-** integers and LogEst values and back again and for doing simple
-** arithmetic operations (multiple and add) on LogEst values.
-**
-** Usage:
-**
-** ./LogEst ARGS
-**
-** See the showHelp() routine for a description of valid arguments.
-** Examples:
-**
-** To convert 123 from LogEst to integer:
-**
-** ./LogEst ^123
-**
-** To convert 123456 from integer to LogEst:
-**
-** ./LogEst 123456
-**
-*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <assert.h>
-#include <string.h>
-#include "sqlite3.h"
-
-typedef short int LogEst; /* 10 times log2() */
-
-LogEst logEstMultiply(LogEst a, LogEst b){ return a+b; }
-LogEst logEstAdd(LogEst a, LogEst b){
- static const unsigned char x[] = {
- 10, 10, /* 0,1 */
- 9, 9, /* 2,3 */
- 8, 8, /* 4,5 */
- 7, 7, 7, /* 6,7,8 */
- 6, 6, 6, /* 9,10,11 */
- 5, 5, 5, /* 12-14 */
- 4, 4, 4, 4, /* 15-18 */
- 3, 3, 3, 3, 3, 3, /* 19-24 */
- 2, 2, 2, 2, 2, 2, 2, /* 25-31 */
- };
- if( a<b ){ LogEst t = a; a = b; b = t; }
- if( a>b+49 ) return a;
- if( a>b+31 ) return a+1;
- return a+x[a-b];
-}
-LogEst logEstFromInteger(sqlite3_uint64 x){
- static LogEst a[] = { 0, 2, 3, 5, 6, 7, 8, 9 };
- LogEst y = 40;
- if( x<8 ){
- if( x<2 ) return 0;
- while( x<8 ){ y -= 10; x <<= 1; }
- }else{
- while( x>255 ){ y += 40; x >>= 4; }
- while( x>15 ){ y += 10; x >>= 1; }
- }
- return a[x&7] + y - 10;
-}
-static sqlite3_uint64 logEstToInt(LogEst x){
- sqlite3_uint64 n;
- if( x<10 ) return 1;
- n = x%10;
- x /= 10;
- if( n>=5 ) n -= 2;
- else if( n>=1 ) n -= 1;
- if( x>=3 ) return (n+8)<<(x-3);
- return (n+8)>>(3-x);
-}
-static LogEst logEstFromDouble(double x){
- sqlite3_uint64 a;
- LogEst e;
- assert( sizeof(x)==8 && sizeof(a)==8 );
- if( x<=0.0 ) return -32768;
- if( x<0.01 ) return -logEstFromDouble(1.0/x);
- if( x<1.0 ) return logEstFromDouble(100.0*x) - 66;
- if( x<1024.0 ) return logEstFromInteger((sqlite3_uint64)(1024.0*x)) - 100;
- if( x<=2000000000.0 ) return logEstFromInteger((sqlite3_uint64)x);
- memcpy(&a, &x, 8);
- e = (a>>52) - 1022;
- 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){
- char c;
- while( ((c=z[0])>='0' && c<='9') || c=='.' || c=='E' || c=='e'
- || c=='+' || c=='-' ) z++;
- return z[0]==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 i;
- int n = 0;
- LogEst a[100];
- for(i=1; i<argc; i++){
- const char *z = argv[i];
- if( strcmp(z,"+")==0 ){
- if( n>=2 ){
- a[n-2] = logEstAdd(a[n-2],a[n-1]);
- n--;
- }
- }else if( strcmp(z,"x")==0 ){
- if( n>=2 ){
- a[n-2] = logEstMultiply(a[n-2],a[n-1]);
- 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]=='^' ){
- a[n++] = atoi(z+1);
- }else if( isInteger(z) ){
- a[n++] = logEstFromInteger(atoi(z));
- }else if( isFloat(z) && z[0]!='-' ){
- a[n++] = logEstFromDouble(atof(z));
- }else{
- showHelp(argv[0]);
- }
- }
- for(i=n-1; i>=0; i--){
- if( a[i]<-40 ){
- printf("%5d (%f)\n", a[i], 1.0/(double)logEstToInt(-a[i]));
- }else if( a[i]<10 ){
- printf("%5d (%f)\n", a[i], logEstToInt(a[i]+100)/1024.0);
- }else{
- sqlite3_uint64 x = logEstToInt(a[i]+100)*100/1024;
- printf("%5d (%lld.%02lld)\n", a[i], x/100, x%100);
- }
- }
- return 0;
-}