OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 21 Октябрь, 2019 06:38

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Среда, 25 Январь, 2012 04:33 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 661
Откуда: СССР
попробовал пока простейший способ

добавил
Код:
MODULE LinLibc ["libc.so.6"];
   PROCEDURE [ccall] getchar* (): INTEGER;
   PROCEDURE [ccall] mbtowc* (OUT wc: wchar_t; s: PtrSTR;size: size_t): INTEGER;

MODULE TestinSample001;

   IMPORT Log, LinSimpleLog, LinLibc;
   
   PROCEDURE Init*;
   VAR res,i,j:INTEGER;
         ss: ARRAY 2 OF SHORTCHAR;
   BEGIN
      LinSimpleLog.Open;
      
      Log.String("Проверка ввода"); Log.Ln;

      i:=LinLibc.getchar();

      Log.String("введено"); Log.Ln;
      
      ss[0]:=SHORT(CHR(i));
      ss[1]:=0X;      
      res := LinLibc.mbtowc(j,ss, 1);

      Log.Char(CHR(j)); Log.Ln;
   END Init;

END TestinSample001.

DevElfLinker.LinkDll libBB.so := Kernel+ Kernel_so_init# Log Math Strings LinSimpleLog
TestinSample001#


английские буквы выходят нормально
с русскими буквами надо, видимо, надо еще лучше разобраться в кодировках


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 25 Январь, 2012 12:41 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4520
Откуда: Россия, Орёл
mb = multibyte
Нужно читать и передавать цепочку SHORTCHAR, а не один.

Посмотрите (вроде попроще в использовании): http://www.gnu.org/software/libc/manual ... Conversion
Или: http://www.gnu.org/software/libc/manual ... conversion


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Февраль, 2012 04:45 

Зарегистрирован: Суббота, 04 Март, 2006 15:13
Сообщения: 661
Откуда: СССР
Вот, пока колхозный вариант.
Работает с английскими и русскими буквами.


Вложения:
Sample004.odc [2.11 КБ]
Скачиваний: 364
KolkhozIn.odc [4.99 КБ]
Скачиваний: 363
Libc.odc [23.38 КБ]
Скачиваний: 351
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 02:10 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Сегодня запустил консольную версию под OpenBSD :wink:

  • Взял DevElfLinker16 из OpenBUGS, подсистему Lin (LinDl, LinLibc, LinKernel, LinHostFiles)
  • Переписал LinDl, LinLibc с учётом OpenBSD.
  • Исправил LinKernel.TrapHandler с учётом sigcontext в OpenBSD.
  • Исправил LinKernel.Time, т. к. в OpenBSD CLOCKS_PER_SEC = 100
  • Добавил вызов mprotect(mod.code, mod.csize, PROT_READ + PROT_WRITE + PROT_EXEC) перед вызовом body() в LinKernel.InitModule, т. к. в OpenBSD по умолчанию память не исполняемая.

В итоге заработала и динамическая загрузка модулей.

Ещё взял подсистему Lindev из OpenBUGS и на основе её и DevElfLinker16 сделал консольную версию компилятора.

Кстати выполнять SetKernelBaseStack почему-то не нужно, т.е. если делать, программа не завершается, а если не делать, то всё нормально. Попробую ещё потестировать сборщик мусора.

Связываю библиотеку .so с исполнямым файлом на этапе сборки (-lBB), а не чрез dlopen.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 07:41 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8185
Откуда: Троицк, Москва
Alexander Shiryaev писал(а):
Сегодня запустил консольную версию под OpenBSD :wink:
Здорово.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 09:12 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Александр, любопытно взглянуть на исходные коды. Я смог бы тогда адаптировать их для моей консольной реализации.

Отсутствие необходимости использования SetKernelBaseStack может объясняться статической сборкой исполняемого файла. Полагаю, для пускача использовался Си.

А какие параметры принимает на входе этот компилятор и что является выходом?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 13:59 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Роман М. писал(а):
А какие параметры принимает на входе этот компилятор и что является выходом?

Реализовал в виде интерпретатора команд, без командной строки. Так удобно.
Пример скрипта:
Код:
#!/bin/sh

./run-dev <<DATA
compile Lin/Mod Obsd.Dl.txt
compile Lin/Mod Obsd.Libc.txt
compile Lin/Mod Obsd.KQueue.txt
compile Lin/Mod Obsd.linKernel.txt
compile System/Mod Files.txt
compile System/Mod Math.txt
compile System/Mod Strings.txt
compile Lin/Mod linHostFiles.txt
compile System/Mod Meta.txt
compile Std/Mod Loader.txt
compile System/Mod Console.txt
compile Lin/Mod Console.txt
compile Lin/Mod Kernel_so_init.txt
DATA

./run-dev <<DATA
compile Lindev/Mod CPM.txt
compile Lindev/Mod CPT.txt
compile Lindev/Mod CPS.txt
compile Lindev/Mod CPH.txt
compile Lindev/Mod CPB.txt
compile Lindev/Mod CPP.txt
compile Lindev/Mod CPE.txt
compile Lindev/Mod CPL486.txt
compile Lindev/Mod CPC486.txt
compile Lindev/Mod CPV486.txt
compile  LindevElfLinker16.txt
compile  LindevCompiler.odc
compile  Lindev.odc
DATA

