ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» basename GML | страница 1 |
 |
Страница 1 из 1 |
|
|
|
Железный канал: «basename GML» |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 4(58) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Делюсь скриптами для GameMaker'a 8.0
Аналог basename для game maker language
Код: |
//basename для game maker language
//Использование: basename(string,'param')
//где string - строка для обработки
// param - параметры обработки, могут иметь следующие значения:
// '-path' возвращает путь до файла
// '-ext' возвращает расширение файла
// '-name' возвращает имя файла
// '' возвращает имя файла и его расширение
slashes=string_count('\',argument0);//кол-во слешей в строке
options=argument1;// параметры
instring=argument0;
instring_lenth=string_length(instring);
i=0;
while(slashes!=0)
{
if(string_char_at(instring,i)=='\')
{
slashes-=1;
}
i+=1;
}
if(options=='-path')//вывести путь до файла
{
return string_copy(instring,0,i-1);
}
if(options=='-ext')//вывести расширение файла
{
ext_name=string_copy(instring,i,instring_lenth-i+1);
ext_name_lenght=string_length(ext_name);
index=0;
dot=0;
while(dot!=1)
{
if(string_char_at(ext_name,index)=='.')
{
dot=1;
}
index+=1;
}
return string_copy(ext_name,index-1,ext_name_lenght-index+2);
}
if(options=='-name')//вывести имя файла
{
full_name=string_copy(instring,i,instring_lenth-i+1);
full_name_lenght=string_length(full_name);
index=0;
dot=0;
while(dot!=1)
{
if(string_char_at(full_name,index)=='.')
{
dot=1;
//show_message("Точка "+string_char_at(full_name,index)+" в позиции "+string(index));
}
index+=1;
}
return string_copy(full_name,0,index-2);
}
if(options=='') // если опции не заданы - вывести полное имя файла
{
return string_copy(instring,i,instring_lenth-i+1);
}
|
_________________ Сосиска в хлебе
Последний раз редактировалось: БулерМэн (23:12 25-11-2014), всего редактировалось 7 раз(а) |
|
|
Diff
708 EGP
      Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003
 |
|
Это типа выложил на ревью или на благо общества? Если первое, то я попридираюсь.
БулерМэн : |
slashes=string_count('\',argument0);
|
А если строка с прямыми слешами придёт? Для виндовс это корректный путь.
А ещё с экранированными может прийти. Типа, "C:\\Windows". И даже "C:\/Windows", что уже совсем изврат, но тоже корректный путь.
А не гуманнее ли последний слеш искать с конца строки, а не с начала? И вообще, неужели нет для этого функции?
БулерМэн : |
ext_name=string_copy(instring,i,instring_lenth-i+1);
ext_name_lenght=string_length(ext_name);
|
Какой-то газенваген. Зачем это тут вообще? Что мешает вернуть всё что справа от последней точки?
И подумать, что делать с файлом типа .htaccess
БулерМэн : |
//вывести имя файла
|
Тот же самый вопрос.
добавлено спустя 2 минуты:
Нда, вот что вечер воскресенья делает. Абстиненция. Своих разработчиков не попинать - так на тебе оторвался .
_________________ Конец света в конце тоннеля
Последний раз редактировалось: Diff (15:29 07-12-2014), всего редактировалось 2 раз(а) |
|
|
SecondShadow
365 EGP
     Рейтинг канала: 6(375) Репутация: -4 Сообщения: 1454 Заблокирован Откуда: Бийск. Алтай. Зарегистрирован: 09.02.2008
 |
|
А что, стандартные функции - вернуть из строки расширение/имя файла/путь до него не работают? Если их нет в скриптах, то вызова стандартной виндозной процедуры никак? Или я совсем не про то?
_________________ Склероз - классная болезнь, ничего не болит и новости каждый день. |
|
|
Diff
708 EGP
      Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003
 |
|
Судя по названию и синтаксису, это велосипед скриптовый язык для чего-то игродельческого.
_________________ Конец света в конце тоннеля |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 4(58) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Выложил на благо общества
Diff : |
А если строка с прямыми слешами придёт?
|
Функции, которые используются в "GameMaker 8 Pro" возвращают строку с обратными слешами. Работа под системами с ядром Linux не подразумевается, так как нет официальной версии GM под nix-подобные от YoYo Games.
Есть во всяком случае ENIGMA но как там и что там - затрудняюсь ответить, и будет ли это чудо работать и что в итоге вернет мой скрипт запущенный из под этой Энигмы. Вероятность того, что там его будут использовать ну просто равна ноль ноль ноль и т.д.
Что приходит в винде и что уходит:
Код: |
filename = get_open_filename("Сообщение|*.txt", ""+string(".txt"));//директория и имя файла
вернет строку, вида:
C:\Windows\file.txt |
Скрипт возвращает все символы после последнего слеша, без параметров - в данном случае будет "Windows".
Но смысла отлавливать двойной слеш нет, и обратный с прямым - если они и появятся то вы знаете, что делаете
Diff : |
А не гуманнее ли последний слеш искать с конца строки, а не с начала?
|
Аргументирую почему не стоит так делать: чтобы вернуть имя файла без символов после точки - нужно взять и переписать все заново. Зачем?
Diff : |
И вообще, неужели нет для этого функции?
|
Для этих целей нет стандартной функции. В GM только базовый набор функций, как то узнать длину строки, взять строку из файла и т.п.
Я бы не выкладывал в сеть то, что уже есть.
Diff : |
Зачем это тут вообще? Что мешает вернуть всё что справа от последней точки?
|
Нельзя просто взять и "вернуть все, что справа"
Поясняю, как работает функция копирования части строки:
Код: |
string_copy(instring,i,instring_lenth-i+1); |
instring - ввод строки
i - номер символа в строке, с которого нужно начать копирование.
instring_lenth-i - количество символов для копирования - длина строки минус количество символов до последнего слеша.
+1 - это косяк, нумерация символов с 1 должна быть Не очень красиво.
Если Ваша винда умеет понимать файлы вида ".htaccess" то вот так сделает скрипт:
Код: |
filename = get_open_filename("Файл|*.*", ""+string("."));
out_string = basename(filename, '');
filename: C:\Windows\.htaccess
out_string: .htaccess
|
Моя WinXP не умеет .htaccess
SecondShadow : |
А что, стандартные функции - вернуть из строки расширение/имя файла/путь до него не работают?
|
Стандартных функций для вывода расширения и имени файла - нет, можно вывести только полный путь вместе с именем и расширением.
Скрипты для вывода расширения файла - может быть и есть, но я не нашел.
SecondShadow : |
то вызова стандартной виндозной процедуры никак?
|
Стандартными средствами это сделать нельзя.
Например: для смены внешнего вида окна нужно отдельное тяжеловесное расширение (extension_pack)со множеством ненужных функций.
Diff : |
скриптовый язык для чего-то игродельческого.
|
Именно так.
_________________ Сосиска в хлебе |
|
|
Diff
708 EGP
      Рейтинг канала: 8(861) Репутация: 44 Сообщения: 4179 Откуда: Сферическая Земля в вакууме. Зарегистрирован: 04.07.2003
 |
|
БулерМэн : |
Функции, которые используются в "GameMaker 8 Pro" возвращают строку с обратными слешами.
|
Из подобных предположений потом вырастают злостные баги . Откуда тебе знать, кто захочет воспользоваться твоей функцией? Совершенно не надо иметь ядро линупса чтобы прочитать список путей из файла в котором волею Ктулху они оказались не с теми слешами, с которыми ты ожидал.
БулерМэн : |
чтобы вернуть имя файла без символов после точки - нужно взять и переписать все заново. Зачем?
|
Непонял. Ну сохраняй позиции при разборе для последующего использования как ты это и сейчас делаешь. Оправдания разбору строки слева когда точно известно что искомое находится справа быть не может . При этом ты заодно сможешь решить проблему слешей ибо тебе станет всё равно сколько их и каких.
БулерМэн : |
Нельзя просто взять и "вернуть все, что справа"
Поясняю, как работает функция копирования части строки:
Код:
string_copy(instring,i,instring_lenth-i+1);
|
Как нельзя? Подставь на место i позицию точки и вернёшь то что справа от неё. Позицию ищи так же как и сейчас, только с конца.
_________________ Конец света в конце тоннеля |
|
|
БулерМэн
420 EGP
   Рейтинг канала: 4(58) Репутация: 68 Сообщения: 1580 Откуда: Гороховец Зарегистрирован: 07.02.2006
 |
|
Diff : |
Как нельзя? Подставь на место i позицию точки и вернёшь то что справа от неё.
|
Ты меня убедил, но я не вижу смысла переделывать, и да - ты придираешься
добавлено спустя 20 минут:
я конечно занесу в todo-лист эту возможность с конца считать слешы, но сомнительно все это
_________________ Сосиска в хлебе
Последний раз редактировалось: БулерМэн (16:27 12-12-2014), всего редактировалось 1 раз |
|
|
|
|
|
Железный канал: «basename GML» |
|
|