~ubuntu-branches/ubuntu/quantal/ruby1.9.1/quantal

« back to all changes in this revision

Viewing changes to ext/syck/rubyext.c

  • Committer: Bazaar Package Importer
  • Author(s): Lucas Nussbaum
  • Date: 2011-09-24 19:16:17 UTC
  • mfrom: (1.1.8 upstream) (13.1.7 experimental)
  • Revision ID: james.westby@ubuntu.com-20110924191617-o1qz4rcmqjot8zuy
Tags: 1.9.3~rc1-1
* New upstream release: 1.9.3 RC1.
  + Includes load.c fixes. Closes: #639959.
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
/*
3
3
 * rubyext.c
4
4
 *
5
 
 * $Author: yugui $
 
5
 * $Author: nobu $
6
6
 *
7
7
 * Copyright (C) 2003-2005 why the lucky stiff
8
8
 */
114
114
    syck_parser_taguri_expansion( parser, 0 );
115
115
    oid = syck_parse( parser );
116
116
    if (!syck_lookup_sym( parser, oid, &data )) {
117
 
        rb_raise(rb_eSyntaxError, "root node <%lx> not found", oid);
 
117
        rb_raise(rb_eSyntaxError, "root node <%p> not found", (void *)oid);
118
118
    }
119
119
    sav = data;
120
120
 
208
208
 * creating timestamps
209
209
 */
210
210
struct mktime_arg {
211
 
    char *str;
 
211
    const char *str;
212
212
    long len;
213
213
};
214
214
 
215
 
SYMID
216
 
mktime_do(struct mktime_arg *arg)
 
215
VALUE
 
216
mktime_do(VALUE varg)
217
217
{
 
218
    struct mktime_arg *arg = (struct mktime_arg *)varg;
218
219
    VALUE time;
219
 
    char *str = arg->str;
 
220
    const char *str = arg->str;
220
221
    long len = arg->len;
221
 
    char *ptr = str;
 
222
    const char *ptr = str;
222
223
    VALUE year = INT2FIX(0);
223
224
    VALUE mon = INT2FIX(0);
224
225
    VALUE day = INT2FIX(0);
225
226
    VALUE hour = INT2FIX(0);
226
227
    VALUE min = INT2FIX(0);
227
228
    VALUE sec = INT2FIX(0);
228
 
    double usec;
 
229
    long usec;
229
230
 
230
231
    /* Year*/
231
232
    if ( ptr[0] != '\0' && len > 0 ) {
271
272
    ptr += 2;
272
273
    if ( len > ptr - str && *ptr == '.' )
273
274
    {
274
 
        char padded[] = "000000.000000";
275
 
        const int padding = 6;
276
 
        const int offset = padding + 1;
 
275
        char padded[] = "000000";
 
276
        const int padding = (int)(sizeof(padded) - 1);
277
277
        const char *end = ptr + 1;
278
278
        const char *begin = end;
279
 
        int length;
 
279
        ptrdiff_t length;
280
280
        while ( isdigit( *end ) ) end++;
281
 
        length = (int)(end - begin) <= padding ? (int)(end - begin) : padding;
 
281
        if ((length = (end - begin)) > padding) length = padding;
282
282
        MEMCPY(padded, begin, char, length);
283
 
        usec = strtod(padded, NULL);
 
283
        usec = strtol(padded, NULL, 10);
284
284
    }
285
285
    else
286
286
    {
287
 
        usec = 0.0;
 
287
        usec = 0;
288
288
    }
289
289
 
290
290
    /* Time Zone*/
312
312
        time = rb_funcall(rb_cTime, s_utc, 6, year, mon, day, hour, min, sec);
313
313
        tmp = rb_funcall(time, s_to_i, 0);
314
314
        tmp = rb_funcall(tmp, '-', 1, LONG2FIX(tz_offset));
315
 
        return rb_funcall(rb_cTime, s_at, 2, tmp, rb_float_new(usec));
 
315
        return rb_funcall(rb_cTime, s_at, 2, tmp, LONG2NUM(usec));
316
316
    }
317
317
    else
318
318
    {
319
319
        /* Make UTC time*/
320
 
        return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, rb_float_new(usec));
 
320
        return rb_funcall(rb_cTime, s_utc, 7, year, mon, day, hour, min, sec, LONG2NUM(usec));
321
321
    }
322
322
}
323
323
 
324
 
SYMID
325
 
mktime_r(struct mktime_arg *arg)
 
324
VALUE
 
325
mktime_r(VALUE varg)
326
326
{
 
327
    struct mktime_arg *arg = (struct mktime_arg *)varg;
 
328
 
327
329
    if (!cDateTime) {
328
330
        /*
329
331
         * Load Date module
334
336
    return rb_funcall(cDateTime, s_parse, 1, rb_str_new(arg->str, arg->len));
335
337
}
336
338
 
337
 
SYMID
338
 
rb_syck_mktime(char *str, long len)
 
339
VALUE
 
340
rb_syck_mktime(const char *str, long len)
339
341
{
340
342
    struct mktime_arg a;
341
343
 
1720
1722
    return self;
1721
1723
}
1722
1724
 
 
1725
#if 0
1723
1726
/*
1724
1727
 * Cloning method for all node types
1725
1728
 */
1742
1745
    MEMCPY( copy_n, orig_n, SyckNode, 1 );
1743
1746
    return copy;
1744
1747
}
 
1748
#endif
1745
1749
 
1746
1750
/*
1747
1751
 * YAML::Syck::Node#type_id=
2223
2227
     * Define YAML::Syck::Node class
2224
2228
     */
2225
2229
    cNode = rb_define_class_under( rb_syck, "Node", rb_cObject );
2226
 
    rb_define_method( cNode, "initialize_copy", syck_node_init_copy, 1 );
 
2230
    rb_undef( cNode, rb_intern("initialize_copy") );
2227
2231
    rb_define_attr( cNode, "emitter", 1, 1 );
2228
2232
    rb_define_attr( cNode, "resolver", 1, 1 );
2229
2233
    rb_define_attr( cNode, "kind", 1, 0 );