Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2015, 11:24   #1
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию Задачка для спинного мозга - 2.

Коллеги, я щас портирую TECXMLParser под unicode-версии компиляторов. Застопился на одном методе, никак не могу вкурить, что он делает.
Кому интересно, посмотрите.
Код:
procedure TXMLTokenizer.ReadBuffer;
var
  Count: Integer;
begin
  Inc(FOrigin, FSourcePtr - FBuffer);
  FSourceEnd[0] := FSaveChar;

  Count := FBufPtr - FSourcePtr;  

  if Count <> 0
    then Move(FSourcePtr[0], FBuffer[0], Count);

  FBufPtr := FBuffer + Count;
  Inc(FBufPtr, FStream.Read(FBufPtr[0], SizeOf(Char) * (FBufEnd - FBufPtr)));
  FSourcePtr := FBuffer;
  FSourceEnd := FBufPtr;

  if FSourceEnd = FBufEnd
    then begin
           FSourceEnd := LineStart(FBuffer, FSourceEnd - 1);
           if FSourceEnd = FBuffer
             then Error(SLineTooLong);
         end;

  FSaveChar := FSourceEnd[0];
  FSourceEnd[0] := #0;
end;
Вот там класс:
Код:
type
  TXMLTokenizer = class(TObject)
  private
    FStream: TStream;
    FOrigin: Longint;
    FBuffer: PChar;
    FBufPtr: PChar;
    FBufEnd: PChar;
    FSourcePtr: PChar;
    FSourceEnd: PChar;
    FTokenPtr: PChar;
    FStringPtr: PChar;
    FSourceLine: Integer;
    FSaveChar: Char;
    FToken: Char;
    procedure ReadBuffer;
    procedure SkipBlanks;
  public
    constructor Create(Stream: TStream); virtual;
    destructor Destroy; override;
    procedure CheckToken(T: Char);
    procedure CheckTokenSymbol(const S: string);
    procedure Error(const Ident: string);
    procedure ErrorFmt(const Ident: string; const Args: array of const);
    procedure ErrorStr(const Message: string);
    procedure HexToBinary(Stream: TStream);
    function NextToken: Char;
    function SourcePos: Longint;
    function TokenComponentIdent: string;
    function TokenFloat: Extended;
    function TokenInt: Longint;
    function TokenString: string;
    function TokenSymbolIs(const S: string): Boolean;
    property SourceLine: Integer read FSourceLine;
    property Token: Char read FToken;
  end;
Если чо, оригиналы на торри.нет. Могу дать ссылку.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.07.2015, 12:17   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Перемещает данные из одной области памяти в другую на основании длины и еще каких-то расчетов. Для Вас ключевое место:
Код:
Inc(FBufPtr, FStream.Read(FBufPtr[0], SizeOf(Char) * (FBufEnd - FBufPtr)));
Так как он там вычисляет длины как раз с учетом Char, а для юникода может быть критично, что там 1, 2 или 4 байта. Ну и там может смещения (типа FSourceEnd - 1) надо проверять будет.
Мне другое интересно - зачем вообще это понадобилося?
Может вот он Вас чем обидел?
Так как:
Цитата:
Full unicode support even for D5-D2007.
А также всяческие Лазарусы и прочие фрипаскали.
И вообще:
Цитата:
OXml supports all Delphi versions starting from Delphi 5 on all platforms: Win32, Win64, OSX, iOS, Android. Currently I tested: Delphi 7, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8. Delphi 5, 6, 2005 and 2006 are supported as well.
Corresponding C++Builder compilers should be supported, too (untested yet).
OXml supports Lazarus 1.0 and newer on all platforms (tested Win32, Win64, Linux, MacOSX).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 22.07.2015 в 12:24.
Utkin вне форума Ответить с цитированием
Старый 22.07.2015, 13:30   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
ключевое место
сорь, это моя правка. в оригинале только ansi - без sizeof(char).
Цитата:
Может вот он Вас чем обидел?
очень громоздкий. я пробовал выковырнуть только нужное (загрузку и сохранения), однако мелочи тянут за собой ещё код, а он - ещё и т.д. В итоге как было километровое полотенце кода, так и осталось.
ECXML - это у меня 1 короткий модуль (uXmlParser.pas); было 2, но я их в один слил. Меня всё устраивает, кроме отсутствие utf8 и unicode-строк. Сохранение я сделал легко, там всё понятно: перевести string в utf8 и сохранить - не проблема.
а вот загрузка - никак, не понимаю я, что тут делается.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.07.2015, 14:11   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

у IDE давно свои библиотеки обработки XML есть, зачем грабли - не понятно.
Человек_Борща вне форума Ответить с цитированием
Старый 22.07.2015, 14:27   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Меня вообще настораживают такие парсеры. XML он как бы давно с поддержкой юникода, если не с самого рождения иначе какой же это XML а стало быть какой же это парсер. Как бы еще фатальных недостатков потом не всплыло.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.07.2015, 15:59   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
у IDE давно свои библиотеки обработки XML есть, зачем грабли - не понятно.
чо тут непонятного? Привык, лет 8 юзаю этот парсер, куча кода под него заточена.
И переделывать, ипстественно, неахота - 100500 тонн времени уйдёт, в том числе и на изучение стандатных XML-примочек.
Не спорю. Но на это есть отладчик.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.07.2015, 17:39   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

но все же посмотрите Perfomance здесь. Переходить на новое это всегда проблема, больно, плохо и вообще ад. Одно хорошо, все это длится не так долго как думается, а переход происходит быстрее чем можно себе представить/ ECXMLParser решает любые не существующие в NEWPARSER, проблемы.

Если совсем плохо:
Пишите класс TECXMLParser а внутри него создаете современный парсер используя тот же OXml. И во всех проектах всем свежо и прекрасно.

Это пост агитации отказываться от старого и не боятся нового, не кусается.

Последний раз редактировалось Человек_Борща; 22.07.2015 в 17:45.
Человек_Борща вне форума Ответить с цитированием
Старый 22.07.2015, 19:54   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
чо тут непонятного? Привык, лет 8 юзаю этот парсер, куча кода под него заточена.
Вот так и приходит старость
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 22.07.2015, 20:57   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Вот так и приходит старость
Чё, тоже стареешь?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачка для спинного мозга. Рубрика "А вам слабо?". min@y™ Общие вопросы Delphi 28 15.06.2015 19:55
Создать класс Date для работы с датами в формате «год.месяц.день» (Стандартная задачка для студентов на C#) roomatan C# (си шарп) 1 13.10.2013 08:55
Задания для супер мозга! scoprion Фриланс 9 13.03.2010 16:36
Какая мощность требуется для эмуляции работы человеческого мозга? Levsha100 Свободное общение 39 11.11.2009 09:10
Ваше "топливо" для мозга Ivan_32 Свободное общение 60 07.06.2009 21:08