oj 3.10.14 → 3.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/ext/oj/buf.h +2 -30
  3. data/ext/oj/cache8.h +1 -29
  4. data/ext/oj/circarray.c +4 -8
  5. data/ext/oj/circarray.h +1 -4
  6. data/ext/oj/code.c +3 -6
  7. data/ext/oj/code.h +1 -4
  8. data/ext/oj/compat.c +1 -4
  9. data/ext/oj/custom.c +1 -4
  10. data/ext/oj/dump.c +23 -13
  11. data/ext/oj/dump.h +1 -4
  12. data/ext/oj/dump_compat.c +1 -4
  13. data/ext/oj/dump_leaf.c +2 -5
  14. data/ext/oj/dump_object.c +1 -4
  15. data/ext/oj/dump_strict.c +1 -4
  16. data/ext/oj/encode.h +1 -29
  17. data/ext/oj/err.c +1 -4
  18. data/ext/oj/err.h +1 -29
  19. data/ext/oj/fast.c +14 -42
  20. data/ext/oj/hash.c +4 -32
  21. data/ext/oj/hash.h +1 -29
  22. data/ext/oj/hash_test.c +1 -29
  23. data/ext/oj/mimic_json.c +5 -6
  24. data/ext/oj/object.c +1 -4
  25. data/ext/oj/odd.c +1 -4
  26. data/ext/oj/odd.h +1 -4
  27. data/ext/oj/oj.c +24 -4
  28. data/ext/oj/oj.h +3 -4
  29. data/ext/oj/parse.c +19 -19
  30. data/ext/oj/parse.h +1 -4
  31. data/ext/oj/rails.c +1 -4
  32. data/ext/oj/rails.h +1 -4
  33. data/ext/oj/reader.c +5 -8
  34. data/ext/oj/reader.h +2 -5
  35. data/ext/oj/resolve.c +1 -4
  36. data/ext/oj/resolve.h +1 -4
  37. data/ext/oj/rxclass.c +3 -6
  38. data/ext/oj/rxclass.h +1 -4
  39. data/ext/oj/saj.c +6 -9
  40. data/ext/oj/scp.c +1 -4
  41. data/ext/oj/sparse.c +40 -23
  42. data/ext/oj/stream_writer.c +4 -9
  43. data/ext/oj/strict.c +3 -6
  44. data/ext/oj/string_writer.c +1 -4
  45. data/ext/oj/trace.c +5 -8
  46. data/ext/oj/trace.h +1 -4
  47. data/ext/oj/util.c +1 -1
  48. data/ext/oj/util.h +1 -1
  49. data/ext/oj/val_stack.c +1 -29
  50. data/ext/oj/val_stack.h +1 -29
  51. data/ext/oj/wab.c +1 -4
  52. data/lib/oj/mimic.rb +45 -1
  53. data/lib/oj/version.rb +1 -1
  54. data/pages/Modes.md +1 -0
  55. data/pages/Options.md +12 -0
  56. data/test/test_compat.rb +14 -1
  57. data/test/test_rails.rb +9 -0
  58. data/test/test_various.rb +1 -0
  59. metadata +85 -85
