LINUX.ORG.RU

Правильно портировать Pascal код

 , , ,


0

1

Был у меня helloworld под офтопик который перехватывал консольный ввод и заменял вводимые символы символом *.

hobbit

Вот код

unit consolepassword;

{$MODE Delphi}

interface

procedure ConsoleGetPassword (var Password : string);

implementation

uses
  SysUtils,Windows;

var
  consoleHandle: THandle;
  ConsoleAttr: _CONSOLE_SCREEN_BUFFER_INFO;


function EnableEcho(const ShowText: Boolean): Cardinal;
begin
  GetConsoleMode(consoleHandle, Result);
  if ShowText then
    SetConsoleMode(consoleHandle, Result or ENABLE_ECHO_INPUT)
  else
    SetConsoleMode(consoleHandle, Result and not ENABLE_ECHO_INPUT);
end;

function KeyPressed: Char;
var
  oldMode: Cardinal;
  bufSize: Cardinal;
begin
  GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), OldMode);
  SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldMode and not
(ENABLE_LINE_INPUT or ENABLE_ECHO_INPUT));
  ReadConsole(GetStdHandle(STD_INPUT_HANDLE), @Result, 1, bufSize,
nil);
  SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldMode);
end;

procedure GotoXY(X, Y: Word);
var
  pos: COORD;
begin
  pos.X := X;
  pos.Y := Y;
  SetConsoleCursorPosition(STD_INPUT_HANDLE, pos);
end;

function GetPassword(const MaskChar: Char = '*'): string;
var
  c: Char;
begin
  Writeln;
  Write('Enter Password: ');

  EnableEcho(False);
  while True do
  begin
    c := KeyPressed();
    case c of
      #13: Break;
      #8:
      begin
        if Length(Result) > 0 then
        begin
          Delete(Result, Length(Result), 1);
          GotoXY(ConsoleAttr.dwCursorPosition.X - 1,
            ConsoleAttr.dwCursorPosition.Y);
          Write(' ');
          GotoXY(ConsoleAttr.dwCursorPosition.X - 1,
            ConsoleAttr.dwCursorPosition.Y);
        end;
      end;
    else
      Result := Result + c;
      Write(MaskChar);
    end;
  end;
  EnableEcho(True);
end;

// main
procedure ConsoleGetPassword (var Password : string);
begin
  consoleHandle := GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(consoleHandle, ConsoleAttr);
  Password := GetPassword();
end;

end.

Я теперь хочу другой helloworld, который использует этот модуль собрать Lazarus'ом под онтопик. Как правильно его перенести на Linux?

★★★★★

Последнее исправление: Twissel (всего исправлений: 1)

Тип используемых строк надо задать поконкретнее, например использованием директивы компилятора {$H+} во всех исходниках.

Модуль Windows у тебя используется чтобы в консоли сканировать и перемещать позицию курсора, такое умеет модуль crt. Только в нём был баг: как crt подключишь, так writeln('русский текст с длиной больше половины консоли'); выводит текст с переносом примерно посередине консоли - определение ширины текста происходит по байтам а не символам. Если баг не исправили, лезешь в исходники crt и вытаскиваешь из него нужные тебе процедуры и функции.

Napilnik ★★★★★
()

Плюсую модуль Crt.

hobbit ★★★★★
()

Как правильно его перенести на Linux?

Переписать с нуля. Это же просто набор вызовов винапи, просто перекомпилить не удастся.

unC0Rr ★★★★★
()
Ответ на: комментарий от rupert

Какой ужас, а заменить звездочки на другой символ можно?

linuhs_user
()
Ответ на: комментарий от crutch_master

Перепиши на си+ncurses.

На fpc+ncurses написана паскалеская IDE fp. Ради нескольких строк кода тащить в бинарь кучу зависимостей...

Napilnik ★★★★★
()

А вообще, если говорить конкретно про консольный ввод с отключением эха, я использовал решение отсюда. Там, правда, не паскаль, а си, но какая разница - там всё делается через вызовы низкоуровневых платформозависимых функций. Как, собственно, и в твоём исходном хеллоуворлде. :)

hobbit ★★★★★
()

Basic:

PRINT «Hello, World!»

Pascal:

Program Hello World;

var

Begin WRITELN («Hello, Wold!»); End. Perl:

#! /usr/bin/perl

print «Hello, World!\n»;

python:

#! /usr/bin/python

print «Hello, World!»

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.