static struct text_node *text_node_bychar(struct text_node *node, char ch) { struct text_node *subnode = node->first_subnode; while (subnode) { if (!dstr_isempty(&subnode->str) && subnode->str.array[0] == ch) return subnode; subnode = subnode->next; } return NULL; }
static void gl_write_main_storage_assign(struct gl_shader_parser *glsp, struct shader_var *var, const char *dst, const char *src, bool input) { struct shader_struct *st; struct dstr dst_copy = {0}; char ch_left = input ? '.' : '_'; char ch_right = input ? '_' : '.'; if (dst) { dstr_copy(&dst_copy, dst); dstr_cat_ch(&dst_copy, ch_left); } else { dstr_copy(&dst_copy, "\t"); } dstr_cat(&dst_copy, var->name); st = shader_parser_getstruct(&glsp->parser, var->type); if (st) { struct dstr src_copy = {0}; size_t i; if (src) dstr_copy(&src_copy, src); dstr_cat(&src_copy, var->name); dstr_cat_ch(&src_copy, ch_right); for (i = 0; i < st->vars.num; i++) { struct shader_var *st_var = st->vars.array+i; gl_write_main_storage_assign(glsp, st_var, dst_copy.array, src_copy.array, input); } dstr_free(&src_copy); } else { if (!dstr_isempty(&dst_copy)) dstr_cat_dstr(&glsp->gl_string, &dst_copy); dstr_cat(&glsp->gl_string, " = "); if (src) dstr_cat(&glsp->gl_string, src); dstr_cat(&glsp->gl_string, var->name); dstr_cat(&glsp->gl_string, ";\n"); if (!input) gl_write_main_interface_assign(glsp, var, src); } dstr_free(&dst_copy); }
static inline void set_rtmp_dstr(AVal *val, struct dstr *str) { bool valid = !dstr_isempty(str); val->av_val = valid ? str->array : NULL; val->av_len = valid ? (int)str->len : 0; }
void dstr_replace(struct dstr *str, const char *find, const char *replace) { size_t find_len, replace_len; char *temp; if (dstr_isempty(str)) return; if (!replace) replace = ""; find_len = strlen(find); replace_len = strlen(replace); temp = str->array; if (replace_len < find_len) { unsigned long count = 0; while ((temp = strstr(temp, find)) != NULL) { char *end = temp+find_len; size_t end_len = strlen(end); if (end_len) { memmove(temp+replace_len, end, end_len + 1); if (replace_len) memcpy(temp, replace, replace_len); } else { strcpy(temp, replace); } temp += replace_len; ++count; } if (count) str->len += (replace_len-find_len) * count; } else if (replace_len > find_len) { unsigned long count = 0; while ((temp = strstr(temp, find)) != NULL) { temp += find_len; ++count; } if (!count) return; str->len += (replace_len-find_len) * count; dstr_ensure_capacity(str, str->len + 1); temp = str->array; while ((temp = strstr(temp, find)) != NULL) { char *end = temp+find_len; size_t end_len = strlen(end); if (end_len) { memmove(temp+replace_len, end, end_len + 1); memcpy(temp, replace, replace_len); } else { strcpy(temp, replace); } temp += replace_len; } } else { while ((temp = strstr(temp, find)) != NULL) { memcpy(temp, replace, replace_len); temp += replace_len; } } }