@@ -1,7 +1,4 @@
1
- /* reader.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
5
2
 
6
3
  #ifndef OJ_READER_H
7
4
  #define OJ_READER_H
@@ -43,7 +40,7 @@ reader_get(Reader reader) {
43
40
  }
44
41
  reader->col++;
45
42
  reader->pos++;
46
-
43
+
47
44
  return *reader->tail++;
48
45
  }
49
46
 
@@ -1,7 +1,4 @@
1
- /* resolve.c
2
- * Copyright (c) 2012, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <stdlib.h>
7
4
  #include <stdio.h>
@@ -1,7 +1,4 @@
1
- /* resolve.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
5
2
 
6
3
  #ifndef OJ_RESOLVE_H
7
4
  #define OJ_RESOLVE_H
@@ -1,7 +1,4 @@
1
- /* rxclass.c
2
- * Copyright (c) 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <sys/types.h>
7
4
  #include <stdlib.h>
@@ -101,12 +98,12 @@ VALUE
101
98
  oj_rxclass_match(RxClass rc, const char *str, int len) {
102
99
  RxC rxc;
103
100
  char buf[4096];
104
-
101
+
105
102
  for (rxc = rc->head; NULL != rxc; rxc = rxc->next) {
106
103
  if (Qnil != rxc->rrx) {
107
104
  // Must use a valiabel for this to work.
108
105
  volatile VALUE rstr = rb_str_new(str, len);
109
-
106
+
110
107
  //if (Qtrue == rb_funcall(rxc->rrx, rb_intern("match?"), 1, rstr)) {
111
108
  if (Qnil != rb_funcall(rxc->rrx, rb_intern("match"), 1, rstr)) {
112
109
  return rxc->clas;
@@ -1,7 +1,4 @@
1
- /* rxclass.h
2
- * Copyright (c) 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #ifndef OJ_RXCLASS_H
7
4
  #define OJ_RXCLASS_H
@@ -1,7 +1,4 @@
1
- /* saj.c
2
- * Copyright (c) 2012, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012 Peter Ohler. All rights reserved.
5
2
 
6
3
  #if !IS_WINDOWS
7
4
  #include <sys/resource.h> /* for getrlimit() on linux */
