MCPcopy Create free account
hub / github.com/crownengine/crown / factor

Function factor

3rdparty/tinyexpr/tinyexpr.c:448–501  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

446
447#ifdef TE_POW_FROM_RIGHT
448static te_expr *factor(state *s) {
449 /* <factor> = <power> {"^" <power>} */
450 te_expr *ret = power(s);
451 CHECK_NULL(ret);
452
453 int neg = 0;
454
455 if (ret->type == (TE_FUNCTION1 | TE_FLAG_PURE) && ret->function == negate) {
456 te_expr *se = ret->parameters[0];
457 free(ret);
458 ret = se;
459 neg = 1;
460 }
461
462 te_expr *insertion = 0;
463
464 while (s->type == TOK_INFIX && (s->function == pow)) {
465 te_fun2 t = s->function;
466 next_token(s);
467
468 if (insertion) {
469 /* Make exponentiation go right-to-left. */
470 te_expr *p = power(s);
471 CHECK_NULL(p, te_free(ret));
472
473 te_expr *insert = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, insertion->parameters[1], p);
474 CHECK_NULL(insert, te_free(p), te_free(ret));
475
476 insert->function = t;
477 insertion->parameters[1] = insert;
478 insertion = insert;
479 } else {
480 te_expr *p = power(s);
481 CHECK_NULL(p, te_free(ret));
482
483 te_expr *prev = ret;
484 ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, p);
485 CHECK_NULL(ret, te_free(p), te_free(prev));
486
487 ret->function = t;
488 insertion = ret;
489 }
490 }
491
492 if (neg) {
493 te_expr *prev = ret;
494 ret = NEW_EXPR(TE_FUNCTION1 | TE_FLAG_PURE, ret);
495 CHECK_NULL(ret, te_free(prev));
496
497 ret->function = negate;
498 }
499
500 return ret;
501}
502#else
503static te_expr *factor(state *s) {
504 /* <factor> = <power> {"^" <power>} */

Callers 1

termFunction · 0.85

Calls 4

powerFunction · 0.85
next_tokenFunction · 0.85
te_freeFunction · 0.85
freeFunction · 0.50

Tested by

no test coverage detected