home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / lib / native / java.util / Date.c
C/C++ Source or Header  |  1996-09-28  |  3KB  |  141 lines

  1. /*
  2.  * java.util.Date.c
  3.  *
  4.  * Copyright (c) 1996 Systems Architecture Research Centre,
  5.  *           City University, London, UK.
  6.  *
  7.  * See the file "license.terms" for information on usage and redistribution
  8.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  9.  *
  10.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  11.  */
  12.  
  13. #include <time.h>
  14. #include <string.h>
  15. #include <native.h>
  16. #include "config.h"
  17. #include "java.util.stubs/Date.h"
  18.  
  19. #if defined(HAVE_STRFTIME)
  20. #define    SIMPLETIME(str, tm)    strftime(str, sizeof(str), "%a %h %d %T %Z %Y", tm)
  21. #define    LOCALETIME(str, tm)    strftime(str, sizeof(str), "%a %h %d %T %Y", tm)
  22. #define    GMTTIME(str, tm)    strftime(str, sizeof(str), "%d %h %Y %T GMT", tm)
  23. #else
  24. #define    SIMPLETIME(str, tm)    strcpy(str, asctime(tm)); str[strlen(str)-1] = 0
  25. #define    LOCALETIME(str, tm)    strcpy(str, asctime(tm)); str[strlen(str)-1] = 0
  26. #define    GMTTIME(str, tm)    strcpy(str, asctime(tm)); str[strlen(str)-1] = 0
  27. #endif
  28.  
  29. /*
  30.  * Convert a date to a string.
  31.  */
  32. struct Hjava_lang_String*
  33. java_util_Date_toString(struct Hjava_util_Date* this)
  34. {
  35. #ifndef __WIN32__
  36.     long date;
  37.     char str[64];
  38.  
  39.     if (unhand(this)->valueValid == 0) {
  40.         java_util_Date_computeValue(this);
  41.     }
  42.     date = unhand(this)->value / 1000;
  43.     SIMPLETIME(str, localtime(&date));
  44.     return(makeJavaString(str, strlen(str)));
  45. #endif
  46. }
  47.  
  48. /*
  49.  * Convert a date to a string in the local timezone.
  50.  */
  51. struct Hjava_lang_String*
  52. java_util_Date_toLocaleString(struct Hjava_util_Date* this)
  53. {
  54. #ifndef __WIN32__
  55.     long date;
  56.     char str[64];
  57.  
  58.     if (unhand(this)->valueValid == 0) {
  59.         java_util_Date_computeValue(this);
  60.     }
  61.     date = unhand(this)->value / 1000;
  62.     LOCALETIME(str, localtime(&date));
  63.     return(makeJavaString(str, strlen(str)));
  64. #endif
  65. }
  66.  
  67. /*
  68.  * Covert a date to a string in GMT timezone.
  69.  */
  70. struct Hjava_lang_String*
  71. java_util_Date_toGMTString(struct Hjava_util_Date* this)
  72. {
  73. #ifndef __WIN32__
  74.     long date;
  75.     char str[64];
  76.  
  77.     if (unhand(this)->valueValid == 0) {
  78.         java_util_Date_computeValue(this);
  79.     }
  80.     date = unhand(this)->value / 1000;
  81.     GMTTIME(str, gmtime(&date));
  82.     return(makeJavaString(str, strlen(str)));
  83. #endif
  84. }
  85.  
  86. /*
  87.  * Expand the single value into a split date.
  88.  */
  89. void
  90. java_util_Date_expand(struct Hjava_util_Date* this)
  91. {
  92. #ifndef __WIN32__
  93.     struct tm* time;
  94.     long date;
  95.  
  96.     date = unhand(this)->value / 1000;
  97.     time = localtime(&date);
  98.  
  99.     unhand(this)->tm_millis = 0;
  100.     unhand(this)->tm_sec = time->tm_sec;
  101.     unhand(this)->tm_min = time->tm_min;
  102.     unhand(this)->tm_hour = time->tm_hour;
  103.     unhand(this)->tm_mday = time->tm_mday;
  104.     unhand(this)->tm_mon = time->tm_mon;
  105.     unhand(this)->tm_year = time->tm_year;
  106.     unhand(this)->tm_wday = time->tm_wday;
  107.     unhand(this)->tm_yday = time->tm_yday;
  108.     unhand(this)->tm_isdst = time->tm_isdst;
  109.  
  110.     unhand(this)->expanded = 1;
  111. #endif
  112. }
  113.  
  114. /*
  115.  * Convert the split date into a single value.
  116.  */
  117. void
  118. java_util_Date_computeValue(struct Hjava_util_Date* this)
  119. {
  120. #ifndef __WIN32__
  121.     struct tm time;
  122.  
  123.     time.tm_sec = unhand(this)->tm_sec;
  124.     time.tm_min = unhand(this)->tm_min;
  125.     time.tm_hour = unhand(this)->tm_hour;
  126.     time.tm_mday = unhand(this)->tm_mday;
  127.     time.tm_mon = unhand(this)->tm_mon;
  128.     time.tm_year = unhand(this)->tm_year;
  129.     time.tm_wday = unhand(this)->tm_wday;
  130.     time.tm_yday = unhand(this)->tm_yday;
  131.     time.tm_isdst = unhand(this)->tm_isdst;
  132. #if defined(HAVE_TM_ZONE)
  133.     time.tm_gmtoff = 0;
  134.     time.tm_zone = 0;
  135. #endif
  136.  
  137.     unhand(this)->valueValid = 1;
  138.     unhand(this)->value = (jlong)1000 * (jlong)mktime(&time);
  139. #endif
  140. }
  141.