Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* Portions are Copyright (C) 2011 Google Inc */ | 1 /* Portions are Copyright (C) 2011 Google Inc */ |
| 2 /* ***** BEGIN LICENSE BLOCK ***** | 2 /* ***** BEGIN LICENSE BLOCK ***** |
| 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| 4 * | 4 * |
| 5 * The contents of this file are subject to the Mozilla Public License Version | 5 * The contents of this file are subject to the Mozilla Public License Version |
| 6 * 1.1 (the "License"); you may not use this file except in compliance with | 6 * 1.1 (the "License"); you may not use this file except in compliance with |
| 7 * the License. You may obtain a copy of the License at | 7 * the License. You may obtain a copy of the License at |
| 8 * http://www.mozilla.org/MPL/ | 8 * http://www.mozilla.org/MPL/ |
| 9 * | 9 * |
| 10 * Software distributed under the License is distributed on an "AS IS" basis, | 10 * Software distributed under the License is distributed on an "AS IS" basis, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 54 * PR_GMTParameters | 54 * PR_GMTParameters |
| 55 * PR_ImplodeTime | 55 * PR_ImplodeTime |
| 56 * This was modified to use the Win32 SYSTEMTIME/FILETIME structures | 56 * This was modified to use the Win32 SYSTEMTIME/FILETIME structures |
| 57 * and the timezone offsets are applied to the FILETIME structure. | 57 * and the timezone offsets are applied to the FILETIME structure. |
| 58 * All types and macros are defined in the base/third_party/prtime.h file. | 58 * All types and macros are defined in the base/third_party/prtime.h file. |
| 59 * These have been copied from the following nspr files. We have only copied | 59 * These have been copied from the following nspr files. We have only copied |
| 60 * over the types we need. | 60 * over the types we need. |
| 61 * 1. prtime.h | 61 * 1. prtime.h |
| 62 * 2. prtypes.h | 62 * 2. prtypes.h |
| 63 * 3. prlong.h | 63 * 3. prlong.h |
| 64 * | |
| 65 * Unit tests are in base/time/pr_time_unittest.cc. | |
| 64 */ | 66 */ |
| 65 | 67 |
| 66 #include "base/logging.h" | 68 #include "base/logging.h" |
| 67 #include "base/third_party/nspr/prtime.h" | 69 #include "base/third_party/nspr/prtime.h" |
| 68 #include "build/build_config.h" | 70 #include "build/build_config.h" |
| 69 | 71 |
| 70 #if defined(OS_WIN) | 72 #if defined(OS_WIN) |
| 71 #include <windows.h> | 73 #include <windows.h> |
| 72 #elif defined(OS_MACOSX) | 74 #elif defined(OS_MACOSX) |
| 73 #include <CoreFoundation/CoreFoundation.h> | 75 #include <CoreFoundation/CoreFoundation.h> |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 498 * Mon Jan 16 16:12 +0130 1989 | 500 * Mon Jan 16 16:12 +0130 1989 |
| 499 * 6 May 1992 16:41-JST (Wednesday) | 501 * 6 May 1992 16:41-JST (Wednesday) |
| 500 * 22-AUG-1993 10:59:12.82 | 502 * 22-AUG-1993 10:59:12.82 |
| 501 * 22-AUG-1993 10:59pm | 503 * 22-AUG-1993 10:59pm |
| 502 * 22-AUG-1993 12:59am | 504 * 22-AUG-1993 12:59am |
| 503 * 22-AUG-1993 12:59 PM | 505 * 22-AUG-1993 12:59 PM |
| 504 * Friday, August 04, 1995 3:54 PM | 506 * Friday, August 04, 1995 3:54 PM |
| 505 * 06/21/95 04:24:34 PM | 507 * 06/21/95 04:24:34 PM |
| 506 * 20/06/95 21:07 | 508 * 20/06/95 21:07 |
| 507 * 95-06-08 19:32:48 EDT | 509 * 95-06-08 19:32:48 EDT |
| 510 * 1995-06-17T23:11:25.342156Z | |
| 508 * | 511 * |
| 509 * If the input string doesn't contain a description of the timezone, | 512 * If the input string doesn't contain a description of the timezone, |
| 510 * we consult the `default_to_gmt' to decide whether the string should | 513 * we consult the `default_to_gmt' to decide whether the string should |
| 511 * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE). | 514 * be interpreted relative to the local time zone (PR_FALSE) or GMT (PR_TRUE). |
| 512 * The correct value for this argument depends on what standard specified | 515 * The correct value for this argument depends on what standard specified |
| 513 * the time string which you are parsing. | 516 * the time string which you are parsing. |
| 514 */ | 517 */ |
| 515 | 518 |
| 516 PRStatus | 519 PRStatus |
| 517 PR_ParseTimeString( | 520 PR_ParseTimeString( |
| 518 const char *string, | 521 const char *string, |
| 519 PRBool default_to_gmt, | 522 PRBool default_to_gmt, |
| 520 PRTime *result_imploded) | 523 PRTime *result_imploded) |
| 521 { | 524 { |
| 522 PRExplodedTime tm; | 525 PRExplodedTime tm; |
| 523 PRExplodedTime *result = &tm; | 526 PRExplodedTime *result = &tm; |
| 524 TIME_TOKEN dotw = TT_UNKNOWN; | 527 TIME_TOKEN dotw = TT_UNKNOWN; |
| 525 TIME_TOKEN month = TT_UNKNOWN; | 528 TIME_TOKEN month = TT_UNKNOWN; |
| 526 TIME_TOKEN zone = TT_UNKNOWN; | 529 TIME_TOKEN zone = TT_UNKNOWN; |
| 527 int zone_offset = -1; | 530 int zone_offset = -1; |
| 528 int dst_offset = 0; | 531 int dst_offset = 0; |
| 529 int date = -1; | 532 int date = -1; |
| 530 PRInt32 year = -1; | 533 PRInt32 year = -1; |
| 531 int hour = -1; | 534 int hour = -1; |
| 532 int min = -1; | 535 int min = -1; |
| 533 int sec = -1; | 536 int sec = -1; |
| 537 int usec = -1; | |
| 534 | 538 |
| 535 const char *rest = string; | 539 const char *rest = string; |
| 536 | 540 |
| 537 int iterations = 0; | 541 int iterations = 0; |
| 538 | 542 |
| 539 PR_ASSERT(string && result); | 543 PR_ASSERT(string && result); |
| 540 if (!string || !result) return PR_FAILURE; | 544 if (!string || !result) return PR_FAILURE; |
| 541 | 545 |
| 542 while (*rest) | 546 while (*rest) |
| 543 { | 547 { |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 767 zone = TT_GMT; | 771 zone = TT_GMT; |
| 768 break; | 772 break; |
| 769 } | 773 } |
| 770 | 774 |
| 771 case '0': case '1': case '2': case '3': case '4': | 775 case '0': case '1': case '2': case '3': case '4': |
| 772 case '5': case '6': case '7': case '8': case '9': | 776 case '5': case '6': case '7': case '8': case '9': |
| 773 { | 777 { |
| 774 int tmp_hour = -1; | 778 int tmp_hour = -1; |
| 775 int tmp_min = -1; | 779 int tmp_min = -1; |
| 776 int tmp_sec = -1; | 780 int tmp_sec = -1; |
| 781 int tmp_usec = -1; | |
| 777 const char *end = rest + 1; | 782 const char *end = rest + 1; |
| 778 while (*end >= '0' && *end <= '9') | 783 while (*end >= '0' && *end <= '9') |
| 779 end++; | 784 end++; |
| 780 | 785 |
| 781 /* end is now the first character after a range of digit s. */ | 786 /* end is now the first character after a range of digit s. */ |
| 782 | 787 |
| 783 if (*end == ':') | 788 if (*end == ':') |
| 784 { | 789 { |
| 785 if (hour >= 0 && min >= 0) /* already got it */ | 790 if (hour >= 0 && min >= 0) /* already got it */ |
| 786 break; | 791 break; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 826 ; | 831 ; |
| 827 else if ((end - rest) > 2) | 832 else if ((end - rest) > 2) |
| 828 /* it is [0-9][0-9][0-9]+: */ | 833 /* it is [0-9][0-9][0-9]+: */ |
| 829 break; | 834 break; |
| 830 else if ((end - rest) == 2) | 835 else if ((end - rest) == 2) |
| 831 tmp_sec = ((rest[0]-'0')*10 + | 836 tmp_sec = ((rest[0]-'0')*10 + |
| 832 (rest[1]-'0')); | 837 (rest[1]-'0')); |
| 833 else | 838 else |
| 834 tmp_sec = (rest[0]-'0'); | 839 tmp_sec = (rest[0]-'0'); |
| 835 | 840 |
| 836 /* If we made it here, we've parsed hour and min , | 841 /* fractional second */ |
| 837 and possibly sec, so it worked as a unit. */ | 842 rest = end; |
| 843 if (*rest == '.') { | |
| 844 rest++; | |
| 845 end++; | |
| 846 tmp_usec = 0; | |
| 847 /* use up to 6 digits, skip over the rest */ | |
| 848 while (*end >= '0' && *end <= '9') { | |
| 849 if (end - rest < 6) { | |
| 850 tmp_usec = tmp_usec * 10 + *end - '0'; | |
| 851 } | |
| 852 end++; | |
| 853 } | |
| 854 int ndigits = end - rest; | |
| 855 while (ndigits++ < 6) | |
| 856 tmp_usec *= 10; | |
| 857 } | |
| 838 | 858 |
| 839 /* skip over whitespace and see if there's an AM or PM | 859 if (*end == 'Z') { |
| 840 directly following the time. | 860 zone = TT_GMT; |
|
wtc
2014/05/12 19:47:15
Should we do
end++;
here? Otherwise 'Z' may
Thiemo Nagel
2014/05/13 14:08:19
It's not strictly necessary because the break will
| |
| 841 */ | 861 } |
|
wtc
2014/05/12 19:47:15
Nit: Lines 843-861 probably should follow the brac
Thiemo Nagel
2014/05/13 14:08:19
Thanks, I fully agree. Done.
| |
| 842 if (tmp_hour <= 12) | 862 else if (tmp_hour <= 12) |
| 843 { | 863 { |
| 864 /* If we made it here, we've parsed hour and min, | |
| 865 and possibly sec, so it worked as a unit. */ | |
|
wtc
2014/05/12 19:47:15
By "it worked as a unit", did you mean we have ful
Thiemo Nagel
2014/05/13 14:08:19
That's how I understand the original author. (I'v
| |
| 866 | |
| 867 /* skip over whitespace and see if there's a n AM or PM | |
| 868 directly following the time. | |
| 869 */ | |
| 844 const char *s = end; | 870 const char *s = end; |
| 845 while (*s && (*s == ' ' || *s == '\t')) | 871 while (*s && (*s == ' ' || *s == '\t')) |
| 846 s++; | 872 s++; |
| 847 if ((s[0] == 'p' || s[0] == 'P') && | 873 if ((s[0] == 'p' || s[0] == 'P') && |
| 848 (s[1] == 'm' || s[1] == 'M')) | 874 (s[1] == 'm' || s[1] == 'M')) |
| 849 /* 10:05pm == 22:05, and 12:05pm == 12 :05 */ | 875 /* 10:05pm == 22:05, and 12:05pm == 12 :05 */ |
| 850 tmp_hour = (tmp_hour == 12 ? 12 : tmp_ hour + 12); | 876 tmp_hour = (tmp_hour == 12 ? 12 : tmp_ hour + 12); |
| 851 else if (tmp_hour == 12 && | 877 else if (tmp_hour == 12 && |
| 852 (s[0] == 'a' || s[0] == 'A') && | 878 (s[0] == 'a' || s[0] == 'A') && |
| 853 (s[1] == 'm' || s[1] == 'M')) | 879 (s[1] == 'm' || s[1] == 'M')) |
| 854 /* 12:05am == 00:05 */ | 880 /* 12:05am == 00:05 */ |
| 855 tmp_hour = 0; | 881 tmp_hour = 0; |
| 856 } | 882 } |
| 857 | 883 |
| 858 hour = tmp_hour; | 884 hour = tmp_hour; |
| 859 min = tmp_min; | 885 min = tmp_min; |
| 860 sec = tmp_sec; | 886 sec = tmp_sec; |
| 887 usec = tmp_usec; | |
| 861 rest = end; | 888 rest = end; |
| 862 break; | 889 break; |
| 863 } | 890 } |
| 864 else if ((*end == '/' || *end == '-') && | 891 else if ((*end == '/' || *end == '-') && |
| 865 end[1] >= '0' && end[1] <= '9') | 892 end[1] >= '0' && end[1] <= '9') |
| 866 { | 893 { |
| 867 /* Perhaps this is 6/16/95, 16/6/95, 6-16-95, or 16-6-95 | 894 /* Perhaps this is 6/16/95, 16/6/95, 6-16-95, or 16-6-95 |
| 868 or even 95-06-05... | 895 or even 95-06-05 or 1995-06-22. |
| 869 #### But it doesn't handle 1995-06-22. | |
| 870 */ | 896 */ |
| 871 int n1, n2, n3; | 897 int n1, n2, n3; |
| 872 const char *s; | 898 const char *s; |
| 873 | 899 |
| 874 if (month != TT_UNKNOWN) | 900 if (month != TT_UNKNOWN) |
| 875 /* if we saw a month name, this can't be. */ | 901 /* if we saw a month name, this can't be. */ |
| 876 break; | 902 break; |
| 877 | 903 |
| 878 s = rest; | 904 s = rest; |
| 879 | 905 |
| 880 n1 = (*s++ - '0'); /* first 1 or 2 digits */ | 906 n1 = (*s++ - '0'); /* first 1, 2 or 4 digits */ |
| 881 if (*s >= '0' && *s <= '9') | 907 if (*s >= '0' && *s <= '9') |
| 882 n1 = n1*10 + (*s++ - '0'); | 908 n1 = n1*10 + (*s++ - '0'); |
| 883 | 909 |
| 910 if (*s >= '0' && *s <= '9') /* option al digits 3 and 4 */ | |
| 911 { | |
| 912 n1 = n1*10 + (*s++ - '0'); | |
| 913 if (*s < '0' || *s > '9') | |
| 914 break; | |
|
wtc
2014/05/12 19:47:15
This break statement means you want to disallow a
Thiemo Nagel
2014/05/13 14:08:19
Yes, that's the intent.
| |
| 915 n1 = n1*10 + (*s++ - '0'); | |
| 916 } | |
|
wtc
2014/05/12 19:47:15
Nit: it seems that this new if block (lines 910-91
Thiemo Nagel
2014/05/13 14:08:19
Yes, good point, that's more readable.
| |
| 917 | |
| 884 if (*s != '/' && *s != '-') /* sl ash */ | 918 if (*s != '/' && *s != '-') /* sl ash */ |
| 885 break; | 919 break; |
| 886 s++; | 920 s++; |
| 887 | 921 |
| 888 if (*s < '0' || *s > '9') /* seco nd 1 or 2 digits */ | 922 if (*s < '0' || *s > '9') /* seco nd 1 or 2 digits */ |
| 889 break; | 923 break; |
| 890 n2 = (*s++ - '0'); | 924 n2 = (*s++ - '0'); |
| 891 if (*s >= '0' && *s <= '9') | 925 if (*s >= '0' && *s <= '9') |
| 892 n2 = n2*10 + (*s++ - '0'); | 926 n2 = n2*10 + (*s++ - '0'); |
| 893 | 927 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 904 if (*s >= '0' && *s <= '9') /* option al digits 3, 4, and 5 */ | 938 if (*s >= '0' && *s <= '9') /* option al digits 3, 4, and 5 */ |
| 905 { | 939 { |
| 906 n3 = n3*10 + (*s++ - '0'); | 940 n3 = n3*10 + (*s++ - '0'); |
| 907 if (*s < '0' || *s > '9') | 941 if (*s < '0' || *s > '9') |
| 908 break; | 942 break; |
| 909 n3 = n3*10 + (*s++ - '0'); | 943 n3 = n3*10 + (*s++ - '0'); |
| 910 if (*s >= '0' && *s <= '9') | 944 if (*s >= '0' && *s <= '9') |
| 911 n3 = n3*10 + (*s++ - '0'); | 945 n3 = n3*10 + (*s++ - '0'); |
| 912 } | 946 } |
| 913 | 947 |
| 914 if ((*s >= '0' && *s <= '9') || /* follow ed by non-alphanum */ | 948 if (*s == 'T' && s[1] >= '0' && s[1] <= '9') |
| 915 (*s >= 'A' && *s <= 'Z') || | 949 /* followed by ISO 8601 T delimiter and number is ok */ |
| 916 (*s >= 'a' && *s <= 'z')) | 950 ; |
| 951 else if ((*s >= '0' && *s <= '9') || | |
| 952 (*s >= 'A' && *s <= 'Z') || | |
| 953 (*s >= 'a' && *s <= 'z')) | |
| 954 /* but other alphanumerics are not ok */ | |
| 917 break; | 955 break; |
| 918 | 956 |
| 919 /* Ok, we parsed three 1-2 digit numbers, with / or - | 957 /* Ok, we parsed three multi-digit numbers, with / or - |
| 920 between them. Now decide what the hell they are | 958 between them. Now decide what the hell they are |
| 921 (DD/MM/YY or MM/DD/YY or YY/MM/DD.) | 959 (DD/MM/YY or MM/DD/YY or [YY]YY/MM/DD.) |
| 922 */ | 960 */ |
| 923 | 961 |
| 924 if (n1 > 31 || n1 == 0) /* must be YY/MM/DD */ | 962 if (n1 > 31 || n1 == 0) /* must be [YY]YY/MM/DD */ |
| 925 { | 963 { |
| 926 if (n2 > 12) break; | 964 if (n2 > 12) break; |
| 927 if (n3 > 31) break; | 965 if (n3 > 31) break; |
| 928 year = n1; | 966 year = n1; |
| 929 if (year < 70) | 967 if (year < 70) |
| 930 year += 2000; | 968 year += 2000; |
| 931 else if (year < 100) | 969 else if (year < 100) |
| 932 year += 1900; | 970 year += 1900; |
| 933 month = (TIME_TOKEN)(n2 + ((int)TT_JAN) - 1); | 971 month = (TIME_TOKEN)(n2 + ((int)TT_JAN) - 1); |
| 934 date = n3; | 972 date = n3; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1019 | 1057 |
| 1020 /* Skip to the end of this token, whether we parsed it or not. | 1058 /* Skip to the end of this token, whether we parsed it or not. |
| 1021 Tokens are delimited by whitespace, or ,;-/ | 1059 Tokens are delimited by whitespace, or ,;-/ |
| 1022 But explicitly not :+-. | 1060 But explicitly not :+-. |
| 1023 */ | 1061 */ |
| 1024 while (*rest && | 1062 while (*rest && |
| 1025 *rest != ' ' && *rest != '\t' && | 1063 *rest != ' ' && *rest != '\t' && |
| 1026 *rest != ',' && *rest != ';' && | 1064 *rest != ',' && *rest != ';' && |
| 1027 *rest != '-' && *rest != '+' && | 1065 *rest != '-' && *rest != '+' && |
| 1028 *rest != '/' && | 1066 *rest != '/' && |
| 1029 *rest != '(' && *rest != ')' && *rest != '[' && *rest ! = ']') | 1067 *rest != '(' && *rest != ')' && *rest != '[' && *rest ! = ']' && |
| 1068 !(*rest == 'T' && rest[1] >= '0' && rest[1] <= '9') /* T precedes time in ISO 8601 */ | |
|
wtc
2014/05/12 19:47:15
Nit: maybe this comment should be moved to the com
Thiemo Nagel
2014/05/13 14:08:19
Done. At that occasion, I've updated the pre-exis
| |
| 1069 ) | |
| 1030 rest++; | 1070 rest++; |
| 1031 /* skip over uninteresting chars. */ | 1071 /* skip over uninteresting chars. */ |
| 1032 SKIP_MORE: | 1072 SKIP_MORE: |
| 1033 while (*rest && | 1073 while (*rest == ' ' || *rest == '\t' || |
|
Thiemo Nagel
2014/05/09 16:19:00
*rest is redundant here.
| |
| 1034 (*rest == ' ' || *rest == '\t' || | 1074 *rest == ',' || *rest == ';' || *rest == '/' || |
| 1035 *rest == ',' || *rest == ';' || *rest == '/' || | 1075 *rest == '(' || *rest == ')' || *rest == '[' || *rest == ']') |
| 1036 *rest == '(' || *rest == ')' || *rest == '[' || *rest == ']')) | |
| 1037 rest++; | 1076 rest++; |
| 1038 | 1077 |
| 1039 /* "-" is ignored at the beginning of a token if we have not yet | 1078 /* "-" is ignored at the beginning of a token if we have not yet |
| 1040 parsed a year (e.g., the second "-" in "30-AUG-1966"), or if | 1079 parsed a year (e.g., the second "-" in "30-AUG-1966"), or if |
| 1041 the character after the dash is not a digit. */ | 1080 the character after the dash is not a digit. */ |
| 1042 if (*rest == '-' && ((rest > string && | 1081 if (*rest == '-' && ((rest > string && |
| 1043 isalpha((unsigned char)rest[-1]) && year < 0) || | 1082 isalpha((unsigned char)rest[-1]) && year < 0) || |
| 1044 rest[1] < '0' || rest[1] > '9')) | 1083 rest[1] < '0' || rest[1] > '9')) |
| 1045 { | 1084 { |
| 1046 rest++; | 1085 rest++; |
| 1047 goto SKIP_MORE; | 1086 goto SKIP_MORE; |
| 1048 } | 1087 } |
| 1049 | 1088 |
| 1050 } | 1089 /* Skip T that may precede ISO 8601 time. */ |
| 1090 if (*rest == 'T' && rest[1] >= '0' && rest[1] <= '9') | |
| 1091 rest++; | |
| 1092 | |
|
wtc
2014/05/12 19:47:15
Nit: delete this blank line.
Thiemo Nagel
2014/05/13 14:08:19
Done.
| |
| 1093 } /* while */ | |
| 1051 | 1094 |
| 1052 if (zone != TT_UNKNOWN && zone_offset == -1) | 1095 if (zone != TT_UNKNOWN && zone_offset == -1) |
| 1053 { | 1096 { |
| 1054 switch (zone) | 1097 switch (zone) |
| 1055 { | 1098 { |
| 1056 case TT_PST: zone_offset = -8 * 60; break; | 1099 case TT_PST: zone_offset = -8 * 60; break; |
| 1057 case TT_PDT: zone_offset = -8 * 60; dst_offset = 1 * 60; break; | 1100 case TT_PDT: zone_offset = -8 * 60; dst_offset = 1 * 60; break; |
| 1058 case TT_MST: zone_offset = -7 * 60; break; | 1101 case TT_MST: zone_offset = -7 * 60; break; |
| 1059 case TT_MDT: zone_offset = -7 * 60; dst_offset = 1 * 60; break; | 1102 case TT_MDT: zone_offset = -7 * 60; dst_offset = 1 * 60; break; |
| 1060 case TT_CST: zone_offset = -6 * 60; break; | 1103 case TT_CST: zone_offset = -6 * 60; break; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1075 } | 1118 } |
| 1076 | 1119 |
| 1077 /* If we didn't find a year, month, or day-of-the-month, we can't | 1120 /* If we didn't find a year, month, or day-of-the-month, we can't |
| 1078 possibly parse this, and in fact, mktime() will do something random | 1121 possibly parse this, and in fact, mktime() will do something random |
| 1079 (I'm seeing it return "Tue Feb 5 06:28:16 2036", which is no doubt | 1122 (I'm seeing it return "Tue Feb 5 06:28:16 2036", which is no doubt |
| 1080 a numerologically significant date... */ | 1123 a numerologically significant date... */ |
| 1081 if (month == TT_UNKNOWN || date == -1 || year == -1 || year > PR_INT16_MAX) | 1124 if (month == TT_UNKNOWN || date == -1 || year == -1 || year > PR_INT16_MAX) |
| 1082 return PR_FAILURE; | 1125 return PR_FAILURE; |
| 1083 | 1126 |
| 1084 memset(result, 0, sizeof(*result)); | 1127 memset(result, 0, sizeof(*result)); |
| 1128 if (usec != -1) | |
| 1129 result->tm_usec = usec; | |
| 1085 if (sec != -1) | 1130 if (sec != -1) |
| 1086 result->tm_sec = sec; | 1131 result->tm_sec = sec; |
| 1087 if (min != -1) | 1132 if (min != -1) |
| 1088 result->tm_min = min; | 1133 result->tm_min = min; |
| 1089 if (hour != -1) | 1134 if (hour != -1) |
| 1090 result->tm_hour = hour; | 1135 result->tm_hour = hour; |
| 1091 if (date != -1) | 1136 if (date != -1) |
| 1092 result->tm_mday = date; | 1137 result->tm_mday = date; |
| 1093 if (month != TT_UNKNOWN) | 1138 if (month != TT_UNKNOWN) |
| 1094 result->tm_month = (((int)month) - ((int)TT_JAN)); | 1139 result->tm_month = (((int)month) - ((int)TT_JAN)); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1197 + 60 * localTime.tm_hour | 1242 + 60 * localTime.tm_hour |
| 1198 + 1440 * (localTime.tm_mday - 2); | 1243 + 1440 * (localTime.tm_mday - 2); |
| 1199 } | 1244 } |
| 1200 | 1245 |
| 1201 result->tm_params.tp_gmt_offset = zone_offset * 60; | 1246 result->tm_params.tp_gmt_offset = zone_offset * 60; |
| 1202 result->tm_params.tp_dst_offset = dst_offset * 60; | 1247 result->tm_params.tp_dst_offset = dst_offset * 60; |
| 1203 | 1248 |
| 1204 *result_imploded = PR_ImplodeTime(result); | 1249 *result_imploded = PR_ImplodeTime(result); |
| 1205 return PR_SUCCESS; | 1250 return PR_SUCCESS; |
| 1206 } | 1251 } |
| OLD | NEW |