int node2str(spConfigNode*node,str*string) { int i; ENTRY; if(node->text) text2str(node->text,string); putStr(string,'<'); for(i=0;i<(int)strlen(node->name);++i) { switch(node->name[i]) { case '[':case '>': case '\\': case '"':case '/': putStr(string,'\\'); default: putStr(string,node->name[i]); } } putStr(string,' '); for(i=0;i<node->numAttributes;++i) { attr2str(node->attributes[i],string); } if(node->numChildren) { putStr(string,'>'); for(i=0;i<node->numChildren;++i) { node2str(node->children[i],string); } putStr(string,'<'); putStr(string,'/'); for(i=0;i<(int)strlen(node->name);++i) { switch(node->name[i]) { case '[':case '>': case '\\': case '"':case '/': putStr(string,'\\'); default: putStr(string,node->name[i]); } } putStr(string,'>'); } else { putStr(string,'/'); putStr(string,'>'); } return(0); }
unsigned StringData::sweepAll() { auto& head = MM().getStringList(); auto count = 0; for (StringDataNode *next, *n = head.next; n != &head; n = next) { count++; next = n->next; assert(next && uintptr_t(next) != kSmallFreeWord); assert(next && uintptr_t(next) != kMallocFreeWord); auto const s = node2str(n); assert(s->isShared()); s->sharedPayload()->shared->getHandle()->unreference(); } head.next = head.prev = &head; return count; }
/* starts with an arbitrary 256 byte buffer. as more junk is added, it * is realloc'd to be 2x larger * buffer is whole thing, location is current position offset */ char *spConfigSaveStr(spConfigNode*root) { str *string; char *saved; ENTRY; string=(str*)malloc(sizeof(str)); string->size=256; string->offset=0; string->string=(char*)malloc(sizeof(char)*256); // 不足したら内部でreallocされる node2str(root,string); saved=string->string; free(string); return(saved); /* buffer=(char*)malloc(256); if(!buffer) { return NULL; } if(root->text) ravsnprintf(buffer,&bufsize,&offset,"%s",root->text); if(root->values) { //warning, no vals in root } for(i=0;i<root->children;++i) { node2str(buffer,&bufsize,&offset,root->child[i],0); } return buffer;*/ }