MCPcopy Create free account
hub / github.com/KratosMultiphysics/Kratos / factor

Function factor

external_libraries/tinyexpr/tinyexpr/tinyexpr.c:474–527  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

472
473#ifdef TE_POW_FROM_RIGHT
474static te_expr *factor(state *s) {
475 /* <factor> = <power> {"^" <power>} */
476 te_expr *ret = power(s);
477 CHECK_NULL(ret);
478
479 int neg = 0;
480
481 if (ret->type == (TE_FUNCTION1 | TE_FLAG_PURE) && ret->function == negate) {
482 te_expr *se = ret->parameters[0];
483 free(ret);
484 ret = se;
485 neg = 1;
486 }
487
488 te_expr *insertion = 0;
489
490 while (s->type == TOK_INFIX && (s->function == pow)) {
491 te_fun2 t = s->function;
492 next_token(s);
493
494 if (insertion) {
495 /* Make exponentiation go right-to-left. */
496 te_expr *p = power(s);
497 CHECK_NULL(p, te_free(ret));
498
499 te_expr *insert = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, insertion->parameters[1], p);
500 CHECK_NULL(insert, te_free(p), te_free(ret));
501
502 insert->function = t;
503 insertion->parameters[1] = insert;
504 insertion = insert;
505 } else {
506 te_expr *p = power(s);
507 CHECK_NULL(p, te_free(ret));
508
509 te_expr *prev = ret;
510 ret = NEW_EXPR(TE_FUNCTION2 | TE_FLAG_PURE, ret, p);
511 CHECK_NULL(ret, te_free(p), te_free(prev));
512
513 ret->function = t;
514 insertion = ret;
515 }
516 }
517
518 if (neg) {
519 te_expr *prev = ret;
520 ret = NEW_EXPR(TE_FUNCTION1 | TE_FLAG_PURE, ret);
521 CHECK_NULL(ret, te_free(prev));
522
523 ret->function = negate;
524 }
525
526 return ret;
527}
528#else
529static te_expr *factor(state *s) {
530 /* <factor> = <power> {"^" <power>} */

Callers 3

termFunction · 0.85
operator*Method · 0.85
operator*Method · 0.85

Calls 3

next_tokenFunction · 0.85
te_freeFunction · 0.85
powerFunction · 0.70

Tested by

no test coverage detected