Пример #1
0
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;
}
Пример #2
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 );
}
Пример #3
0
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;
}
Пример #4
0
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;
}