./run-dev <<DATA
link libBBLindev.so := Kernel+ Kernel_so_init# Console Math Strings LinConsole Files HostFiles LindevCPM LindevCPT LindevCPS LindevCPH LindevCPB LindevCPP LindevCPE LindevCPL486 LindevCPC486 LindevCPV486 LindevCompiler LindevElfLinker Lindev#
DATA


Исходники выложу позже.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 21:44 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4520
Откуда: Россия, Орёл
Alexander Shiryaev писал(а):
Кстати выполнять SetKernelBaseStack почему-то не нужно, т.е. если делать, программа не завершается, а если не делать, то всё нормально. Попробую ещё потестировать сборщик мусора.

Связываю библиотеку .so с исполнямым файлом на этапе сборки (-lBB), а не чрез dlopen.
Поэтому и не нужно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Сентябрь, 2012 21:46 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4520
Откуда: Россия, Орёл
Alexander Shiryaev писал(а):
Реализовал в виде интерпретатора команд, без командной строки.
Похоже, почти идеальный вариант. :) Ещё бы избавиться от самопального интерпретатора в пользу Dialog.Call...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 01:42 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Евгений Темиргалеев писал(а):
Alexander Shiryaev писал(а):
Реализовал в виде интерпретатора команд, без командной строки.
Похоже, почти идеальный вариант. :) Ещё бы избавиться от самопального интерпретатора в пользу Dialog.Call...

Хорошо. Сделал так:

