EnetUtils.Mod 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. MODULE EnetUtils;
  2. IMPORT
  3. S := SYSTEM;
  4. TYPE
  5. Int8 = SHORTINT;
  6. Int16 = INTEGER;
  7. Int32 = LONGINT;
  8. UnalignedInt32* = ARRAY 4 OF Int8;
  9. (*
  10. Get a string representation of an integer (in decimal format)
  11. *)
  12. PROCEDURE IntToStr*(x: HUGEINT; VAR str: ARRAY OF CHAR);
  13. VAR
  14. i, j: Int32;
  15. ch: CHAR;
  16. negative: BOOLEAN;
  17. BEGIN
  18. IF x < 0 THEN
  19. IF x = MIN(HUGEINT) THEN
  20. str := "-9223372036854775808";
  21. RETURN;
  22. ELSE
  23. x := -x;
  24. negative := TRUE;
  25. END;
  26. ELSE negative := FALSE;
  27. END;
  28. i := 0;
  29. REPEAT
  30. str[i] := CHR((x MOD 10)+48);
  31. x := x DIV 10;
  32. INC(i);
  33. UNTIL x = 0;
  34. (* reverse the output string *)
  35. IF ~negative THEN DEC(i); ELSE str[i] := "-"; END;
  36. FOR j := 0 TO (i DIV 2) BY 1 DO
  37. ch := str[j];
  38. str[j] := str[i-j];
  39. str[i-j] := ch;
  40. END;
  41. str[i+1] := 0X;
  42. END IntToStr;
  43. PROCEDURE StrAppend*(VAR dst: ARRAY OF CHAR; CONST src: ARRAY OF CHAR);
  44. VAR
  45. i, j: Int32;
  46. BEGIN
  47. i := 0; j := 0;
  48. WHILE (i < LEN(dst)) & (dst[i] # 0X) DO INC(i); END;
  49. WHILE (j < LEN(src)) & (src[j] # 0X) DO
  50. dst[i + j] := src[j];
  51. INC(j);
  52. END;
  53. dst[i + j] := src[j];
  54. END StrAppend;
  55. (** Switch endianness of a 16-bit integer *)
  56. PROCEDURE SwitchEndianness16*(x: Int16): Int16;
  57. TYPE Array2OfInt8 = ARRAY 2 OF Int8;
  58. VAR xx, yy: Array2OfInt8;
  59. BEGIN
  60. xx := S.VAL(Array2OfInt8,x);
  61. yy[0] := xx[1]; yy[1] := xx[0];
  62. RETURN S.VAL(Int16,yy);
  63. END SwitchEndianness16;
  64. (** Switch endianness of a 32-bit integer *)
  65. PROCEDURE SwitchEndianness32*(x: Int32): Int32;
  66. TYPE Array4OfInt8 = ARRAY 4 OF Int8;
  67. VAR xx, yy: Array4OfInt8;
  68. BEGIN
  69. xx := S.VAL(Array4OfInt8,x);
  70. yy[0] := xx[3]; yy[1] := xx[2]; yy[2] := xx[1]; yy[3] := xx[0];
  71. RETURN S.VAL(Int32,yy);
  72. END SwitchEndianness32;
  73. OPERATOR ":="*(VAR y: Int32; x: UnalignedInt32);
  74. BEGIN
  75. S.MOVE(ADDRESSOF(x),ADDRESSOF(y),SIZEOF(Int32));
  76. END ":=";
  77. OPERATOR ":="*(VAR y: UnalignedInt32; x: Int32);
  78. BEGIN
  79. S.MOVE(ADDRESSOF(x),ADDRESSOF(y),SIZEOF(Int32));
  80. END ":=";
  81. OPERATOR "="*(x: Int32; y: UnalignedInt32): BOOLEAN;
  82. VAR y1: Int32;
  83. BEGIN
  84. S.MOVE(ADDRESSOF(y),ADDRESSOF(y1),SIZEOF(Int32));
  85. RETURN x = y1;
  86. END "=";
  87. OPERATOR "="*(x: UnalignedInt32; y: Int32): BOOLEAN;
  88. VAR x1: Int32;
  89. BEGIN
  90. S.MOVE(ADDRESSOF(x),ADDRESSOF(x1),SIZEOF(Int32));
  91. RETURN x1 = y;
  92. END "=";
  93. END EnetUtils.