Прикручивание русского языка к FP в линуксе

Планы, идеология, архитектура и т.п.

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

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 21.02.2013 17:06:14

64 битную сборку не собирал, но так как сейчас все патчи архитектурно-независимы, то проблем возникнуть не должно.
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Re: Прикручивание русского языка к FP в линуксе

Сообщение Сквозняк » 26.02.2013 00:29:22

Патч для правильного отображения позиции курсора в окне редактирования кода для Linix x86_64 сборки:

fpcbuild-2.6.0/fpcsrc/ide/wcedit.pas
Код: Выделить всё
procedure TIndicator.Draw;
var
  Color: Byte;
  Frame: Char;
  L: array[0..1] of Longint;
  S: String[15];
  B: TDrawBuffer;
  K: String; //[[[[[[[[[[[[[[[[[
begin
  if assigned(CodeOwner) and
     (CodeOwner^.ELockFlag>0) then
    begin
      CodeOwner^.IndicatorDrawCalled:=true;
      exit;
    end;
  if (State and sfDragging = 0) and (State and sfActive <> 0) then
   begin
     Color := GetColor(1);
     Frame := #205;
   end
  else
   begin
     if (State and sfDragging)<>0 then
      Color := GetColor(2)
     else
      Color := GetColor(3);
     Frame := #196;
   end;
  MoveChar(B, Frame, Color, Size.X);
  if State and sfActive<>0 then
   begin
     if Modified then
     WordRec (B[0]).Lo := ord('*');
{$ifdef debug}
     if StoreUndo then
       WordRec (B[1]).Lo := ord('S');
     if SyntaxComplete then
       WordRec(B[2]).lo := ord('C');
     if UseTabs then
       WordRec(B[3]).lo := ord('T');     
{$endif debug}
     L[0] := Location.Y + 1;
     L[1] := Location.X + 1;
   //[[[[[[[[[[[[[[  FormatStr(S, ' %d:%d ', L);  //проблемная процедура
     Str(L[0],S);                  //[[[[[[[[[[[[[[[[[[[[v
     if Length(S)<6 then S:=' '+S;
     S:=S+':';
     Str(L[1],K);
     if Length(K)<3 then K:=K+' ';
     S:=S+K;                       //[[[[[[[[[[[[[[[[[[[[^
     MoveStr(B[8 - Pos(':', S)], S, Color); 
   end;
WriteBuf(0, 0, Size.X, 1, B);
end;

С тебя протестировать на 32 битной сборке и во время ближайшего пакета обновления добавить патч в дистрибутив :P
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 26.02.2013 10:11:32

Всё ОК на 32бит, спасибо. Патч отправлен в апстрим http://bugs.freepascal.org/view.php?id=23957
По сути осталось самое сложное - исправить отладчик, ну и походу если ещё какие-то баги всплывут.
src.rpm: ftp://ftp.mageialinux.ru/mageia2/SRPMS/ (fp-ide-2.6.0-13.mrc.mga2.src.rpm)
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Re: Прикручивание русского языка к FP в линуксе

Сообщение bormant » 26.02.2013 11:27:35

Сквозняк писал(а):Патч

О боги! А почему не тривиальное:
Код: Выделить всё
-  L: array[0..1] of LongInt;
+  L: array[0..1] of Pointer;
...
-  L[0] := Location.Y + 1;
-  L[1] := Location.X + 1;
+  L[0] := Pointer(Location.Y + 1);
+  L[1] := Pointer(Location.X + 1);
...


Тест
Код: Выделить всё
uses Drivers;
var
  S: string[15];
  L: array [0..1] of Pointer;
begin
  L[0] := Pointer(1025);
  L[1] := Pointer(1026);
  FormatStr(S, ' %d:%d ', L);
  writeln('[', S, ']');
end.
Код: Выделить всё
./test32
[ 1025:1026 ]
Код: Выделить всё
./test64
[ 1025:1026 ]


