File: parse.h

package info (click to toggle)
ruby-oj 3.16.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,852 kB
  • sloc: ansic: 19,402; ruby: 11,451; makefile: 17
file content (113 lines) | stat: -rw-r--r-- 3,650 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright (c) 2011 Peter Ohler. All rights reserved.
// Licensed under the MIT License. See LICENSE file in the project root for license details.

#ifndef OJ_PARSE_H
#define OJ_PARSE_H

#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#include "circarray.h"
#include "oj.h"
#include "reader.h"
#include "ruby.h"
#include "rxclass.h"
#include "val_stack.h"

struct _rxClass;
struct _parseInfo;

typedef struct _numInfo {
    int64_t            i;
    int64_t            num;
    int64_t            div;
    int64_t            di;
    const char        *str;
    size_t             len;
    long               exp;
    struct _parseInfo *pi;
    int                big;
    int                infinity;
    int                nan;
    int                neg;
    int                has_exp;
    int                no_big;
    int                bigdec_load;
} *NumInfo;

typedef struct _parseInfo {
    // used for the string parser
    const char *json;
    const char *cur;
    const char *end;
    // used for the stream parser
    struct _reader rd;

    struct _err      err;
    struct _options  options;
    VALUE            handler;
    struct _valStack stack;
    CircArray        circ_array;
    struct _rxClass  str_rx;
    int              expect_value;
    int              max_depth;  // just for the json gem
    VALUE            proc;
    VALUE (*start_hash)(struct _parseInfo *pi);
    void (*end_hash)(struct _parseInfo *pi);
    VALUE (*hash_key)(struct _parseInfo *pi, const char *key, size_t klen);
    void (*hash_set_cstr)(struct _parseInfo *pi, Val kval, const char *str, size_t len, const char *orig);
    void (*hash_set_num)(struct _parseInfo *pi, Val kval, NumInfo ni);
    void (*hash_set_value)(struct _parseInfo *pi, Val kval, VALUE value);

    VALUE (*start_array)(struct _parseInfo *pi);
    void (*end_array)(struct _parseInfo *pi);
    void (*array_append_cstr)(struct _parseInfo *pi, const char *str, size_t len, const char *orig);
    void (*array_append_num)(struct _parseInfo *pi, NumInfo ni);
    void (*array_append_value)(struct _parseInfo *pi, VALUE value);

    void (*add_cstr)(struct _parseInfo *pi, const char *str, size_t len, const char *orig);
    void (*add_num)(struct _parseInfo *pi, NumInfo ni);
    void (*add_value)(struct _parseInfo *pi, VALUE val);
    VALUE err_class;
    bool  has_callbacks;
} *ParseInfo;

extern void  oj_parse2(ParseInfo pi);
extern void  oj_set_error_at(ParseInfo pi, VALUE err_clas, const char *file, int line, const char *format, ...);
extern VALUE oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yieldOk);
extern VALUE oj_num_as_value(NumInfo ni);

extern void oj_set_strict_callbacks(ParseInfo pi);
extern void oj_set_object_callbacks(ParseInfo pi);
extern void oj_set_compat_callbacks(ParseInfo pi);
extern void oj_set_custom_callbacks(ParseInfo pi);
extern void oj_set_wab_callbacks(ParseInfo pi);

extern void  oj_sparse2(ParseInfo pi);
extern VALUE oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd);

extern VALUE oj_cstr_to_value(const char *str, size_t len, size_t cache_str);
extern VALUE oj_calc_hash_key(ParseInfo pi, Val parent);

static inline void parse_info_init(ParseInfo pi) {
    memset(pi, 0, sizeof(struct _parseInfo));
}

extern void oj_scanner_init(void);

static inline bool empty_ok(Options options) {
    switch (options->mode) {
    case ObjectMode:
    case WabMode: return true;
    case CompatMode:
    case RailsMode: return false;
    case StrictMode:
    case NullMode:
    case CustomMode:
    default: break;
    }
    return Yes == options->empty_string;
}

#endif /* OJ_PARSE_H */