fork(4) download
  1. #include <stdio.h>
  2. #include <time.h> // use for test. not available on IDE
  3.  
  4. time_t getElapsedSecond(int yyyy, int mm, int dd, int hh, int nn, int ss){
  5. struct tm workdt;
  6. workdt.tm_isdst = -1; // summer time flag
  7. workdt.tm_year = yyyy - 1900;
  8. workdt.tm_mon = mm - 1;
  9. workdt.tm_mday = dd;
  10. workdt.tm_hour = hh;
  11. workdt.tm_min = nn;
  12. workdt.tm_sec = ss;
  13. return mktime(&workdt);
  14. }
  15.  
  16. void getDateTimeString(time_t srcdt, char *dstPtr)
  17. {
  18. if (dstPtr == NULL) {
  19. return; // error
  20. }
  21. struct tm *workdt;
  22. workdt = localtime(&srcdt);
  23. workdt->tm_year = workdt->tm_year + 1900;
  24. sprintf(dstPtr, "%04d/%02d/%02d %02d:%02d:%02d",
  25. workdt->tm_year, workdt->tm_mon + 1, workdt->tm_mday,
  26. workdt->tm_hour, workdt->tm_min, workdt->tm_sec
  27. );
  28. }
  29.  
  30. typedef struct {
  31. unsigned int OI; // [s]
  32. unsigned int MI; // [s]
  33. unsigned int W; // [s]
  34. unsigned int R; // [s]
  35. unsigned int N; // [s]
  36. } SETTING_t;
  37.  
  38. time_t getNextWtime(time_t torigin, time_t tnow, SETTING_t *setPtr)
  39. {
  40. if (setPtr == NULL) {
  41. return 0; // error // TOOD: 0z > use error value for time_t
  42. }
  43. // case 1: (now - origin) % OI == 0
  44. unsigned long A = (tnow - torigin) / setPtr->OI;
  45. if ((tnow - torigin) % setPtr->OI == 0) {
  46. return torigin + (A + 1) * setPtr->OI;
  47. }
  48.  
  49. // case 2: (now - origin) % OI != 0
  50.  
  51. // case 2-a: (now - A*OI) % MI == 0
  52.  
  53. // case 2-b: (now - A*OI) % MI != 0
  54.  
  55. return 0; // TODO: 0z > remove after debug
  56. }
  57.  
  58. void AssertCheck(time_t torigin, time_t tnow, time_t tnextWans, SETTING_t *setPtr)
  59. {
  60. char szbuf[30];
  61. if (setPtr == NULL) {
  62. return; // error
  63. }
  64. time_t tnextWres = getNextWtime(torigin, tnow, setPtr);
  65.  
  66. getDateTimeString(tnow, szbuf);
  67. printf("%s - ", szbuf);
  68. getDateTimeString(tnextWres, szbuf);
  69. printf("%s:", szbuf);
  70. printf("%c", (tnextWres == tnextWans) ? 'T' : 'F');
  71. printf("\r\n");
  72. }
  73.  
  74. void Test_group_run()
  75. {
  76. time_t torigin = getElapsedSecond(2017, 8, 2, 13, 48, 55);
  77. SETTING_t setting = { 3600, 600, 60, 5, 3 }; // OI, MI, W, R, N
  78.  
  79. // case (2)
  80. AssertCheck(torigin,
  81. getElapsedSecond(2017, 8, 2, 13, 48, 55),
  82. getElapsedSecond(2017, 8, 2, 14, 48, 55),
  83. &setting);
  84.  
  85. }
  86.  
  87. int main(void) {
  88. Test_group_run();
  89.  
  90. return 0;
  91. }
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
2017/08/02 13:48:55 - 2017/08/02 14:48:55:T