dec.ocm 1023 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. -- decin/decout - Decimal i/o
  2. proc decin(chan in, var d, c)=
  3. -- Reads a decimal number from input into d. c is used as the first input
  4. -- character, and it contains the character just after the decimal number
  5. -- when decin exits.
  6. var neg:
  7. seq
  8. while (c='*s') or (c='*t') or (c='*n')
  9. in ? c
  10. if
  11. (c='-') or (c='+')
  12. seq
  13. neg:=(c='-')
  14. in ? c
  15. true
  16. neg:=false
  17. d:=0
  18. while ('0'<=c) and (c<='9')
  19. seq
  20. d:=(d*10)+(c-'0')
  21. in ? c
  22. if
  23. neg
  24. d:= -d
  25. :
  26. proc decout(chan out, value d, w)=
  27. -- Sends d to channel out in decimal on a field of w spaces. It is just like
  28. -- fprintf(out, "%*d", w, d);
  29. var dec[BYTE 12], di, dd, d0, neg:
  30. seq
  31. di:=0
  32. if
  33. d<0
  34. seq
  35. neg:=true
  36. dd:= -d
  37. d>=0
  38. seq
  39. neg:=false
  40. dd:=d
  41. d0:=1
  42. while d0<>0
  43. seq
  44. dec[BYTE di]:=(dd\10)+'0'
  45. di:=di+1
  46. dd:=dd/10
  47. d0:=dd
  48. if
  49. neg
  50. seq
  51. dec[BYTE di]:='-'
  52. di:=di+1
  53. seq i=[0 for w-di]
  54. out ! '*s'
  55. while di<>0
  56. seq
  57. di:=di-1
  58. out ! dec[BYTE di]
  59. :