Как удалить стандартное управление файлами из lua

Я пытаюсь интегрировать lua в свой проект (lua 5.2.1), и у меня нет проблем с его компиляцией.

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

Так что начинаю модифицировать lua для замены каждого вызова fopen/fclose/fread/fwrite...

Но проблема в том, что Lua слишком много смешивается, если stdio fct использует какую-то функцию FILE, которой у меня нет эквивалента в моем проекте (и не так легко переопределить), например: ungetc setvbuff

И так далее....

Мой вопрос ^^ Некоторые уже пытались это сделать? И если да то как? Есть ли у кого-нибудь расширение lua, у которого есть эта функциональность (некоторые библиотеки c используют функцию обратного вызова, чтобы попросить открыть/закрыть файл)?

Мне кажется странным, что lua, который действительно используется в многоплатформенных ОС или даже во встроенных системах, так сильно использует std lib, что обычно для действительно кросс-платформенной библиотеки каждый тип и fct из std определены для легкого изменения специфики платформы.

Спасибо за любую помощь, которую вы можете мне дать :)


person user1482649    schedule 28.08.2012    source источник
comment
Не уверен, но я думаю, что вы пропустили библиотеку ввода-вывода в PiL.   -  person hjpotter92    schedule 28.08.2012
comment
Lua нацелен на автономный C для ядра, но стандартные библиотеки Lua не могут этого сделать, потому что их цель — экспортировать средства в программы Lua, включая то, что доступно в стандартной библиотеке C. См. stackoverflow. ком/вопросы/4998822/   -  person lhf    schedule 28.08.2012
comment
Мне кажется странным, что lua, который действительно используется на мультиплатформенных ОС или даже на встроенных системах, так активно использует стандартную библиотеку. Почему? Учитывая, что стандартная библиотека C является стандартной, это означает, что если у вас есть компилятор C, то, скорее всего, у вас есть доступ к стандартной библиотеке C, которая поставляется практически с каждым компилятором C. Таким образом, Lua должен быть таким же кроссплатформенным, как C. Если вы работаете в среде, которая не поддерживает стандартную библиотеку C, то вам решать, как работать с такой нестандартной средой.   -  person Nicol Bolas    schedule 28.08.2012
comment
конечно, стандартная библиотека C работает везде, где вы можете скомпилировать C, но реализация и производительность могут меняться в зависимости от компилятора или платформы, поэтому typedef стандартный тип и стандартная функция #define могут позволить пользователю библиотеки переопределить использование вашей библиотеки стандартная библиотека по его необходимости. например, ogg lib переопределяет malloc с помощью ogg_alloc и использует во всем своем коде ogg_alloc, когда ему нужна память, если вы перекомпилируете ogg для своего проекта и хотите использовать анализатор памяти, просматривая каждый вызов malloc/free, вы можете изменить определение ogg_alloc вашей собственной функцией   -  person user1482649    schedule 28.08.2012
comment
вместо прямого вызова malloc, я ожидаю от lua не использовать непосредственно fopen в коде, а использовать определение lua_fopen, которое будет определяться как fopen, пока вы его не измените, потому что ваша платформа требует больше, чем обычный fopen для пример. и то же самое для любого другого использования другой стандартной функции. PS: fct это функция, извините за ярлык   -  person user1482649    schedule 28.08.2012


Ответы (1)


Вы не спрашиваете о файловом вводе-выводе «Lua the language»; вы говорите о файловом вводе-выводе "Lua the C library". Это не было ясно из вопроса.

В Lua есть условия для этого. luaL_loadfile, например, это просто синтаксический сахар вокруг функции, которая открывает данный файл, загружает его, закрывает файл, а затем вызывает для него luaL_loadstring.

Если вы находитесь в среде, где файловый ввод-вывод должен проходить по разным каналам, вам не следует пытаться заставить luaL_loadfile работать с новым файловым вводом-выводом. Вы должны написать новую функцию, которая загружает файл из вашей файловой системы и вызывает luaL_loadstring.

Короче говоря: вы не должны использовать какие-либо API Lua, для которых требуются файлы. Файловые функции Lua — это удобные функции; больше ничего. В самом Lua уже есть средства для этого; каждый файловый API имеет нефайловую версию, которая может работать так же хорошо. Вы не должны изменять сам Lua.

person Nicol Bolas    schedule 28.08.2012
comment
моя собственная система для управления файлом написана на C++, я не хочу заменять lua IO lib, я хочу больше в C после открытия lua_State, я вызываю luaL_loadFile( L, myfile.lua ), и эта функция, внутри библиотеки lua используйте fopen, и я хочу заменить fopen (который находится в c std) на: MyFunctionToOpenAFile(...) снова работает для простой файловой функции, такой как open/fclose/fread/fwrite.... Но Lua использует некоторую стандартную функцию File, которую я не поддерживаю для File, например: ungetc (для чего я мог найти эту функцию, повторно нажимая символ, который вы только что прочитали в файле, с помощью getc ) - person user1482649; 28.08.2012