MCPcopy
hub / github.com/qax-os/excelize / calculate

Function calculate

calc.go:1337–1391  ·  view source on GitHub ↗

calculate evaluate basic arithmetic operations.

(opdStack *Stack, opt efp.Token)

Source from the content-addressed store, hash-verified

1335
1336// calculate evaluate basic arithmetic operations.
1337func calculate(opdStack *Stack, opt efp.Token) error {
1338 if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorPrefix {
1339 if opdStack.Len() < 1 {
1340 return ErrInvalidFormula
1341 }
1342 opd := opdStack.Pop().(formulaArg)
1343 opdStack.Push(newNumberFormulaArg(0 - opd.ToNumber().Number))
1344 }
1345 if opt.TValue == "-" && opt.TType == efp.TokenTypeOperatorInfix {
1346 if opdStack.Len() < 2 {
1347 return ErrInvalidFormula
1348 }
1349 rOpd := opdStack.Pop().(formulaArg)
1350 lOpd := opdStack.Pop().(formulaArg)
1351 if err := calcSubtract(rOpd, lOpd, opdStack); err != nil {
1352 return err
1353 }
1354 }
1355 tokenCalcFunc := map[string]func(rOpd, lOpd formulaArg, opdStack *Stack) error{
1356 "^": calcPow,
1357 "*": calcMultiply,
1358 "/": calcDiv,
1359 "+": calcAdd,
1360 "=": calcEq,
1361 "<>": calcNEq,
1362 "<": calcL,
1363 "<=": calcLe,
1364 ">": calcG,
1365 ">=": calcGe,
1366 "&": calcSplice,
1367 }
1368 if fn, ok := tokenCalcFunc[opt.TValue]; ok {
1369 if opdStack.Len() < 2 {
1370 return ErrInvalidFormula
1371 }
1372 rOpd := opdStack.Pop().(formulaArg)
1373 lOpd := opdStack.Pop().(formulaArg)
1374 if opt.TValue != "&" {
1375 if rOpd.Value() == "" {
1376 rOpd = newNumberFormulaArg(0)
1377 }
1378 if lOpd.Value() == "" {
1379 lOpd = newNumberFormulaArg(0)
1380 }
1381 }
1382 if rOpd.Type == ArgError {
1383 return errors.New(rOpd.Value())
1384 }
1385 if lOpd.Type == ArgError {
1386 return errors.New(lOpd.Value())
1387 }
1388 return fn(rOpd, lOpd, opdStack)
1389 }
1390 return nil
1391}
1392
1393// parseOperatorPrefixToken parse operator prefix token.
1394func (f *File) parseOperatorPrefixToken(optStack, opdStack *Stack, token efp.Token) (err error) {

Callers 4

evalInfixExpMethod · 0.85
prepareEvalInfixExpFunction · 0.85
parseTokenMethod · 0.85

Calls 7

newNumberFormulaArgFunction · 0.85
calcSubtractFunction · 0.85
LenMethod · 0.80
PopMethod · 0.80
PushMethod · 0.80
ToNumberMethod · 0.80
ValueMethod · 0.45

Tested by

no test coverage detected