/* _unix_dir_ankh_file(): process a file for ankh. */ static u2_noun _unix_dir_ankh_file(u2_noun pam, u2_noun wib, u2_noun baw, u2_noun woz) { u2_weak ole; if ( u2_no == u2du(wib) ) { ole = u2_ckd_by_get(u2k(pam), u2k(wib)); if ( u2_none == ole ) { ole = u2_do("cosh", u2nt(0, woz, u2_nul)); } else { u2_noun elo; elo = u2_do("cosh", u2nt(0, woz, u2k(u2t(u2t(ole))))); u2z(ole); ole = elo; } pam = u2_ckd_by_put(pam, wib, ole); } else { u2_noun fid = u2h(wib); u2_noun har = u2t(wib); ole = u2_ckd_by_get(u2k(pam), u2k(fid)); if ( u2_none == ole ) { ole = u2nt (0, u2_nul, u2_ckd_by_put(u2_nul, u2k(har), u2_do("cosh", u2nt(0, woz, u2_nul)))); ole = u2_do("cosh", ole); } else { u2_noun roo = u2t(u2t(ole)); u2_weak tup = u2_ckd_by_get(u2k(roo), u2k(har)); u2_noun oor, elo; if ( u2_none == tup ) { tup = u2_do("cosh", u2nt(0, woz, u2_nul)); } else { u2_noun upt; upt = u2_do("cosh", u2nt(0, woz, u2k(u2t(u2t(tup))))); u2z(tup); tup = upt; } oor = u2_ckd_by_put(u2k(roo), u2k(har), tup); elo = u2_do("cosh", u2nt(0, u2k(u2h(u2t(ole))), oor)); u2z(ole); ole = elo; } pam = u2_ckd_by_put(pam, u2k(fid), ole); u2z(wib); } return pam; }
/* u2_ckd_by_got(): map get for key `b` in map `a` with fail. */ u2_noun u2_ckd_by_got(u2_noun a, u2_noun b) { u2_weak c = u2_ckd_by_get(a, b); if ( u2_none == c ) { return u2_cm_bail(c3__exit); } else return c; }
/* _unix_dir_arch(): resolve directory to old style arch. */ static u2_noun _unix_dir_arch(u2_udir* dir_u) { u2_udir* dis_u; u2_ufil* fil_u; u2_noun pam = u2_nul; for ( dis_u = dir_u->dis_u; dis_u; dis_u = dis_u->nex_u ) { u2_noun pre = _unix_dir_name(dis_u); u2_noun arc = _unix_dir_arch(dis_u); // uL(fprintf(uH, "dir %s\n", u2_cr_string(pre))); pam = u2_ckd_by_put(pam, pre, arc); } for ( fil_u = dir_u->fil_u; fil_u; fil_u = fil_u->nex_u ) { u2_noun wib = _unix_file_name(fil_u); u2_noun baw = _unix_file_load(fil_u); u2_noun has = u2_do("sham", u2k(baw)); u2_noun fil = u2nt(u2_yes, has, baw); if ( u2_no == u2du(wib) ) { // uL(fprintf(uH, "file %s\n", u2_cr_string(wib))); pam = u2_ckd_by_put(pam, wib, fil); } else { u2_weak ole = u2_ckd_by_get(u2k(pam), u2k(u2h(wib))); u2_noun arc, rac; // uL(fprintf(uH, "file %s.%s\n", u2_cr_string(u2h(wib)), // u2_cr_string(u2t(wib)))); if ( u2_none == ole ) { arc = u2nc(u2_no, u2_nul); } else if ( u2_yes == u2h(ole) ) { u2z(ole); arc = u2nc(u2_no, u2_nul); } else arc = ole; rac = u2nc(u2_no, u2_ckd_by_put(u2k(u2t(arc)), u2k(u2t(wib)), fil)); pam = u2_ckd_by_put(pam, u2k(u2h(wib)), rac); u2z(wib); u2z(arc); } } return u2nc(u2_no, pam); }
/* _walk_in(): inner loop of _walk(), producing map. */ static u2_noun _walk_in(u2_reck* rec_u, const c3_c* dir_c, c3_w len_w) { DIR* dir_d = opendir(dir_c); u2_noun map = u2_nul; if ( !dir_d ) { return u2_nul; } else while ( 1 ) { struct dirent ent_n; struct dirent* out_n; if ( readdir_r(dir_d, &ent_n, &out_n) != 0 ) { uL(fprintf(uH, "%s: %s\n", dir_c, strerror(errno))); break; } else if ( !out_n ) { break; } else if ( !strcmp(out_n->d_name, ".") || !strcmp(out_n->d_name, "..") || ('~' == out_n->d_name[0]) || ('.' == out_n->d_name[0]) ) // XX restricts some spans { continue; } else { c3_c* fil_c = out_n->d_name; c3_w lef_w = len_w + 1 + strlen(fil_c); c3_c* pat_c = malloc(lef_w + 1); struct stat buf_b; strcpy(pat_c, dir_c); pat_c[len_w] = '/'; strcpy(pat_c + len_w + 1, fil_c); if ( 0 != stat(pat_c, &buf_b) ) { free(pat_c); } else { u2_noun tim = c3_stat_mtime(&buf_b); if ( !S_ISDIR(buf_b.st_mode) ) { c3_c* dot_c = strrchr(fil_c, '.'); c3_c* nam_c = strdup(fil_c); c3_c* ext_c = strdup(dot_c + 1); nam_c[dot_c - fil_c] = 0; { u2_noun nam = u2_ci_string(nam_c); u2_noun ext = u2_ci_string(ext_c); u2_noun get = u2_ckd_by_get(u2k(map), u2k(nam)); u2_noun dat = u2_walk_load(pat_c); u2_noun hax; if ( !strcmp("noun", ext_c) ) { dat = u2_cke_cue(dat); } hax = u2_do("sham", u2k(dat)); if ( u2_none == get ) { get = u2_nul; } get = u2_ckd_by_put(get, ext, u2nt(u2_yes, hax, dat)); map = u2_ckd_by_put(map, nam, u2nc(u2_no, get)); } free(nam_c); free(ext_c); } else { u2_noun dir = _walk_in(rec_u, pat_c, lef_w); if ( u2_nul != dir ) { map = u2_ckd_by_put (map, u2_ci_string(fil_c), u2nc(u2_no, dir)); } else u2z(tim); } free(pat_c); } } } closedir(dir_d); return map; }
/* _unix_dir_ankh(): resolve directory to new style ankh. */ static u2_noun _unix_dir_ankh(u2_udir* dir_u) { u2_udir* dis_u; u2_ufil* fil_u; u2_noun pam = u2_nul; for ( dis_u = dir_u->dis_u; dis_u; dis_u = dis_u->nex_u ) { u2_noun pre = _unix_dir_name(dis_u); u2_noun ank = _unix_dir_ankh(dis_u); // uL(fprintf(uH, "dir %s\n", u2_cr_string(pre))); if ( 0 != u2h(ank) ) { pam = u2_ckd_by_put(pam, pre, ank); } } for ( fil_u = dir_u->fil_u; fil_u; fil_u = fil_u->nex_u ) { u2_noun wib = _unix_file_name(fil_u); u2_noun baw = _unix_file_load(fil_u); u2_noun woz = u2nt(u2_nul, u2_do("sham", u2k(baw)), baw); u2_weak ole; if ( u2_no == u2du(wib) ) { ole = u2_ckd_by_get(u2k(pam), u2k(wib)); if ( u2_none == ole ) { ole = u2_do("cosh", u2nt(0, woz, u2_nul)); } else { u2_noun elo; elo = u2_do("cosh", u2nt(0, woz, u2k(u2t(u2t(ole))))); u2z(ole); ole = elo; } pam = u2_ckd_by_put(pam, wib, ole); } else { u2_noun fid = u2h(wib); u2_noun har = u2t(wib); ole = u2_ckd_by_get(u2k(pam), u2k(fid)); if ( u2_none == ole ) { ole = u2nt (0, u2_nul, u2_ckd_by_put(u2_nul, u2k(har), u2_do("cosh", u2nt(0, woz, u2_nul)))); ole = u2_do("cosh", ole); } else { u2_noun roo = u2t(u2t(ole)); u2_weak tup = u2_ckd_by_get(u2k(roo), u2k(har)); u2_noun oor, elo; if ( u2_none == tup ) { tup = u2_do("cosh", u2nt(0, woz, u2_nul)); } else { u2_noun upt; upt = u2_do("cosh", u2nt(0, woz, u2k(u2t(u2t(tup))))); u2z(tup); tup = upt; } oor = u2_ckd_by_put(u2k(roo), u2k(har), tup); elo = u2_do("cosh", u2nt(0, u2k(u2h(u2t(ole))), oor)); u2z(ole); ole = elo; } pam = u2_ckd_by_put(pam, u2k(fid), ole); u2z(wib); } } return u2_do("cosh", u2nt(0, u2_nul, pam)); }