| line | true | false | branch | 
 
| 35 | 310 | 33 | if (file_p) { | 
 
| 37 | 0 | 310 | if (debuglevel>=TMPL_LOG_DEBUG2) tmpl_log(TMPL_LOG_DEBUG2,"_ff_exists: found [%s]\n",path); | 
 
| 40 | 0 | 33 | if (debuglevel>=TMPL_LOG_DEBUG2) tmpl_log(TMPL_LOG_ERROR,"_ff_exists: not found [%s]\n",path); | 
 
| 48 | 68 | 0 | if (path!=NULL) retval.endnext += strlen(path); | 
 
| 50 | 957 | 36 | while (retval.endnext > retval.begin && (c=*(--retval.endnext)) && ! IS_FILE_SEP(c)); | 
 
|  | 957 | 0 | while (retval.endnext > retval.begin && (c=*(--retval.endnext)) && ! IS_FILE_SEP(c)); | 
 
|  | 925 | 32 | while (retval.endnext > retval.begin && (c=*(--retval.endnext)) && ! IS_FILE_SEP(c)); | 
 
| 74 | 0 | 310 | if ('\0' == c0) return 0; | 
 
| 76 | 0 | 310 | if (IS_FILE_SEP(c0)) return 1; | 
 
| 105 | 6 | 0 | if (pos >= buf.begin && (pos+shift) <=buf.endnext) { | 
 
|  | 6 | 0 | if (pos >= buf.begin && (pos+shift) <=buf.endnext) { | 
 
| 107 | 170 | 6 | while (pos | 
 
| 126 | 4940 | 230 | while (pos | 
 
| 127 | 218 | 4722 | if (IS_FILE_SEP(*pos) && IS_FILE_SEP(*(pos+1))) buf=_shift_back_pstring_at(buf, pos, 1); | 
 
|  | 0 | 218 | if (IS_FILE_SEP(*pos) && IS_FILE_SEP(*(pos+1))) buf=_shift_back_pstring_at(buf, pos, 1); | 
 
| 139 | 2363 | 115 | while (pos | 
 
| 140 | 110 | 2253 | if (IS_FILE_SEP(*pos) && ('.'==*(pos+1)) && IS_FILE_SEP(*(pos+2))) buf=_shift_back_pstring_at(buf, pos, 2); | 
 
|  | 1 | 109 | if (IS_FILE_SEP(*pos) && ('.'==*(pos+1)) && IS_FILE_SEP(*(pos+2))) buf=_shift_back_pstring_at(buf, pos, 2); | 
 
|  | 0 | 1 | if (IS_FILE_SEP(*pos) && ('.'==*(pos+1)) && IS_FILE_SEP(*(pos+2))) buf=_shift_back_pstring_at(buf, pos, 2); | 
 
| 158 | 2246 | 115 | while (pos | 
 
| 160 | 110 | 2136 | if (IS_FILE_SEP(*pos)) { | 
 
| 161 | 1 | 109 | if (('.'==*(pos+1)) && ('.'==*(pos+2)) && IS_FILE_SEP(*(pos+3))) { | 
 
|  | 1 | 0 | if (('.'==*(pos+1)) && ('.'==*(pos+2)) && IS_FILE_SEP(*(pos+3))) { | 
 
|  | 1 | 0 | if (('.'==*(pos+1)) && ('.'==*(pos+2)) && IS_FILE_SEP(*(pos+3))) { | 
 
| 163 | 0 | 1 | if (pos == prev_slash_next && prev_slash_next==slash_begin) { | 
 
|  | 0 | 0 | if (pos == prev_slash_next && prev_slash_next==slash_begin) { | 
 
| 171 | 1 | 0 | if (prev_slash_next>slash_begin) prev_slash_next--; | 
 
| 172 | 1 | 0 | if (prev_slash_next>slash_begin) prev_slash_next--; | 
 
| 176 | 9 | 1 | while (prev_slash_next>=slash_begin && !IS_FILE_SEP(*prev_slash_next)) prev_slash_next--; | 
 
|  | 9 | 0 | while (prev_slash_next>=slash_begin && !IS_FILE_SEP(*prev_slash_next)) prev_slash_next--; | 
 
| 177 | 0 | 1 | if (prev_slash_next>slash_begin) prev_slash_next++;/* step next to slash */ | 
 
| 189 | 0 | 115 | if ((buf.endnext-buf.begin)<2) return buf.begin; | 
 
| 191 | 5 | 110 | if (('.'==*pos) && IS_FILE_SEP(*(pos+1))) buf=_shift_back_pstring_at(buf, pos, 2); | 
 
|  | 5 | 0 | if (('.'==*pos) && IS_FILE_SEP(*(pos+1))) buf=_shift_back_pstring_at(buf, pos, 2); | 
 
| 199 | 355 | 68 | for (s=pstr.begin;s | 
 
| 207 | 2783 | 227 | while ('\0'!=*s) {*(ret.endnext++)=*s++;} | 
 
| 213 | 112 | 0 | if (ret.endnext>ret.begin && IS_FILE_SEP(*(ret.endnext-1))) return ret; | 
 
|  | 7 | 105 | if (ret.endnext>ret.begin && IS_FILE_SEP(*(ret.endnext-1))) return ret; | 
 
| 227 | 310 | 0 | if (NULL==retval) retval = getenv("HTML_TEMPLATE_ROOT"); | 
 
| 239 | 0 | 310 | if (param->debug >= TMPL_LOG_DEBUG2) { | 
 
| 241 | 0 | 0 | if (HTML_TEMPLATE_ROOT) tmpl_log(TMPL_LOG_DEBUG2,"built-in _find_file: HTML_TEMPLATE_ROOT = %s\n",HTML_TEMPLATE_ROOT); | 
 
| 245 | 0 | 310 | if (_ff_is_absolute(filename) && _ff_exists(filename)) return _ff_canonical_path(filename); | 
 
|  | 0 | 0 | if (_ff_is_absolute(filename) && _ff_exists(filename)) return _ff_canonical_path(filename); | 
 
| 255 | 1 | 309 | if (HTML_TEMPLATE_ROOT!=NULL) HTML_TEMPLATE_ROOT_length=strlen(HTML_TEMPLATE_ROOT); | 
 
| 256 | 80 | 230 | if (pathlist!=NULL) { | 
 
| 257 | 99 | 80 | while (NULL!=*pathlist) { | 
 
| 259 | 88 | 11 | if (buffsize | 
 
| 273 | 68 | 242 | if (extra_dir.begin!=NULL) { | 
 
| 275 | 32 | 36 | if (extra_dir.endnext-extra_dir.begin >0) | 
 
| 279 | 52 | 16 | if (_ff_exists(filepath.begin)) return _ff_canonical_path_from_buf(filepath); | 
 
| 283 | 1 | 257 | if (HTML_TEMPLATE_ROOT!=NULL) { | 
 
| 285 | 1 | 0 | if (HTML_TEMPLATE_ROOT_length >0) | 
 
| 289 | 0 | 1 | if (_ff_exists(filepath.begin)) return _ff_canonical_path_from_buf(filepath); | 
 
| 294 | 67 | 191 | if (pathlist!=NULL) { | 
 
| 295 | 77 | 5 | while (NULL!=*pathlist) { | 
 
| 299 | 77 | 0 | if (0!=**pathlist) filepath=_ff_add_sep_to_buffer(filepath); | 
 
| 302 | 62 | 15 | if (_ff_exists(filepath.begin)) return _ff_canonical_path_from_buf(filepath); | 
 
| 308 | 195 | 1 | if (_ff_exists(filename)) return _ff_canonical_path(filename); | 
 
| 311 | 1 | 0 | if (HTML_TEMPLATE_ROOT!=NULL) { | 
 
| 313 | 1 | 0 | if (pathlist!=NULL) { | 
 
| 314 | 1 | 0 | while (NULL!=*pathlist) { | 
 
| 316 | 1 | 0 | if (HTML_TEMPLATE_ROOT_length >0) | 
 
| 320 | 1 | 0 | if (0!=**pathlist) filepath=_ff_add_sep_to_buffer(filepath); | 
 
| 323 | 1 | 0 | if (_ff_exists(filepath.begin)) return _ff_canonical_path_from_buf(filepath); | 
 
| 336 | 0 | 310 | if (filename == last_visited_file) tmpl_log(TMPL_LOG_ERROR,"built-in find_file: internal error: buffer clash for %s\n",filename); | 
 
| 338 | 0 | 310 | if (((struct tmplpro_param*)param)->debug>= TMPL_LOG_DEBUG) | 
 
| 342 | 76 | 234 | if (last_visited_file!=NULL && ! ((struct tmplpro_param*) param)->search_path_on_include) { | 
 
|  | 68 | 8 | if (last_visited_file!=NULL && ! ((struct tmplpro_param*) param)->search_path_on_include) { | 
 
| 346 | 0 | 310 | if (filepath==NULL) { | 
 
| 350 | 0 | 0 | if (NULL!=last_visited_file) tmpl_log(TMPL_LOG_ERROR," (included from %s)", last_visited_file); | 
 
| 351 | 0 | 0 | if(HTML_TEMPLATE_ROOT!=NULL) { | 
 
| 354 | 0 | 0 | if (NULL!=path) { | 
 
| 356 | 0 | 0 | while (NULL!=*path) { |