int main (int argc, char **argv) { int i=-1, u=0, atoms=0, fromend=0, err=CBSUCCESS; unsigned int namearraylen=0, y=0; int bufsize=BUFSIZE, blksize=BLKSIZE, namelen=0, namebuflen=0, count=1, co=0; char list=0, inputenc=CBENC1BYTE, tree=0, uniquenamesandleaves=0; char *str_err, *value, *namearray = NULL; CBFILE *in = NULL; unsigned char *name = NULL; unsigned int chr = ' ', chprev = ' '; unsigned long int endchr = ENDCHR; /* fprintf(stderr,"main: argc=%i", argc ); for(u=0;u<argc;++u) fprintf( stderr,", argv[%i]=%s", u, argv[u] ); fprintf( stderr,".\n" ); */ // Last parameter was null (FreeBSD) atoms=argc; if(argv[(atoms-1)]==NULL && argc>0) --atoms; // Parameters if ( atoms < 2 ){ // no fields usage(&argv[0]); exit(ERRUSAGE); } // // From end fromend = atoms-1; /* * Name */ if ( atoms >= 2 ){ namelen = (int) strlen( argv[fromend] ); namebuflen = NAMEBUFLEN; // 4 * namelen; name = (unsigned char *) malloc( sizeof(unsigned char)*( (unsigned int) namebuflen + 1 ) ); if(name==NULL){ fprintf(stderr,"\nerror in malloc, name was null"); exit(CBERRALLOC); } name[ namelen*4 ] = '\0'; u = 0; for(i=0; i<namelen && u<namebuflen; ++i){ chr = (unsigned long int) argv[fromend][i]; chr = chr & 0x000000FF; err = cb_put_ucs_chr( chr, &name, &u, namebuflen); } if( namebuflen > u ) name[ u ] = '\0'; if(err!=CBSUCCESS){ fprintf(stderr,"\ncbsearch: cb_put_ucs_chr, err=%i.", err); } if( namebuflen>(namelen*4) ) name[ namelen*4 ] = '\0'; }else{ usage(&argv[0]); // not enough parameters exit(ERRUSAGE); } #ifdef DEBUG fprintf(stderr,"\nDebug: name (namelen:%i, namebuflen:%i):", namelen, namebuflen); cb_print_ucs_chrbuf( CBLOGDEBUG, &name, (namelen*4), namebuflen); //fprintf(stderr,"\nDebug: argv[fromend]: %s", argv[fromend]); #endif // Allocate buffer err = cb_allocate_cbfile( &in, 0, bufsize, blksize); if(err>=CBERROR){ fprintf(stderr, "error at cb_allocate_cbfile: %i.", err); } cb_set_to_consecutive_names(&in); //cb_use_as_stream(&in); // BEFORE TEST 11.8.2015 cb_use_as_file(&in); // TEST 11.8.2015 //cb_use_as_seekable_file(&in); // namelist is endless, memory increases cb_set_encoding(&in, CBENC1BYTE); cb_set_search_state(&in, CBSTATETREE); (*in).cf.stopatheaderend=0; (*in).cf.stopatmessageend=0; // 26.3.2016 (*in).cf.leadnames=1; //(*in).cf.leadnames=0; /* * Rest of the fields in between start ( ./progname ) and end ( <name> ) */ for(i=1 ; i<fromend ; ++i){ u = get_option( argv[i], argv[i+1], 'c', &value); // count if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ count = (int) strtol(value,&str_err,10); if(count==0 && errno==EINVAL) count = 1; continue; } u = get_option( argv[i], argv[i+1], 'x', &value); // regular expression search if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE || u == GETOPTSUCCESSNOVALUE){ tree = -10; continue; } u = get_option( argv[i], argv[i+1], 'u', &value); // unique names if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE || u == GETOPTSUCCESSNOVALUE){ uniquenamesandleaves=1; continue; } u = get_option( argv[i], argv[i+1], 'b', &value); // buffer size if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ bufsize = (int) strtol(value,&str_err,10); if(bufsize==0 && errno==EINVAL) bufsize = BUFSIZE; continue; } u = get_option( argv[i], argv[i+1], 'l', &value); // block size if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ blksize = (int) strtol(value,&str_err,10); if(blksize==0 && errno==EINVAL) blksize = BLKSIZE; continue; } u = get_option( argv[i], argv[i+1], 'i', &value); // input encoding number ( from cb_encoding.h ) if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ inputenc = (char) strtol(value,&str_err,10); if(inputenc==0 && errno==EINVAL) inputenc = CBENC1BYTE; cb_set_encoding(&in, inputenc); continue; } u = get_option( argv[i], argv[i+1], 'z', &value); // set double delimiters and configuration file options if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ tree = 1; cb_set_to_conf( &in ); continue; } u = get_option( argv[i], argv[i+1], 't', &value); // traverse the dotted (or primary key-) tree with cb_tree_set_cursor_ucs if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ tree = 1; continue; } u = get_option( argv[i], argv[i+1], 'J', &value); // use JSON if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ tree = 1; cb_set_to_json( &in ); continue; } u = get_option( argv[i], argv[i+1], 'e', &value); // end character if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ if(value!=NULL){ endchr = (unsigned long int) strtol(value,&str_err,16); fprintf(stderr, "\nAfter get_option, value=%s endchr=0x%.6lX.", value, endchr); err = CBSUCCESS; if( ! ( endchr==0 && errno==EINVAL ) ) err = cb_set_rend( &in, endchr); if( err>=CBERROR ){ fprintf(stderr,"\nError ar cb_set_rend, %i.", err); } }else{ err = cb_set_rend( &in, endchr); // set to new line, 0x0A if( err>=CBERROR ){ fprintf(stderr,"\nError ar cb_set_rend, %i.", err); } } continue; } u = get_option( argv[i], argv[i+1], 's', &namearray); // list of names if( u == GETOPTSUCCESS || u == GETOPTSUCCESSATTACHED || u == GETOPTSUCCESSPOSSIBLEVALUE ){ list=1; if(namearray!=NULL) err = CBSUCCESS; else err = CBERRALLOC; continue; } } #ifdef DEBUG // Debug if( name!=NULL ) fprintf(stderr,"\nDebug: Searching ["); cb_print_ucs_chrbuf(CBLOGDEBUG, &name, (namelen*4), namebuflen); if(in!=NULL) fprintf(stderr,"] count [%i] buffer size [%i] block size [%i] encoding [%i]", count, bufsize, blksize, inputenc ); if(in!=NULL) fprintf(stderr," value end [0x%.6lX]", (*in).cf.rend); fprintf(stderr,"\n"); #endif if( uniquenamesandleaves==1 ){ cb_set_to_unique_names(&in); cb_set_to_unique_leaves(&in); } // Program co = count; if(count==-1) co = 10; for(i=0; i<co && err<=CBERROR; ++i){ if(count==-1) i = 0; fprintf(stderr,"\n%i.", (i+1) ); if( list==0 ) // one name err = search_and_print_name(&in, &name, (namelen*4), tree ); else{ // list of names if(namearray!=NULL){ memset( &(*name), (int) 0x20, (unsigned int) namebuflen ); namearraylen = (unsigned int) strnlen( &(*namearray), (unsigned int) namebuflen ); u = 0; chprev = (unsigned long int) 0x0A; namelen=0; for(y=0; y<namearraylen && y<10000; ++y ){ // (if first char in name is sp, possibly prints "null name") chprev = chr; chr = (unsigned long int) namearray[y]; chr = chr & 0x000000FF; if( ! WSP( chr ) ){ err = cb_put_ucs_chr( chr, &name, &u, namebuflen); namelen = u; } if( ( WSP( chr ) && ! WSP( chprev ) && namelen>0 ) || y==(namearraylen-1) || chr=='\0' ){ name[ namelen*4 ] = '\0'; // error here, null is at wrong place 16.7.2015 err = search_and_print_name(&in, &name, namelen, tree ); namelen = 0; u = 0; memset( &(*name), (int) 0x20, (unsigned int) namebuflen ); } } } } } // Debug: cb_print_names(&in, CBLOGDEBUG); memset( &(*name), (int) 0x20, (unsigned int) namebuflen ); name[namebuflen] = '\0'; cb_free_cbfile(&in); free( name ); exit( err ); }
/* * Copy UCS string from URL encoded data. Does not allocate. * * Can be used with only one buffer, the same buffer can be the resultbuffer. */ int cb_decode_url_encoded_bytes(unsigned char **ucshexdata, int ucshexdatalen, unsigned char **ucsdata, int *ucsdatalen, int ucsbuflen ){ int err = CBSUCCESS, indx=0, num=0, ucsindx=0; // ucsindx is important to be able to use only one parameter buffer, 23.5.2016 char cr_on=0; unsigned long int chr=0x20, chprev=0x20; char hex[3] = { '0', '0', '\0' }; if( ucshexdata==NULL || *ucshexdata==NULL || ucsdata==NULL || *ucsdata==NULL || ucsdatalen==NULL ){ cb_clog( CBLOGDEBUG, CBERRALLOC, "\ncb_decode_url_encoded_bytes: parameter was null, error %i.", CBERRALLOC ); return CBERRALLOC; } cb_clog( CBLOGDEBUG, CBNEGATION, "\ncb_decode_url_encoded_bytes: encoding data ["); cb_print_ucs_chrbuf( CBLOGDEBUG, &(*ucshexdata), ucshexdatalen, ucshexdatalen ); cb_clog( CBLOGDEBUG, CBNEGATION, "]"); for(indx=0; indx<ucshexdatalen && ucsindx<ucsbuflen && err<CBNEGATION;){ chprev = chr; err = cb_get_ucs_chr( &chr, &(*ucshexdata), &indx, ucshexdatalen); if(err>CBERROR){ cb_clog( CBLOGDEBUG, err, "\ncb_decode_url_encoded_bytes: cb_get_ucs_chr (1), error %i.", err ); continue; } // stop if( chr == '%' && ucsindx<ucsbuflen && indx<ucshexdatalen && err<CBNEGATION ){ chprev = chr; err = cb_get_ucs_chr( &chr, &(*ucshexdata), &indx, ucshexdatalen); if(err>CBERROR){ cb_clog( CBLOGDEBUG, err, "\ncb_decode_url_encoded_bytes: cb_get_ucs_chr (2), error %i.", err ); continue; } // stop if( chr == '0' && ucsindx<ucsbuflen && indx<ucshexdatalen && err<CBNEGATION ){ chprev = chr; err = cb_get_ucs_chr( &chr, &(*ucshexdata), &indx, ucshexdatalen); if(err>CBERROR){ cb_clog( CBLOGDEBUG, err, "\ncb_decode_url_encoded_bytes: cb_get_ucs_chr (3), error %i.", err ); continue; } // stop if( chr == 'D' || chr == 'd' ){ // ignore cr_on = 1; continue; } if( ( chr == 'A' || chr == 'a' ) && ucsindx<ucsbuflen && err<CBNEGATION ){ // LF -> CRLF err = cb_put_ucs_chr( (unsigned long int) 0x0D, &(*ucsdata), &ucsindx, ucsbuflen); // CR #1 cr_on = 0; if( ucsindx<ucsbuflen && err<CBNEGATION ) err = cb_put_ucs_chr( (unsigned long int) 0x0A, &(*ucsdata), &ucsindx, ucsbuflen); continue; }else if( cr_on==1 ){ // CR #2 err = cb_put_ucs_chr( (unsigned long int) 0x0D, &(*ucsdata), &ucsindx, ucsbuflen); cr_on = 0; } if( ucsindx<ucsbuflen && err<CBNEGATION ){ // %<hexnum><hexnum> #1 hex[0] = (char) chprev; hex[1] = (char) chr; num = (int) strtol( &hex[0], NULL, 16); err = cb_put_ucs_chr( (unsigned long int) num, &(*ucsdata), &ucsindx, ucsbuflen); } }else{ if(cr_on==1){ // CR #3 err = cb_put_ucs_chr( (unsigned long int) 0x0D, &(*ucsdata), &ucsindx, ucsbuflen); cr_on = 0; } if( ucsindx<ucsbuflen && err<CBNEGATION ){ // %<hexnum><hexnum> #2 hex[0] = (char) chr; chprev = chr; err = cb_get_ucs_chr( &chr, &(*ucshexdata), &indx, ucshexdatalen); if(err>CBERROR){ cb_clog( CBLOGDEBUG, err, "\ncb_decode_url_encoded_bytes: cb_get_ucs_chr (5), error %i.", err ); continue; } // stop hex[1] = (char) chr; num = (int) strtol( &hex[0], NULL, 16); err = cb_put_ucs_chr( (unsigned long int) num, &(*ucsdata), &ucsindx, ucsbuflen); } } continue; } if(cr_on==1){ // CR #4 err = cb_put_ucs_chr( (unsigned long int) 0x0D, &(*ucsdata), &ucsindx, ucsbuflen); cr_on = 0; } if( chr == '+' ){ err = cb_put_ucs_chr( (unsigned long int) 0x20, &(*ucsdata), &ucsindx, ucsbuflen); continue; // SP }else if( chr != '%' ){ // alpha, digit, special characters err = cb_put_ucs_chr( chr, &(*ucsdata), &ucsindx, ucsbuflen); } } *ucsdatalen = ucsindx; cb_clog( CBLOGDEBUG, CBNEGATION, "\ncb_decode_url_encoded_bytes: encoded data ["); cb_print_ucs_chrbuf( CBLOGDEBUG, &(*ucsdata), *ucsdatalen, ucsbuflen ); cb_clog( CBLOGDEBUG, CBNEGATION, "]"); return err; }
/* * Search name1.name2.name3 */ int search_and_print_tree(CBFILE **cbs, unsigned char **dotname, int namelen, int matchctl){ int err=CBSUCCESS, err2=CBSUCCESS, indx=0, undx=0; int ret = CBNEGATION; char namecount = 0; unsigned char origsearchstate = 1; unsigned char *ucsname = NULL; cb_name *firstname = NULL; unsigned long int chr = 0x20; cb_name *leaf = NULL; if( cbs==NULL || *cbs==NULL || (**cbs).cb==NULL ) return CBERRALLOC; if( dotname==NULL || *dotname==NULL ) return CBERRALLOC; /* Allocate new name to hold the name */ ucsname = (unsigned char *) malloc( sizeof(char)*( (unsigned int) namelen+1 ) ); if( ucsname == NULL ) { return CBERRALLOC; } memset( &ucsname[0], 0x20, (size_t) namelen ); ucsname[namelen] = '\0'; origsearchstate = (**cbs).cf.searchstate; (**cbs).cf.searchstate = CBSTATETREE; /* Every name */ undx = 0; indx=0; while( indx<namelen && undx<namelen && err<=CBNEGATION && err2<=CBNEGATION && namelen>0 ){ err2 = cb_get_ucs_chr( &chr, &(*dotname), &indx, namelen ); if( chr != (unsigned long int) '.' ) err = cb_put_ucs_chr( chr, &ucsname, &undx, namelen ); if( chr == (unsigned long int) '.' || indx>=namelen ){ // Name // HERE err = cb_set_cursor_match_length_ucs( &(*cbs), &ucsname, &undx, namecount, matchctl ); if( ( err==CBSUCCESS || err==CBSTREAM || err==CBFILESTREAM ) && (*(**cbs).cb).list.current!=NULL ){ if( (*(**cbs).cb).list.current!=NULL && namecount==0 ){ firstname = &(*(*(**cbs).cb).list.current); fprintf(stderr,"\nFound \""); if( firstname!=NULL && (*firstname).namebuf!=NULL && (*firstname).namelen>0 ) cb_print_ucs_chrbuf( CBLOGDEBUG, &(*firstname).namebuf, (*firstname).namelen, (*firstname).buflen ); fprintf(stderr,"\", (from list)"); fprintf(stderr," leaves from currentleaf: "); if( (*(*(**cbs).cb).list.currentleaf).leaf!=NULL ){ // 15.11.2015 leaf = &(* (cb_name*) (*(*(**cbs).cb).list.currentleaf).leaf); cb_print_leaves( &leaf, CBLOGDEBUG ); }else{ fprintf(stderr,"(empty)"); } }else{ if( (*(**cbs).cb).list.currentleaf!=NULL ){ // 15.11.2015 leaf = &(*(*(**cbs).cb).list.currentleaf); fprintf(stderr,"\nFound leaf (currentleaf) \""); cb_print_ucs_chrbuf( CBLOGDEBUG, &(*leaf).namebuf, (*leaf).namelen, (*leaf).buflen ); fprintf(stderr,"\" (from tree)."); fprintf(stderr," leaves from currentleaf: "); cb_print_leaves( &leaf, CBLOGDEBUG ); }else{ fprintf(stderr,"(empty)"); } } }else{ fprintf(stderr,"\n\""); cb_print_ucs_chrbuf( CBLOGDEBUG, &ucsname, undx, undx ); fprintf(stderr,"\" not found."); } if(err!=CBSUCCESS && err!=CBSUCCESSLEAVESEXIST && err!=CBSTREAM && err!=CBFILESTREAM) ret = CBNOTFOUND; else ret = err; undx = 0; ++namecount; } } (**cbs).cf.searchstate = origsearchstate; free(ucsname); ucsname=NULL; if(indx==namelen && (ret==CBSUCCESS || ret==CBSTREAM || ret==CBFILESTREAM) ) // Match and dotted name was searched through (cursor is at name), 13.12.2013 return ret; else // Name was not searched through or no match (cursor is somewhere in value) return CBNOTFOUND; }