Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » 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 раз(а)
    Добавлено: 17:14 25-11-2014   
Diff
 708 EGP


Модератор
Рейтинг канала: 8(861)
Репутация: 44
Сообщения: 4179
Откуда: Сферическая Земля в вакууме.
Зарегистрирован: 04.07.2003
Это типа выложил на ревью или на благо общества? Если первое, то я попридираюсь.

БулерМэн :
slashes=string_count('\',argument0);

А если строка с прямыми слешами придёт? Для виндовс это корректный путь.
А ещё с экранированными может прийти. Типа, "C:\\Windows". И даже "C:\/Windows", что уже совсем изврат, но тоже корректный путь.

БулерМэн :
i=0;

А не гуманнее ли последний слеш искать с конца строки, а не с начала? И вообще, неужели нет для этого функции?

БулерМэн :
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 раз(а)
    Добавлено: 15:24 07-12-2014   
SecondShadow
 365 EGP


Рейтинг канала: 6(372)
Репутация: -4
Сообщения: 1454 Заблокирован
Откуда: Бийск. Алтай.
Зарегистрирован: 09.02.2008
А что, стандартные функции - вернуть из строки расширение/имя файла/путь до него не работают? Если их нет в скриптах, то вызова стандартной виндозной процедуры никак? Или я совсем не про то? Вау!
_________________
Склероз - классная болезнь, ничего не болит и новости каждый день.
    Добавлено: 19:28 07-12-2014   
Diff
 708 EGP


Модератор
Рейтинг канала: 8(861)
Репутация: 44
Сообщения: 4179
Откуда: Сферическая Земля в вакууме.
Зарегистрирован: 04.07.2003
Судя по названию и синтаксису, это велосипед скриптовый язык для чего-то игродельческого.
_________________
Конец света в конце тоннеля
    Добавлено: 06:17 08-12-2014   
БулерМэн
 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


Diff :
C:\\Windows

Скрипт возвращает все символы после последнего слеша, без параметров - в данном случае будет "Windows".
Но смысла отлавливать двойной слеш нет, и обратный с прямым - если они и появятся то вы знаете, что делаете Хы...

Diff :
А не гуманнее ли последний слеш искать с конца строки, а не с начала?

Аргументирую почему не стоит так делать: чтобы вернуть имя файла без символов после точки - нужно взять и переписать все заново. Зачем?
Diff :
И вообще, неужели нет для этого функции?

Для этих целей нет стандартной функции. В GM только базовый набор функций, как то узнать длину строки, взять строку из файла и т.п.
Я бы не выкладывал в сеть то, что уже есть.

Diff :
Зачем это тут вообще? Что мешает вернуть всё что справа от последней точки?

Нельзя просто взять и "вернуть все, что справа"
Поясняю, как работает функция копирования части строки:
Код:
string_copy(instring,i,instring_lenth-i+1);

instring - ввод строки
i - номер символа в строке, с которого нужно начать копирование.
instring_lenth-i - количество символов для копирования - длина строки минус количество символов до последнего слеша.
+1 - это косяк, нумерация символов с 1 должна быть Расстроен Не очень красиво.

Diff :
.htaccess

Если Ваша винда умеет понимать файлы вида ".htaccess" то вот так сделает скрипт:
Код:

filename = get_open_filename("Файл|*.*", ""+string("."));
out_string = basename(filename, '');

filename: C:\Windows\.htaccess
out_string: .htaccess

Моя WinXP не умеет .htaccess Гы-гы

SecondShadow :
А что, стандартные функции - вернуть из строки расширение/имя файла/путь до него не работают?

Стандартных функций для вывода расширения и имени файла - нет, можно вывести только полный путь вместе с именем и расширением.
Скрипты для вывода расширения файла - может быть и есть, но я не нашел.
SecondShadow :
то вызова стандартной виндозной процедуры никак?

Стандартными средствами это сделать нельзя.
Например: для смены внешнего вида окна нужно отдельное тяжеловесное расширение (extension_pack)со множеством ненужных функций.

Diff :
скриптовый язык для чего-то игродельческого.

Именно так.
_________________
Дулички и фигушки
    Добавлено: 02:03 12-12-2014   
Diff
 708 EGP


Модератор
Рейтинг канала: 8(861)
Репутация: 44
Сообщения: 4179
Откуда: Сферическая Земля в вакууме.
Зарегистрирован: 04.07.2003
БулерМэн :
Функции, которые используются в "GameMaker 8 Pro" возвращают строку с обратными слешами.

Из подобных предположений потом вырастают злостные баги Хы.... Откуда тебе знать, кто захочет воспользоваться твоей функцией? Совершенно не надо иметь ядро линупса чтобы прочитать список путей из файла в котором волею Ктулху они оказались не с теми слешами, с которыми ты ожидал.

БулерМэн :
чтобы вернуть имя файла без символов после точки - нужно взять и переписать все заново. Зачем?

Непонял. Ну сохраняй позиции при разборе для последующего использования как ты это и сейчас делаешь. Оправдания разбору строки слева когда точно известно что искомое находится справа быть не может Улыбка. При этом ты заодно сможешь решить проблему слешей ибо тебе станет всё равно сколько их и каких.

БулерМэн :
Нельзя просто взять и "вернуть все, что справа"
Поясняю, как работает функция копирования части строки:
Код:
string_copy(instring,i,instring_lenth-i+1);

Как нельзя? Подставь на место i позицию точки и вернёшь то что справа от неё. Позицию ищи так же как и сейчас, только с конца.
_________________
Конец света в конце тоннеля
    Добавлено: 04:19 12-12-2014   
БулерМэн
 420 EGP


Рейтинг канала: 4(58)
Репутация: 68
Сообщения: 1580
Откуда: Гороховец
Зарегистрирован: 07.02.2006
Diff :
Как нельзя? Подставь на место i позицию точки и вернёшь то что справа от неё.

Ты меня убедил, но я не вижу смысла переделывать, и да - ты придираешься Хы...

добавлено спустя 20 минут:
я конечно занесу в todo-лист эту возможность с конца считать слешы, но сомнительно все это Подозрение. Хы...
_________________
Дулички и фигушки

Последний раз редактировалось: БулерМэн (16:27 12-12-2014), всего редактировалось 1 раз
    Добавлено: 16:27 12-12-2014   
Железный канал: «basename GML»
 
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Это ж "Жалостная Книга"? Ну так вот - я жалуюсь! (Jackal Survivor)

  » basename GML | страница 1
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18