url tail (url u) { if (is_concat (u)) { if (is_root_web (u[1]) && is_atomic (u[2])) return url_here (); return tail (u[2]); } if (is_or (u)) return tail (u[1]) | tail (u[2]); if (is_root (u)) return url_here (); return u; }
url unroot (url u) { if (is_concat (u)) return unroot (u[1]) * u[2]; if (is_or (u)) return unroot (u[1]) | unroot (u[2]); if (is_root (u)) return url_here (); return u; }
void reset_pfb_path () { string pfb= get_setting ("PFB"); the_pfb_path= url_here () | search_sub_dirs ("$TEXMACS_HOME_PATH/fonts/type1") | search_sub_dirs ("$TEXMACS_PATH/fonts/type1") | "$TEX_PFB_PATH" | (pfb == ""? url_none (): url_system (pfb)); the_pfb_path= expand (factor (the_pfb_path)); }
bool is_recursively_up_to_date (url dir) { if (!is_up_to_date (dir)) return false; bool error_flag; array<string> a= read_directory (dir, error_flag); for (int i=0; i<N(a); i++) if (url (a[i]) != url_here () && url (a[i]) != url_parent ()) if (is_directory (dir * a[i])) if (!is_recursively_up_to_date (dir * a[i])) return false; return true; }
properties tmfs_list_heads_inside (url u, string prj) { strings files= as_strings (tmfs_get_project_files (prj)); properties r; for (int i=0; i<N(files); i++) { string id= files[i]; collection pl= tmfs_query (seq ("mirror", id, prj, "?delta"), "?delta"); if (N(pl) > 0) { url v= first (pl); if (u == url_here () || descends (v, u)) r << seq (as_string (v), id); } } merge_sort (r); return r; }
void reset_pk_path (bool rehash) { (void) rehash; // if (rehash && (get_setting ("TEXHASH") == "true")) system ("texhash"); string pk= get_setting ("PK"); the_pk_path= url_here () | search_sub_dirs ("$TEXMACS_HOME_PATH/fonts/pk") | search_sub_dirs ("$TEXMACS_PATH/fonts/pk") | "$TEX_PK_PATH" | (pk == ""? url_none (): pk); if ((get_setting ("MAKEPK") != "false") || (get_setting ("TEXHASH") == "true")) if (get_setting ("KPSEWHICH") != "true") the_pk_path= the_pk_path | get_kpsepath ("pk"); the_pk_path= expand (factor (the_pk_path)); }
void reset_tfm_path (bool rehash) { (void) rehash; // if (rehash && (get_setting ("TEXHASH") == "true")) system ("texhash"); string tfm= get_setting ("TFM"); the_tfm_path= url_here () | search_sub_dirs ("$TEXMACS_HOME_PATH/fonts/tfm") | search_sub_dirs ("$TEXMACS_PATH/fonts/tfm") | "$TEX_TFM_PATH" | (tfm == ""? url_none (): tfm); if ((get_setting ("MAKETFM") != "false") || (get_setting ("TEXHASH") == "true")) if (get_setting ("KPSEWHICH") != "true") the_tfm_path= the_tfm_path | get_kpsepath ("tfm"); the_tfm_path= expand (factor (the_tfm_path)); }
url operator * (url u1, url u2) { //cout << "concat " << u1->t << " * " << u2->t << "\n"; if (is_root (u2) || (is_concat (u2) && is_root (u2[1]))) { if (is_concat (u1) && is_root_web (u1[1])) { if (is_root (u2, "default") || (is_concat (u2) && is_root (u2[1], "default"))) { url v= u1[2]; while (is_concat (v)) v= v[1]; if (is_root (u2)) return u1[1] * v; return u1[1] * v * u2[2]; } if (is_root (u2, "blank") || (is_concat (u2) && is_root (u2[1], "blank"))) return reroot (u2, u1[1][1]->t->label); } return u2; } if (is_here (u1) || (u1->t == "")) return u2; if (is_here (u2)) return u1; if (is_none (u1)) return url_none (); if (is_none (u2)) return url_none (); if (u2 == url_parent ()) { if (is_root (u1)) return u1; if (is_pseudo_atomic (u1) && (!is_parent (u1))) return url_here (); if (is_semi_root (u1)) return u1; } if (is_concat (u2) && (u2[1] == url_parent ())) { if (is_root (u1)) return u1 * u2[2]; if (is_pseudo_atomic (u1) && (!is_parent (u1))) return u2[2]; if (is_semi_root (u1)) return u1 * u2[2]; } if (is_concat (u1)) return u1[1] * (u1[2] * u2); return as_url (tuple ("concat", u1->t, u2->t)); }
url complete (url base, url u, string filter, bool flag) { // cout << "complete " << base << " |||| " << u << LF; if (!is_rooted(u)) { if (is_none (base)) return base; if (is_none (u)) return u; if ((!is_root (base)) && (!is_rooted_name (base))) { failed_error << "base= " << base << LF; FAILED ("invalid base url"); } } if (is_name (u) || (is_concat (u) && is_root (u[1]) && is_name (u[2]))) { url comp= base * u; if (is_rooted (comp, "default") || is_rooted (comp, "file")) { if (is_of_type (comp, filter)) return reroot (u, "default"); return url_none (); } if (is_rooted_web (comp) || is_rooted_tmfs (comp) || is_ramdisc (comp)) { if (is_of_type (comp, filter)) return u; return url_none (); } failed_error << "base= " << base << LF; failed_error << "u= " << u << LF; ASSERT (is_rooted (comp), "unrooted url"); FAILED ("bad protocol in url"); } if (is_root (u)) { // FIXME: test filter flags here return u; } if (is_concat (u) && is_wildcard (u[1], 0) && is_wildcard (u[2], 1)) { // FIXME: ret= ret | ... is unefficient (quadratic) in main loop if (!(is_rooted (base, "default") || is_rooted (base, "file"))) { failed_error << "base= " << base << LF; FAILED ("wildcards only implemented for files"); } url ret= url_none (); bool error_flag; array<string> dir= read_directory (base, error_flag); int i, n= N(dir); for (i=0; i<n; i++) { if ((!is_none (ret)) && flag) return ret; if ((dir[i] == ".") || (dir[i] == "..")) continue; if (starts (dir[i], "http://") || starts (dir[i], "ftp://")) if (is_directory (base * dir[i])) continue; ret= ret | (dir[i] * complete (base * dir[i], u, filter, flag)); if (match_wildcard (dir[i], u[2][1]->t->label)) ret= ret | complete (base, dir[i], filter, flag); } return ret; } if (is_concat (u)) { url sub= complete (base, u[1], "", false); // "" should often be faster than the more correct "d" here return complete (base, sub, u[2], filter, flag); } if (is_or (u)) { url res1= complete (base, u[1], filter, flag); if ((!is_none (res1)) && flag) return res1; return res1 | complete (base, u[2], filter, flag); } if (is_wildcard (u)) { // FIXME: ret= ret | ... is unefficient (quadratic) in main loop if (!(is_rooted (base, "default") || is_rooted (base, "file"))) { failed_error << "base= " << base << LF; FAILED ("wildcards only implemented for files"); } url ret= url_none (); if (is_wildcard (u, 0) && is_of_type (base, filter)) ret= url_here (); bool error_flag; array<string> dir= read_directory (base, error_flag); int i, n= N(dir); for (i=0; i<n; i++) { if ((!is_none (ret)) && flag) return ret; if ((dir[i] == ".") || (dir[i] == "..")) continue; if (starts (dir[i], "http://") || starts (dir[i], "ftp://")) if (is_directory (base * dir[i])) continue; if (is_wildcard (u, 0)) ret= ret | (dir[i] * complete (base * dir[i], u, filter, flag)); else if (match_wildcard (dir[i], u[1]->t->label)) ret= ret | complete (base, dir[i], filter, flag); } return ret; } failed_error << "url= " << u << LF; FAILED ("bad url"); return u; }