timestamp.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:2k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * timestamp.c - Convert a textual timestamps to seconds since epoch
  3.  *
  4.  * Read textual timestamps, one per line, from the standard input, and 
  5.  * convert them to integers giving the corresponding number of seconds
  6.  * since the beginning of the epoch (beginning of 1970). Both the input
  7.  * and the results should be in UTC.
  8.  *
  9.  * Lars Wirzenius
  10.  */
  11. #include <stdio.h>
  12. #include "gwlib/gwlib.h"
  13. static Octstr *read_line(FILE *f, Octstr *buf)
  14. {
  15.     Octstr *os;
  16.     char cbuf[8*1024];
  17.     size_t n;
  18.     long pos;
  19.     
  20.     pos = octstr_search_char(buf, 'n', 0);
  21.     while (pos == -1 && (n = fread(cbuf, 1, sizeof(cbuf), f)) > 0) {
  22. octstr_append_data(buf, cbuf, n);
  23. pos = octstr_search_char(buf, 'n', 0);
  24.     }
  25.     if (pos == -1) {
  26.      pos = octstr_len(buf);
  27. if (pos == 0)
  28.     return NULL;
  29.     }
  30.     os = octstr_copy(buf, 0, pos);
  31.     octstr_delete(buf, 0, pos + 1);
  32.     return os;
  33. }
  34. static int remove_long(long *p, Octstr *os)
  35. {
  36.     long pos;
  37.     
  38.     pos = octstr_parse_long(p, os, 0, 10);
  39.     if (pos == -1)
  40.      return -1;
  41.     octstr_delete(os, 0, pos);
  42.     return 0;
  43. }
  44. static int remove_prefix(Octstr *os, Octstr *prefix)
  45. {
  46.     if (octstr_ncompare(os, prefix, octstr_len(prefix)) != 0)
  47.      return -1;
  48.     octstr_delete(os, 0, octstr_len(prefix));
  49.     return 0;
  50. }
  51. static int parse_date(struct universaltime *ut, Octstr *os)
  52. {
  53.     long pos;
  54.     pos = 0;
  55.     
  56.     if (remove_long(&ut->year, os) == -1 ||
  57.         remove_prefix(os, octstr_imm("-")) == -1 ||
  58. remove_long(&ut->month, os) == -1 ||
  59.         remove_prefix(os, octstr_imm("-")) == -1 ||
  60. remove_long(&ut->day, os) == -1 ||
  61.         remove_prefix(os, octstr_imm(" ")) == -1 ||
  62. remove_long(&ut->hour, os) == -1 ||
  63.         remove_prefix(os, octstr_imm(":")) == -1 ||
  64. remove_long(&ut->minute, os) == -1 ||
  65.         remove_prefix(os, octstr_imm(":")) == -1 ||
  66. remove_long(&ut->second, os) == -1 ||
  67.         remove_prefix(os, octstr_imm(" ")) == -1)
  68.      return -1;
  69.     return 0;
  70. }
  71. int main(void)
  72. {
  73.     struct universaltime ut;
  74.     Octstr *os;
  75.     Octstr *buf;
  76.     
  77.     gwlib_init();
  78.     buf = octstr_create("");
  79.     while ((os = read_line(stdin, buf)) != NULL) {
  80. if (parse_date(&ut, os) == -1)
  81.     panic(0, "Bad line: %s", octstr_get_cstr(os));
  82. printf("%ld %sn", date_convert_universal(&ut), octstr_get_cstr(os));
  83. octstr_destroy(os);
  84.     }
  85.     log_set_output_level(GW_PANIC);
  86.     gwlib_shutdown();
  87.     return 0;
  88. }