Skip to content

Commit c8d5b43

Browse files
committed
CHECK_NULL macro
1 parent b11af53 commit c8d5b43

File tree

1 file changed

+31
-116
lines changed

1 file changed

+31
-116
lines changed

tinyexpr.c

Lines changed: 31 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,14 @@ typedef struct state {
8080
#define IS_CLOSURE(TYPE) (((TYPE) & TE_CLOSURE0) != 0)
8181
#define ARITY(TYPE) ( ((TYPE) & (TE_FUNCTION0 | TE_CLOSURE0)) ? ((TYPE) & 0x00000007) : 0 )
8282
#define NEW_EXPR(type, ...) new_expr((type), (const te_expr*[]){__VA_ARGS__})
83+
#define CHECK_NULL(ptr, ...) if ((ptr) == NULL) { __VA_ARGS__; return NULL; }
8384

8485
static te_expr *new_expr(const int type, const te_expr *parameters[]) {
8586
const int arity = ARITY(type);
8687
const int psize = sizeof(void*) * arity;
8788
const int size = (sizeof(te_expr) - sizeof(void*)) + psize + (IS_CLOSURE(type) ? sizeof(void*) : 0);
8889
te_expr *ret = malloc(size);
89-
if (ret == NULL) {
90-
return NULL;
91-
}
90+
CHECK_NULL(ret);
9291

9392
memset(ret, 0, size);
9493
if (arity && parameters) {
@@ -309,19 +308,15 @@ static te_expr *base(state *s) {
309308
switch (TYPE_MASK(s->type)) {
310309
case TOK_NUMBER:
311310
ret = new_expr(TE_CONSTANT, 0);
312-
if (ret == NULL) {
313-
return NULL;
314-
}
311+
CHECK_NULL(ret);
315312

316313
ret->value = s->value;
317314
next_token(s);
318315
break;
319316

320317
case TOK_VARIABLE:
321318
ret = new_expr(TE_VARIABLE, 0);
322-
if (ret == NULL) {
323-
return NULL;
324-
}
319+
CHECK_NULL(ret);
325320

326321
ret->bound = s->bound;
327322
next_token(s);
@@ -330,9 +325,7 @@ static te_expr *base(state *s) {
330325
case TE_FUNCTION0:
331326
case TE_CLOSURE0:
332327
ret = new_expr(s->type, 0);
333-
if (ret == NULL) {
334-
return NULL;
335-
}
328+
CHECK_NULL(ret);
336329

337330
ret->function = s->function;
338331
if (IS_CLOSURE(s->type)) ret->parameters[0] = s->context;
@@ -350,18 +343,13 @@ static te_expr *base(state *s) {
350343
case TE_FUNCTION1:
351344
case TE_CLOSURE1:
352345
ret = new_expr(s->type, 0);
353-
if (ret == NULL) {
354-
return NULL;
355-
}
346+
CHECK_NULL(ret);
356347

357348
ret->function = s->function;
358349
if (IS_CLOSURE(s->type)) ret->parameters[1] = s->context;
359350
next_token(s);
360351
ret->parameters[0] = power(s);
361-
if (ret->parameters[0] == NULL) {
362-
free(ret);
363-
return NULL;
364-
}
352+
CHECK_NULL(ret->parameters[0], te_free(ret));
365353
break;
366354

367355
case TE_FUNCTION2: case TE_FUNCTION3: case TE_FUNCTION4:
@@ -371,9 +359,7 @@ static te_expr *base(state *s) {
371359
arity = ARITY(s->type);
372360

373361
ret = new_expr(s->type, 0);
374-
if (ret == NULL) {
375-
return NULL;
376-
}
362+
CHECK_NULL(ret);
377363

378364
ret->function = s->function;
379365
if (IS_CLOSURE(s->type)) ret->parameters[arity] = s->context;
@@ -386,14 +372,7 @@ static te_expr *base(state *s) {
386372
for(i = 0; i < arity; i++) {
387373
next_token(s);
388374
ret->parameters[i] = expr(s);
389-
if (ret->parameters[i] == NULL) {
390-
int j;
391-
for (j = 0; j < i; ++j) {
392-
te_free(ret->parameters[j]);
393-
}
394-
free(ret);
395-
return NULL;
396-
}
375+
CHECK_NULL(ret->parameters[i], te_free(ret));
397376

398377
if(s->type != TOK_SEP) {
399378
break;
@@ -411,9 +390,7 @@ static te_expr *base(state *s) {
411390
case TOK_OPEN:
412391
next_token(s);
413392
ret = list(s);
414-
if (ret == NULL) {
415-
return NULL;
416-
}
393+
CHECK_NULL(ret);
417394

418395
if (s->type != TOK_CLOSE) {
419396
s->type = TOK_ERROR;
@@ -424,9 +401,7 @@ static te_expr *base(state *s) {
424401

425402
default:
426403
ret = new_expr(0, 0);
427-
if (ret == NULL) {
428-
return NULL;
429-
}
404+
CHECK_NULL(ret);
430405

431406
s->type = TOK_ERROR;
432407
ret->value = NAN;
@@ -451,15 +426,10 @@ static te_expr *power(state *s) {
451426
ret = base(s);
452427
} else {
453428
te_expr *b = base(s);
454-
if (b == NULL) {
455-
return NULL;
456-
}
429+
CHECK_NULL(b);
457430

458431
ret = NEW_EXPR(TE_FUNCTION1 | TE_FLAG_PURE, b);
459-
if (ret == NULL) {
460-
te_free(b);
461-
return NULL;
462-
}
432+
CHECK_NULL(ret, te_free(b));
463433

464434
ret->function = negate;
465435
}
@@ -471,9 +441,7 @@ static te_expr *power(state *s) {
471441
static te_expr *factor(state *s) {
472442
/* <factor> = <power> {"^" <power>} */
473443
te_expr *ret = power(s);
474-
if (ret == NULL) {
475-
return NULL;
476-
}
444+
CHECK_NULL(ret);
477445

478446
int neg = 0;
479447

@@ -493,35 +461,21 @@ static te_expr *factor(state *s) {
493461
if (insertion) {
494462
/* Make exponentiation go right-to-left. */
495463
te_expr *p = power(s);
496-
if (p == NULL) {
497-
te_free(ret);
498-
return NULL;
499-
}
464+
CHECK_NULL(p, te_free(ret));
500465

501466
te_expr *insert = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, insertion->parameters[1], p);
502-
if (insert == NULL) {
503-
te_free(p);
504-
te_free(ret);
505-
return NULL;
506-
}
467+
CHECK_NULL(insert, te_free(p), te_free(ret));
507468

508469
insert->function = t;
509470
insertion->parameters[1] = insert;
510471
insertion = insert;
511472
} else {
512473
te_expr *p = power(s);
513-
if (p == NULL) {
514-
te_free(ret);
515-
return NULL;
516-
}
474+
CHECK_NULL(p, te_free(ret));
517475

518476
te_expr *prev = ret;
519477
ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, p);
520-
if (ret == NULL) {
521-
te_free(p);
522-
te_free(prev);
523-
return NULL;
524-
}
478+
CHECK_NULL(ret, te_free(p), te_free(prev));
525479

526480
ret->function = t;
527481
insertion = ret;
@@ -531,10 +485,7 @@ static te_expr *factor(state *s) {
531485
if (neg) {
532486
te_expr *prev = ret;
533487
ret = NEW_EXPR(TE_FUNCTION1 | TE_FLAG_PURE, ret);
534-
if (ret == NULL) {
535-
te_free(prev);
536-
return NULL;
537-
}
488+
CHECK_NULL(ret, te_free(prev));
538489

539490
ret->function = negate;
540491
}
@@ -545,26 +496,17 @@ static te_expr *factor(state *s) {
545496
static te_expr *factor(state *s) {
546497
/* <factor> = <power> {"^" <power>} */
547498
te_expr *ret = power(s);
548-
if (ret == NULL) {
549-
return NULL;
550-
}
499+
CHECK_NULL(ret);
551500

552501
while (s->type == TOK_INFIX && (s->function == pow)) {
553502
te_fun2 t = s->function;
554503
next_token(s);
555504
te_expr *p = power(s);
556-
if (p == NULL) {
557-
te_free(ret);
558-
return NULL;
559-
}
505+
CHECK_NULL(p, te_free(ret));
560506

561507
te_expr *prev = ret;
562508
ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, p);
563-
if (ret == NULL) {
564-
te_free(p);
565-
te_free(prev);
566-
return NULL;
567-
}
509+
CHECK_NULL(ret, te_free(p), te_free(prev));
568510

569511
ret->function = t;
570512
}
@@ -578,26 +520,17 @@ static te_expr *factor(state *s) {
578520
static te_expr *term(state *s) {
579521
/* <term> = <factor> {("*" | "/" | "%") <factor>} */
580522
te_expr *ret = factor(s);
581-
if (ret == NULL) {
582-
return NULL;
583-
}
523+
CHECK_NULL(ret);
584524

585525
while (s->type == TOK_INFIX && (s->function == mul || s->function == divide || s->function == fmod)) {
586526
te_fun2 t = s->function;
587527
next_token(s);
588528
te_expr *f = factor(s);
589-
if (f == NULL) {
590-
te_free(ret);
591-
return NULL;
592-
}
529+
CHECK_NULL(f, te_free(ret));
593530

594531
te_expr *prev = ret;
595532
ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, f);
596-
if (ret == NULL) {
597-
te_free(f);
598-
te_free(prev);
599-
return NULL;
600-
}
533+
CHECK_NULL(ret, te_free(f), te_free(prev));
601534

602535
ret->function = t;
603536
}
@@ -609,26 +542,17 @@ static te_expr *term(state *s) {
609542
static te_expr *expr(state *s) {
610543
/* <expr> = <term> {("+" | "-") <term>} */
611544
te_expr *ret = term(s);
612-
if (ret == NULL) {
613-
return NULL;
614-
}
545+
CHECK_NULL(ret);
615546

616547
while (s->type == TOK_INFIX && (s->function == add || s->function == sub)) {
617548
te_fun2 t = s->function;
618549
next_token(s);
619550
te_expr *te = term(s);
620-
if (te == NULL) {
621-
te_free(ret);
622-
return NULL;
623-
}
551+
CHECK_NULL(te, te_free(ret));
624552

625553
te_expr *prev = ret;
626554
ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, te);
627-
if (ret == NULL) {
628-
te_free(te);
629-
te_free(prev);
630-
return NULL;
631-
}
555+
CHECK_NULL(ret, te_free(te), te_free(prev));
632556

633557
ret->function = t;
634558
}
@@ -640,25 +564,16 @@ static te_expr *expr(state *s) {
640564
static te_expr *list(state *s) {
641565
/* <list> = <expr> {"," <expr>} */
642566
te_expr *ret = expr(s);
643-
if (ret == NULL) {
644-
return NULL;
645-
}
567+
CHECK_NULL(ret);
646568

647569
while (s->type == TOK_SEP) {
648570
next_token(s);
649571
te_expr *e = expr(s);
650-
if (e == NULL) {
651-
te_free(ret);
652-
return NULL;
653-
}
572+
CHECK_NULL(e, te_free(ret));
654573

655574
te_expr *prev = ret;
656575
ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, e);
657-
if (ret == NULL) {
658-
te_free(e);
659-
te_free(prev);
660-
return NULL;
661-
}
576+
CHECK_NULL(ret, te_free(e), te_free(prev));
662577

663578
ret->function = comma;
664579
}

0 commit comments

Comments
 (0)