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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение andrey_k3 » 22.07.2013 01:58:15

Доброго времени суток!
Делаю сканер для проверки появления новых файлов/каталогов по путям, определенных пользователем. До недавнего времени все было просто: путь состоял из пути до конечного каталога + маска файла. Теперь появился ресурс, путь которого заканчивается каталогом, имя которого текущая дата в формате 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 строку и распознавать ее как функцию?
andrey_k3
новенький
 
Сообщения: 22
Зарегистрирован: 17.05.2012 09:52:32

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

Сообщение hinst » 24.07.2013 10:30:47

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

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

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

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

И даже работала бы проверка параметров, если её сделать (она опять же присутствует в парсере лазаруса).
надо будет их проверить, а потом запушить в стэк ассемблером, только в правильном порядке и т.п.
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

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

Сообщение andrey_k3 » 25.07.2013 09:38:56

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

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

Сообщение andy789 » 19.08.2013 09:49:53

Я хотел бы оценить, что поделились такой большой информации с нами
andy789
незнакомец
 
Сообщения: 1
Зарегистрирован: 19.08.2013 09:47:59


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru
cron