Skip to content

Commit

Permalink
Fix segfault when conversion to base units failes because of aborted …
Browse files Browse the repository at this point in the history
…calculations; Fix element() function for vector when column number is specified (non-zero); Fix powmod() descriptives; Fix some memory leaks; Do not try to calculate norm() and magnitude() for matrices; Improve parsing of element-wise operators with comma as decimal separator; Fix segfault in some cases with curly brackets in expression; Remove temporary code; Increment version number; Update translations; Update currencies
  • Loading branch information
hanna-kn committed Apr 17, 2023
1 parent 1498908 commit f330c61
Show file tree
Hide file tree
Showing 38 changed files with 8,845 additions and 8,624 deletions.
60 changes: 60 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,63 @@
2023-04-17 Hanna Knutsson <[email protected]>

* Fix element() function for vector when column number is specified (non-zero)

2023-04-14 Hanna Knutsson <[email protected]>

* Improve parsing of element-wise operators with comma as decimal separator
* Fix segfault in some cases with curly brackets in expression

2023-04-13 Hanna Knutsson <[email protected]>

* Fix some memory leaks

2023-04-12 Hanna Knutsson <[email protected]>

* Fix segfault when conversion to base units fails because of aborted calculations
* Do not try to calculate norm() and magnitude() for matrices

2023-04-11 Hanna Knutsson <[email protected]>

* Fix rref() with different units for different elements
* Fix segfault trying to solve cbrt(x)^(1/3)-x=0 (and similar)
* Fix erroneous simplification of sin(x)^2*y-cos(x)*sin(x)^2*y (and similar)
* Fix division and exponentiation of scalar by matrix/vector, e.g. 4./[8 4.5]

2023-04-10 Hanna Knutsson <[email protected]>

* Fix segfault in function assignment with equals sign (e.g. F()=...), when an object with the same name already exists
* Improve abortion of calculations
* Replace temporary variables created during calculation after abortion
* Fix segfault with empty vector in uncertainty calculation
* Fix segfaults in some corner cases
* Fix some memory leaks
* Fix internal id does not exist error (primarily in some cases with functions without parentheses in matrices)

2023-04-06 Hanna Knutsson <[email protected]>

* Fix segfault in handling of vector variable with uncertainty
* Fix abortion with low max calculation time in qalc

2023-04-04 Hanna Knutsson <[email protected]>

* Do not make any difference between row and column vectors in magnitude(), norm(), and dot() functions

2023-04-02 Hanna Knutsson <[email protected]>

* Fix abbreviation for variable units (varunits) command in information (within qalc and in man page)

2023-04-01 Hanna Knutsson <[email protected]>

* Fix order of argument titles in csum() function

2023-03-26 Hanna Knutsson <[email protected]>

* Add modular exponentiation function, powmod(), with support for calculation of modular inverse

2023-03-25 Hanna Knutsson <[email protected]>

* Fix a^n mod b when n is negative

2023-03-04 Hanna Knutsson <[email protected]>

* Fix segfault in multisolve() and improve removal of equal solutions
Expand Down
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ dnl ----------------------
dnl | initialize autotools |---------------------------------------------------
dnl ----------------------

