int main( int argc, char **argv ) { char *s = "Hello world"; char *s2 = "**Helsssssssssssssssssssssssssssslo world**"; char *p, *p2; obstack_init( &os ); p = (char*)obstack_copy0( &os, s, strlen(s) ); p2 = (char*)obstack_copy0( &os, s2, strlen(s2) ); //printf("%s - %s %08lX %08lX\n", p, p2, p, p2 ); obstack_free( &os, p ); p = (char*)obstack_copy0( &os, s, strlen(s) ); p = (char*)obstack_copy0( &os, s, strlen(s) ); p2 = (char*)obstack_copy0( &os, s2, strlen(s2) ); //printf("%s - %s %08lX %08lX\n", p, p2, p, p2 ); obstack_grow( &os, s, strlen(s) ); obstack_grow( &os, s, strlen(s) ); obstack_grow( &os, s, strlen(s) ); obstack_grow( &os, s, strlen(s) ); obstack_grow( &os, s, strlen(s) ); obstack_grow( &os, s, strlen(s) ); obstack_grow0( &os, s, strlen(s) ); p = obstack_finish( &os ); obstack_grow0( &os, s, strlen(s) ); p = obstack_finish( &os ); printf("XXXXXX %s XXXXXX\n", p ); obstack_free( &os, NULL ); return 0; }
const char *mem_finish( mem_String info ) { stringInfo i = (stringInfo)info; _mem_magic_strings( i, __FUNCTION__ ); ++i->count; i->bytes += 1; obstack_grow0( i->obstack, "", 0 ); return obstack_finish( i->obstack ); }
tree build_java_signature (tree type) { tree sig, t; while (TREE_CODE (type) == POINTER_TYPE) type = TREE_TYPE (type); MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type); sig = TYPE_SIGNATURE (type); if (sig == NULL_TREE) { char sg[2]; switch (TREE_CODE (type)) { case BOOLEAN_TYPE: sg[0] = 'Z'; goto native; case VOID_TYPE: sg[0] = 'V'; goto native; case INTEGER_TYPE: if (type == char_type_node || type == promoted_char_type_node) { sg[0] = 'C'; goto native; } switch (TYPE_PRECISION (type)) { case 8: sg[0] = 'B'; goto native; case 16: sg[0] = 'S'; goto native; case 32: sg[0] = 'I'; goto native; case 64: sg[0] = 'J'; goto native; default: goto bad_type; } case REAL_TYPE: switch (TYPE_PRECISION (type)) { case 32: sg[0] = 'F'; goto native; case 64: sg[0] = 'D'; goto native; default: goto bad_type; } native: sg[1] = 0; sig = get_identifier (sg); break; case RECORD_TYPE: if (TYPE_ARRAY_P (type)) { t = build_java_signature (TYPE_ARRAY_ELEMENT (type)); sig = ident_subst (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t), "[", 0, 0, ""); } else { t = DECL_NAME (TYPE_NAME (type)); sig = ident_subst (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t), "L", '.', '/', ";"); } break; case METHOD_TYPE: case FUNCTION_TYPE: { extern struct obstack temporary_obstack; sig = build_java_argument_signature (type); obstack_1grow (&temporary_obstack, '('); obstack_grow (&temporary_obstack, IDENTIFIER_POINTER (sig), IDENTIFIER_LENGTH (sig)); obstack_1grow (&temporary_obstack, ')'); t = build_java_signature (TREE_TYPE (type)); obstack_grow0 (&temporary_obstack, IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t)); sig = get_identifier ((char *) obstack_base (&temporary_obstack)); obstack_free (&temporary_obstack, obstack_base (&temporary_obstack)); } break; bad_type: default: gcc_unreachable (); } TYPE_SIGNATURE (type) = sig; } return sig; }
qu_ast_node *qu_raw_globseq(struct qu_parser *ctx, qu_ast_node *src) { const char *pat = qu_node_content(src); const char *pattern = qu_join_filenames(ctx, src->tag_token->filename, pat); const char *star = strchr(pattern, '*'); if(!star || star != strrchr(pattern, '*')) { qu_err_node_fatal(ctx->err, src, "Exactly one star in glob pattern required"); } const char *c; for (c = star-1; c >= pattern && *c != '/'; --c); const char *pat_start = c+1; for (c = star+1; *c && *c != '/'; ++c); const char *pat_end = c; int taillen = strlen(pat_end); char *dir; int dirlen; if(pat_start > pattern) { dirlen = pat_start - pattern; dir = alloca(dirlen + 1); memcpy(dir, pattern, dirlen); dir[dirlen] = 0; } else { dir = "."; dirlen = 1; } DIR *d = opendir(dir); if(!d) { qu_err_node_fatal(ctx->err, src, "Can't open directory \"%s\"", dir); } qu_ast_node *result = qu_new_sequence_node(ctx, NULL); int name_max = pathconf(dir, _PC_NAME_MAX); if (name_max == -1) /* Limit not defined, or error */ name_max = 255; /* Take a guess */ int len = offsetof(struct dirent, d_name) + name_max + 1; struct dirent *entryp = alloca(len); int rc; while(!(rc = readdir_r(d, entryp, &entryp)) && entryp) { // Prefix match if(pat_start == star) { // dir/* shouldn't match hidden files if(entryp->d_name[0] == '.') continue; } else { if(strncmp(entryp->d_name, pat_start, star - pat_start)) continue; } // Suffix match char *eend = entryp->d_name + strlen(entryp->d_name); if(pat_end > star+1) { int suffixlen = pat_end - (star+1); if(eend - entryp->d_name < suffixlen) continue; if(strncmp(eend - suffixlen, star+1, suffixlen)) continue; } obstack_blank(&ctx->pieces, 0); obstack_grow(&ctx->pieces, dir, dirlen); obstack_grow(&ctx->pieces, entryp->d_name, strlen(entryp->d_name)); obstack_grow0(&ctx->pieces, pat_end, taillen); char *fn = obstack_finish(&ctx->pieces); if(access(fn, F_OK) < 0) // file not exists after adding suffix continue; qu_ast_node *next = qu_file_newparse(ctx, fn); if(next) { qu_sequence_add(ctx, result, next); } } if(rc) { qu_err_node_fatal(ctx->err, src, "Can't read directory \"%s\"", dir); } closedir(d); return result; }