static ssize_t buildpath(char *dst,size_t dstSize,const char *src) { const char *p = src; while(*p == '/') p++; int layer = 0; size_t count = 0; char *pathtemp = dst; while(*p) { int pos = strchri(p,'/'); /* simply skip '.' */ if(pos == 1 && p[0] == '.') p += 2; /* one layer back */ else if(pos == 2 && p[0] == '.' && p[1] == '.') { if(layer > 0) { char *start = pathtemp; /* to last slash */ while(*pathtemp != '/') pathtemp--; *pathtemp = '\0'; count -= start - pathtemp; layer--; } p += 3; } else { if(dstSize - count < (size_t)(pos + 2)) return count; /* append to path */ pathtemp[0] = '/'; strncpy(pathtemp + 1,p,pos); pathtemp[pos + 1] = '\0'; pathtemp += pos + 1; count += pos + 1; p += pos + 1; layer++; } /* one step too far? */ if(*(p - 1) == '\0') break; /* skip multiple '/' */ while(*p == '/') p++; } /* terminate */ if(dstSize - count < 2) return count; /* root? */ if(pathtemp == dst) { *pathtemp++ = '/'; count++; } *pathtemp = '\0'; return count; }
int scan_op(char **arg, t_lv *lv) { ft_bzero((void *)lv->flag, 3); if ((lv->f = search_ope(&(*arg)[lv->d], "+-*%/=", strchri(&(*arg)[lv->d], ';')))) { if (lv->f == '=') return (0); lv->flag[0] = search_opi(&(*arg)[lv->d], "+-*%/=", strchri(&(*arg)[lv->d], ';')); lv->flag[1] = search_ope(ft_strchr(&(*arg)[lv->d], lv->f) + 1, "+-*%/=", 1); } else if (ft_strchr(cpy_to(&(*arg)[lv->d], search_opi(&(*arg)[lv->d], ";&<>|", 10000)), '.')) lv->f = '.'; return (1); }
void modif_e2(t_sh *t, t_linez *lz, int k, int *j) { char *tmp; int x = 0; if (ft_strncmp("unsetenv", lz->ep_l, 8)) { tmp = ft_strdup(lz->ep_l); t->env = realloc_tb(t->env); if (search_oplen(&lz->ep_l[k], " =", 10000) < search_oplen(&lz->ep_l[k], "<>|&;", 10000)) { if (ft_strchr(&(tmp[k]), '=')) { t->env[++j[1]] = cpy_to(&(tmp[k]), '='); x = strchri(&(tmp[k]), '='); while (tmp[k + x] == ' ' || tmp[k + x] == '=') x++; } else { t->env[++j[1]] = cpy_to(&(tmp[k]), ' '); x = strchri(&(tmp[k]), ' '); while (tmp[k + x] == ' ' || tmp[k + x] == '=') x++; } } else t->env[++j[1]] = ft_strdup(&(tmp[k])); if (x && tmp[k + x]) { replace_char(t->env[j[1]], '=', ' '); t->env[j[1]] = epur_str(t->env[j[1]], t); if (t->env[j[1]][len(t->env[j[1]]) - 1] == ' ') t->env[j[1]][len(t->env[j[1]]) - 1] = '\0'; t->env[j[1]] = ft_strjoin_free(t->env[j[1]], "=", 1); t->env[j[1]] = ft_strjoin_free(t->env[j[1]], &tmp[k + x], 1); } else t->env[j[1]] = ft_strjoin_free(t->env[j[1]], "=", 1); ft_strdel(&tmp); } t->env[++j[1]] = 0; }
char *set_local_var(char **arg, int opt, t_sh *t) { static char **vars = NULL; t_lv *lv; int i; i = -1; lv = (t_lv *)malloc(sizeof(t_lv)); lv->d = strchri((*arg), '$'); if (vars && (opt == 6 || opt == 7)) return (find_del(vars, arg, opt)); if (vars && opt == 1) { if (!scan_op(arg, lv)) return (NULL); i = search_cmp(i, vars, cpy_to(&((*arg)[lv->d + 1]), ';')); lv->o = search_ope(&(*arg)[lv->d], t->ope, len(&(*arg)[lv->d])); lv->a = ft_strsub((*arg), 0, lv->d); lv->b = ft_strdup(ft_strchr(&(*arg)[lv->d], lv->o)); if (vars[i]) found_var(vars, lv, arg, i); else { ft_strdel(arg); *arg = ft_strjoin_free(lv->a, lv->b, 3); } return (*arg); } if (opt == 1 || opt == 6 || opt == 7) return (NULL); if (!vars) { vars = (char **)malloc(sizeof(char *) * 100); vars[0] = NULL; } free(lv); return (assign_alias(vars, i, arg)); }