void ExchangeString(void) { /* 文字列(target)中の一部(pat)を別の文字列(patr)で置き換える */ int target = getCaliValue(); int pat = getCaliValue(); int patr = getCaliValue(); char *start = v_str(target -1); char *next; char dst[STRVAR_LEN] = ""; DEBUG_COMMAND("ShString.ExchangeString: %d,%d,%d:\n", target, pat, patr); if (v_strlen(target -1) == 0 || v_strlen(pat -1) == 0) { return; } while(TRUE) { next = strstr(start, v_str(pat -1)); if (next == NULL) break; strncat(dst, start, (size_t)(next - start)); strncat(dst, v_str(patr -1), sizeof(dst) - strlen(dst)); start = next + v_strlen(pat -1); } strncat(dst, start, sizeof(dst) - strlen(dst)); v_strcpy(target -1, dst); }
/* * returns the length of the variable */ int v_length(var_t *var) { char tmpsb[INT_STR_LEN]; switch (var->type) { case V_STR: return v_strlen(var); case V_MAP: return map_length(var); case V_PTR: ltostr(var->v.ap.p, tmpsb); return strlen(tmpsb); case V_INT: ltostr(var->v.i, tmpsb); return strlen(tmpsb); case V_NUM: ftostr(var->v.n, tmpsb); return strlen(tmpsb); case V_ARRAY: return var->v.a.size; case V_REF: return v_length(var->v.ref); } return 1; }
/* * assign (dest = src) */ void v_set(var_t *dest, const var_t *src) { v_free(dest); dest->const_flag = 0; dest->type = src->type; switch (src->type) { case V_INT: dest->v.i = src->v.i; break; case V_STR: dest->v.p.length = v_strlen(src) + 1; dest->v.p.ptr = (char *)malloc(dest->v.p.length); strcpy(dest->v.p.ptr, src->v.p.ptr); break; case V_NUM: dest->v.n = src->v.n; break; case V_MAP: map_set(dest, (const var_p_t)src); break; case V_PTR: dest->v.ap.p = src->v.ap.p; dest->v.ap.v = src->v.ap.v; break; case V_REF: dest->v.ref = src->v.ref; break; case V_FUNC: dest->v.fn.cb = src->v.fn.cb; dest->v.fn.self = src->v.fn.self; break; case V_ARRAY: if (src->v.a.size) { memcpy(&dest->v.a, &src->v.a, sizeof(src->v.a)); v_new_array(dest, src->v.a.size); // copy each element int i; for (i = 0; i < src->v.a.size; i++) { var_t *src_vp = v_elem(src, i); var_t *dest_vp = v_elem(dest, i); v_init(dest_vp); v_set(dest_vp, src_vp); } } else { dest->v.a.size = 0; dest->v.a.data = NULL; dest->v.a.ubound[0] = dest->v.a.lbound[0] = opt_base; dest->v.a.maxdim = 1; } break; } }
/* * returns true if the user's program must use this var as an empty var * this is usefull for arrays */ int v_isempty(var_t *var) { switch (var->type) { case V_STR: return (v_strlen(var) == 0); case V_INT: return (var->v.i == 0); case V_MAP: return map_is_empty(var); case V_PTR: return (var->v.ap.p == 0); case V_NUM: return (var->v.n == 0.0); case V_ARRAY: return (var->v.a.size == 0); case V_REF: return v_isempty(var->v.ref); } return 1; }
// 指定の文字列のCGを作成 int scg_create_text(int wNumCG, int wSize, int wR, int wG, int wB, int wText) { cginfo_t *i; agsurface_t *glyph; FONT *font; if (0) { char *b = sjis2lang(v_str(wText-1)); WARNING("str = '%s'\n", b); free(b); } spcg_assert_no(wNumCG); // 勝手に出ていいのかな? if (v_strlen(wText -1) == 0) return OK; font = nact->ags.font; font->sel_font(FONT_GOTHIC, wSize); glyph = font->get_glyph(v_str(wText -1)); i = g_new(cginfo_t, 1); i->type = CG_SET; i->no = wNumCG; i->refcnt = 0; i->sf = sf_create_surface(glyph->width, wSize, nact->ags.dib->depth); gr_fill(i->sf, 0, 0, glyph->width, wSize, wR, wG, wB); gr_draw_amap(i->sf, 0, 0, glyph->pixel, glyph->width, wSize, glyph->bytes_per_line); // もし前に作成したものがあり、未開放の場合は開放 scg_free(wNumCG); sact.cg[wNumCG] = i; return OK; }