LINUX.ORG.RU

Ответ на: комментарий от true_admin

можно сделать велосипедный вариант с getcwd и dirname.

rg-400
()
Ответ на: комментарий от rg-400

вот не хотел своих велосипедов, уже весь день велосипеды леплю, блин :(.

true_admin ★★★★★
() автор топика

видимо в subj реч идёт об функции os.path.normpath(..), но на ЯП Си..

(нехочу показываться капитаном очевиднолстью, но видимо так получилось :-[...
а вообще на ЯП Си я зачастую приходил к выводу о том что всё это СТРАННО.. странно что нехватает коллекции «миниатурных функций» и необходимо делать микро-вилосипеды на каждый чих)

mkfifo
()
Ответ на: комментарий от mkfifo

угу, этого и ещё чтобы ~user раскрывало.

странно что нехватает коллекции «миниатурных функций»

сам в ужасе последние два дня. Всю жизнь всего хватало, а щас три дня подряд велосипеды пишу. Нет даже стандартной функции замены одной подстроки на другую! Ппц накрасноглазился.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от rg-400

зачем убрать './' и '../' в пути

Ну, я, например, в CGI проверяю, чтобы в пути не было конструкций "../", которые могут вывести за пределы дозволенной директории.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

одно дело убирать, другое заменять.
он вроде хочет так

ololo@ololo:/dir1/dir2$./myprog ../file

../file было заменено на /home/ololo/dir1/file

rg-400
()
Ответ на: комментарий от rg-400

Так это довольно просто делается: strtok, strstr и другие функции из <string.h>. Я думаю, что готовых шаблонных функций для подобных действий нет, потому что эти функции реализуются пятью строками кода :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от rg-400

Ну раскрыть ~user это не так важно, а вот ./ ../ нужно чтобы путь был нормализованный чтобы его уже сравнивать с другими путями путём сравнения строк.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Получаем путь к текущей директории (PWD), если strstr покажет, что наш путь начинается с .., в PWD делаем «откат» на предыдущий слэш при помощи strrchr, потом при помощи strcat объединяем. В общем, примерно так.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от true_admin

>сам в ужасе последние два дня. Всю жизнь всего хватало, а щас три дня подряд велосипеды пишу. Нет даже стандартной функции замены одной подстроки на другую! Ппц накрасноглазился.

Неужели нет библиотеки для си, аналогичной питоновской? Эт тогда написать надо.

anonymous
()
Ответ на: комментарий от akk

не, перерыл весь гугл. И normalize path и real path(это совсем не то) и remove slashes итд итп :(

true_admin ★★★★★
() автор топика
Ответ на: комментарий от rg-400

ты случаем не рекурсивный обход каталога делаешь?

не, слава богу :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

> ... этого и ещё чтобы ~user раскрывало.

ну раскрытие ~-подобных-хреней — этож чисто BASH-фишка?... (а не какая-то часть правил операционной системы)

..тоесть сам BASH только и знает как его нада правильно раскрывать :-)

mkfifo
()
Ответ на: комментарий от quasimoto

globbing это раскрытие звёздочек, например, "./*.c". man glob говорит «find pathnames matching a pattern». А мне нужно путь нормализовать. Но всё же взгляну что они там навояли, спасибо за помощь, теперь у меня есть все ориентиры чтобы это сделать.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

> не, не тока баш, шеллы и ,например, питон тоже умеют :). Согласись это удобно.

если чесно.. то чото я немного уже непонимаю %) %) %)

если не сложно — то можно простой пример — как питон умеет? %) %) спасибо.

(ну то что шелы умеют это я понимаю. тоесть /bin/sh и его модификации.)

mkfifo
()
Ответ на: комментарий от true_admin

пусть у нас есть:

путь к файлу ./dir/.././/../file

и

$PWD = /home/ololo

если совету Eddy_Em мы получим

/home/ololo/dir/.././/../file

а нормализованная должна быть:

/home/file

думаю это нужно, если ввод осуществляется пользователем или берется из файла.

rg-400
()
Ответ на: комментарий от rg-400

а нормализованная должна быть:

/home/file

Получаем PWD и кладем его в переменную, скажем, thepath (достаточной длины, чтобы вместить наиболее возможный путь);

Проверяем, не начинается ли путь с '/': если начинается, устанавливаем thepath в '/';

далее при помощи strtok разбиваем путь к файлу на токены между символами '/';
проходим по токенам{
    если токен - точка, продолжаем дальше;
    если токен '..' - при помощи strrchr делаем "откат" в thepath (проверяя, чтобы thepath был как минимум '/');
    default: strcat(thepath, токен);
}

возвращаем "нормализованный" путь thepath;
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от xydo

По-моему, через strtok, strstr и strchr/strrchr будет элегантнее.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от rg-400

да это легко. Одним флагом в аргументах аппендить getcwd() или нет :)

true_admin ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.