Example #1
0
void
draw_string_center(DC& dc, const Rect& rect, const String& str)
{
	uint prev_align = dc.set_text_align(TA_CENTER | TA_TOP);

	Point str_pos(
		rect.left + rect.width() /2,
		rect.top + (rect.height() - dc.string_height()) /2);
	dc.draw_string(str, str_pos);

	dc.set_text_align(prev_align);
}
Example #2
0
p_val punt_sfind(p_val *args, p_var **vars) {
  p_val rval = val_make();

  if(val_llen(args) != 2) {
    fprintf(stderr, "sfind: 2 args required\n");
    exit(1);
  } else if(strcmp(args[0].type, "str") || strcmp(args[1].type, "str")) {
    fprintf(stderr, "sfind: all args must be strings\n");
    exit(1);
  }

  rval.val = ptr_dupint(str_pos((char *)args[0].val, (char *)args[1].val, 0));

  return rval;
}
Example #3
0
/* 
 * replace substring
 *
 * This function is probably f'ing hideous.
 */
char *str_replace(const char *target, const char *search, const char *replace,
    unsigned int start) {
  char *result, *left, *right;
  int pos;

  asprintf(&result, "%s", target);
  for(; (pos = str_pos(result, search, start)) != -1; ) {
    left = (char *)calloc(start + pos + 1, sizeof(char));
    right = (char *)calloc((strlen(result) - pos - strlen(search)) + 1, sizeof(char));

    strncpy(left, result, pos);
    strncpy(right, result + pos + strlen(search), strlen(result) - pos - strlen(search));
    asprintf(&result, "%s%s%s", left, replace, right);

    free(left);
    free(right);

    start = pos + strlen(replace);
  }

  return result;
}
Example #4
0
ea_t
VtableScanner::checkVtable (
    ea_t address
) {
    size_t vtableMethodsCount = getVtableMethodsCount (address);
    ea_t endTable;
    ea_t p;

    if (!vtableMethodsCount) {
        // No vtable found at this address, return the next address
        return address + 4;
    }
    
    // Check if it's named as a vtable
    char bufName [4096];
    char *name = IDAUtils::Name (address, bufName, sizeof (bufName));
    if (strncmp (name, "??_7", 4) != 0) {
        name = NULL;
    }
    
    endTable = get_long (address - 4);
    
    char buffer[4096] = {0};
    if (CompleteObjectLocator::isValid (endTable)) {
        Vtable *vtable = Vtable::parse (address, vtableMethodsCount);
        if (vtable) {
            this->vtables.push_back (vtable);
        }
        
        if (name == NULL) {
            name = Vtable::getClassName2 (endTable, buffer, sizeof (buffer));
        }

        // only output object tree for main vtable
        if (get_long (endTable + 4) == 0) {
            CRTTIClassHierarchyDescriptor::parse2 (get_long (endTable + 16));
        }

        IDAUtils::MakeName (address, name);
    }
    
    char buffer2 [4096];
    if (name != NULL) {
        int typeinfoPos = str_pos (name, "@@6B");
        name[typeinfoPos+2] = '\0';
        //convert vtable name into typeinfo name
        sprintf_s (buffer2, sizeof (buffer2), ".?AV%s", &name[4]);
        name = buffer2;
    }
    
    IDAUtils::DeleteArray (IDAUtils::GetArrayId ("AddrList"));
    int q = 0; int i = 1;

    for (endTable = IDAUtils::DfirstB (address); endTable != BADADDR; endTable = IDAUtils::DnextB (address, endTable))
    {
        p = Vtable::getFuncStart (endTable);

        if (p != BADADDR)
        {
            if (q == p) {
                i++;
            }

            else {           
                if (q) {
                    IDAUtils::AddAddr(q);
                }
                i = 1;
                q = p;
            }
        }
    }
    if (q) {
        IDAUtils::AddAddr(q);
    }
    
    endTable = address;

    while (vtableMethodsCount > 0)
    {
        p = get_long (endTable);
        if (IDAUtils::GetFunctionFlags(p) == -1) {
            IDAUtils::MakeCode(p);
            IDAUtils::MakeFunction (p, BADADDR);
        }
        
        Vtable::checkSDD (p, name, address, 0);
        vtableMethodsCount--;
        endTable += 4;
    }

    IDAUtils::doAddrList (name);
    
    return endTable;
}
Example #5
0
    Eximpl int			/* -1 | success */
epd_fill_line( EpdJob* ejp, const char* linbuf )
{
    register const char*	p;	/* scanning input */
    char			c;

    g_epd_errs  = 0;
    g_epd_phase = "input";
    p = linbuf;
    SKIP_SPACE(p);		/* we accept leading spaces */
    switch( (c = *p) ) {
     case '.':			/* end of input */
	return -1;		/* codes end-of-input */
     case 0:			/* empty line */
	c = ' ';		/* represented by blank in copy-string */
	/*FALLTHROUGH*/
     case '%':			/* PGN escape, accepted as comment */
     case ';':			/* PGN comment */
     case '#':			/* another widely used explicit comment */
	if( str_pos(EPD_COPY_COMMENT_CHARS, c) >= 0 ) {
#if EPD_STRIP_COMMENT
	    printf("%s\n", p);		/* copy reduced line */
#else
	    printf("%s\n", linbuf);	/* copy complete line */
#endif
	}
	return FALSE;		/* no error, but no job read */
    }
    p = EPD_FILL_CARR(p, ejp->fys   , "board"        ); SKIP_SPACE(p);
    p = EPD_FILL_CARR(p, ejp->tom   , "side to move" ); SKIP_SPACE(p);
    p = EPD_FILL_CARR(p, ejp->castle, "castle rights"); SKIP_SPACE(p);
    p = EPD_FILL_CARR(p, ejp->ep    , "ep target"    ); SKIP_SPACE(p);

    for(;;) {
	    register const char*	p0;
	    register int		i;
	    EpdOp*			eop;
	SKIP_SPACE(p);
	if( ! *p ) break;
	/* FFS: dup opcode: should overwrite first? */
					/* allocate next EpdOp */
	if( ! (eop = epd_new_op(ejp)) ) {
	    return FALSE;
	}
					/* fill in opcode */
	p0 = p;
	p = EPD_FILL_CARR(p, eop->op, "opcode");
	if( p <= p0 ) {
	    break;
	}
					/* copy opnd-list */
	SKIP_SPACE(p);
	if( *p == ';' ) {
	    eop->rest = EPD_STR_NIL;
	}else {
	    eop->rest = epd_new_str(ejp);
	    for( i=0 ; i<EPD_MAX_BUF_SIZ ; ++i ) {
		    register int	len;
		len = epd_len_opnd(p);
		if( len <= 0                     ) break;
		if( i && ! epd_app_chr(ejp, ' ') ) break;
		if( ! epd_app_mem(ejp, p, len)   ) break;
		p += len;
		if( ! IS_SPACE(*p)               ) break;
		SKIP_SPACE(p);
	    }
	    if( ! epd_app_chr(ejp, 0) ) break;		/* terminate string */
	}
					/* check proper termination */
	if( *p == ';' ) {
	    ++p;
	}else {
	    epd_tell_err_S("missing ';' at end of EPD-op", eop->op);
	}
    }
    epd_dump(ejp);			/* debugging */
    return g_epd_errs == 0;	/* ok, done */
}