Страница 1 из 1

распознавание текстовой строки как функции

СообщениеДобавлено: 22.07.2013 01:58:15
andrey_k3
Доброго времени суток!
Делаю сканер для проверки появления новых файлов/каталогов по путям, определенных пользователем. До недавнего времени все было просто: путь состоял из пути до конечного каталога + маска файла. Теперь появился ресурс, путь которого заканчивается каталогом, имя которого текущая дата в формате YYYYMMDD. Составные части пути для поиска хранятся в файле sqlite3 (path1 - путь до конечного каталога, mask1 - маска файла, param1 - дополнительный параметр).
В param1 записана "функция" для определения текущей даты (FormatDateTime(YYYYMMDD,Now)\). Естественно, что при сборке пути она считывается как строка и поиск не выполняется. На данный момент решил проблему через CASE, но это значит, что если появится новый параметр, то придется добавлять его в блок CASE'а.
Код: Выделить всё
begin
  tdfind:= '';
  tdfind:= ZQuery1.FieldByName('path1').AsString + '\';
  case ZQuery1.FieldByName('param1').AsString of
    'FormatDateTime(YYYYMMDD,Now)\':
    tdfind:= tdfind + FormatDateTime('YYYYMMDD',Now) + '\';
end;
tdfind:= tdfind + ZQuery1.FieldByName('mask1').AsString;
  if FindFirst(UTF8ToSys(tdfind), faAnyFile, result1) = 0
  then
    begin...

Возможно ли считывать из param1 строку и распознавать ее как функцию?

Re: распознавание текстовой строки как функции

СообщениеДобавлено: 24.07.2013 10:30:47
hinst
Во-первых, если надо просто хранить формат даты, то почему бы не хранить просто саму строку формата 'YYYYMMDD' и всё. Какой там ещё может быть параметр? Не надо лишний раз усложнять.

:idea: А во-вторых... А что если сделать небольшой парсер исходников (он кстати есть в составе Lazarus'а), и чтобы он просто пробегал бы по всем исходникам и составлял бы список всех объявленных в interface-секциях модулей функций, т.е если объявлено где-то
Код: Выделить всё
function FormatDateTime(...);

то он бы записывал имя функции и генерировал бы кроме прочего такой файл с кодом
Код: Выделить всё
GlobalFunctionArray['FormatDateTime'].Address := @FormatDateTime

Это достаточно легко реализуемо. Можно сделать чтобы всё было в автоматическом режиме. К тому же, можно было бы и проверку параметров сделать таким же образом. Тогда во время исполнения стали бы доступны адреса всех функций и можно было бы их вызывать
Код: Выделить всё
CallFunction('FormatDateTime', ['YYYYMMDD', Now]);

И даже работала бы проверка параметров, если её сделать (она опять же присутствует в парсере лазаруса).
надо будет их проверить, а потом запушить в стэк ассемблером, только в правильном порядке и т.п.

Re: распознавание текстовой строки как функции

СообщениеДобавлено: 25.07.2013 09:38:56
andrey_k3
hinst, спасибо! Попробую разобраться.
На счет
hinst писал(а):надо просто хранить формат даты, то почему бы не хранить просто саму строку формата 'YYYYMMDD'
каталог с именем YYYYMMDD частный случай, т.е. заранее не знаю каким будет конечный каталог - с постоянным именем или имя будет генеририроваться с определенным интервалом. В подавляющем большинстве случаем пользователи создавали свои базы из путей с постоянными именами, поэтому для проверки достаточно было собрать вместе path1 + mask1. После того, как у одно из пользователей появился ресурс с ежедневно меняющимся конечным каталогом, был введен param1 (path1 + param1 + mask1), чтобы этому пользователю не пришлось каждый день править запись в своей базе. Т.о. param1 - всего лишь имя каталога, причем не обязательно в формате YYYYMMDD

Re: распознавание текстовой строки как функции

СообщениеДобавлено: 19.08.2013 09:49:53
andy789
Я хотел бы оценить, что поделились такой большой информации с нами