register.awk 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # BSD 3-Clause 2023 by Kevin Bloom.
  2. BEGIN {
  3. if(type == "weekly") {
  4. split("31 28 31 30 31 30 31 31 30 31 30 31", days, " ")
  5. month = 1
  6. day = 1
  7. for(week = 1; week < 53; week++) {
  8. if (days[month] < day) {
  9. day -= days[month]
  10. month++
  11. }
  12. weekly[week] = (month < 10 ? "0" month : month) "-" (day < 10 ? "0" day : day)
  13. day += 6
  14. if (days[month] < day) {
  15. day -= days[month]
  16. month++
  17. }
  18. weekly[week] = weekly[week] " -> " (month < 10 ? "0" month : month) "-" (day < 10 ? "0" day : day)
  19. day++
  20. }
  21. if(day <= days[month]) {
  22. weekly[53] = (month < 10 ? "0" month : month) "-" (day < 10 ? "0" day : day)
  23. day = days[month]
  24. weekly[53] = weekly[53] " -> " (month < 10 ? "0" month : month) "-" (day < 10 ? "0" day : day)
  25. }
  26. }
  27. skip = FALSE
  28. }
  29. /;;/ {
  30. next
  31. }
  32. # check if it might be a date and is definitely not an entry
  33. $1 ~ "-" || $1 ~ "/", $1 == "\n" {
  34. cor = $1
  35. if(cor ~ "/") {
  36. gsub("/", "-", cor);
  37. phase = "DATE"
  38. isDate = 0
  39. skip = 0
  40. }
  41. if(cor ~ /[0-9]{4}-[0-9]{2}-[0-9]{2}/) {
  42. isDate = 1;
  43. phase = "DATE"
  44. total = 0
  45. skip = 0
  46. }
  47. if(skip)
  48. next
  49. split(cor, arr, "-")
  50. if(phase == "DATE") {
  51. if(isDate) {
  52. if(start_date != "" && $1 < start_date) {
  53. skip = 1
  54. next
  55. } else if(end_date != "" && $1 > end_date) {
  56. skip = 1
  57. next
  58. } else {
  59. if(type == "monthly") {
  60. month = arr[1] "-" arr[2]
  61. if(length(map[month]) == 0)
  62. map[month] = month
  63. entry = month
  64. } else if(type == "weekly") {
  65. for(i in weekly) {
  66. split(weekly[i], dates, " -> ")
  67. start = dates[1]
  68. split(start, s, "-")
  69. end = dates[2]
  70. split(end, e, "-")
  71. if(arr[2] >= s[1] &&
  72. arr[2] <= e[1] &&
  73. arr[3] >= s[2] &&
  74. arr[3] <= e[2]) {
  75. if(length(map[weekly[i]]) == 0)
  76. map[weekly[i]] = weekly[i]
  77. entry = weekly[i]
  78. break;
  79. }
  80. }
  81. } else {
  82. map[$0] = cor " " substr($0, 12)
  83. entry = $0
  84. }
  85. phase = "ENTRIES"
  86. }
  87. } else {
  88. print "Error with date on line " NR ": " $0
  89. error = 1
  90. }
  91. } else if(!skip && phase == "ENTRIES") {
  92. isDate = 0;
  93. map[entry] = map[entry] "<<>>" $0
  94. }
  95. }
  96. END {
  97. if(error)
  98. exit 1
  99. for(i in map) {
  100. print map[i]
  101. }
  102. }