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); }
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; }
/* * 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; }
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; }
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 */ }