void sendReplay(aeEventLoop *el, int fd, void *privdata, int mask) { vuiClient *c = (vuiClient *)privdata; int len; int nw; char *pos; sdsclear(c->res.buf); LogInfo("sendReplay...."); c->res.buf = sdscatprintf(c->res.buf, "%s %d %s\r\nlength: %zu\r\n\r\n%s", c->res.version, c->res.code, c->res.reason, sdslen(c->res.body), c->res.body); len = sdslen(c->res.buf); pos = c->res.buf; while(len>0) { nw = write(fd, pos, len); pos += nw; len -= nw; } //reset if (c->res.code >= 200) { c->procing = PROC_END; } else{ c->res.code = 200; c->res.reason = sdscpy(c->res.reason, "OK"); c->procing = PROC_ING; } aeDeleteFileEvent(el,c->fd,AE_WRITABLE); }
static int conf_parse_conf_common(rmt_conf *cf, dict *org) { int ret; conf_option *opt; dictEntry *de; sds key; if(cf == NULL || org == NULL){ return RMT_ERROR; } key = sdsempty(); for(opt = conf_common_options; opt&&opt->name; opt++){ key = sdscpy(key, opt->name); de = dictFind(org, key); if(de != NULL){ ret = opt->set(cf, opt, dictGetVal(de)); if(ret != RMT_OK){ log_error("ERROR: parse key %s in conf file error", key); sdsfree(key); return RMT_ERROR; } } } sdsfree(key); return RMT_OK; }
void addReplay(vuiClient *c, const char *body) { if (body) c->res.body = sdscpy(c->res.body, body); else sdsclear(c->res.body); c->procing = PROC_HALF; aeCreateFileEvent(server.el, c->fd, AE_WRITABLE, sendReplay, c); }
int main(){ char hello[20]={"hello,world!"}; printf("hello:%s\n",hello); printf("str new\n"); sds str=sdsnew(hello); printf("str:%s\n",str); printf("str len:%d\n",sdslen(str)); printf("str avail:%d\n",sdsavail(str)); printf("str cat\n"); sds newstr=sdscat(str,"this is strcat content"); printf("str:%s\n",str); printf("str:%s\n",newstr); printf("str len:%d\n",sdslen(newstr)); printf("str avail:%d\n",sdsavail(newstr)); printf("str cpy\n"); char* teststr="test a string"; sdscpy(newstr,teststr); printf("str:%s\n",newstr); printf("str len:%d\n",sdslen(newstr)); printf("str avail:%d\n",sdsavail(newstr)); printf("trim char \n"); sdstrim(newstr,"g"); printf("str:%s\n",newstr); printf("sds range \n"); sdsrange(newstr,1,3); printf("str:%s\n",newstr); printf("sds toupper \n"); sdstoupper(newstr); printf("str:%s\n",newstr); printf("sds tolower \n"); sdstolower(newstr); printf("str:%s\n",newstr); printf("sds cmp \n"); sds cmpstr=sdsnew("est"); printf("str:%d\n",sdscmp(newstr,cmpstr)); return 0; }
void setResCode(vuiClient *c, int code, char *reason) { c->res.code = code; if (!reason) { if(code < 200) reason = "Trying"; else if(code == 200) reason = "OK"; else if(code == 202) reason = "Accept"; else if(code < 300) reason = "Created"; else if(code < 400) reason = "Keep"; else if(code == 404) reason = "Not Found"; else if(code < 500) reason = "Error"; else if(code < 600) reason = "Error"; else reason = "Error"; } c->res.reason = sdscpy(c->res.reason, reason); }
TEST(sds, sds) { // struct sdshdr *sh; sds x = sdsnew("foo"), y; TEST_ASSERT_TRUE( sdslen(x) == 3 && memcmp(x,"foo\0",4) == 0) sdsfree(x); x = sdsnewlen("foo",2); TEST_ASSERT_TRUE( sdslen(x) == 2 && memcmp(x,"fo\0",3) == 0) x = sdscat(x,"bar"); TEST_ASSERT_TRUE( sdslen(x) == 5 && memcmp(x,"fobar\0",6) == 0); x = sdscpy(x,"a"); TEST_ASSERT_TRUE( sdslen(x) == 1 && memcmp(x,"a\0",2) == 0) x = sdscpy(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk"); TEST_ASSERT_TRUE( sdslen(x) == 33 && memcmp(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk\0",33) == 0) sdsfree(x); x = sdscatprintf(sdsempty(),"%d",123); TEST_ASSERT_TRUE( sdslen(x) == 3 && memcmp(x,"123\0",4) ==0) sdsfree(x); x = sdsnew("xxciaoyyy"); sdstrim(x,"xy"); TEST_ASSERT_TRUE( sdslen(x) == 4 && memcmp(x,"ciao\0",5) == 0) y = sdsdup(x); sdsrange(y,1,1); TEST_ASSERT_TRUE( sdslen(y) == 1 && memcmp(y,"i\0",2) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,1,-1); TEST_ASSERT_TRUE( sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,-2,-1); TEST_ASSERT_TRUE( sdslen(y) == 2 && memcmp(y,"ao\0",3) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,2,1); TEST_ASSERT_TRUE( sdslen(y) == 0 && memcmp(y,"\0",1) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,1,100); TEST_ASSERT_TRUE( sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,100,100); TEST_ASSERT_TRUE( sdslen(y) == 0 && memcmp(y,"\0",1) == 0) sdsfree(y); sdsfree(x); x = sdsnew("foo"); y = sdsnew("foa"); TEST_ASSERT_TRUE( sdscmp(x,y) > 0) sdsfree(y); sdsfree(x); x = sdsnew("bar"); y = sdsnew("bar"); TEST_ASSERT_TRUE( sdscmp(x,y) == 0) sdsfree(y); sdsfree(x); x = sdsnew("aar"); y = sdsnew("bar"); TEST_ASSERT_TRUE( sdscmp(x,y) < 0) sdsfree(y); sdsfree(x); // x = sdsnewlen("\a\n\0foo\r",7); // y = sdscatrepr(sdsempty(),x,sdslen(x)); // TEST_ASSERT_TRUE( // memcmp(y,"\"\\a\\n\\x00foo\\r\"",15) == 0) #if 0 { int oldfree; sdsfree(x); x = sdsnew("0"); sh = (void*) (x-(sizeof(struct sdshdr))); TEST_ASSERT_TRUE( sh->len == 1 && sh->free == 0); x = sdsMakeRoomFor(x,1); sh = (void*) (x-(sizeof(struct sdshdr))); TEST_ASSERT_TRUE( sh->len == 1 && sh->free > 0); oldfree = sh->free; x[1] = '1'; sdsIncrLen(x,1); TEST_ASSERT_TRUE( x[0] == '0' && x[1] == '1'); TEST_ASSERT_TRUE( sh->len == 2); TEST_ASSERT_TRUE( sh->free == oldfree-1); } #endif }
int main(void) { { sds x = sdsnew("foo"), y; test_cond("Create a string and obtain the length", sdslen(x) == 3 && memcmp(x,"foo\0",4) == 0) sdsfree(x); x = sdsnewlen("foo",2); test_cond("Create a string with specified length", sdslen(x) == 2 && memcmp(x,"fo\0",3) == 0) x = sdscat(x,"bar"); test_cond("Strings concatenation", sdslen(x) == 5 && memcmp(x,"fobar\0",6) == 0); x = sdscpy(x,"a"); test_cond("sdscpy() against an originally longer string", sdslen(x) == 1 && memcmp(x,"a\0",2) == 0) x = sdscpy(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk"); test_cond("sdscpy() against an originally shorter string", sdslen(x) == 33 && memcmp(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk\0",33) == 0) sdsfree(x); x = sdscatprintf(sdsempty(),"%d",123); test_cond("sdscatprintf() seems working in the base case", sdslen(x) == 3 && memcmp(x,"123\0",4) ==0) sdsfree(x); x = sdstrim(sdsnew("xxciaoyyy"),"xy"); test_cond("sdstrim() correctly trims characters", sdslen(x) == 4 && memcmp(x,"ciao\0",5) == 0) y = sdsrange(sdsdup(x),1,1); test_cond("sdsrange(...,1,1)", sdslen(y) == 1 && memcmp(y,"i\0",2) == 0) sdsfree(y); y = sdsrange(sdsdup(x),1,-1); test_cond("sdsrange(...,1,-1)", sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0) sdsfree(y); y = sdsrange(sdsdup(x),-2,-1); test_cond("sdsrange(...,-2,-1)", sdslen(y) == 2 && memcmp(y,"ao\0",3) == 0) sdsfree(y); y = sdsrange(sdsdup(x),2,1); test_cond("sdsrange(...,2,1)", sdslen(y) == 0 && memcmp(y,"\0",1) == 0) sdsfree(y); y = sdsrange(sdsdup(x),1,100); test_cond("sdsrange(...,1,100)", sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0) sdsfree(y); y = sdsrange(sdsdup(x),100,100); test_cond("sdsrange(...,100,100)", sdslen(y) == 0 && memcmp(y,"\0",1) == 0) sdsfree(y); sdsfree(x); x = sdsnew("foo"); y = sdsnew("foa"); test_cond("sdscmp(foo,foa)", sdscmp(x,y) > 0) sdsfree(y); sdsfree(x); x = sdsnew("bar"); y = sdsnew("bar"); test_cond("sdscmp(bar,bar)", sdscmp(x,y) == 0) sdsfree(y); sdsfree(x); x = sdsnew("aar"); y = sdsnew("bar"); test_cond("sdscmp(bar,bar)", sdscmp(x,y) < 0) } test_report() }
void load_config_from_string(sds config) { char *err = NULL; int linenum = 0, totlines, i; sds *lines = sdssplitlen(config, strlen(config), "\n", 1, &totlines); for (i = 0; i < totlines; i++) { sds *argv; int argc; linenum = i + 1; lines[i] = sdstrim(lines[i], " \t\r\n"); if (lines[i][0] == '#' || lines[i][0] == '\0') continue; argv = sdssplitargs(lines[i], &argc); if (argv == NULL) { err = "Unbalanced quotes in configuration line"; goto loaderr; } if (argc == 0) { sdsfreesplitres(argv, argc); continue; } sdstolower(argv[0]); if (strcasecmp(argv[0], "working-directory") == 0 && argc == 2) { destor.working_directory = sdscpy(destor.working_directory, argv[1]); } else if (strcasecmp(argv[0], "simulation-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "all") == 0) { destor.simulation_level = SIMULATION_ALL; } else if (strcasecmp(argv[1], "append") == 0) { destor.simulation_level = SIMULATION_APPEND; } else if (strcasecmp(argv[1], "restore") == 0) { destor.simulation_level = SIMULATION_RESTORE; } else if (strcasecmp(argv[1], "no") == 0) { destor.simulation_level = SIMULATION_NO; } else { err = "Invalid simulation level"; goto loaderr; } } else if (strcasecmp(argv[0], "log-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "debug") == 0) { destor.verbosity = DESTOR_DEBUG; } else if (strcasecmp(argv[1], "verbose") == 0) { destor.verbosity = DESTOR_VERBOSE; } else if (strcasecmp(argv[1], "notice") == 0) { destor.verbosity = DESTOR_NOTICE; } else if (strcasecmp(argv[1], "warning") == 0) { destor.verbosity = DESTOR_WARNING; } else { err = "Invalid log level"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-algorithm") == 0 && argc == 2) { if (strcasecmp(argv[1], "fixed") == 0) { destor.chunk_algorithm = CHUNK_FIXED; } else if (strcasecmp(argv[1], "rabin") == 0) { destor.chunk_algorithm = CHUNK_RABIN; } else if (strcasecmp(argv[1], "normalized rabin") == 0) { destor.chunk_algorithm = CHUNK_NORMALIZED_RABIN; } else if (strcasecmp(argv[1], "file") == 0) { destor.chunk_algorithm = CHUNK_FILE; } else { err = "Invalid chunk algorithm"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-avg-size") == 0 && argc == 2) { destor.chunk_avg_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "chunk-max-size") == 0 && argc == 2) { destor.chunk_max_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "chunk-min-size") == 0 && argc == 2) { destor.chunk_min_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index") == 0 && argc >= 3) { if (strcasecmp(argv[1], "exact") == 0) { destor.index_category[0] = INDEX_CATEGORY_EXACT; } else if (strcasecmp(argv[1], "near-exact") == 0) { destor.index_category[0] = INDEX_CATEGORY_NEAR_EXACT; } else { err = "Invalid index category"; goto loaderr; } if (strcasecmp(argv[2], "physical") == 0) { destor.index_category[1] = INDEX_CATEGORY_PHYSICAL_LOCALITY; } else if (strcasecmp(argv[2], "logical") == 0) { destor.index_category[1] = INDEX_CATEGORY_LOGICAL_LOCALITY; } else { err = "Invalid index category"; goto loaderr; } if (argc > 3) { if (strcasecmp(argv[3], "ddfs") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_EXACT && destor.index_category[1] == INDEX_CATEGORY_PHYSICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_DDFS; } else if (strcasecmp(argv[3], "sampled index") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_PHYSICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_SAMPLED; } else if (strcasecmp(argv[3], "block locality caching") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_BLOCK_LOCALITY_CACHING; } else if (strcasecmp(argv[3], "extreme binning") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_EXTREME_BINNING; } else if (strcasecmp(argv[3], "sparse index") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_SPARSE; } else if (strcasecmp(argv[3], "silo") == 0) { assert(destor.index_category[0] == INDEX_CATEGORY_NEAR_EXACT && destor.index_category[1] == INDEX_CATEGORY_LOGICAL_LOCALITY); destor.index_specific = INDEX_SPECIFIC_SILO; } else { err = "Invalid index specific"; goto loaderr; } } } else if (strcasecmp(argv[0], "fingerprint-index-cache-size") == 0 && argc == 2) { destor.index_cache_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-key-value") == 0 && argc == 2) { if (strcasecmp(argv[1], "htable") == 0) { destor.index_key_value_store = INDEX_KEY_VALUE_HTABLE; } else { err = "Invalid key-value store"; goto loaderr; } } else if (strcasecmp(argv[0], "fingerprint-index-key-size") == 0 && argc == 2) { destor.index_key_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-value-length") == 0 && argc == 2) { destor.index_value_length = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-bloom-filter") == 0 && argc == 2) { destor.index_bloom_filter_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "fingerprint-index-sampling-method") == 0 && argc >= 2) { if (strcasecmp(argv[1], "optmin") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_OPTIMIZED_MIN; else if (strcasecmp(argv[1], "random") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_RANDOM; else if (strcasecmp(argv[1], "min") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_MIN; else if (strcasecmp(argv[1], "uniform") == 0) destor.index_sampling_method[0] = INDEX_SAMPLING_UNIFORM; else { err = "Invalid feature method!"; goto loaderr; } if (argc > 2) { destor.index_sampling_method[1] = atoi(argv[2]); } else { destor.index_sampling_method[1] = 0; } } else if (strcasecmp(argv[0], "fingerprint-index-segment-algorithm") == 0 && argc >= 2) { if (strcasecmp(argv[1], "fixed") == 0) destor.index_segment_algorithm[0] = INDEX_SEGMENT_FIXED; else if (strcasecmp(argv[1], "file-defined") == 0) destor.index_segment_algorithm[0] = INDEX_SEGMENT_FILE_DEFINED; else if (strcasecmp(argv[1], "content-defined") == 0) destor.index_segment_algorithm[0] = INDEX_SEGMENT_CONTENT_DEFINED; else { err = "Invalid segment algorithm"; goto loaderr; } if (argc > 2) { assert(destor.index_segment_algorithm[0] != INDEX_SEGMENT_FILE_DEFINED); destor.index_segment_algorithm[1] = atoi(argv[2]); } } else if (strcasecmp(argv[0], "fingerprint-index-segment-boundary") == 0 && argc == 3) { destor.index_segment_min = atoi(argv[1]); destor.index_segment_max = atoi(argv[2]); } else if (strcasecmp(argv[0], "fingerprint-index-segment-selection") == 0 && argc >= 2) { destor.index_segment_selection_method[1] = 1; if (strcasecmp(argv[1], "base") == 0) destor.index_segment_selection_method[0] = INDEX_SEGMENT_SELECT_BASE; else if (strcasecmp(argv[1], "top") == 0) { destor.index_segment_selection_method[0] = INDEX_SEGMENT_SELECT_TOP; if (argc > 2) destor.index_segment_selection_method[1] = atoi(argv[2]); } else if (strcasecmp(argv[1], "mix") == 0) destor.index_segment_selection_method[0] = INDEX_SEGMENT_SELECT_MIX; else { err = "Invalid selection method!"; goto loaderr; } } else if (strcasecmp(argv[0], "fingerprint-index-segment-prefetching") == 0 && argc == 2) { destor.index_segment_prefech = atoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-algorithm") == 0 && argc >= 2) { if (strcasecmp(argv[1], "no") == 0) destor.rewrite_algorithm[0] = REWRITE_NO; else if (strcasecmp(argv[1], "cfl-based selective deduplication") == 0 || strcasecmp(argv[1], "cfl") == 0) destor.rewrite_algorithm[0] = REWRITE_CFL_SELECTIVE_DEDUPLICATION; else if (strcasecmp(argv[1], "context-based rewriting") == 0 || strcasecmp(argv[1], "cbr") == 0) destor.rewrite_algorithm[0] = REWRITE_CONTEXT_BASED; else if (strcasecmp(argv[1], "capping") == 0 || strcasecmp(argv[1], "cap") == 0) destor.rewrite_algorithm[0] = REWRITE_CAPPING; else { err = "Invalid rewriting algorithm"; goto loaderr; } if (argc > 2) { assert(destor.rewrite_algorithm != REWRITE_NO); destor.rewrite_algorithm[1] = atoi(argv[2]); } else { destor.rewrite_algorithm[1] = 1024; } } else if (strcasecmp(argv[0], "rewrite-enable-cfl-switch") == 0 && argc == 2) { destor.rewrite_enable_cfl_switch = yesnotoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cfl-require") == 0 && argc == 2) { destor.rewrite_cfl_require = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cfl-usage-threshold") == 0 && argc == 2) { destor.rewrite_cfl_usage_threshold = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cbr-limit") == 0 && argc == 2) { destor.rewrite_cbr_limit = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-cbr-minimal-utility") == 0 && argc == 2) { destor.rewrite_cbr_minimal_utility = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-capping-level") == 0 && argc == 2) { destor.rewrite_capping_level = atoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-enable-har") == 0 && argc == 2) { destor.rewrite_enable_har = yesnotoi(argv[1]); } else if (strcasecmp(argv[0], "rewrite-har-utilization-threshold") == 0 && argc == 2) { destor.rewrite_har_utilization_threshold = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-har-rewrite-limit") == 0 && argc == 2) { destor.rewrite_har_rewrite_limit = atof(argv[1]); } else if (strcasecmp(argv[0], "rewrite-enable-cache-aware") == 0 && argc == 2) { destor.rewrite_enable_cache_aware = yesnotoi(argv[1]); } else if (strcasecmp(argv[0], "restore-cache") == 0 && argc == 3) { if (strcasecmp(argv[1], "lru") == 0) destor.restore_cache[0] = RESTORE_CACHE_LRU; else if (strcasecmp(argv[1], "optimal cache") == 0 || strcasecmp(argv[1], "opt") == 0) destor.restore_cache[0] = RESTORE_CACHE_OPT; else if (strcasecmp(argv[1], "forward assembly") == 0 || strcasecmp(argv[1], "asm") == 0) destor.restore_cache[0] = RESTORE_CACHE_ASM; else { err = "Invalid restore cache"; goto loaderr; } destor.restore_cache[1] = atoi(argv[2]); } else if (strcasecmp(argv[0], "restore-opt-window-size") == 0 && argc == 2) { destor.restore_opt_window_size = atoi(argv[1]); } else if (strcasecmp(argv[0], "backup-retention-time") == 0 && argc == 2) { destor.backup_retention_time = atoi(argv[1]); } else { err = "Bad directive or wrong number of arguments"; goto loaderr; } sdsfreesplitres(argv, argc); } sdsfreesplitres(lines, totlines); return; loaderr: fprintf(stderr, "\n*** FATAL CONFIG FILE ERROR in destor ***\n"); fprintf(stderr, "Reading the configuration file, at line %d\n", linenum); fprintf(stderr, ">>> '%s'\n", lines[i]); fprintf(stderr, "%s\n", err); exit(1); }
int main(void) { { sdshdr *sh; sds x = sdsnew("foo"), y; test_cond("Create a string and obtain the length", sdslen(x) == 3 && memcmp(x,"foo\0",4) == 0) sdsfree(x); x = sdsnewlen("foo",2); test_cond("Create a string with specified length", sdslen(x) == 2 && memcmp(x,"fo\0",3) == 0) x = sdscat(x,"bar"); test_cond("Strings concatenation", sdslen(x) == 5 && memcmp(x,"fobar\0",6) == 0); x = sdscpy(x,"a"); test_cond("sdscpy() against an originally longer string", sdslen(x) == 1 && memcmp(x,"a\0",2) == 0) x = sdscpy(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk"); test_cond("sdscpy() against an originally shorter string", sdslen(x) == 33 && memcmp(x,"xyzxxxxxxxxxxyyyyyyyyyykkkkkkkkkk\0",33) == 0) sdsfree(x); x = sdscatprintf(sdsempty(),"%d",123); test_cond("sdscatprintf() seems working in the base case", sdslen(x) == 3 && memcmp(x,"123\0",4) ==0) sdsfree(x); x = sdsnew("xxciaoyyy"); sdstrim(x,"xy"); test_cond("sdstrim() correctly trims characters", sdslen(x) == 4 && memcmp(x,"ciao\0",5) == 0) y = sdsdup(x); sdsrange(y,1,1); test_cond("sdsrange(...,1,1)", sdslen(y) == 1 && memcmp(y,"i\0",2) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,1,-1); test_cond("sdsrange(...,1,-1)", sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,-2,-1); test_cond("sdsrange(...,-2,-1)", sdslen(y) == 2 && memcmp(y,"ao\0",3) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,2,1); test_cond("sdsrange(...,2,1)", sdslen(y) == 0 && memcmp(y,"\0",1) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,1,100); test_cond("sdsrange(...,1,100)", sdslen(y) == 3 && memcmp(y,"iao\0",4) == 0) sdsfree(y); y = sdsdup(x); sdsrange(y,100,100); test_cond("sdsrange(...,100,100)", sdslen(y) == 0 && memcmp(y,"\0",1) == 0) sdsfree(y); sdsfree(x); x = sdsnew("foo"); y = sdsnew("foa"); test_cond("sdscmp(foo,foa)", sdscmp(x,y) > 0) sdsfree(y); sdsfree(x); x = sdsnew("bar"); y = sdsnew("bar"); test_cond("sdscmp(bar,bar)", sdscmp(x,y) == 0) sdsfree(y); sdsfree(x); x = sdsnew("aar"); y = sdsnew("bar"); test_cond("sdscmp(bar,bar)", sdscmp(x,y) < 0) sdsfree(y); sdsfree(x); x = sdsnewlen("\a\n\0foo\r",7); y = sdscatrepr(sdsempty(),x,sdslen(x)); test_cond("sdscatrepr(...data...)", memcmp(y,"\"\\a\\n\\x00foo\\r\"",15) == 0) sdsfree(y); { size_t oldfree; sdsfree(x); x = sdsnew("0"); sh = sds_start(x); test_cond("sdsnew() free/len buffers", sh->len == 1 && sh->free == 0); x = sdsMakeRoomFor(x,1); sh = sds_start(x); test_cond("sdsMakeRoomFor()", sh->len == 1 && sh->free > 0); oldfree = sh->free; x[1] = '1'; sdsIncrLen(x,1); test_cond("sdsIncrLen() -- content", x[0] == '0' && x[1] == '1'); test_cond("sdsIncrLen() -- len", sh->len == 2); test_cond("sdsIncrLen() -- free", sh->free == oldfree-1); sdsfree(x); } x = sdsnew("0FoO1bar\n"); sdstolower(x); test_cond("sdstolower(...)", memcmp(x,"0foo1bar\n\0",10) == 0) sdsfree(x); x = sdsnew("0FoO1bar\n"); sdstoupper(x); test_cond("sdstoupper(...)", memcmp(x,"0FOO1BAR\n\0",10) == 0) sdsfree(x); } test_report() return 0; }
/** * Parses a string buffer for mustache tags. * * @param sds str The string buffer to parse. * * @retval sds str The parsed string buffer. */ static sds match_tags(sds str) { puts("match_tags"); sds re = sdsempty(), s = sdsempty(), buff = sdsempty(); re = sdscatprintf(re, "(%s[\\S\\s]+?%s)", ldelim, rdelim); struct slre_cap caps[1]; int i, sl = sdslen(str); struct slre_cap* match = slre_match_all(re, str, sl, caps, 1); int matches = slre_match_count(re, str, sl, caps, 1); sds remain = sdsdup(str); sds part = sdsempty(); char *pos, *end, type; for (i=0; i < matches; i++) { s = sdsempty(); s = sdscatprintf(s,"%.*s", match[i].len, match[i].ptr); if (!(pos = strstr(remain, s))) continue; part = sdscpylen(part, remain, pos-remain); remain = sdscpy(remain, pos+sdslen(s)); buff = sdscat(buff,part); type = s[(strlen(ldelim))]; if (type == '#' || type == '^') { sds endtag = sdsdup(s); sds tag = sdscpylen( sdsempty(), ( s + sdslen(ldelim) + 1 ), ( sdslen(s) - sdslen(ldelim) - sdslen(rdelim) - 1 ) ); endtag[(sdslen(ldelim))] = '/'; end = strstr(remain, endtag); printf("part: '%s'\n", part); s = sdscatlen(sdsempty(), remain, end-remain); printf("search: '%s'\n", s); remain = sdscpy(remain, end+sdslen(endtag)); printf("remain: '%s'\n", remain); //sds tmp = sdsempty(); //tmp = match_tags(tmp); buff = parse_section(s, tag, type); //sdsfree(tmp); //buff = sdscat(buff, tmp); } else { buff = sdscat(buff,parse_tag(s)); puts("foo"); } } buff = sdscat(buff,remain); str = sdscpylen(str,buff,sdslen(buff)); puts("free part"); sdsfree(part); puts("free remain"); sdsfree(remain); puts("free buff"); //sdsfree(buff); puts("free re"); sdsfree(re); puts("free s"); // sdsfree(s); // puts("return"); return str; }
/* * Create a new backupVersion structure for a backup run. */ struct backupVersion* create_backup_version(const char *path) { struct backupVersion *b = (struct backupVersion *) malloc( sizeof(struct backupVersion)); b->bv_num = get_next_version_number(); b->path = sdsnew(path); /* * If the path points to a file, */ int cur = sdslen(b->path) - 1; while (b->path[cur] != '/') { b->path[cur] = 0; cur--; } sdsupdatelen(b->path); b->deleted = 0; b->number_of_chunks = 0; b->number_of_files = 0; b->fname_prefix = sdsdup(recipepath); b->fname_prefix = sdscat(b->fname_prefix, "bv"); char s[20]; sprintf(s, "%d", b->bv_num); b->fname_prefix = sdscat(b->fname_prefix, s); sds fname = sdsdup(b->fname_prefix); fname = sdscat(fname, ".meta"); if ((b->metadata_fp = fopen(fname, "w")) == 0) { fprintf(stderr, "Can not create bv%d.meta!\n", b->bv_num); exit(1); } fseek(b->metadata_fp, 0, SEEK_SET); fwrite(&b->bv_num, sizeof(b->bv_num), 1, b->metadata_fp); fwrite(&b->deleted, sizeof(b->deleted), 1, b->metadata_fp); fwrite(&b->number_of_files, sizeof(b->number_of_files), 1, b->metadata_fp); fwrite(&b->number_of_chunks, sizeof(b->number_of_chunks), 1, b->metadata_fp); int pathlen = sdslen(b->path); fwrite(&pathlen, sizeof(pathlen), 1, b->metadata_fp); fwrite(b->path, sdslen(b->path), 1, b->metadata_fp); b->metabuf = malloc(metabufsize); b->metabufoff = 0; fname = sdscpy(fname, b->fname_prefix); fname = sdscat(fname, ".recipe"); if ((b->recipe_fp = fopen(fname, "w+")) <= 0) { fprintf(stderr, "Can not create bv%d.recipe!\n", b->bv_num); exit(1); } b->recordbuf = malloc(recordbufsize); b->recordbufoff = 0; fname = sdscpy(fname, b->fname_prefix); fname = sdscat(fname, ".records"); if ((b->record_fp = fopen(fname, "w")) <= 0) { fprintf(stderr, "Can not create bv%d.records!\n", b->bv_num); exit(1); } sdsfree(fname); return b; }
/* * Open an existing bversion for a restore run. */ struct backupVersion* open_backup_version(int number) { if (!backup_version_exists(number)) { fprintf(stderr, "Backup version %d doesn't exist", number); exit(1); } struct backupVersion *b = (struct backupVersion *) malloc( sizeof(struct backupVersion)); b->fname_prefix = sdsdup(recipepath); b->fname_prefix = sdscat(b->fname_prefix, "bv"); char s[20]; sprintf(s, "%d", number); b->fname_prefix = sdscat(b->fname_prefix, s); sds fname = sdsdup(b->fname_prefix); fname = sdscat(fname, ".meta"); if ((b->metadata_fp = fopen(fname, "r")) == 0) { fprintf(stderr, "Can not open bv%d.meta!\n", b->bv_num); exit(1); } fseek(b->metadata_fp, 0, SEEK_SET); fread(&b->bv_num, sizeof(b->bv_num), 1, b->metadata_fp); assert(b->bv_num == number); fread(&b->deleted, sizeof(b->deleted), 1, b->metadata_fp); if (b->deleted) { /*fprintf(stderr, "Backup version %d has been deleted!\n", number);*/ NOTICE("This version has been deleted!\n"); /*exit(1);*/ } fread(&b->number_of_files, sizeof(b->number_of_files), 1, b->metadata_fp); fread(&b->number_of_chunks, sizeof(b->number_of_chunks), 1, b->metadata_fp); int pathlen; fread(&pathlen, sizeof(int), 1, b->metadata_fp); char path[pathlen + 1]; fread(path, pathlen, 1, b->metadata_fp); path[pathlen] = 0; b->path = sdsnew(path); fname = sdscpy(fname, b->fname_prefix); fname = sdscat(fname, ".recipe"); if ((b->recipe_fp = fopen(fname, "r")) <= 0) { fprintf(stderr, "Can not open bv%d.recipe!\n", b->bv_num); exit(1); } fname = sdscpy(fname, b->fname_prefix); fname = sdscat(fname, ".records"); if ((b->record_fp = fopen(fname, "r")) <= 0) { fprintf(stderr, "Can not open bv%d.records!\n", b->bv_num); exit(1); } b->metabuf = 0; b->metabufoff = 0; b->recordbuf = 0; b->recordbufoff = 0; sdsfree(fname); return b; }
void load_config_from_string(sds config) { char *err = NULL; int linenum = 0, totlines, i; sds *lines = sdssplitlen(config, strlen(config), "\n", 1, &totlines); for (i = 0; i < totlines; i++) { sds *argv; int argc; linenum = i + 1; lines[i] = sdstrim(lines[i], " \t\r\n"); if (lines[i][0] == '#' || lines[i][0] == '\0') continue; argv = sdssplitargs(lines[i], &argc); if (argv == NULL) { err = "Unbalanced quotes in configuration line"; goto loaderr; } if (argc == 0) { sdsfreesplitres(argv, argc); continue; } sdstolower(argv[0]); if (strcasecmp(argv[0], "working-directory") == 0 && argc == 2) { destor.working_directory = sdscpy(destor.working_directory, argv[1]); } else if (strcasecmp(argv[0], "simulation-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "all") == 0) { destor.simulation_level = SIMULATION_ALL; } else if (strcasecmp(argv[1], "append") == 0) { destor.simulation_level = SIMULATION_APPEND; } else if (strcasecmp(argv[1], "restore") == 0) { destor.simulation_level = SIMULATION_RESTORE; } else if (strcasecmp(argv[1], "no") == 0) { destor.simulation_level = SIMULATION_NO; } else { err = "Invalid simulation level"; goto loaderr; } } else if (strcasecmp(argv[0], "log-level") == 0 && argc == 2) { if (strcasecmp(argv[1], "debug") == 0) { destor.verbosity = DESTOR_DEBUG; } else if (strcasecmp(argv[1], "verbose") == 0) { destor.verbosity = DESTOR_VERBOSE; } else if (strcasecmp(argv[1], "notice") == 0) { destor.verbosity = DESTOR_NOTICE; } else if (strcasecmp(argv[1], "warning") == 0) { destor.verbosity = DESTOR_WARNING; } else { err = "Invalid log level"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-algorithm") == 0 && argc == 2) { if (strcasecmp(argv[1], "fixed") == 0) { destor.chunk_algorithm = CHUNK_FIXED; } else if (strcasecmp(argv[1], "rabin") == 0) { destor.chunk_algorithm = CHUNK_RABIN; } else if (strcasecmp(argv[1], "normalized rabin") == 0) { destor.chunk_algorithm = CHUNK_NORMALIZED_RABIN; } else { err = "Invalid chunk algorithm"; goto loaderr; } } else if (strcasecmp(argv[0], "chunk-avg-size") == 0 && argc == 2) { destor.chunk_avg_size = atoi(argv[1]); int pwr; for (pwr = 0; destor.chunk_avg_size; pwr++) { destor.chunk_avg_size >>= 1; } destor.chunk_avg_size = 1 << (pwr - 1); } else if (strcasecmp(argv[0], "chunk-max-size") == 0 && argc == 2) {
static int conf_parse(rmt_conf *cf) { int ret; conf_pool *cp; dict *orgs, *org; dictEntry *de; sds key; if(cf == NULL){ return RMT_ERROR; } orgs = cf->organizations; if(orgs == NULL){ return RMT_ERROR; } //source pool key = sdsnew(CONF_ORGANIZATION_NAME_SOURCE); de = dictFind(orgs, key); if(de == NULL){ log_error("ERROR: Can not find %s organization in conf file %s", CONF_ORGANIZATION_NAME_SOURCE, cf->fname); sdsfree(key); return RMT_ERROR; } org = dictGetVal(de); if(org == NULL){ log_error("ERROR: Dict %s entry value is NULL", dictGetKey(de)); sdsfree(key); return RMT_ERROR; } cp = &cf->source_pool; ret = conf_parse_conf_pool(cp, org); if(ret != RMT_OK){ log_error("ERROR: source pool conf parse error"); sdsfree(key); return RMT_ERROR; } //target pool key = sdscpy(key, CONF_ORGANIZATION_NAME_TARGET); de = dictFind(orgs, key); if(de == NULL){ log_error("ERROR: Can not find %s organization in conf file %s", CONF_ORGANIZATION_NAME_TARGET, cf->fname); sdsfree(key); return RMT_ERROR; } org = dictGetVal(de); if(org == NULL){ log_error("ERROR: Dict %s entry value is NULL", dictGetKey(de)); sdsfree(key); return RMT_ERROR; } cp = &cf->target_pool; ret = conf_parse_conf_pool(cp, org); if(ret != RMT_OK){ log_error("ERROR: target pool conf parse error"); sdsfree(key); return RMT_ERROR; } //common key = sdscpy(key, CONF_ORGANIZATION_NAME_COMMAN); de = dictFind(orgs, key); if(de == NULL){ log_error("ERROR: Can not find %s organization in conf file %s", CONF_ORGANIZATION_NAME_COMMAN, cf->fname); sdsfree(key); return RMT_ERROR; } org = dictGetVal(de); if(org == NULL){ log_error("ERROR: Dict %s entry value is NULL", dictGetKey(de)); sdsfree(key); return RMT_ERROR; } ret = conf_parse_conf_common(cf, org); if(ret != RMT_OK){ log_error("ERROR: common conf parse error"); sdsfree(key); return RMT_ERROR; } sdsfree(key); return RMT_OK; }