diff options
Diffstat (limited to 'source/blender/blenkernel/intern/text.c')
-rw-r--r-- | source/blender/blenkernel/intern/text.c | 191 |
1 files changed, 136 insertions, 55 deletions
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 8a272cd9d81..9f441b45db9 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -369,14 +369,18 @@ int BKE_text_reload(Text *text) buffer = MEM_mallocN(len, "text_buffer"); - // under windows fread can return less then len bytes because - // of CR stripping + /* under windows fread can return less than len bytes because + * of CR stripping */ len = fread(buffer, 1, len, fp); fclose(fp); - BLI_stat(str, &st); - text->mtime = st.st_mtime; + if (BLI_stat(str, &st) != -1) { + text->mtime = st.st_mtime; + } + else { + text->mtime = 0; + } text_from_buf(text, buffer, len); @@ -425,14 +429,18 @@ Text *BKE_text_load_ex(Main *bmain, const char *file, const char *relpath, const fseek(fp, 0L, SEEK_SET); buffer = MEM_mallocN(len, "text_buffer"); - // under windows fread can return less then len bytes because - // of CR stripping + /* under windows fread can return less than len bytes because + * of CR stripping */ len = fread(buffer, 1, len, fp); fclose(fp); - BLI_stat(str, &st); - ta->mtime = st.st_mtime; + if (BLI_stat(str, &st) != -1) { + ta->mtime = st.st_mtime; + } + else { + ta->mtime = 0; + } text_from_buf(ta, buffer, len); @@ -446,7 +454,7 @@ Text *BKE_text_load(Main *bmain, const char *file, const char *relpath) return BKE_text_load_ex(bmain, file, relpath, false); } -Text *BKE_text_copy(Text *ta) +Text *BKE_text_copy(Main *bmain, Text *ta) { Text *tan; TextLine *line, *tmp; @@ -455,8 +463,7 @@ Text *BKE_text_copy(Text *ta) /* file name can be NULL */ if (ta->name) { - tan->name = MEM_mallocN(strlen(ta->name) + 1, "text_name"); - strcpy(tan->name, ta->name); + tan->name = BLI_strdup(ta->name); } else { tan->name = NULL; @@ -490,6 +497,10 @@ Text *BKE_text_copy(Text *ta) init_undo_text(tan); + if (ta->id.lib) { + BKE_id_lib_local_paths(bmain, ta->id.lib, &tan->id); + } + return tan; } @@ -505,10 +516,14 @@ void BKE_text_unlink(Main *bmain, Text *text) bNodeTree *ntree; bNode *node; Material *mat; + Lamp *la; + Tex *te; + World *wo; + FreestyleLineStyle *linestyle; Scene *sce; SceneRenderLayer *srl; FreestyleModuleConfig *module; - short update; + bool update; for (ob = bmain->object.first; ob; ob = ob->id.next) { /* game controllers */ @@ -560,23 +575,97 @@ void BKE_text_unlink(Main *bmain, Text *text) } /* nodes */ + for (la = bmain->lamp.first; la; la = la->id.next) { + ntree = la->nodetree; + if (!ntree) + continue; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_FRAME) { + if ((Text *)node->id == text) { + node->id = NULL; + } + } + } + } + + for (linestyle = bmain->linestyle.first; linestyle; linestyle = linestyle->id.next) { + ntree = linestyle->nodetree; + if (!ntree) + continue; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_FRAME) { + if ((Text *)node->id == text) { + node->id = NULL; + } + } + } + } + for (mat = bmain->mat.first; mat; mat = mat->id.next) { ntree = mat->nodetree; if (!ntree) continue; for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == SH_NODE_SCRIPT) { + if (ELEM(node->type, SH_NODE_SCRIPT, NODE_FRAME)) { + if ((Text *)node->id == text) { + node->id = NULL; + } + } + } + } + + for (te = bmain->tex.first; te; te = te->id.next) { + ntree = te->nodetree; + if (!ntree) + continue; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_FRAME) { + if ((Text *)node->id == text) { + node->id = NULL; + } + } + } + } + + for (wo = bmain->world.first; wo; wo = wo->id.next) { + ntree = wo->nodetree; + if (!ntree) + continue; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_FRAME) { + if ((Text *)node->id == text) { + node->id = NULL; + } + } + } + } + + for (sce = bmain->scene.first; sce; sce = sce->id.next) { + ntree = sce->nodetree; + if (!ntree) + continue; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_FRAME) { Text *ntext = (Text *)node->id; if (ntext == text) node->id = NULL; } } + + /* Freestyle (while looping oer the scene) */ + for (srl = sce->r.layers.first; srl; srl = srl->next) { + for (module = srl->freestyleConfig.modules.first; module; module = module->next) { + if (module->script == text) + module->script = NULL; + } + } } - + for (ntree = bmain->nodetree.first; ntree; ntree = ntree->id.next) { for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == SH_NODE_SCRIPT) { - Text *ntext = (Text *)node->id; - if (ntext == text) node->id = NULL; + if (ELEM(node->type, SH_NODE_SCRIPT, NODE_FRAME)) { + if ((Text *)node->id == text) { + node->id = NULL; + } } } } @@ -597,16 +686,6 @@ void BKE_text_unlink(Main *bmain, Text *text) } } - /* Freestyle */ - for (sce = bmain->scene.first; sce; sce = sce->id.next) { - for (srl = sce->r.layers.first; srl; srl = srl->next) { - for (module = srl->freestyleConfig.modules.first; module; module = module->next) { - if (module->script == text) - module->script = NULL; - } - } - } - text->id.us = 0; } @@ -614,7 +693,7 @@ void BKE_text_clear(Text *text) /* called directly from rna */ { int oldstate; - oldstate = txt_get_undostate( ); + oldstate = txt_get_undostate(); txt_set_undostate(1); txt_sel_all(text); txt_delete_sel(text); @@ -1515,7 +1594,7 @@ static bool max_undo_test(Text *text, int x) /* XXX error("Undo limit reached, buffer cleared\n"); */ MEM_freeN(text->undo_buf); init_undo_text(text); - return 0; + return false; } else { void *tmp = text->undo_buf; @@ -1526,7 +1605,7 @@ static bool max_undo_test(Text *text, int x) } } - return 1; + return true; } #if 0 /* UNUSED */ @@ -2474,6 +2553,7 @@ void txt_delete_word(Text *text) { txt_jump_right(text, true, true); txt_delete_sel(text); + txt_make_dirty(text); } void txt_backspace_char(Text *text) @@ -2522,6 +2602,7 @@ void txt_backspace_word(Text *text) { txt_jump_left(text, true, true); txt_delete_sel(text); + txt_make_dirty(text); } /* Max spaces to replace a tab with, currently hardcoded to TXT_TABSIZE = 4. @@ -2548,13 +2629,13 @@ static bool txt_add_char_intern(Text *text, unsigned int add, bool replace_tabs) if (add == '\n') { txt_split_curline(text); - return 1; + return true; } /* insert spaces rather than tabs */ if (add == '\t' && replace_tabs) { txt_convert_tab_to_spaces(text); - return 1; + return true; } txt_delete_sel(text); @@ -2603,7 +2684,7 @@ bool txt_replace_char(Text *text, unsigned int add) size_t del_size = 0, add_size; char ch[BLI_UTF8_MAX]; - if (!text->curl) return 0; + if (!text->curl) return false; /* If text is selected or we're at the end of the line just use txt_add_char */ if (text->curc == text->curl->len || txt_has_sel(text) || add == '\n') { @@ -2642,7 +2723,7 @@ bool txt_replace_char(Text *text, unsigned int add) text->curc += add_size; txt_pop_sel(text); } - return 1; + return true; } void txt_indent(Text *text) @@ -2735,7 +2816,7 @@ void txt_unindent(Text *text) while (true) { bool changed = false; - if (strncmp(text->curl->line, remove, indentlen) == 0) { + if (STREQLEN(text->curl->line, remove, indentlen)) { if (num == 0) unindented_first = true; text->curl->len -= indentlen; @@ -2977,37 +3058,37 @@ bool text_check_delim(const char ch) for (a = 0; a < (sizeof(delims) - 1); a++) { if (ch == delims[a]) - return 1; + return true; } - return 0; + return false; } bool text_check_digit(const char ch) { - if (ch < '0') return 0; - if (ch <= '9') return 1; - return 0; + if (ch < '0') return false; + if (ch <= '9') return true; + return false; } bool text_check_identifier(const char ch) { - if (ch < '0') return 0; - if (ch <= '9') return 1; - if (ch < 'A') return 0; - if (ch <= 'Z' || ch == '_') return 1; - if (ch < 'a') return 0; - if (ch <= 'z') return 1; - return 0; + if (ch < '0') return false; + if (ch <= '9') return true; + if (ch < 'A') return false; + if (ch <= 'Z' || ch == '_') return true; + if (ch < 'a') return false; + if (ch <= 'z') return true; + return false; } bool text_check_identifier_nodigit(const char ch) { - if (ch <= '9') return 0; - if (ch < 'A') return 0; - if (ch <= 'Z' || ch == '_') return 1; - if (ch < 'a') return 0; - if (ch <= 'z') return 1; - return 0; + if (ch <= '9') return false; + if (ch < 'A') return false; + if (ch <= 'Z' || ch == '_') return true; + if (ch < 'a') return false; + if (ch <= 'z') return true; + return false; } #ifndef WITH_PYTHON @@ -3025,8 +3106,8 @@ int text_check_identifier_nodigit_unicode(const unsigned int ch) bool text_check_whitespace(const char ch) { if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n') - return 1; - return 0; + return true; + return false; } int text_find_identifier_start(const char *str, int i) |