aboutsummaryrefslogtreecommitdiffstats
path: root/skeletons
diff options
context:
space:
mode:
authorLev Walkin <vlm@lionet.info>2005-07-04 01:44:01 +0000
committerLev Walkin <vlm@lionet.info>2005-07-04 01:44:01 +0000
commit4b4c146c706863cf17d1ae499af715f794842bac (patch)
tree2ff433eb5b1b3722196923f47ba4e73fc1edf10e /skeletons
parent398176b2a7992212b179309f15075cbe39eadfd0 (diff)
ignoring non-normalized values
Diffstat (limited to 'skeletons')
-rw-r--r--skeletons/GeneralizedTime.c17
-rw-r--r--skeletons/tests/check-GeneralizedTime.c56
2 files changed, 67 insertions, 6 deletions
diff --git a/skeletons/GeneralizedTime.c b/skeletons/GeneralizedTime.c
index 45a082bd..e9aa4781 100644
--- a/skeletons/GeneralizedTime.c
+++ b/skeletons/GeneralizedTime.c
@@ -559,18 +559,23 @@ asn_time2GT_frac(GeneralizedTime_t *opt_gt, const struct tm *tm, long frac_value
/*
* Deal with fractions.
*/
- if(frac_base >= 10 && frac_value > 0) {
+ if(frac_base >= 10
+ && frac_value > 0
+ /* 1001 ms? should ignore or adjust seconds */
+ && (frac_value/frac_base) == 0
+ ) {
char *end = p + 1 + 6; /* '.' + maximum 6 digits */
- char *z;
- *p++ = '.';
+ char *z = p;
+ *z++ = '.';
+ frac_value %= frac_base;
do {
int digit;
frac_base /= 10;
digit = frac_value / frac_base;
frac_value %= frac_base;
- *p++ = digit + 0x30;
- } while(frac_base >= 10 && frac_value > 0 && p < end);
- for(z = p - 1; *z == 0x30; --z); /* Strip zeroes */
+ *z++ = digit + 0x30;
+ } while(frac_base >= 10 && frac_value > 0 && z < end);
+ for(--z; *z == 0x30; --z); /* Strip zeroes */
p = z + (*z != '.');
size = p - buf;
}
diff --git a/skeletons/tests/check-GeneralizedTime.c b/skeletons/tests/check-GeneralizedTime.c
index abd44b0f..c39904e7 100644
--- a/skeletons/tests/check-GeneralizedTime.c
+++ b/skeletons/tests/check-GeneralizedTime.c
@@ -83,11 +83,67 @@ recode(char *time_str, const char *expect) {
FREEMEM(gt.buf);
}
+static void
+check_fractions() {
+ GeneralizedTime_t *gt = 0;
+ struct tm tm;
+
+ memset(&tm, 0, sizeof tm);
+ tm.tm_year = 70;
+ tm.tm_mday = 1;
+
+ gt = asn_time2GT_frac(gt, &tm, -1, -1, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ gt = asn_time2GT_frac(gt, &tm, 0, 0, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ gt = asn_time2GT_frac(gt, &tm, 0, -1, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ gt = asn_time2GT_frac(gt, &tm, -1, 0, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ gt = asn_time2GT_frac(gt, &tm, 10, 0, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ /* Normalization should happen prior calling the _frac() */
+ gt = asn_time2GT_frac(gt, &tm, 55, 10, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ gt = asn_time2GT_frac(gt, &tm, 10, 20, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000.5Z") == 0);
+
+ gt = asn_time2GT_frac(gt, &tm, -10, 20, 1);
+ assert(gt);
+ printf("[%s]\n", gt->buf);
+ assert(strcmp((char *)gt->buf, "19700101000000Z") == 0);
+
+ FREEMEM(gt->buf);
+ FREEMEM(gt);
+}
+
int
main(int ac, char **av) {
(void)av;
+ check_fractions();
+
recognize("200401250", -1, 0);
recognize("2004012509300", -1, 0);
recognize("20040125093000-", -1, 0);