{prints flt on display to a given length and format}
{could be converted to any text file varible like}
{lst:,myfile etc. with an additional pram}
PROCEDURE ftostr (u:flt; fieldsize:byte; mode:char);

var  num$:string 30;   {string to written out}
    sign_u     :integer;
    exp_u      :integer;
    counter    :integer;
    fieldleft  :integer;
    chtoleft   :integer;
    numzeros   :integer;
    uu         :array [1..digmax] of byte;

{builds pusedo string too copy from}
procedure fillarray;

var  n,m:byte;

begin
m:=1;
for n:=1 to dpmax
do   begin
    uu[m]:=(u.dp[n] div 10)+ord('0');
    uu[m+1]:=(u.dp[n] mod 10)+ord('0');
    m:=m+2
    end;
end; {fillarray}

{completes string after decimal point}
procedure fillfield;

begin
while (fieldleft>0) and (counter<=digmax)
do   begin
    append(num$,chr(uu[counter]));
    fieldleft:=fieldleft-1;
    counter:=counter+1
    end;
while fieldleft>0
do   begin
    append(num$,'0');
    fieldleft:=fieldleft-1
    end;
end; {fillfield}

{for engineering type buy it from eric brom}
procedure scitype;

var exp$   :string 10;
   radix,x  :integer;
   anyway :boolean;

begin
fillarray;
setlength(num$,0);
sign_u:=signdig(u);
exp_u:=expvalue(u);
if sign_u=1
then append(num$,'-');
append (num$,chr(uu[1]));
append (num$,'.');
setlength(exp$,0);
append(exp$,'E');
if exp_u <0
then begin
    append(exp$,'-');
    exp_u:=abs(exp_u);
    end;
radix:=10000;
anyway:=false;
for counter:=1 to 5
do   begin
    if (exp_u>=radix) or anyway
    then begin
         x:=exp_u div radix +ord('0');
         exp_u:=exp_u mod radix;
         radix:=radix div 10;
         append(exp$,chr(x));
         anyway:=true
         end
    else radix:=radix div 10
    end;
x:=fieldsize+1-length(num$)-length(exp$);
for counter :=2 to x
do   append(num$,chr(uu[counter]));
append (num$,exp$);
write(num$)
end; {scitype}


{this mode tells you as much as possible in the space allotted}
{it drops thru to scitype automatic}
procedure infotype;

begin
fillarray;
setlength(num$,0);
sign_u:=signdig(u);
exp_u:=expvalue(u);
fieldleft:=fieldsize;
if sign_u=1
then begin
    append(num$,'-');
    fieldleft:=fieldleft-1;
    end;
chtoleft:=exp_u+1;
if chtoleft>fieldleft
then scitype
else begin
    if chtoleft<1
    then begin
         append(num$,'0.');
         fieldleft:=fieldleft-2;
         numzeros:=0-chtoleft;
         if numzeros>(fieldleft-2)
         then scitype
         else begin
              fieldleft:=fieldleft-numzeros;
              while numzeros>0
              do   begin
                   append(num$,'0');
                   numzeros:=numzeros-1
                   end;
              counter:=1;
              fillfield;
              write(num$)
              end
         end
    else begin
         for counter:=1 to chtoleft
         do append(num$,chr(uu[counter]));
         counter:=chtoleft+1;
         fieldleft:=fieldleft-chtoleft;
         if fieldleft>0
         then begin
              append(num$,'.');
              fieldleft:=fieldleft-1;
              end;
         fillfield;
         write(num$)
         end
    end
end; {infotype}

{tries to hold decimal point in a given position but}
{will drop thru to infotype to avoid displaying  0.0000}
procedure fixtype;

var  fixval     :integer;
    numblank   :integer;
    holestoleft:integer;

begin
fillarray;
setlength(num$,0);
exp_u:=expvalue(u);
sign_u:=signdig(u);
fixval:=ord(mode)-ord('0');
chtoleft:=exp_u+1;
holestoleft:=fieldsize-fixval-sign_u-1;
fieldleft:=fieldsize;
if chtoleft>holestoleft
then infotype
else begin
    if chtoleft<1
    then begin
         numblank:=holestoleft-sign_u-1;
         while numblank>0
         do   begin
              append(num$,' ');
              numblank:=numblank-1
              end;
         if sign_u=1
         then append(num$,'-');
         append(num$,'0.');
         fieldleft:=fixval;
         if (fieldleft+chtoleft)<1
         then infotype
         else begin
              while (chtoleft<0) and (fieldleft>0)
              do   begin
                   append(num$,'0');
                   chtoleft:=chtoleft+1;
                   fieldleft:=fieldleft-1
                   end;
              counter:=1;
              fillfield;
              write(num$)
              end
         end
    else begin
         numblank:=holestoleft-sign_u-chtoleft;
         while numblank>0
         do   begin
              append(num$,' ');
              numblank:=numblank-1;
              end;
         if sign_u=1
         then append(num$,'-');
         counter:=1;
         while chtoleft>0
         do   begin
              append(num$,chr(uu[counter]));
              counter:=counter+1;
              chtoleft:=chtoleft-1
              end;
         append(num$,'.');
         fieldleft:=fixval;
         fillfield;
         write(num$)
         end
    end
end; {fixtype}

begin
case mode of
    '0','1','2','3','4','5','6','7','8','9'
         :fixtype; {allows console entry of mode}
    'i','I':infotype;
    else:scitype
  end; {case}
end; {ftostr}