AC_INIT([libqalculate],[4.6.0])
AC_INIT([libqalculate],[4.6.1])
AC_CONFIG_SRCDIR(libqalculate/Calculator.cc)
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS(config.h)
Expand Down
60 changes: 30 additions & 30 deletions data/eurofxref-daily.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,37 @@
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time='2023-02-27'>
<Cube currency='USD' rate='1.0554'/>
<Cube currency='JPY' rate='143.88'/>
<Cube time='2023-04-11'>
<Cube currency='USD' rate='1.0905'/>
<Cube currency='JPY' rate='145.28'/>
<Cube currency='BGN' rate='1.9558'/>
<Cube currency='CZK' rate='23.619'/>
<Cube currency='DKK' rate='7.4426'/>
<Cube currency='GBP' rate='0.88073'/>
<Cube currency='HUF' rate='379.93'/>
<Cube currency='PLN' rate='4.7160'/>
<Cube currency='RON' rate='4.9198'/>
<Cube currency='SEK' rate='11.0595'/>
<Cube currency='CHF' rate='0.9929'/>
<Cube currency='ISK' rate='152.30'/>
<Cube currency='NOK' rate='10.9635'/>
<Cube currency='TRY' rate='19.9324'/>
<Cube currency='AUD' rate='1.5739'/>
<Cube currency='BRL' rate='5.4848'/>
<Cube currency='CAD' rate='1.4334'/>
<Cube currency='CNY' rate='7.3378'/>
<Cube currency='HKD' rate='8.2818'/>
<Cube currency='IDR' rate='16119.69'/>
<Cube currency='ILS' rate='3.8742'/>
<Cube currency='INR' rate='87.3360'/>
<Cube currency='KRW' rate='1396.00'/>
<Cube currency='MXN' rate='19.3777'/>
<Cube currency='MYR' rate='4.7266'/>
<Cube currency='NZD' rate='1.7185'/>
<Cube currency='PHP' rate='58.596'/>
<Cube currency='SGD' rate='1.4246'/>
<Cube currency='THB' rate='37.045'/>
<Cube currency='ZAR' rate='19.4574'/>
<Cube currency='CZK' rate='23.469'/>
<Cube currency='DKK' rate='7.4505'/>
<Cube currency='GBP' rate='0.87738'/>
<Cube currency='HUF' rate='375.23'/>
<Cube currency='PLN' rate='4.6690'/>
<Cube currency='RON' rate='4.9375'/>
<Cube currency='SEK' rate='11.4255'/>
<Cube currency='CHF' rate='0.9868'/>
<Cube currency='ISK' rate='149.50'/>
<Cube currency='NOK' rate='11.5435'/>
<Cube currency='TRY' rate='21.0333'/>
<Cube currency='AUD' rate='1.6387'/>
<Cube currency='BRL' rate='5.5072'/>
<Cube currency='CAD' rate='1.4732'/>
<Cube currency='CNY' rate='7.5080'/>
<Cube currency='HKD' rate='8.5603'/>
<Cube currency='IDR' rate='16263.25'/>
<Cube currency='ILS' rate='3.9722'/>
<Cube currency='INR' rate='89.5205'/>
<Cube currency='KRW' rate='1441.82'/>
<Cube currency='MXN' rate='19.7901'/>
<Cube currency='MYR' rate='4.8184'/>
<Cube currency='NZD' rate='1.7566'/>
<Cube currency='PHP' rate='59.996'/>
<Cube currency='SGD' rate='1.4526'/>
<Cube currency='THB' rate='37.361'/>
<Cube currency='ZAR' rate='19.9013'/>
</Cube>
</Cube>
</gesmes:Envelope>
8 changes: 4 additions & 4 deletions data/functions.xml.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<QALCULATE version="4.6.0">
<QALCULATE version="4.6.1">
<category>
<_title>Matrices &amp; Vectors</_title>
<builtin_function name="vector">
Expand Down Expand Up @@ -566,14 +566,14 @@
<_title>Denominator</_title>
</argument>
</builtin_function>
<builtin_function name="pwmod">
<builtin_function name="powmod">
<_title>Modular Exponentiation</_title>
<_description>Returns the modular inverse for negative exponents, and is otherwise equivalent to mod(a^b, c). For negative exponents the greatest common divisor of the numerator and the denominator must be 1.</_description>
<_description>Finds the modular inverse for negative exponents, and is otherwise equivalent to mod(a^b, c). For negative exponents the greatest common divisor of the numerator and the denominator must be 1.</_description>
<_names>r:powmod,power_mod</_names>
<argument index="1">
<_title>Numerator</_title>
</argument>
<argument index="3">
<argument index="2">
<_title>Exponent</_title>
</argument>
<argument index="3">
Expand Down
2 changes: 1 addition & 1 deletion data/rates.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"motd":{"msg":"If you or your company use this project or like what we doing, please consider backing us so we can continue maintaining and evolving this project.","url":"https://exchangerate.host/#/donate"},"success":true,"base":"EUR","date":"2023-02-28","rates":{"AED":3.884729,"AFN":93.822413,"ALL":115.086634,"AMD":414.200485,"ANG":1.903019,"AOA":535.347427,"ARS":208.148755,"AUD":1.574063,"AWG":1.906817,"AZN":1.798955,"BAM":1.955079,"BBD":2.116004,"BDT":112.550591,"BGN":1.951847,"BHD":0.398932,"BIF":2192.843063,"BMD":1.058261,"BND":1.424641,"BOB":7.291474,"BRL":5.502135,"BSD":1.059029,"BTC":0.000045,"BTN":87.436449,"BWP":14.052888,"BYN":2.66421,"BZD":2.127773,"CAD":1.437427,"CDF":2195.098035,"CHF":0.991266,"CLF":0.032099,"CLP":881.771029,"CNH":7.362251,"CNY":7.341305,"COP":5108.224378,"CRC":591.408448,"CUC":1.05855,"CUP":27.237214,"CVE":110.169735,"CZK":23.619001,"DJF":187.90536,"DKK":7.435844,"DOP":58.802953,"DZD":144.604634,"EGP":32.455838,"ERN":15.866517,"ETB":56.768796,"EUR":1,"FJD":2.347748,"FKP":0.87865,"GBP":0.878764,"GEL":2.781888,"GGP":0.878483,"GHS":13.558609,"GIP":0.878733,"GMD":64.522117,"GNF":9083.262235,"GTQ":8.247574,"GYD":222.626362,"HKD":8.301096,"HNL":26.019173,"HRK":7.528423,"HTG":158.602839,"HUF":378.159797,"IDR":16126.883722,"ILS":3.877936,"IMP":0.878657,"INR":87.492991,"IQD":1540.248527,"IRR":44742.206653,"ISK":152.165889,"JEP":0.878935,"JMD":162.39897,"JOD":0.751082,"JPY":144.171541,"KES":134.132036,"KGS":92.464577,"KHR":4265.688306,"KMF":491.582575,"KPW":951.962452,"KRW":1400.076482,"KWD":0.325326,"KYD":0.879355,"KZT":472.095311,"LAK":17861.409135,"LBP":15840.431778,"LKR":383.081507,"LRD":166.910989,"LSL":19.430353,"LYD":5.089856,"MAD":10.980985,"MDL":19.96837,"MGA":4527.470784,"MKD":61.562923,"MMK":2216.229712,"MNT":3603.668414,"MOP":8.530784,"MRU":38.340696,"MUR":48.815352,"MVR":16.247551,"MWK":1083.93846,"MXN":19.447996,"MYR":4.74465,"MZN":67.642438,"NAD":19.483619,"NGN":485.442575,"NIO":38.563012,"NOK":10.965659,"NPR":139.902564,"NZD":1.72006,"OMR":0.408223,"PAB":1.058654,"PEN":4.03407,"PGK":3.720018,"PHP":58.463271,"PKR":272.021417,"PLN":4.711698,"PYG":7690.886255,"QAR":3.851945,"RON":4.91947,"RSD":117.205624,"RUB":78.552789,"RWF":1149.263994,"SAR":3.970089,"SBD":8.708681,"SCR":13.99628,"SDG":623.535395,"SEK":11.013227,"SGD":1.42718,"SHP":0.878528,"SLL":18684.894938,"SOS":600.013348,"SRD":35.851903,"SSP":137.781567,"STD":24141.741573,"STN":24.480419,"SVC":9.234079,"SYP":2657.592496,"SZL":19.422408,"THB":37.167974,"TJS":10.592543,"TMT":3.713563,"TND":3.333984,"TOP":2.4966,"TRY":19.977993,"TTD":7.163048,"TWD":32.501562,"TZS":2472.985994,"UAH":38.786401,"UGX":3928.163282,"USD":1.058897,"UYU":41.020817,"UZS":11977.684744,"VES":25.793867,"VND":25154.236111,"VUV":124.859871,"WST":2.85398,"XAF":655.385818,"XAG":0.051071,"XAU":0.001139,"XCD":2.858787,"XDR":0.795847,"XOF":655.385904,"XPD":0.001333,"XPF":119.22839,"XPT":0.001467,"YER":264.804221,"ZAR":19.515744,"ZMW":20.870223,"ZWL":340.591573}}
{"motd":{"msg":"If you or your company use this project or like what we doing, please consider backing us so we can continue maintaining and evolving this project.","url":"https://exchangerate.host/#/donate"},"success":true,"base":"EUR","date":"2023-04-12","rates":{"AED":4.010542,"AFN":94.434503,"ALL":112.955161,"AMD":425.968924,"ANG":1.969857,"AOA":555.112502,"ARS":233.444641,"AUD":1.638272,"AWG":1.967109,"AZN":1.856483,"BAM":1.956348,"BBD":2.184574,"BDT":116.173822,"BGN":1.955643,"BHD":0.412045,"BIF":2272.3554,"BMD":1.093107,"BND":1.454689,"BOB":7.566717,"BRL":5.466923,"BSD":1.093423,"BTC":0.000036,"BTN":89.450145,"BWP":14.41415,"BYN":2.758982,"BZD":2.202302,"CAD":1.469821,"CDF":2256.803483,"CHF":0.985799,"CLF":0.032647,"CLP":884.006719,"CNH":7.52927,"CNY":7.522605,"COP":4976.050696,"CRC":586.871668,"CUC":1.092745,"CUP":28.122701,"CVE":110.466399,"CZK":23.458,"DJF":194.026755,"DKK":7.449728,"DOP":59.971458,"DZD":148.164832,"EGP":33.638106,"ERN":16.381637,"ETB":59.300714,"EUR":1,"FJD":2.419485,"FKP":0.879601,"GBP":0.879211,"GEL":2.75817,"GGP":0.879383,"GHS":11.858282,"GIP":0.879302,"GMD":67.92925,"GNF":9413.198996,"GTQ":8.519937,"GYD":231.08804,"HKD":8.57429,"HNL":26.851125,"HRK":7.531252,"HTG":169.359512,"HUF":375.854476,"IDR":16213.148106,"ILS":3.99691,"IMP":0.878737,"INR":89.642224,"IQD":1595.024779,"IRR":46141.558661,"ISK":149.237271,"JEP":0.879506,"JMD":165.528313,"JOD":0.77508,"JPY":146.147888,"KES":146.069622,"KGS":95.472505,"KHR":4436.837631,"KMF":492.912207,"KPW":982.897955,"KRW":1447.727023,"KWD":0.335594,"KYD":0.91147,"KZT":493.053899,"LAK":18752.809975,"LBP":16489.387241,"LKR":349.112145,"LRD":177.850474,"LSL":20.025423,"LYD":5.215162,"MAD":11.109658,"MDL":19.71521,"MGA":4774.432051,"MKD":61.669564,"MMK":2294.476031,"MNT":3843.128304,"MOP":8.835089,"MRU":37.459966,"MUR":49.386195,"MVR":16.775165,"MWK":1114.714712,"MXN":19.853488,"MYR":4.822208,"MZN":69.786291,"NAD":20.062488,"NGN":502.730576,"NIO":39.922061,"NOK":11.512953,"NPR":143.120239,"NZD":1.761953,"OMR":0.421481,"PAB":1.093095,"PEN":4.134821,"PGK":3.850606,"PHP":60.153651,"PKR":315.162137,"PLN":4.667854,"PYG":7833.348393,"QAR":3.97556,"RON":4.934653,"RSD":117.199398,"RUB":89.782681,"RWF":1207.19509,"SAR":4.097989,"SBD":9.049375,"SCR":14.699999,"SDG":654.71932,"SEK":11.397877,"SGD":1.454931,"SHP":0.879101,"SLL":19292.087019,"SOS":621.05477,"SRD":39.953264,"SSP":142.25863,"STD":24926.260469,"STN":24.897441,"SVC":9.562003,"SYP":2743.954187,"SZL":20.010098,"THB":37.402837,"TJS":11.915334,"TMT":3.823174,"TND":3.332173,"TOP":2.576363,"TRY":21.08374,"TTD":7.418787,"TWD":33.336444,"TZS":2556.625666,"UAH":40.352741,"UGX":4075.204751,"USD":1.093111,"UYU":42.279691,"UZS":12476.267547,"VES":26.606404,"VND":25609.284114,"VUV":129.938446,"WST":2.977017,"XAF":655.684295,"XAG":0.043227,"XAU":0.001667,"XCD":2.951895,"XDR":0.810887,"XOF":655.684495,"XPD":0.001841,"XPF":119.28276,"XPT":0.001619,"YER":273.382804,"ZAR":20.060083,"ZMW":21.115576,"ZWL":351.659293}}
2 changes: 1 addition & 1 deletion docs/reference/Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.

