home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume15 / emitc < prev    next >
Text File  |  1988-06-02  |  5KB  |  146 lines

  1. Subject:  v15i032:  Routine to process ctime(3) output
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: Mike Marshall <hubcap@hubcap.clemson.edu>
  7. Posting-number: Volume 15, Issue 32
  8. Archive-name: emitc
  9.  
  10. [  This is one of those "oh yeah, how could this not be there" routines.
  11.    The name is clever, and works on two levels.  --r$ ]
  12.  
  13. There may be other programs in the archives that do this, but when I was
  14. looking around all I could find was the enormously complicated "getdate"
  15. that is included with the news source, and the proprietary "unctime" which
  16. comes with the BSD source. This program (emitc) is a simple minded hack
  17. comparatively, but it works, is small, and is no slower than "unctime".
  18.  
  19. I would guess it is more or less portable.  Don't forget to change the
  20. value of TIMEZONE if necessary (see the comments in the code).
  21.  
  22. -Mike Marshall     hubcap@hubcap.clemson.edu  ...!hubcap!hubcap
  23.  
  24.  
  25. #! /bin/sh
  26. #
  27. # This is a shell archive.  Save this into a file, edit it
  28. # and delete all lines above this comment.  Then give this
  29. # file to sh by executing the command "sh file".  The files
  30. # will be extracted into the current directory owned by
  31. # you with default permissions.
  32. #
  33. # The files contained herein are:
  34. #
  35. echo 'x - emitc.man'
  36. if test -f emitc.man; then echo 'shar: not overwriting emitc.man'; else
  37. sed 's/^X//' << '________This_Is_The_END________' > emitc.man
  38. X.TH emitc 3
  39. X.SH NAME
  40. Xemitc \- convert ctime formatted ascii date string to long integer
  41. X.SH SYNTAX
  42. X.PP
  43. X.nf
  44. X
  45. Xlong emitc(string)
  46. Xchar *string;
  47. X.SH DESCRIPTION
  48. X.PP
  49. XThe
  50. X.PN emitc
  51. Xcall converts a 25 character string (in the following form: Fri Apr 22 09:45:15 
  52. X1988\\n),
  53. Xpointed to by
  54. X.PN string,
  55. Xinto a long integer representing the time in seconds since
  56. X00:00:00 GMT, January 1, 1970,
  57. Xand returns that value.
  58. X.SH AUTHOR
  59. X.PP
  60. XMike Marshall   hubcap@hubcap.clemson.edu   04/20/88
  61. ________This_Is_The_END________
  62. if test `wc -l < emitc.man` -ne 23; then
  63.     echo 'shar: emitc.man was damaged during transit (should have been 23 bytes)'
  64. fi
  65. fi        ; : end of overwriting check
  66. echo 'x - emitc.c'
  67. if test -f emitc.c; then echo 'shar: not overwriting emitc.c'; else
  68. sed 's/^X//' << '________This_Is_The_END________' > emitc.c
  69. X/* emitc - as the name implies, emitc is the opposite of ctime(3).
  70. X .  ctime(3) eats a long integer which represents the number of seconds
  71. X .  since Jan 01 00:00:00 1970 and spits out the corresponding day, date
  72. X .  and time in ascii. emitc ingests an ascii string (formatted as per
  73. X .  ctime's output) and gives back the appropriate number of seconds.
  74. X .     
  75. X .  Anyone is free to use emitc anyway they please, but if you do deem
  76. X .  it worthwhile, leave the following credit line somewhere in the code:
  77. X .
  78. X .  AUTHOR - Mike Marshall    hubcap@hubcap.clemson.edu      4/20/88
  79. X . 
  80. X .  SYSTEM CALLS USED - none
  81. X .
  82. X .  LIBRARY FUNCTIONS USED - localtime(3)
  83. X */
  84. X#include <time.h>
  85. X#define MONTH_OFFSET 4
  86. X#define DAY_OFFSET 8
  87. X#define HOUR_OFFSET 11
  88. X#define MINUTE_OFFSET 14
  89. X#define SECOND_OFFSET 17
  90. X#define YEAR_OFFSET 20
  91. X#define MONTH_LENGTH 3
  92. X#define MONTHS "JanFebMarAprMayJunJulAugSepOctNovDec"
  93. X#define SECONDS_PER_YEAR 31536000
  94. X#define SECONDS_PER_DAY 86400
  95. X#define SECONDS_PER_HOUR 3600
  96. X#define SECONDS_PER_MINUTE 60
  97. X#define FEB 1
  98. X#define TIMEZONE 5     /* You gotta change this, depending on where you
  99. X                        . are located geographically. I equated TIMEZONE
  100. X                        . to 5 since I am in the Eastern Standard Time Zone,
  101. X                        . which is five hours west of Greenwich.
  102. X                        */
  103. X
  104. Xlong emitc(string)
  105. Xchar *string;
  106. X{
  107. X  struct tm *time;
  108. X  long fudge_days;
  109. X  long month_num;
  110. X  long clock;
  111. X  static char *months = MONTHS;
  112. X  static long days_so_far[11] = {31,59,90,120,151,181,212,243,273,304,334};
  113. X  /* determine month number */
  114. X  for (month_num=0;
  115. X       strncmp(string+MONTH_OFFSET,months+month_num*MONTH_LENGTH,MONTH_LENGTH);
  116. X       month_num++);
  117. X  /* determine the number of seconds since the beginning of the universe */
  118. X  clock = (atoi(string+YEAR_OFFSET)-1970) * SECONDS_PER_YEAR;
  119. X  if (month_num > 0) 
  120. X     clock = clock + days_so_far[month_num-1] * SECONDS_PER_DAY;
  121. X  clock = clock + (atoi(string+DAY_OFFSET)-1) * SECONDS_PER_DAY;
  122. X  clock = clock + atoi(string+HOUR_OFFSET) * SECONDS_PER_HOUR;
  123. X  clock = clock + atoi(string+MINUTE_OFFSET) * SECONDS_PER_MINUTE;
  124. X  clock = clock + atoi(string+SECOND_OFFSET);
  125. X  /* calculate in the leap year fudge factors */
  126. X  if (atoi(string+YEAR_OFFSET) > 1971) {
  127. X     fudge_days=0;
  128. X     fudge_days = (atoi(string+YEAR_OFFSET)-1971)/4;
  129. X     if (!(atoi(string+YEAR_OFFSET)%4) && (month_num > FEB)) fudge_days++;
  130. X     clock = clock + fudge_days*SECONDS_PER_DAY;
  131. X  }
  132. X  /* calculate in the time shift westward from Greenwich */
  133. X  clock = clock + TIMEZONE*SECONDS_PER_HOUR;
  134. X  /* worry about daylight savings time */
  135. X  time = localtime(&clock);
  136. X  if (time->tm_isdst) clock = clock - SECONDS_PER_HOUR;
  137. X  return(clock);
  138. X} 
  139. ________This_Is_The_END________
  140. if test `wc -l < emitc.c` -ne 70; then
  141.     echo 'shar: emitc.c was damaged during transit (should have been 70 bytes)'
  142. fi
  143. fi        ; : end of overwriting check
  144. exit 0
  145.  
  146.