et_h.awk 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. BEGIN {
  2. char_shift=64
  3. ## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
  4. c2n["A"]=1
  5. c2n["B"]=2
  6. c2n["C"]=3
  7. c2n["D"]=4
  8. c2n["E"]=5
  9. c2n["F"]=6
  10. c2n["G"]=7
  11. c2n["H"]=8
  12. c2n["I"]=9
  13. c2n["J"]=10
  14. c2n["K"]=11
  15. c2n["L"]=12
  16. c2n["M"]=13
  17. c2n["N"]=14
  18. c2n["O"]=15
  19. c2n["P"]=16
  20. c2n["Q"]=17
  21. c2n["R"]=18
  22. c2n["S"]=19
  23. c2n["T"]=20
  24. c2n["U"]=21
  25. c2n["V"]=22
  26. c2n["W"]=23
  27. c2n["X"]=24
  28. c2n["Y"]=25
  29. c2n["Z"]=26
  30. c2n["a"]=27
  31. c2n["b"]=28
  32. c2n["c"]=29
  33. c2n["d"]=30
  34. c2n["e"]=31
  35. c2n["f"]=32
  36. c2n["g"]=33
  37. c2n["h"]=34
  38. c2n["i"]=35
  39. c2n["j"]=36
  40. c2n["k"]=37
  41. c2n["l"]=38
  42. c2n["m"]=39
  43. c2n["n"]=40
  44. c2n["o"]=41
  45. c2n["p"]=42
  46. c2n["q"]=43
  47. c2n["r"]=44
  48. c2n["s"]=45
  49. c2n["t"]=46
  50. c2n["u"]=47
  51. c2n["v"]=48
  52. c2n["w"]=49
  53. c2n["x"]=50
  54. c2n["y"]=51
  55. c2n["z"]=52
  56. c2n["0"]=53
  57. c2n["1"]=54
  58. c2n["2"]=55
  59. c2n["3"]=56
  60. c2n["4"]=57
  61. c2n["5"]=58
  62. c2n["6"]=59
  63. c2n["7"]=60
  64. c2n["8"]=61
  65. c2n["9"]=62
  66. c2n["_"]=63
  67. }
  68. /^#/ { next }
  69. /^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
  70. table_number = 0
  71. table_name = $2
  72. mod_base = 1000000
  73. for(i=1; i<=length(table_name); i++) {
  74. table_number=(table_number*char_shift)+c2n[substr(table_name,i,1)]
  75. }
  76. # We start playing *_high, *low games here because the some
  77. # awk programs do not have the necessary precision (sigh)
  78. tab_base_low = table_number % mod_base
  79. tab_base_high = int(table_number / mod_base)
  80. tab_base_sign = 1;
  81. # figure out: table_number_base=table_number*256
  82. tab_base_low = tab_base_low * 256
  83. tab_base_high = (tab_base_high * 256) + \
  84. int(tab_base_low / mod_base)
  85. tab_base_low = tab_base_low % mod_base
  86. if (table_number > 128*256*256) {
  87. # figure out: table_number_base -= 256*256*256*256
  88. # sub_high, sub_low is 256*256*256*256
  89. sub_low = 256*256*256 % mod_base
  90. sub_high = int(256*256*256 / mod_base)
  91. sub_low = sub_low * 256
  92. sub_high = (sub_high * 256) + int(sub_low / mod_base)
  93. sub_low = sub_low % mod_base
  94. tab_base_low = sub_low - tab_base_low;
  95. tab_base_high = sub_high - tab_base_high;
  96. tab_base_sign = -1;
  97. if (tab_base_low < 0) {
  98. tab_base_low = tab_base_low + mod_base
  99. tab_base_high--
  100. }
  101. }
  102. curr_low = tab_base_low
  103. curr_high = tab_base_high
  104. curr_sign = tab_base_sign
  105. print "/*" > outfile
  106. print " * " outfile ":" > outfile
  107. print " * This file is automatically generated; please do not edit it." > outfile
  108. print " */" > outfile
  109. print "" > outfile
  110. print "#include <com_err.h>" > outfile
  111. print "" > outfile
  112. table_item_count = 0
  113. }
  114. /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,/ {
  115. tag=substr($2,1,length($2)-1)
  116. if (curr_high == 0) {
  117. printf "#define %-40s (%dL)\n", tag, \
  118. curr_sign*curr_low > outfile
  119. } else {
  120. printf "#define %-40s (%d%06dL)\n", tag, curr_high*curr_sign, \
  121. curr_low > outfile
  122. }
  123. curr_low += curr_sign;
  124. if (curr_low >= mod_base) {
  125. curr_low -= mod_base;
  126. curr_high++
  127. }
  128. if (curr_low < 0) {
  129. cur_low += mod_base
  130. cur_high--
  131. }
  132. }
  133. END {
  134. if (table_item_count > 256) {
  135. print "Error table too large!" | "cat 1>&2"
  136. exit 1
  137. }
  138. if (tab_base_high == 0) {
  139. print "#define ERROR_TABLE_BASE_" table_name " (" \
  140. sprintf("%d", tab_base_sign*tab_base_low) \
  141. "L)" > outfile
  142. } else {
  143. print "#define ERROR_TABLE_BASE_" table_name " (" \
  144. sprintf("%d%06d", tab_base_sign*tab_base_high, \
  145. tab_base_low) "L)" > outfile
  146. }
  147. print "" > outfile
  148. print "extern const struct error_table et_" table_name "_error_table;" > outfile
  149. print "" > outfile
  150. print "#if !defined(_WIN32)" > outfile
  151. print "/* for compatibility with older versions... */" > outfile
  152. print "extern void initialize_" table_name "_error_table (void) /*@modifies internalState@*/;" > outfile
  153. print "#else" > outfile
  154. print "#define initialize_" table_name "_error_table()" > outfile
  155. print "#endif" > outfile
  156. print "" > outfile
  157. print "#if !defined(_WIN32)" > outfile
  158. print "#define init_" table_name "_err_tbl initialize_" table_name "_error_table" > outfile
  159. print "#define " table_name "_err_base ERROR_TABLE_BASE_" table_name > outfile
  160. print "#endif" > outfile
  161. }