Skip to content

Commit a2311af

Browse files
committed
CHECK_NULL macro
1 parent b11af53 commit a2311af

File tree

1 file changed

+30
-108
lines changed

1 file changed

+30
-108
lines changed

tinyexpr.c

Lines changed: 30 additions & 108 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;
@@ -411,9 +397,7 @@ static te_expr *base(state *s) {
411397
case TOK_OPEN:
412398
next_token(s);
413399
ret = list(s);
414-
if (ret == NULL) {
415-
return NULL;
416-
}
400+
CHECK_NULL(ret);
417401

418402
if (s->type != TOK_CLOSE) {
419403
s->type = TOK_ERROR;
@@ -424,9 +408,7 @@ static te_expr *base(state *s) {
424408

425409
default:
426410
ret = new_expr(0, 0);
427-
if (ret == NULL) {
428-
return NULL;
429-
}
411+
CHECK_NULL(ret);
430412

431413
s->type = TOK_ERROR;
432414
ret->value = NAN;
@@ -451,15 +433,10 @@ static te_expr *power(state *s) {
451433
ret = base(s);
452434
} else {
453435
te_expr *b = base(s);
454-
if (b == NULL) {
455-
return NULL;
456-
}
436+
CHECK_NULL(b);
457437

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

464441
ret->function = negate;
465442
}
@@ -471,9 +448,7 @@ static te_expr *power(state *s) {
471448
static te_expr *factor(state *s) {
472449
/* <factor> = <power> {"^" <power>} */
473450
te_expr *ret = power(s);
474-
if (ret == NULL) {
475-
return NULL;
476-
}
451+
CHECK_NULL(ret);
477452

478453
int neg = 0;
479454

@@ -493,35 +468,21 @@ static te_expr *factor(state *s) {
493468
if (insertion) {
494469
/* Make exponentiation go right-to-left. */
495470
te_expr *p = power(s);
496-
if (p == NULL) {
497-
te_free(ret);
498-
return NULL;
499-
}
471+
CHECK_NULL(p, te_free(ret));
500472

501473
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-
}
474+
CHECK_NULL(insert, te_free(p), te_free(ret));
507475

508476
insert->function = t;
509477
insertion->parameters[1] = insert;
510478
insertion = insert;
511479
} else {
512480
te_expr *p = power(s);
513-
if (p == NULL) {
514-
te_free(ret);
515-
return NULL;
516-
}
481+
CHECK_NULL(p, te_free(ret));
517482

518483
te_expr *prev = ret;
519484
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-
}
485+
CHECK_NULL(ret, te_free(p), te_free(prev));
525486

526487
ret->function = t;
527488
insertion = ret;
@@ -531,10 +492,7 @@ static te_expr *factor(state *s) {
531492
if (neg) {
532493
te_expr *prev = ret;
533494
ret = NEW_EXPR(TE_FUNCTION1 | TE_FLAG_PURE, ret);
534-
if (ret == NULL) {
535-
te_free(prev);
536-
return NULL;
537-
}
495+
CHECK_NULL(ret, te_free(prev));
538496

539497
ret->function = negate;
540498
}
@@ -545,26 +503,17 @@ static te_expr *factor(state *s) {
545503
static te_expr *factor(state *s) {
546504
/* <factor> = <power> {"^" <power>} */
547505
te_expr *ret = power(s);
548-
if (ret == NULL) {
549-
return NULL;
550-
}
506+
CHECK_NULL(ret);
551507

552508
while (s->type == TOK_INFIX && (s->function == pow)) {
553509
te_fun2 t = s->function;
554510
next_token(s);
555511
te_expr *p = power(s);
556-
if (p == NULL) {
557-
te_free(ret);
558-
return NULL;
559-
}
512+
CHECK_NULL(p, te_free(ret));
560513

561514
te_expr *prev = ret;
562515
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-
}
516+
CHECK_NULL(ret, te_free(p), te_free(prev));
568517

569518
ret->function = t;
570519
}
@@ -578,26 +527,17 @@ static te_expr *factor(state *s) {
578527
static te_expr *term(state *s) {
579528
/* <term> = <factor> {("*" | "/" | "%") <factor>} */
580529
te_expr *ret = factor(s);
581-
if (ret == NULL) {
582-
return NULL;
583-
}
530+
CHECK_NULL(ret);
584531

585532
while (s->type == TOK_INFIX && (s->function == mul || s->function == divide || s->function == fmod)) {
586533
te_fun2 t = s->function;
587534
next_token(s);
588535
te_expr *f = factor(s);
589-
if (f == NULL) {
590-
te_free(ret);
591-
return NULL;
592-
}
536+
CHECK_NULL(f, te_free(ret));
593537

594538
te_expr *prev = ret;
595539
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-
}
540+
CHECK_NULL(ret, te_free(f), te_free(prev));
601541

602542
ret->function = t;
603543
}
@@ -609,26 +549,17 @@ static te_expr *term(state *s) {
609549
static te_expr *expr(state *s) {
610550
/* <expr> = <term> {("+" | "-") <term>} */
611551
te_expr *ret = term(s);
612-
if (ret == NULL) {
613-
return NULL;
614-
}
552+
CHECK_NULL(ret);
615553

616554
while (s->type == TOK_INFIX && (s->function == add || s->function == sub)) {
617555
te_fun2 t = s->function;
618556
next_token(s);
619557
te_expr *te = term(s);
620-
if (te == NULL) {
621-
te_free(ret);
622-
return NULL;
623-
}
558+
CHECK_NULL(te, te_free(ret));
624559

625560
te_expr *prev = ret;
626561
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-
}
562+
CHECK_NULL(ret, te_free(te), te_free(prev));
632563

633564
ret->function = t;
634565
}
@@ -640,25 +571,16 @@ static te_expr *expr(state *s) {
640571
static te_expr *list(state *s) {
641572
/* <list> = <expr> {"," <expr>} */
642573
te_expr *ret = expr(s);
643-
if (ret == NULL) {
644-
return NULL;
645-
}
574+
CHECK_NULL(ret);
646575

647576
while (s->type == TOK_SEP) {
648577
next_token(s);
649578
te_expr *e = expr(s);
650-
if (e == NULL) {
651-
te_free(ret);
652-
return NULL;
653-
}
579+
CHECK_NULL(e, te_free(ret));
654580

655581
te_expr *prev = ret;
656582
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-
}
583+
CHECK_NULL(ret, te_free(e), te_free(prev));
662584

663585
ret->function = comma;
664586
}

0 commit comments

Comments
 (0)