El 23/9/2015 12:25 PM, Rainer Stratmann escribió:

Rather than saving the state in a static way, I prefer implementing a Push/Pop (LIFO queue) approach to allow for nested pairs of setting and restoring, like this:

Type IOsCollection = {Any sort of collection, array, list, or record with linking pointers};

var oldios : IOsCollection;

procedure PushTio(tio : termios);
begin
//Stores tio in the oldios: IOsCollection, and advances a pointer, index, etc., 
if necessary
end;
funtion PopTio: termios;
begin
//Retrieves and removes last pushed tio from the oldios: IOsCollection
end;

procedure crt_output_set_normal;
var tio : termios;
begin
  tcgetattr( 1 , tio );

  PushTio(tio);

  // !
  tio.c_oflag := tio.c_oflag or OPOST or ONLCR;
  // !
  tcsetattr( 1 , TCSANOW , tio );
end;

procedure crt_output_restore;
begin
  // tcsetattr( 1 , TCSANOW , oldio ); //old suggestion

 tcsetattr( 1 , TCSANOW , PopTio );

end;
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


-----------------------------------------------------
I repeat it here for the sake of clarity
-----------------------------------------------------
Type IOsCollection = {Any sort of collection, array, list, or record with linking pointers};

var oldios : IOsCollection;

procedure PushTio(tio : termios);
begin
//Stores tio in the IOsCollection, and advances a pointer, index, etc., if 
necessary
end;
funtion PopTio: termios;
begin
//Retrieves and removes last pushed tio from the IOsCollection
end;


procedure crt_output_set_normal;
var tio : termios;
begin
 tcgetattr( 1 , tio );
 PushTio(tio);
 // !
 tio.c_oflag := tio.c_oflag or OPOST or ONLCR;
 // !
 tcsetattr( 1 , TCSANOW , tio );
end;

procedure crt_output_restore;
begin
 tcsetattr( 1 , TCSANOW , PopTio );
end;

---------------------------------------------
Now you can nest them
---------------------------------------------

uses AnyUnit {Unit that implements crt_output_set_any_other_tio_state and 
any_other_tio_modifyng_routine};

procedure any_tio_modifyng_routine; forward;

procedure MyNestingExample;
begin
crt_output_set_normal;
// Do some outputs

any_tio_modifyng_routine;
//keep working;
crt_output_restore
end;

procedure any_tio_modifyng_routine;
begin
crt_output_set_any_other_tio_state;
// Do some outputs
any_other_tio_modifyng_routine;
//keep working;
crt_output_restore
end;

Best regards,
Roger Rivero

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to