ps. Строго говоря, с учётом того, что в packages/fv/src/drivers.pas
Код: Выделить всё
procedure FormatStr (Var Result: String; CONST Format: String; Var Params);
TYPE TLongArray = Array[0..0] Of PtrInt;
преобразовывать нужно к PtrInt, который по смыслу своему "Signed integer type with same size as Pointer." (http://www.freepascal.org/docs-html/rtl ... trint.html).
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Прикручивание русского языка к FP в линуксе

Сообщение Сквозняк » 26.02.2013 17:08:43

bormant писал(а):А почему не тривиальное:

А потому что нет привычки а значит и опыта в работе с указателями - большинство задач как-то решаются без этого. И ещё make создаёт неудобства - нужно несколько минут ждать чтобы скомпилить и проверить результат опытным путём. Твой вариант патча потянет отображение строки с номером 123456?

Добавлено спустя 5 минут 29 секунд:
alex_alex_alex1 писал(а):По сути осталось самое сложное - исправить отладчик

А вот с этим вопросом чем дальше тем туманнее. Привычки пользоваться gdb тоже нет а значит команды для работы с ним неизвестны. Попробовал на альтовском иде с gdb 7.2 протестировать однопоточный пример
Код: Выделить всё
VAR

Q3,W3: BYTE;

begin

WRITELN('jjkjkj');

W3:=100;
Q3:=1+W3;
WRITELN(Q3);

end.

Потыкал, ничего не падает. Если альтовский способ сборки с отладчиком не устраивает, то давай свой тестовый пример и пошаговый набор действий: куда и что тыкать чтобы упало или заглючило. Иначе непонятно, что вообще от отладчика требуется.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Прикручивание русского языка к FP в линуксе

Сообщение bormant » 26.02.2013 18:44:45

Сквозняк писал(а):нет привычки а значит и опыта в работе с указателями
К слову, дело не совсем, а точнее, совсем не в указателях...
В оригинальном Turbo Vision, если правильно путаю, внутри FormatStr() параметр var Params использовался для передачи значений, которые интерпретировались в зависимости от спецификатора формата:
Код: Выделить всё
{ A generalized string formatting routine. Given a string in Format     }
{ that includes format specifiers and a list of parameters in Params,   }
{ FormatStr produces a formatted output string in Result.               }
{ Format specifiers are of the form %[-][nnn]X, where                   }
{   % indicates the beginning of a format specifier                     }
{  [-] is an optional minus sign (-) indicating the parameter is to be  }
{      left-justified (by default, parameters are right-justified)      }
{ [nnn] is an optional, decimal-number width specifier in the range     }
{      0..255 (0 indicates no width specified, and non-zero means to    }
{      display in a field of nnn characters)                            }
{   X  is a format character:                                           }
{   's' means the parameter is a pointer to a string.                   }
{   'd' means the parameter is a Longint to be displayed in decimal.    }
{   'c' means the low byte of the parameter is a character.             }
{   'x' means the parameter is a Longint to be displayed in hexadecimal.}
{   '#' sets the parameter index to nnn.                                }
Нетрудно заметить, что максимальный элемент данных -- 4 байта, под который подходили и Pointer и LongInt.

В x64 указатель стал вдвое длиннее, но по спецификации процедуры по-прежнему должен помещаться в списке передаваемых параметров, отсюда и первый патч. Потом (а нужно было сразу) решил проверить, а что в коде FormatStr() в FreeVision.

В FreeVision процедуру FormatStr() переписали на паскале, в нынешнем варианте там
Код: Выделить всё
procedure FormatStr (Var Result: String; CONST Format: String; Var Params);
type
  TLongArray = Array[0..0] Of PtrInt;
...
           Case Format[FormatIndex] Of
...
           'c': S := Char(TLongArray(Params)[I]);          { Character parameter }
           'd': S := LongToStr(TLongArray(Params)[I],10);  { Decimal parameter }
           's': S := PString(TLongArray(Params)[I])^;      { String parameter }
           'x': S := LongToStr(TLongArray(Params)[I],16);  { Hex parameter }
           end;
...
то есть, доступ к Params производится как к массиву из PtrInt через приведение типа TLongArray(Params)[I] с последующим приведением полученного сообразно символу формата. Раз внутри оно интерпретирует содержимое памяти Params как array of PtrInt, то и укладывать в передаваемые параметры нужно сообразно ожидаемым размерам элементов. Первое решение (с приведением к Pointer) тоже рабочее, поскольку sizeof(PtrInt) по документации равен sizeof(Pointer).
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 26.02.2013 19:10:04

Надо брать gdb последних версий. Для Магея 2 это gdb-7.3.50, для Магея 3 это gdb-7.5.1. На ранних версиях вроде как должно работать, но ошибки с новыми версиями gdb. А падает если поставить точку останова и запустить пошагово - падение мгновенно происходит.
Видите как хорошо дело пошло - уже целых 3 патча для исправления правильного отображения позиции курсора. Так держать!
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Re: Прикручивание русского языка к FP в линуксе

Сообщение Сквозняк » 27.02.2013 02:09:36

alex_alex_alex1 писал(а):Надо брать gdb последних версий. Для Магея 2 это gdb-7.3.50, для Магея 3 это gdb-7.5.1.

Пилить совместимость со всеми новыми версиями gdb это не дело - работы будет выше крыши а пользы фиг да нефига. Допустим, есть рабочий биндинг к gdb-7.2, теперь надо запилить (если альт раньше не запилит) к ~7.5.1 а на все промежуточные версии забить иначе на полезные дела времени не останется, вместо них будешь пахать как ментейнер :wink:
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 27.02.2013 13:12:11

Сквозняк, согласен, бери последнюю версию gdb. А на Альт надеяться смысла нет - они уже год делают и бестолку, Арч тоже баг не решил, закрыв его, апстрим тоже не чешется.
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Re: Прикручивание русского языка к FP в линуксе

Сообщение Сквозняк » 08.03.2013 04:10:17

alex_alex_alex1 писал(а):Собрать с gdb не проблема

Со сборкой нарисовалась проблема. gdb7.5 и gdb7.5.1 собираются без libgdb.a Как их собрать или откуда взять (64 бит, не из арча)?

Собираюсь попробовать бэкпортировать gdbint.pp из fpc2.7.1 - там есть биндинг к gdb7.5.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 08.03.2013 13:25:13

libgdb.a появляется при сборке gdb всё равно, но в пакеты не попадает. Откуда взять? Пересобрать gdb.
gdbint.pp можно взять полностью, ну, соберётся с поддержкой gdb, а отладчик в fp всё равно работать не будет - надо править сам код fp.
Варианты сборки с поддержкой отладчика у меня см. в spec файле.
"download GDB sources, recompile then, and use packages/gdbint/gen-libgdb-inc.sh script" - это один из вариантов как получить необходимые зависимости, затем см. в spec как указать, что их юзать.
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Re: Прикручивание русского языка к FP в линуксе

Сообщение Сквозняк » 08.03.2013 18:32:51

alex_alex_alex1 писал(а):libgdb.a появляется при сборке gdb всё равно, но в пакеты не попадает. Откуда взять? Пересобрать gdb.

В том то и дело что в версии 7.5 и выше после сборки не обнаруживал libgdb.a - в 7.4 есть а в 7.5 нет, а если нет файла то и не с чем работать. Лажа какая-то: или сборка бинарника происходит без libgdb.a или он стирается перед окончанием сборки. Похоже в Makefile водятся привидения :evil:
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 08.03.2013 22:31:57

Всё на месте http://pkgs.org/mageia-cauldron/mageia- ... 6.rpm.html - я его пересобирал как gdb-7.5-1.mrc.mga2.src.rpm ftp://ftp.mageialinux.ru/mageia2/construct/SRPMS/ - немного поправив спек.
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Re: Прикручивание русского языка к FP в линуксе

Сообщение Сквозняк » 09.03.2013 03:08:24

Ну и как мне этот gdb-7.5.1-4.mga3.src.rpm собрать не устанавливая в систему? По ссылкам архивов с *.a файлами не обнаружено. Для меня ковыряние в С/перле такая же радость как для тебя в недрах fpc. Причём у меня есть смутное подозрение что если загружу в память всю эту ахинею придуманную сишниками то забуду ценные вещи из паскаля.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Прикручивание русского языка к FP в линуксе

Сообщение alex_alex_alex1 » 09.03.2013 10:36:57

http://wiki.mageialinux.ru/index.php?title=Сборка_rpm-пакетов_в_Mageia
Глава IV.
Пересобрать не устанавливая.
alex_alex_alex1
постоялец
 
Сообщения: 207
Зарегистрирован: 15.10.2010 14:08:50

Пред.След.

Вернуться в Разработки на нашем сайте

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

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

Рейтинг@Mail.ru