-- COMPLEX_IO body -- --Copyright (C) 1993 Free Software Foundation --written by Jon Squire with assistance from many others -- --This file is part of the numerics library. This library --is free software; you can redistribute it and/or modify it under the --terms of the GNU Library General Public License as published by the Free --Software Foundation; either version 2 of the License, or (at your --option) any later version. This library is distributed in the hope --that it will be useful, but WITHOUT ANY WARRANTY; without even the --implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --PURPOSE. See the GNU Library General Public License for more details. --You should have received a copy of the GNU Library General Public --License along with this library; if not, write to the Free Software --Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -- package BODY COMPLEX_IO is package REAL_IO is new TEXT_IO.FLOAT_IO(REAL); ROOM : POSITIVE := REAL'DIGITS + 6; -- room in a string for a floating thing procedure GET (FILE : in FILE_TYPE; ITEM : out COMPLEX; WIDTH : in FIELD := 0) is SYNTAX : CHARACTER := ' '; -- look for ( , ) REAL_PART, IMAGINARY_PART : REAL; -- temporary until COMPLEX composed begin while SYNTAX /= '(' loop TEXT_IO.GET(FILE, SYNTAX); -- look for '(' end loop; REAL_IO.GET(FILE, REAL_PART, WIDTH); -- ITEM.RE while SYNTAX /= ',' loop TEXT_IO.GET(FILE, SYNTAX); -- look for ',' end loop; REAL_IO.GET(FILE, IMAGINARY_PART, WIDTH); -- ITEM.IM while SYNTAX /= ')' loop TEXT_IO.GET(FILE, SYNTAX); -- look for ')' end loop; ITEM := COMPOSE_FROM_CARTESIAN(REAL_PART,IMAGINARY_PART); end GET; procedure GET (ITEM : out COMPLEX; WIDTH : in FIELD := 0) is SYNTAX : CHARACTER := ' '; -- look for ( , ) REAL_PART, IMAGINARY_PART : REAL; -- temporary until COMPLEX composed begin while SYNTAX /= '(' loop TEXT_IO.GET(SYNTAX); -- look for '(' end loop; REAL_IO.GET(REAL_PART, WIDTH); -- ITEM.RE while SYNTAX /= ',' loop TEXT_IO.GET(SYNTAX); -- look for ',' end loop; REAL_IO.GET(IMAGINARY_PART, WIDTH); -- ITEM.IM while SYNTAX /= ')' loop TEXT_IO.GET(SYNTAX); -- look for ')' end loop; ITEM := COMPOSE_FROM_CARTESIAN(REAL_PART,IMAGINARY_PART); end GET; procedure PUT (FILE : in FILE_TYPE; ITEM : in COMPLEX; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP) is begin TEXT_IO.PUT(FILE, '(' ); REAL_IO.PUT(FILE, RE(ITEM), FORE, AFT, EXP); -- ITEM.RE TEXT_IO.PUT(FILE, ',' ); REAL_IO.PUT(FILE, IM(ITEM) ,FORE, AFT, EXP); -- ITEM.IM TEXT_IO.PUT(FILE, ')' ); end PUT; procedure PUT (ITEM : in COMPLEX; FORE : in FIELD := DEFAULT_FORE; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP) is begin TEXT_IO.PUT( '(' ); REAL_IO.PUT(RE(ITEM), FORE, AFT, EXP); -- ITEM.RE TEXT_IO.PUT( ',' ); REAL_IO.PUT(IM(ITEM) ,FORE, AFT, EXP); -- ITEM.IM TEXT_IO.PUT( ')' ); end PUT; procedure GET (FROM : in STRING; ITEM : out COMPLEX; LAST : out POSITIVE) is SYNTAX : CHARACTER := ' '; -- look for ( , ) REAL_PART, IMAGINARY_PART : REAL; -- temporary until COMPLEX composed LAST_POS : POSITIVE; POSITION : POSITIVE := FROM'FIRST; begin while FROM(POSITION) /= '(' loop POSITION := POSITION+1; -- look for '(' if POSITION > FROM'LAST then raise END_ERROR; end if; end loop; REAL_IO.GET(FROM(POSITION+1..FROM'LAST), REAL_PART, LAST_POS); -- ITEM.RE POSITION := LAST_POS+1; if POSITION > FROM'LAST then raise END_ERROR; end if; while FROM(POSITION) /= ',' loop POSITION := POSITION+1; -- look for ',' if POSITION > FROM'LAST then raise END_ERROR; end if; end loop; REAL_IO.GET(FROM(POSITION+1..FROM'LAST), IMAGINARY_PART, LAST_POS); -- ITEM.IM POSITION := LAST_POS+1; if POSITION > FROM'LAST then raise END_ERROR; end if; while FROM(POSITION) /= ')' loop POSITION := POSITION+1; -- look for ')' if POSITION > FROM'LAST then raise END_ERROR; end if; end loop; ITEM := COMPOSE_FROM_CARTESIAN(REAL_PART,IMAGINARY_PART); LAST := POSITION; end GET; procedure PUT (TO : out STRING; ITEM : in COMPLEX; AFT : in FIELD := DEFAULT_AFT; EXP : in FIELD := DEFAULT_EXP) is POS : POSITIVE := TO'FIRST; begin if POS+2*ROOM+3 > TO'LAST then raise END_ERROR; end if; TO(POS):='('; REAL_IO.PUT(TO(POS+1..POS+ROOM+1), RE(ITEM), AFT, EXP); -- ITEM.RE TO(POS+ROOM+2):=','; REAL_IO.PUT(TO(POS+ROOM+3..POS+2*ROOM+2), IM(ITEM), AFT, EXP); -- ITEM.IM TO(POS+2*ROOM+3):=')'; end PUT; end COMPLEX_IO;