PROJECT_NAME = libqalculate-4.6.0
PROJECT_NAME = libqalculate-4.6.1

# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
Expand Down
54 changes: 40 additions & 14 deletions libqalculate/BuiltinFunctions-matrixvector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -263,26 +263,31 @@ int ElementsFunction::calculate(MathStructure &mstruct, const MathStructure &var
return 1;
}
ElementFunction::ElementFunction() : MathFunction("element", 2, 3) {
setArgumentDefinition(1, new VectorArgument(""));
setArgumentDefinition(1, new MatrixArgument(""));
setArgumentDefinition(2, new IntegerArgument("", ARGUMENT_MIN_MAX_POSITIVE, true, true, INTEGER_TYPE_SIZE));
setArgumentDefinition(3, new IntegerArgument("", ARGUMENT_MIN_MAX_NONE, true, true, INTEGER_TYPE_SIZE));
setDefaultValue(3, "0");
}
bool ElementFunction::representsScalar(const MathStructure &vargs) const {
if(vargs.size() >= 2 && vargs[0].isVector() && vargs[1].isInteger() && vargs[1].number().isPositive()) {
if(vargs.size() >= 2 && vargs[0].isMatrix() && vargs[1].isInteger() && vargs[1].number().isPositive()) {
if(vargs.size() == 2 || vargs[2].isZero()) {
if(vargs[1].number() <= vargs[0].size()) return vargs[0][vargs[1].number().uintValue() - 1].representsScalar();
} else if(vargs[0].isMatrix() && vargs[1].number() <= vargs[0].size() && vargs[2].isInteger() && vargs[2].number().isPositive() && vargs[2].number() <= vargs[0][0].size()) {
if(vargs[0].size() == 1 && vargs[1].number() <= vargs[0][0].size()) return vargs[0][0][vargs[1].number().uintValue() - 1].representsScalar();
if(vargs[1].number() <= vargs[0].size() && vargs[0][0].size() == 1) return vargs[0][vargs[1].number().uintValue() - 1][0].representsScalar();
} else if(vargs[1].number() <= vargs[0].size() && vargs[2].isInteger() && vargs[2].number().isPositive() && vargs[2].number() <= vargs[0][0].size()) {
return vargs[0][vargs[1].number().uintValue() - 1][vargs[2].number().uintValue() - 1].representsScalar();
}
}
return false;
}
bool ElementFunction::representsNonMatrix(const MathStructure &vargs) const {
if(vargs.size() >= 2 && vargs[0].isVector() && vargs[1].isInteger() && vargs[1].number().isPositive()) {
if(vargs.size() >= 2 && vargs[0].isMatrix() && vargs[1].isInteger() && vargs[1].number().isPositive()) {
if(vargs.size() == 2 || vargs[2].isZero()) {
if(vargs[1].number() <= vargs[0].size()) return vargs[0][vargs[1].number().uintValue() - 1].representsNonMatrix();
} else if(vargs[0].isMatrix() && vargs[1].number() <= vargs[0].size() && vargs[2].isInteger() && vargs[2].number().isPositive() && vargs[2].number() <= vargs[0][0].size()) {
if(vargs[0].size() == 1 && vargs[1].number() <= vargs[0][0].size()) return vargs[0][0][vargs[1].number().uintValue() - 1].representsNonMatrix();
if(vargs[1].number() <= vargs[0].size()) {
if(vargs[0][0].size() == 1) return vargs[0][vargs[1].number().uintValue() - 1][0].representsNonMatrix();
else return vargs[0][vargs[1].number().uintValue() - 1].representsNonMatrix();
}
} else if(vargs[1].number() <= vargs[0].size() && vargs[2].isInteger() && vargs[2].number().isPositive() && vargs[2].number() <= vargs[0][0].size()) {
return vargs[0][vargs[1].number().uintValue() - 1][vargs[2].number().uintValue() - 1].representsNonMatrix();
}
}
Expand All @@ -292,19 +297,24 @@ int ElementFunction::calculate(MathStructure &mstruct, const MathStructure &varg
size_t row = (size_t) vargs[1].number().uintValue();
size_t col = (size_t) vargs[2].number().uintValue();
if(col == 0) {
if(row > vargs[0].size()) {
CALCULATOR->error(true, _("Element %s does not exist in vector."), format_and_print(vargs[0]).c_str(), NULL);
return 0;
if(vargs[0].size() == 1 && vargs[0][0].size() >= row) {
mstruct = vargs[0][0][row - 1];
return 1;
}
mstruct = vargs[0][row - 1];
return 1;
if(vargs[0].size() >= row) {
if(vargs[0][0].size() == 1) mstruct = vargs[0][row - 1][0];
else mstruct = vargs[0][row - 1];
return 1;
}
CALCULATOR->error(true, _("Element %s does not exist in vector."), format_and_print(vargs[1]).c_str(), NULL);
return 0;
}
if(col > vargs[0].columns()) {
CALCULATOR->error(true, _("Column %s does not exist in matrix."), format_and_print(vargs[1]).c_str(), NULL);
CALCULATOR->error(true, _("Column %s does not exist in matrix."), format_and_print(vargs[2]).c_str(), NULL);
return 0;
}
if(row > vargs[0].rows()) {
CALCULATOR->error(true, _("Row %s does not exist in matrix."), format_and_print(vargs[0]).c_str(), NULL);
CALCULATOR->error(true, _("Row %s does not exist in matrix."), format_and_print(vargs[1]).c_str(), NULL);
return 0;
}
const MathStructure *em = vargs[0].getElement(row, col);
Expand Down Expand Up @@ -471,7 +481,15 @@ MagnitudeFunction::MagnitudeFunction() : MathFunction("magnitude", 1) {
setArgumentDefinition(1, new VectorArgument(""));
}
int MagnitudeFunction::calculate(MathStructure &mstruct, const MathStructure &vargs, const EvaluationOptions &eo) {
if(vargs[0].isMatrix()) return 0;
mstruct = vargs[0];
if(!mstruct.representsNonMatrix()) {
CALCULATOR->beginTemporaryStopMessages();
mstruct.eval(eo);
CALCULATOR->endTemporaryStopMessages();
if(mstruct.isMatrix()) return 0;
mstruct = vargs[0];
}
if(mstruct.size() == 1) {
mstruct.setType(STRUCT_FUNCTION);
mstruct.setFunctionId(FUNCTION_ID_ABS);
Expand All @@ -493,7 +511,15 @@ NormFunction::NormFunction() : MathFunction("norm", 1, 2) {
setDefaultValue(2, "2");
}
int NormFunction::calculate(MathStructure &mstruct, const MathStructure &vargs, const EvaluationOptions &eo) {
if(vargs[0].isMatrix()) return 0;
mstruct = vargs[0];
if(!mstruct.representsNonMatrix()) {
CALCULATOR->beginTemporaryStopMessages();
mstruct.eval(eo);
CALCULATOR->endTemporaryStopMessages();
if(mstruct.isMatrix()) return 0;
mstruct = vargs[0];
}
if(mstruct.size() == 1) {
mstruct.setType(STRUCT_FUNCTION);
mstruct.setFunctionId(FUNCTION_ID_ABS);
Expand Down
1 change: 0 additions & 1 deletion libqalculate/Calculator-calculate.cc
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,6 @@ bool Calculator::abort() {
while(b_busy && msecs > 0) {
sleep_ms(10);
msecs -= 10;
if(i_aborted == 1 && msecs < 4000) i_aborted = 3;
}
if(b_busy) {

Expand Down
Loading

0 comments on commit f330c61

Please sign in to comment.