time.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "all.h"
  2. Timet
  3. toytime(void)
  4. {
  5. return time(nil);
  6. }
  7. void
  8. datestr(char *s, Timet t)
  9. {
  10. Tm *tm;
  11. tm = localtime(t);
  12. sprint(s, "%.4d%.2d%.2d", tm->year+1900, tm->mon+1, tm->mday);
  13. }
  14. void
  15. prdate(void)
  16. {
  17. print("%T\n", time(nil));
  18. }
  19. static void
  20. ct_numb(char *cp, int n)
  21. {
  22. if(n >= 10)
  23. cp[0] = (n/10)%10 + '0';
  24. else
  25. cp[0] = ' ';
  26. cp[1] = n%10 + '0';
  27. }
  28. int
  29. Tfmt(Fmt* fmt)
  30. {
  31. char s[30];
  32. char *cp;
  33. Timet t;
  34. Tm *tm;
  35. t = va_arg(fmt->args, Timet);
  36. if(t == 0)
  37. return fmtstrcpy(fmt, "The Epoch");
  38. tm = localtime(t);
  39. strcpy(s, "Day Mon 00 00:00:00 1900");
  40. cp = &"SunMonTueWedThuFriSat"[tm->wday*3];
  41. s[0] = cp[0];
  42. s[1] = cp[1];
  43. s[2] = cp[2];
  44. cp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[tm->mon*3];
  45. s[4] = cp[0];
  46. s[5] = cp[1];
  47. s[6] = cp[2];
  48. ct_numb(s+8, tm->mday);
  49. ct_numb(s+11, tm->hour+100);
  50. ct_numb(s+14, tm->min+100);
  51. ct_numb(s+17, tm->sec+100);
  52. if(tm->year >= 100) {
  53. s[20] = '2';
  54. s[21] = '0';
  55. }
  56. ct_numb(s+22, tm->year+100);
  57. return fmtstrcpy(fmt, s);
  58. }
  59. /*
  60. * compute the next time after t
  61. * that has hour hr and is not on
  62. * day in bitpattern --
  63. * for automatic dumps
  64. */
  65. Timet
  66. nextime(Timet t, int hr, int day)
  67. {
  68. int nhr;
  69. Tm *tm;
  70. if(hr < 0 || hr >= 24)
  71. hr = 5;
  72. if((day&0x7f) == 0x7f)
  73. day = 0;
  74. for (;;) {
  75. tm = localtime(t);
  76. t -= tm->sec;
  77. t -= tm->min*60;
  78. nhr = tm->hour;
  79. do {
  80. t += 60*60;
  81. nhr++;
  82. } while(nhr%24 != hr);
  83. tm = localtime(t);
  84. if(tm->hour != hr) {
  85. t += 60*60;
  86. tm = localtime(t);
  87. if(tm->hour != hr) {
  88. t -= 60*60;
  89. tm = localtime(t);
  90. }
  91. }
  92. if(day & (1<<tm->wday))
  93. t += 12*60*60;
  94. else
  95. return t;
  96. }
  97. }
  98. /*
  99. * delay for l milliseconds more or less.
  100. */
  101. void
  102. delay(int l)
  103. {
  104. sleep(l);
  105. }