@@ -213,7 +210,7 @@ read_next(ParseInfo pi, const char *key) {
213
210
  static void
214
211
  read_hash(ParseInfo pi, const char *key) {
215
212
  const char *ks;
216
-
213
+
217
214
  if (pi->has_hash_start) {
218
215
  call_no_value(pi->handler, oj_hash_start_id, key);
219
216
  }
@@ -378,7 +375,7 @@ read_num(ParseInfo pi, const char *key) {
378
375
  if (0 == e && 0 == a && 1 == div) {
379
376
  if (big) {
380
377
  char c = *pi->s;
381
-
378
+
382
379
  *pi->s = '\0';
383
380
  if (pi->has_add_value) {
384
381
  call_add_value(pi->handler, rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new2(start)), key);
@@ -396,7 +393,7 @@ read_num(ParseInfo pi, const char *key) {
396
393
  } else { /* decimal */
397
394
  if (big) {
398
395
  char c = *pi->s;
399
-
396
+
400
397
  *pi->s = '\0';
401
398
  if (pi->has_add_value) {
402
399
  call_add_value(pi->handler, rb_funcall(rb_cObject, oj_bigdecimal_id, 1, rb_str_new2(start)), key);
@@ -541,7 +538,7 @@ read_quoted_value(ParseInfo pi) {
541
538
  char *h = pi->s; /* head */
542
539
  char *t = h; /* tail */
543
540
  uint32_t code;
544
-
541
+
545
542
  h++; /* skip quote character */
546
543
  t++;
547
544
  value = h;
@@ -679,7 +676,7 @@ oj_saj_parse(int argc, VALUE *argv, VALUE self) {
679
676
  } else {
680
677
  VALUE clas = rb_obj_class(input);
681
678
  volatile VALUE s;
682
-
679
+
683
680
  if (oj_stringio_class == clas) {
684
681
  s = rb_funcall2(input, oj_string_id, 0, 0);
685
682
  len = RSTRING_LEN(s) + 1;
@@ -1,7 +1,4 @@
1
- /* scp.c
2
- * Copyright (c) 2012, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <stdlib.h>
7
4
  #include <stdio.h>
@@ -1,7 +1,4 @@
1
- /* sparse.c
2
- * Copyright (c) 2013, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2013 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <stdlib.h>
7
4
  #include <stdio.h>
@@ -228,17 +225,6 @@ read_escaped_str(ParseInfo pi) {
228
225
  case '"': buf_append(&buf, '"'); break;
229
226
  case '/': buf_append(&buf, '/'); break;
230
227
  case '\\': buf_append(&buf, '\\'); break;
231
- case '\'':
232
- // The json gem claims this is not an error despite the
233
- // ECMA-404 indicating it is not valid.
234
- if (CompatMode == pi->options.mode) {
235
- buf_append(&buf, '\'');
236
- } else {
237
- oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid escaped character");
238
- buf_cleanup(&buf);
239
- return;
240
- }
241
- break;
242
228
  case 'u':
243
229
  if (0 == (code = read_hex(pi)) && err_has(&pi->err)) {
244
230
  buf_cleanup(&buf);
@@ -276,6 +262,12 @@ read_escaped_str(ParseInfo pi) {
276
262
  }
277
263
  break;
278
264
  default:
265
+ // The json gem claims this is not an error despite the
266
+ // ECMA-404 indicating it is not valid.
267
+ if (CompatMode == pi->options.mode) {
268
+ buf_append(&buf, c);
269
+ break;
270
+ }
279
271
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid escaped character");
280
272
  buf_cleanup(&buf);
281
273
  return;
@@ -408,8 +400,13 @@ read_num(ParseInfo pi) {
408
400
  ni.nan = 0;
409
401
  ni.neg = 0;
410
402
  ni.has_exp = 0;
411
- ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
412
- ni.bigdec_load = pi->options.bigdec_load;
403
+ if (CompatMode == pi->options.mode) {
404
+ ni.no_big = !pi->options.compat_bigdec;
405
+ ni.bigdec_load = pi->options.compat_bigdec;
406
+ } else {
407
+ ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
408
+ ni.bigdec_load = pi->options.bigdec_load;
409
+ }
413
410
 
414
411
  c = reader_get(&pi->rd);
415
412
  if ('-' == c) {
@@ -526,7 +523,11 @@ read_num(ParseInfo pi) {
526
523
  ni.nan = 1;
527
524
  }
528
525
  }
529
- if (BigDec == pi->options.bigdec_load) {
526
+ if (CompatMode == pi->options.mode) {
527
+ if (pi->options.compat_bigdec) {
528
+ ni.big = 1;
529
+ }
530
+ } else if (BigDec == pi->options.bigdec_load) {
530
531
  ni.big = 1;
531
532
  }
532
533
  add_num_value(pi, &ni);
@@ -549,15 +550,24 @@ read_nan(ParseInfo pi) {
549
550
  ni.infinity = 0;
550
551
  ni.nan = 1;
551
552
  ni.neg = 0;
552
- ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
553
- ni.bigdec_load = pi->options.bigdec_load;
553
+ if (CompatMode == pi->options.mode) {
554
+ ni.no_big = !pi->options.compat_bigdec;
555
+ ni.bigdec_load = pi->options.compat_bigdec;
556
+ } else {
557
+ ni.no_big = (FloatDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load);
558
+ ni.bigdec_load = pi->options.bigdec_load;
559
+ }
554
560
 
555
561
  if ('a' != reader_get(&pi->rd) ||
556
562
  ('N' != (c = reader_get(&pi->rd)) && 'n' != c)) {
557
563
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
558
564
  return;
559
565
  }
560
- if (BigDec == pi->options.bigdec_load) {
566
+ if (CompatMode == pi->options.mode) {
567
+ if (pi->options.compat_bigdec) {
568
+ ni.big = 1;
569
+ }
570
+ } else if (BigDec == pi->options.bigdec_load) {
561
571
  ni.big = 1;
562
572
  }
563
573
  add_num_value(pi, &ni);
@@ -747,8 +757,15 @@ oj_sparse2(ParseInfo pi) {
747
757
  ni.infinity = 0;
748
758
  ni.nan = 1;
749
759
  ni.neg = 0;
750
- ni.no_big = (FloatDec == pi->options.bigdec_load || RubyDec == pi->options.bigdec_load || FastDec == pi->options.bigdec_load);
751
- ni.bigdec_load = pi->options.bigdec_load;
760
+ if (CompatMode == pi->options.mode) {
761
+ ni.no_big = !pi->options.compat_bigdec;
762
+ ni.bigdec_load = pi->options.compat_bigdec;
763
+ } else {
764
+ ni.no_big = (FloatDec == pi->options.bigdec_load ||
765
+ FastDec == pi->options.bigdec_load ||
766
+ RubyDec == pi->options.bigdec_load);
767
+ ni.bigdec_load = pi->options.bigdec_load;
768
+ }
752
769
  add_num_value(pi, &ni);
753
770
  } else {
754
771
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "invalid token");
@@ -1,7 +1,4 @@
1
- /* stream_writer.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <errno.h>
7
4
 
@@ -86,7 +83,7 @@ stream_writer_new(int argc, VALUE *argv, VALUE self) {
86
83
  #if !IS_WINDOWS
87
84
  VALUE s;
88
85
  #endif
89
-
86
+
90
87
  if (oj_stringio_class == clas) {
91
88
  type = STRING_IO;
92
89
  #if !IS_WINDOWS
@@ -107,7 +104,7 @@ stream_writer_new(int argc, VALUE *argv, VALUE self) {
107
104
 
108
105
  if (Qundef == buffer_size_sym) {
109
106
  buffer_size_sym = ID2SYM(rb_intern("buffer_size")); rb_gc_register_address(&buffer_size_sym);
110
-
107
+
111
108
  }
112
109
  if (Qnil != (v = rb_hash_lookup(argv[1], buffer_size_sym))) {
113
110
  #ifdef RUBY_INTEGER_UNIFICATION
@@ -340,7 +337,7 @@ stream_writer_flush(VALUE self) {
340
337
  }
341
338
 
342
339
  /* Document-class: Oj::StreamWriter
343
- *
340
+ *
344
341
  * Supports building a JSON document one element at a time. Build the IO stream
345
342
  * document by pushing values into the document. Pushing an array or an object
346
343
  * will create that element in the JSON document and subsequent pushes will add
@@ -359,5 +356,3 @@ oj_stream_writer_init() {
359
356
  rb_define_method(oj_stream_writer_class, "pop_all", stream_writer_pop_all, 0);
360
357
  rb_define_method(oj_stream_writer_class, "flush", stream_writer_flush, 0);
361
358
  }
362
-
363
-
@@ -1,7 +1,4 @@
1
- /* strict.c
2
- * Copyright (c) 2012, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include <stdlib.h>
7
4
  #include <stdio.h>
@@ -102,7 +99,7 @@ hash_set_cstr(ParseInfo pi, Val parent, const char *str, size_t len, const char
102
99
  static void
103
100
  hash_set_num(ParseInfo pi, Val parent, NumInfo ni) {
104
101
  volatile VALUE v;
105
-
102
+
106
103
  if (ni->infinity || ni->nan) {
107
104
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
108
105
  }
@@ -143,7 +140,7 @@ array_append_cstr(ParseInfo pi, const char *str, size_t len, const char *orig) {
143
140
  static void
144
141
  array_append_num(ParseInfo pi, NumInfo ni) {
145
142
  volatile VALUE v;
146
-
143
+
147
144
  if (ni->infinity || ni->nan) {
148
145
  oj_set_error_at(pi, oj_parse_error_class, __FILE__, __LINE__, "not a number or other value");
149
146
  }
@@ -1,7 +1,4 @@
1
- /* strwriter.c
2
- * Copyright (c) 2012, 2017, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2012, 2017 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include "dump.h"
7
4
  #include "encode.h"
@@ -1,7 +1,4 @@
1
- /* trace.h
2
- * Copyright (c) 2018, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2018 Peter Ohler. All rights reserved.
5
2
 
6
3
  #include "parse.h"
7
4
  #include "trace.h"
@@ -37,7 +34,7 @@ oj_trace_parse_call(const char *func, ParseInfo pi, const char *file, int line,
37
34
  char fmt[64];
38
35
  char indent[MAX_INDENT];
39
36
  int depth = (int)(stack_size(&pi->stack) * 2);
40
-
37
+
41
38
  fill_indent(indent, depth);
42
39
  sprintf(fmt, "#0:%%13s:%%3d:Oj:-:%%%ds %%s %%s\n", depth);
43
40
  printf(fmt, file, line, indent, func, rb_obj_classname(obj));
@@ -48,7 +45,7 @@ oj_trace_parse_in(const char *func, ParseInfo pi, const char *file, int line) {
48
45
  char fmt[64];
49
46
  char indent[MAX_INDENT];
50
47
  int depth = (int)(stack_size(&pi->stack) * 2);
51
-
48
+
52
49
  fill_indent(indent, depth);
53
50
  sprintf(fmt, "#0:%%13s:%%3d:Oj:}:%%%ds %%s\n", depth);
54
51
  printf(fmt, file, line, indent, func);
@@ -61,7 +58,7 @@ oj_trace_parse_hash_end(ParseInfo pi, const char *file, int line) {
61
58
  int depth = (int)(stack_size(&pi->stack) * 2 - 2);
62
59
  Val v = stack_peek(&pi->stack);
63
60
  VALUE obj = v->val;
64
-
61
+
65
62
  fill_indent(indent, depth);
66
63
  sprintf(fmt, "#0:%%13s:%%3d:Oj:{:%%%ds hash_end %%s\n", depth);
67
64
  printf(fmt, file, line, indent, rb_obj_classname(obj));
@@ -72,7 +69,7 @@ oj_trace_parse_array_end(ParseInfo pi, const char *file, int line) {
72
69
  char fmt[64];
73
70
  char indent[MAX_INDENT];
74
71
  int depth = (int)(stack_size(&pi->stack) * 2);
75
-
72
+
76
73
  fill_indent(indent, depth);
77
74
  sprintf(fmt, "#0:%%13s:%%3d:Oj:{:%%%ds array_ned\n", depth);
78
75
  printf(fmt, file, line, indent);
@@ -1,7 +1,4 @@
1
- /* trace.h
2
- * Copyright (c) 2018, Peter Ohler
3
- * All rights reserved.
4
- */
1
+ // Copyright (c) 2018 Peter Ohler. All rights reserved.
5
2
 
6
3
  #ifndef OJ_TRACE_H
7
4
  #define OJ_TRACE_H
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2019, Peter Ohler, All rights reserved.
1
+ // Copyright (c) 2019 Peter Ohler. All rights reserved.
2
2
 
3
3
  #include "util.h"
4
4
 
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2019, Peter Ohler, All rights reserved.
1
+ // Copyright (c) 2019 Peter Ohler. All rights reserved.
2
2
 
3
3
  #ifndef OJ_UTIL_H
4
4
  #define OJ_UTIL_H
@@ -1,32 +1,4 @@
1
- /* val_stack.c
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
30
2
 
31
3
  #include <string.h>
32
4
 
@@ -1,32 +1,4 @@
1
- /* val_stack.h
2
- * Copyright (c) 2011, Peter Ohler
3
- * All rights reserved.
4
- *
5
- * Redistribution and use in source and binary forms, with or without
6
- * modification, are permitted provided that the following conditions are met:
7
- *
8
- * - Redistributions of source code must retain the above copyright notice, this
9
- * list of conditions and the following disclaimer.
10
- *
11
- * - Redistributions in binary form must reproduce the above copyright notice,
12
- * this list of conditions and the following disclaimer in the documentation
13
- * and/or other materials provided with the distribution.
14
- *
15
- * - Neither the name of Peter Ohler nor the names of its contributors may be
16
- * used to endorse or promote products derived from this software without
17
- * specific prior written permission.
18
- *
19
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
- */
1
+ // Copyright (c) 2011 Peter Ohler. All rights reserved.
30
2
 
31
3
  #ifndef OJ_VAL_STACK_H
32
4
  #define OJ_VAL_STACK_H