static int do_onig_search_internal (Onig_Type *o, OnigOptionType option, UChar *str, UChar *str_end, int start_pos, int end_pos) { UChar *start, *range; int status; onig_region_clear (o->region); start = str + start_pos; range = str + end_pos; /* fwd search: (start <= search string < range) * bkw search: (range <= search string <= start) */ if ((start < str) || (start > str_end) || (range < str) || (range > str_end)) { SLang_verror (SL_InvalidParm_Error, "Invalid string offsets"); return -1; } status = onig_search (o->re, str, str_end, start, range, o->region, option); if (status >= 0) return status; if (status == ONIG_MISMATCH) return -1; throw_onig_error (status, NULL); return -2; }
static unstr_t* create_date_query(const nich_t *nich, size_t res_no, const unstr_t *data) { OnigRegion *region = onig_region_new(); unstr_t *strtmp = 0; unstr_t *query = 0; UChar *start; UChar *end; UChar *range; int ret = -1; int i = 0; end = (UChar *)(data->data + unstr_strlen(data)); start = (UChar *)(data->data); range = end; ret = onig_search(nich->reg, (UChar *)data->data, end, start, range, region, ONIG_OPTION_NONE); if(ret >= 0){ strtmp = unstr_init_memory(8); query = unstr_sprintf(NULL, "(%d,%$,%d,'", nich->board_no, nich->thread, res_no); for(i = 1; i < region->num_regs; i++){ unstr_substr_char(strtmp, data->data + region->beg[i], region->end[i] - region->beg[i]); unstr_strcat(query, strtmp); } unstr_strcat_char(query, "')"); } onig_region_clear(region); onig_region_free(region, 1); unstr_free(strtmp); return query; }
static int findmatch_exec (TUserdata *ud, TArgExec *argE) { const char *end = argE->text + argE->textlen; onig_region_clear(ud->region); return onig_search (ud->reg, (CUC)argE->text, (CUC)end, (CUC)argE->text + argE->startoffset, (CUC)end, ud->region, argE->eflags); }
cell AMX_NATIVE_CALL pawn_regex_exsearch(AMX* amx, cell* params) { const char *string = NULL; cell* addr[2] = {NULL, NULL}; amx_GetAddr(amx, params[3], &addr[0]); amx_GetAddr(amx, params[4], &addr[1]); amx_StrParam(amx, params[1], string); if(string) { int id=(int)params[2]; if(id>=0 && id<TotalExpressions) { int r=NULL; UChar* str = (UChar* )string; onig_region_clear(rexpression[id].zreg); r = onig_search(rexpression[id].RegExpr, str, str+strlen(string), str, str+strlen(string), rexpression[id].zreg, ONIG_OPTION_NONE); if(r>=0) { *addr[0]=r; *addr[1]=rexpression[id].zreg->end[rexpression[id].zreg->num_regs-1]-1; } else if(r==ONIG_MISMATCH) { *addr[0]=-1; *addr[1]=-1; } else { UChar s[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(s, r); logprintf("[REGEX ERROR]: %s\n", s); return -1; } return 1; } logprintf("[REGEX ERROR]: Call regex_exsearch with undefined parameter at index %d", id); return -1; } return -1337; }
cell AMX_NATIVE_CALL pawn_regex_exreplace(AMX* amx, cell* params) { const char *string = NULL, *replace = NULL; cell* addr = NULL; amx_GetAddr(amx, params[1], &addr); amx_StrParam(amx, params[1], string); amx_StrParam(amx, params[3], replace); if(string) { int id=(int)params[2]; if(id>=0 && id<TotalExpressions) { int r=NULL; UChar* str = (UChar* )string; onig_region_clear(rexpression[id].zreg); r = onig_search(rexpression[id].RegExpr, str, str+strlen(string), str, str+strlen(string), rexpression[id].zreg, ONIG_OPTION_NONE); if(r>=0) { std::string asd = std::string(string); asd.replace(asd.begin()+r, asd.begin()+rexpression[id].zreg->end[rexpression[id].zreg->num_regs-1], replace); amx_SetString(addr, asd.c_str(), 0, 0, params[1]); } else if(r<ONIG_MISMATCH) { UChar s[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(s, r); logprintf("[REGEX ERROR]: %s\n", s); return -1; } return r; } logprintf("[REGEX ERROR]: Call regex_exreplace with undefined parameter at index %d", id); return -1; } return -1337; }
static int gsub_exec (TOnig *ud, TArgExec *argE, int st) { const char *end = argE->text + argE->textlen; onig_region_clear(ud->region); return onig_search (ud->reg, (CUC)argE->text, (CUC)end, (CUC)argE->text + st, (CUC)end, ud->region, argE->eflags); }