2
0

EnetTrace.Mod 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. MODULE EnetTrace;
  2. (**
  3. AUTHOR: Alexey Morozov, HighDim GmbH, 2015
  4. PURPOSE: Ethernet networking stack, trace utilities
  5. *)
  6. IMPORT Timing := EnetTiming, Utils := EnetUtils;
  7. CONST
  8. (** New line types *)
  9. LnCRLF* = 0;
  10. LnCR* = 1;
  11. LnLF* = 2;
  12. LnType* = LnCRLF;
  13. TYPE
  14. Int = LONGINT;
  15. StringType* = ARRAY OF CHAR;
  16. LongString* = ARRAY 2048 OF CHAR;
  17. (* concatenate two strings "str1" and "str2" into string "str" (no inplace possible!) *)
  18. PROCEDURE Concat(CONST str1, str2: ARRAY OF CHAR; VAR str: ARRAY OF CHAR);
  19. VAR i, j: Int;
  20. BEGIN
  21. i := 0; WHILE str1[i] # 0X DO str[i] := str1[i]; INC(i); END;
  22. j := 0; WHILE str2[j] # 0X DO str[i] := str2[j]; INC(i); INC(j); END;
  23. str[i] := 0X;
  24. END Concat;
  25. (* append string "str1" to string "str" (no inplace possible!) *)
  26. PROCEDURE Append(VAR str: ARRAY OF CHAR; CONST str1: ARRAY OF CHAR);
  27. VAR i, j: Int;
  28. BEGIN
  29. i := 0; WHILE str[i] # 0X DO INC(i); END;
  30. j := 0; WHILE str1[j] # 0X DO str[i] := str1[j]; INC(i); INC(j); END;
  31. str[i] := 0X;
  32. END Append;
  33. (* prepend string "str1" to string "str" (no inplace possible!) *)
  34. PROCEDURE Prepend(CONST str1: ARRAY OF CHAR; VAR str: ARRAY OF CHAR);
  35. VAR i, j: Int;
  36. BEGIN
  37. i := 0; WHILE str1[i] # 0X DO INC(i); END;
  38. j := 0; WHILE str[j] # 0X DO INC(j); END;
  39. WHILE j > 0 DO DEC(j); str[i+j] := str[j]; END;
  40. WHILE j < i DO str[j] := str1[j]; INC(j); END;
  41. END Prepend;
  42. (**
  43. Get a hexadecimal representation of a decimal integer
  44. numDigits: number of used hexadecimal digits
  45. *)
  46. PROCEDURE Hx*(x: HUGEINT; numDigits: Int): LongString;
  47. VAR
  48. str: LongString;
  49. ch: CHAR;
  50. BEGIN
  51. DEC(numDigits);
  52. str[numDigits+1] := 0X;
  53. WHILE numDigits >= 0 DO
  54. ch := CHR(x MOD 10H + ORD("0"));
  55. IF ch > "9" THEN ch := CHR((x MOD 10H - 10) + ORD("A")) END;
  56. str[numDigits] := ch;
  57. x := x DIV 10H;
  58. DEC(numDigits);
  59. END;
  60. RETURN str;
  61. END Hx;
  62. OPERATOR "&"*(CONST x, y: StringType): LongString;
  63. VAR str: LongString;
  64. BEGIN
  65. Concat(x,y,str);
  66. RETURN str;
  67. END "&";
  68. OPERATOR "&"*(CONST x: StringType; y: HUGEINT): LongString;
  69. VAR str: LongString;
  70. BEGIN
  71. Utils.IntToStr(y, str);
  72. Prepend(x,str);
  73. RETURN str;
  74. END "&";
  75. OPERATOR "&"*(x: HUGEINT; CONST y: StringType): LongString;
  76. VAR str: LongString;
  77. BEGIN
  78. Utils.IntToStr(x,str);
  79. Append(str,y);
  80. RETURN str;
  81. END "&";
  82. OPERATOR "&"*(CONST x: StringType; y: BOOLEAN): LongString;
  83. VAR str: LongString;
  84. BEGIN
  85. IF y THEN str := "TRUE"; ELSE str := "FALSE"; END;
  86. Prepend(x,str);
  87. RETURN str;
  88. END "&";
  89. OPERATOR "&"*(x: BOOLEAN; CONST y: StringType): LongString;
  90. VAR str: LongString;
  91. BEGIN
  92. IF x THEN str := "TRUE"; ELSE str := "FALSE"; END;
  93. Append(str,y);
  94. RETURN str;
  95. END "&";
  96. PROCEDURE String*(CONST str: ARRAY OF CHAR);
  97. BEGIN
  98. string(str);
  99. END String;
  100. PROCEDURE StringLn*(CONST str: ARRAY OF CHAR);
  101. BEGIN
  102. string(str); string(ln);
  103. END StringLn;
  104. PROCEDURE Enter*;
  105. BEGIN
  106. IF acquire # NIL THEN acquire; END;
  107. END Enter;
  108. PROCEDURE Exit*;
  109. BEGIN
  110. IF release # NIL THEN release; END;
  111. END Exit;
  112. VAR
  113. string*: PROCEDURE{DELEGATE}(CONST str: ARRAY OF CHAR);
  114. acquire*, release*: PROCEDURE{DELEGATE}();
  115. ln: ARRAY 3 OF CHAR;
  116. refTimestamps: ARRAY 32 OF Timing.Time;
  117. PROCEDURE RefTimestamp*(id: Int);
  118. BEGIN
  119. refTimestamps[id] := Timing.getTimeCounter();
  120. END RefTimestamp;
  121. PROCEDURE Timestamp*(id: Int; CONST msg: ARRAY OF CHAR);
  122. VAR t: Timing.Time;
  123. BEGIN
  124. t := Timing.getTimeCounter() - refTimestamps[id];
  125. StringLn(msg & t);
  126. END Timestamp;
  127. BEGIN
  128. CASE LnType OF
  129. |LnCRLF: ln[0] := 0DX; ln[1] := 0AX; ln[2] := 0X;
  130. |LnCR: ln[0] := 0DX; ln[1] := 0X;
  131. |LnLF: ln[0] := 0AX; ln[1] := 0X;
  132. END;
  133. END EnetTrace.