Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2018-12

How to get ANSI code command return value?

3 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Mr Bee

Hi all,
I'm playing around with ANSI code (ESC sequence) on the console. Sending an escape command is trivial such as changing text's color and background. However, getting a response isn't as easy as I thought. Here's a simple test program: program ANSItest;
var  s: string;begin  // send ESC command  write('Cursor position: ');  write(#27'[6n');  read(s);  // read ESC result  write('Received string: ');  writeln(s);end. The program sends <ESC>[6n command to query current cursor position and would return <ESC>[<line>;<column>R string. As the result is sent back to standard input, I think using the standard read() procedure would be enough. Unfortunately, that's not the case. Here are the problems:
1. read() procedure keeps waiting until the user presses return/enter key while I hope it could automatically stop reading as the input buffer gets empty. Is there a way to make read() doesn't wait for return/enter key?
2. read() procedure strangely doesn't read the response given by the console (into s variable) although it's clearly printed on the screen. It's proven by the last writeln(s) line that produces nothing or an empty text. What's wrong with it?
3. The return value of an ESC command query is printed on the console. I don't want this. I want to send the ESC command silently, fortunately the standard write() procedure is able to do just that. I also want to get the response value silently. Is there a way to temporarily redirect standard input into a variable? Requirements:
– I want to avoid CRT unit as much as possible. I prefer raw pascal solution.– The solution works across platforms, at least on Mac, Linux, and Windows. Is it possible using standard Pascal routines?
Thank you.
Regards,
–Mr Bee

Reply by email

Sven Barth
to Mr Bee

Am So., 2. Dez. 2018, 08:29 hat Mr Bee via fpc-pascal <

Show quoted text 5 lines
geschrieben: – I want to avoid CRT unit as much as possible. I prefer raw pascal solution.

Um... The CRT unit is a raw Pascal solution?! Anyway, you can use that unit to see how the CRT unit did it.

– The solution works across platforms, at least on Mac, Linux, and Windows.

The Windows console does not support ANSI codes. So you'll need to use an abstraction API like the CRT unit anyway.

Regards,
Sven

Reply by email

Mr Bee
to Sven Barth

Pada tanggal Min, 2 Des 2018 pukul 15.59 Sven Barth <

Show quoted text 6 lines
menulis: Um... The CRT unit is a raw Pascal solution?! Anyway, you can use that unit to see how the CRT unit did it.

Nope, I don't think so. CRT unit is Turbo Pascal's legacy unit. There are some serious caveats with CRT unit, as explained here: https://www.freepascal.org/docs-html/rtl/crt/index.html

The Windows console does not support ANSI codes. So you'll need to use an

abstraction API like the CRT unit anyway.

Windows now supports ANSI codes emulation, as explained here: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

Regards,

–Mr Bee

Reply by email