printer-fix.red 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. % Some patches to I/O modules
  2. Fluid '(DigitStrBase);
  3. DigitStrBase:='"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  4. on syslisp;
  5. smacro procedure DigitStr();
  6. strinf LispVar DigitstrBase;
  7. syslsp procedure SysPowerOf2P Num;
  8. case Num of
  9. 1: 0;
  10. 2: 1;
  11. 4: 2;
  12. 8: 3;
  13. 16: 4;
  14. 32: 5;
  15. default: NIL
  16. end;
  17. syslsp procedure ChannelWriteSysInteger(Channel, Number, Radix);
  18. begin scalar Exponent,N1;
  19. return if (Exponent := SysPowerOf2P Radix) then
  20. ChannelWriteBitString(Channel, Number, Radix - 1, Exponent)
  21. else if Number < 0 then
  22. << ChannelWriteChar(Channel, char '!-);
  23. WriteNumber1(Channel,-(Number/Radix),Radix); % To catch largest NEG
  24. ChannelWriteChar(Channel, strbyt(DigitStr(), - MOD(Number, Radix))) >>
  25. else if Number = 0 then ChannelWriteChar(Channel, char !0)
  26. else WriteNumber1(Channel, Number, Radix);
  27. end;
  28. syslsp procedure WriteNumber1(Channel, Number, Radix);
  29. if Number = 0 then Channel
  30. else
  31. << WriteNumber1(Channel, Number / Radix, Radix);
  32. ChannelWriteChar(Channel,
  33. strbyt(Digitstr(), MOD(Number, Radix))) >>;
  34. syslsp procedure ChannelWriteBitString(Channel, Number, DigitMask, Exponent);
  35. if Number = 0 then ChannelWriteChar(Channel,char !0)
  36. else ChannelWriteBitStrAux(Channel, Number, DigitMask, Exponent);
  37. syslsp procedure ChannelWriteBitStrAux(Channel, Number, DigitMask, Exponent);
  38. if Number = 0 then Channel % Channel means nothing here
  39. else % just trying to fool the compiler
  40. << ChannelWriteBitStrAux(Channel,
  41. LSH(Number, -Exponent),
  42. DigitMask,
  43. Exponent);
  44. ChannelWriteChar(Channel,
  45. StrByt(DigitStr(),
  46. LAND(Number, DigitMask))) >>;