Код:
MODULE Interp;

   (* (Std)Interpreter on (Lin)Console *)

   IMPORT Console, LinConsole (* required *), Strings, Dialog, StdInterpreter (* required (Dialog.SetCallHook) *);

   PROCEDURE WriteInt (x: INTEGER);
      VAR s: ARRAY 16 OF CHAR;
   BEGIN
      Strings.IntToString(x, s);
      Console.WriteStr(s)
   END WriteInt;

   PROCEDURE Call (VAR s: ARRAY OF CHAR): BOOLEAN;
      VAR i: INTEGER;
         res: BOOLEAN;
   BEGIN
      i := 0;
      WHILE (i < LEN(s)) & (s[i] # 0AX) & (s[i] # 0DX) & (s[i] # 0X) DO
         INC(i)
      END;
      IF (i < LEN(s)) & (s[i] # 0X) THEN
         IF (i > 0) & (s[0] # '#') THEN
            s[i] := 0X;
            Dialog.Call(s, "", i);
            IF i = 0 THEN
               res := TRUE
            ELSE
               WriteInt(i); Console.WriteLn;
               res := FALSE (* stop on Dialog.Call error *)
            END
         ELSE (* skip empty strings and comments *)
            res := TRUE
         END
      ELSE (* end of input *)
         res := FALSE
      END;
   RETURN res
   END Call;

   PROCEDURE Init*;
      VAR s: ARRAY 1024 OF CHAR;
   BEGIN
      Console.ReadLn(s);
      WHILE Call(s) DO
         Console.ReadLn(s)
      END
   END Init;

END Interp.


Код:
#!/bin/sh

./run-interp <<DATA
LindevCompiler.Compile('Lin/Mod', 'Obsd.Dl.txt')
LindevCompiler.Compile('Lin/Mod', 'Obsd.Libc.txt')
LindevCompiler.Compile('Lin/Mod', 'Obsd.KQueue.txt')
LindevCompiler.Compile('Lin/Mod', 'Obsd.linKernel.txt')
LindevCompiler.Compile('System/Mod', 'Files.txt')
LindevCompiler.Compile('System/Mod', 'Dialog.txt')
...
DATA


Наибольшая длина строки -- 256 (LEN(Dialog.String) = 256).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 16:27 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
https://github.com/aixp/BlackBox

Копилятор OpenBUGS Lindev старее, чем BlackBox 1.6-rc6.

Использование Lindev -- временное решение, надо сделать так, чтобы заработал оригинальный компилятор Dev.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 17:28 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4520
Откуда: Россия, Орёл
Alexander Shiryaev писал(а):
Использование Lindev -- временное решение, надо сделать так, чтобы заработал оригинальный компилятор Dev.
На мой взгляд, это как раз идеальное. :)

Если ещё вызов команд из каждой строки делать на подобие DevCommanders (выставлять DevCommanders.par, например на кусок текста от конца команды до перевода строки), то будет
Код:
DevCompiler.CompileThis ....
DevElfLinker.LinkDll ...
Поглядите ert0devCmdSeq...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 17:48 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Alexander Shiryaev писал(а):
надо сделать так, чтобы заработал оригинальный компилятор Dev.
Для этого понадобится присоединить базовую часть каркаса ББ, включающую Text, а это весьма трудоёмко. Поэтому проще отделаться вызовом функций Console, как сейчас.
Компилятор ББ тесно связан со графической средой разработки: вывод на экран сообщений об ошибках, маркировка ошибок, трапы. На консоли это не сделаешь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 18:17 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Может быть можно просто заменить модули TextModels, TextMappers, DevMarkers (их требует только DevCPM).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 20:07 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Обновил Lindev в соответствии с BlackBox 1.6-rc6


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 21:58 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Alexander Shiryaev писал(а):
Может быть можно просто заменить модули TextModels, TextMappers, DevMarkers (их требует только DevCPM).
Заменить чем?
Весь смысл использования каркаса ББ состоит в интеракции с пользователем через графический интерфейс. То что предлагает консоль, изначально является ущербной заменой возможностям, предоставляемых каркасом, как ни крути.
Имеет смысл переносить на разные платформы не компилятор ББ, а среду исполнения программ.
Компилятор же является вполне придаточным звеном. Он по определению заработает как только среда исполнения и каркас будут перенесены на новую ОС. Для компиляции для другой платформы (не x86-32) потребуется не только адаптация связки Kernel+Files+HostFiles, но и вмешательство в кодогенератор компилятора и компоновщик ББ, а это уже другая история.

Этими словами я признаю то, что мой выбор в пользу консольного компилятора (вернее, консольной оболочки для) ББ был поспешным. На то время мне слишком хотелось получить "привычный" компилятор.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 22:40 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Роман М. писал(а):
Имеет смысл переносить на разные платформы не компилятор ББ, а среду исполнения программ.

Да, а компилятор является её подмножеством. Но это не значит, что для работы компилятора должен быть необходим графический пользовательский интерфейс. Т.е. он может быть, а может его и не быть.

Для консольного компилятора можно реализовать подсистему Text (точнее, её подмножество) таким образом, чтобы она работала без графического пользовательского интерфейса, при этом ничего не меняя в реализации самого компилятора. Эта реализация должна использоваться только для сборки консольного компилятора и не должна заменять текущую реализацию Text, предназначенную для работы с графическим пользовательским интерфейсом.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Сентябрь, 2012 23:42 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Хотя может и не делать ничего, а оставить так, как есть (Lindev), т.к. процесс перевода Dev -> Lindev тривиальный.

Командную строку для компилятора делать не буду хотя бы по той причине, что многократный запуск программы работает медлнее, чем однократный. А удобства пользования компилятором командная строка не добавляет. Всё равно же сборка должна быть автоматизированной, скрипт сборки должен быть, не вручную же компилировать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 08 Сентябрь, 2012 02:01 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
В общем сделал так, чтобы подсистема Dev заработала без графического пользовательского интерфейса, при этом ничего в ней не меняя. Потребовалось, чтобы заработала подсистема Texts. В ней тоже ничего не менял, а для того, чтобы она заработала, пришлось реализовать HostFonts, HostDialog и HostWindows. Для работы Dev ещё потребовалось реализовать HostDates и заменить реализацию StdLog.

Скоро подсистемы Lindev не будет, останутся только консольные интерфейсы к компилятору Dev и к DevElfLinker16. Только для работы оригинального DevElfLinker16 ещё надо будет дореализовать неоригинальный StdLog.

Сообщения компилятора об ошибках будут выводиться на консоль так:
Код:
        PROCEDURE LogMarks (r: TextModels.Reader);
                VAR v: Views.View;
        BEGIN
                r.SetPos(0);
                r.ReadView(v);
                WHILE ~r.eot DO
                        WITH v: DevMarkers.View DO
                                v.SetMode(DevMarkers.message);
                                LogStr("  pos = "); LogInt(r.Pos()); LogStr(', error = "'); LogStr(v.msg); LogStr('"'); LogLn;
                        ELSE
                        END;
                        r.ReadView(v)
                END
        END LogMarks;

Код:
        IF error THEN
                DevCPM.InsertMarks(source.Base());
                LogMarks(source)
        END


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 08 Сентябрь, 2012 19:59 
Аватара пользователя

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 446
Откуда: Егорьевск
Добился работоспособности DevCompiler и DevElfLinker из консоли, без Lindev:

Код:
#!/bin/sh

./run-BlackBox <<DATA
DevCompiler.CompileThis ObxHello0 ObxPi
ObxHello0.Do
ObxPi.WritePi(1000)

DevElfLinker.LinkDll libBB.so := Kernel+ Files HostFiles StdLoader
DATA


Код:
compiling
compiling "ObxHello0"   32   0
compiling "ObxPi"   444   0
ok
Hello World
31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989
compiling Obx/Mod Hello0.odc
   32   0
compiling Obx/Mod Pi.odc
   444   0
linking
$libc.so.66.0  libc.so.66.0
$libc.so.66.0  libc.so.66.0
Ok


Ещё написал интерфейс компилятора ConsCompiler, назначение которого -- вывод на экран ошибок DevMarkers и компиляция текстовых файлов без применения Converters import .txt (т.к. HostTexts не реализован).

Почему-то в Windows он работает, компилирует текстовые файлы, а в OpenBSD -- нет, пока не могу понять почему. Хотя LindevCompiler работает, и делает почти то же самое.
odc-файлы ConsCompiler компилирует нормально.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 53 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB