contrib/bc: merge from vendor release 5.3.3
This update fixes a build issue of release 5.3.2 on the FreeBSD base system. Merge commit '3f739b0595b7d6ac4bac9aaa1cae0910f11f92e2' MFC after: 2 weeks
This commit is contained in:
commit
f53b5fe786
152
contrib/bc/.clang-format
Normal file
152
contrib/bc/.clang-format
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: LLVM
|
||||||
|
AccessModifierOffset: 1
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveBitFields: true
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignConsecutiveMacros: false
|
||||||
|
AlignEscapedNewlines: Left
|
||||||
|
AlignOperands: Align
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllArgumentsOnNextLine: false
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortEnumsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: None
|
||||||
|
AllowShortIfStatementsOnASingleLine: AllIfsAndElse
|
||||||
|
AllowShortLambdasOnASingleLine: Empty
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterReturnType: All
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: true
|
||||||
|
#AttributeMacros: []
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
#BitFieldColonSpacing: Both
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: true
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: true
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: true
|
||||||
|
AfterObjCDeclaration: true
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
AfterExternBlock: true
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
BeforeWhile: true
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
SplitEmptyNamespace: false
|
||||||
|
BreakAfterJavaFieldAnnotations: true
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
#BreakBeforeConceptDeclarations: true
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakBeforeTernaryOperators: false
|
||||||
|
BreakConstructorInitializers: AfterColon
|
||||||
|
BreakInheritanceList: AfterColon
|
||||||
|
BreakStringLiterals: false
|
||||||
|
ColumnLimit: 80
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
DeriveLineEnding: false
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<(sys|arpa|net|netinet)/.*\.h>'
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<(args|bc|bcl|dc|file|history|lang|lex|library|num|opt|parse|program|rand|read|status|vector|version|vm)\.h>'
|
||||||
|
Priority: 3
|
||||||
|
- Regex: '^<.*\.h>'
|
||||||
|
Priority: 0
|
||||||
|
- Regex: '^<.*>'
|
||||||
|
Priority: 1
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IncludeIsMainSourceRegex: ''
|
||||||
|
IndentCaseLabels: true
|
||||||
|
IndentExternBlock: NoIndent
|
||||||
|
IndentGotoLabels: false
|
||||||
|
IndentPPDirectives: None
|
||||||
|
#IndentPragmas: false
|
||||||
|
#IndentRequires: true
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
InsertTrailingCommas: None
|
||||||
|
JavaImportGroups: []
|
||||||
|
JavaScriptQuotes: Double
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
Language: Cpp
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
NamespaceMacros: []
|
||||||
|
ObjCBinPackProtocolList: Always
|
||||||
|
ObjCBlockIndentWidth: 4
|
||||||
|
ObjCBreakBeforeNestedBlockParam: true
|
||||||
|
ObjCSpaceAfterProperty: true
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 1000
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 429496720
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 42949672
|
||||||
|
PenaltyBreakString: 10000
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 42949672
|
||||||
|
PenaltyIndentedWhitespace: 1
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
PointerAlignment: Left
|
||||||
|
#RawStringFormats:
|
||||||
|
# This is used to get spaces around a bitwise and operator.
|
||||||
|
ReferenceAlignment: Middle
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: false
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
#SpaceAroundPointerQualifiers: Default
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: true
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Latest
|
||||||
|
TabWidth: 4
|
||||||
|
TypenameMacros: []
|
||||||
|
UseCRLF: false
|
||||||
|
UseTab: ForIndentation
|
||||||
|
WhitespaceSensitiveMacros: []
|
||||||
|
...
|
43
contrib/bc/.clang-tidy
Normal file
43
contrib/bc/.clang-tidy
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Checks: 'clang-diagnostic-*,clang-analyzer-*'
|
||||||
|
WarningsAsErrors: 'clang-diagnostic-*,clang-analyzer-*'
|
||||||
|
HeaderFilterRegex: ''
|
||||||
|
AnalyzeTemporaryDtors: false
|
||||||
|
FormatStyle: file
|
||||||
|
CheckOptions:
|
||||||
|
- key: llvm-else-after-return.WarnOnConditionVariables
|
||||||
|
value: 'false'
|
||||||
|
- key: modernize-loop-convert.MinConfidence
|
||||||
|
value: reasonable
|
||||||
|
- key: modernize-replace-auto-ptr.IncludeStyle
|
||||||
|
value: llvm
|
||||||
|
- key: cert-str34-c.DiagnoseSignedUnsignedCharComparisons
|
||||||
|
value: 'false'
|
||||||
|
- key: google-readability-namespace-comments.ShortNamespaceLines
|
||||||
|
value: '10'
|
||||||
|
- key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField
|
||||||
|
value: 'false'
|
||||||
|
- key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic
|
||||||
|
value: 'true'
|
||||||
|
- key: cert-dcl16-c.NewSuffixes
|
||||||
|
value: 'L;LL;LU;LLU'
|
||||||
|
- key: google-readability-braces-around-statements.ShortStatementLines
|
||||||
|
value: '1'
|
||||||
|
- key: modernize-pass-by-value.IncludeStyle
|
||||||
|
value: llvm
|
||||||
|
- key: google-readability-namespace-comments.SpacesBeforeComments
|
||||||
|
value: '2'
|
||||||
|
- key: modernize-loop-convert.MaxCopySize
|
||||||
|
value: '16'
|
||||||
|
- key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors
|
||||||
|
value: 'true'
|
||||||
|
- key: modernize-use-nullptr.NullMacros
|
||||||
|
value: 'NULL'
|
||||||
|
- key: llvm-qualified-auto.AddConstToQualified
|
||||||
|
value: 'false'
|
||||||
|
- key: modernize-loop-convert.NamingStyle
|
||||||
|
value: CamelCase
|
||||||
|
- key: llvm-else-after-return.WarnOnUnfixable
|
||||||
|
value: 'false'
|
||||||
|
- key: google-readability-function-size.StatementThreshold
|
||||||
|
value: '800'
|
||||||
|
...
|
@ -1,5 +1,19 @@
|
|||||||
# News
|
# News
|
||||||
|
|
||||||
|
## 5.3.3
|
||||||
|
|
||||||
|
This is a production release that fixes a build problem in the FreeBSD base
|
||||||
|
system.
|
||||||
|
|
||||||
|
All other users do **NOT** need to upgrade.
|
||||||
|
|
||||||
|
## 5.3.2
|
||||||
|
|
||||||
|
This is a production release that fixes prompt bugs with editline and readline
|
||||||
|
where the `BC_PROMPT` environment variable was not being respected.
|
||||||
|
|
||||||
|
This also fixes editline and readline output on `EOF`.
|
||||||
|
|
||||||
## 5.3.1
|
## 5.3.1
|
||||||
|
|
||||||
This is a production release that fixes a build problem in the FreeBSD base
|
This is a production release that fixes a build problem in the FreeBSD base
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
print "scale = 20\n"
|
|
||||||
print "x = 1234567890 / scale\n"
|
|
||||||
print "len = length(x) + 1 + scale\n"
|
|
||||||
print "len *= 2\n"
|
|
||||||
|
|
||||||
scale = 20
|
|
||||||
x = 1234567890 / scale
|
|
||||||
len = length(x) + 1 + scale
|
|
||||||
len *= 2
|
|
||||||
|
|
||||||
for (i = 0; i <= len; ++i) {
|
|
||||||
print "a[", i, "] = x * (10^", i, ")\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i <= 10000; ++i) {
|
|
||||||
for (j = 0; j < len; ++j) {
|
|
||||||
print "v = a[", i, "] + a[", j, "]\n"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
#! /usr/bin/bc
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
max = 1000000
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
print "a", i, "[0] = ", i, "\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,38 +0,0 @@
|
|||||||
#! /usr/bin/bc
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
max = 1000000
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
print "b", i, "[100] = ", i, "\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,18 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
scale = 0
|
|
||||||
max = 10000
|
|
||||||
|
|
||||||
print "scale = 0\n"
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
|
|
||||||
a = rand()
|
|
||||||
b = rand()
|
|
||||||
|
|
||||||
print "band(", a, ", ", b, ")\n"
|
|
||||||
print "bor(", a, ", ", b, ")\n"
|
|
||||||
print "bxor(", a, ", ", b, ")\n"
|
|
||||||
print "bshl(", a, ", ", b % 32, ")\n"
|
|
||||||
print "bshr(", a, ", ", b % 32, ")\n"
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
#! /usr/bin/bc
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
max = 1000
|
|
||||||
max2 = 1000
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
|
|
||||||
print "c = ", i, "\n"
|
|
||||||
print "e = 0.", i, "\n"
|
|
||||||
|
|
||||||
for (j = 0; j < max2; ++j) {
|
|
||||||
print "d = ", i, ".", j, "\n"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
print "scale = 20\n"
|
|
||||||
print "x = 1234567890 * 10^(-scale)\n"
|
|
||||||
print "len = 1 + 2 * scale\n"
|
|
||||||
print "scale += 10\n"
|
|
||||||
|
|
||||||
scale = 20
|
|
||||||
x = 1234567890 * 10^(-scale)
|
|
||||||
len = 1 + 2 * scale
|
|
||||||
|
|
||||||
scale += 10
|
|
||||||
|
|
||||||
for (i = 0; i <= len; ++i) {
|
|
||||||
print "a[", i, "] = x * (10^", i, ")\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i <= 10000; ++i) {
|
|
||||||
for (j = 0; j < len; ++j) {
|
|
||||||
print "v = a[0] / a[", j, "]\n"
|
|
||||||
print "v = a[", i, "] / a[", j, "]\n"
|
|
||||||
print "v = (a[0] * ", i, ") / a[", j, "]\n"
|
|
||||||
print "v = a[0] / (a[", j, "] * ", i, ")\n"
|
|
||||||
print "v = (a[0] * ", i, ") / (a[", j, "] * ", i, ")\n"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
#! /usr/bin/bc
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
max = 1000000
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
print "define etsna", i, "(n) {\n\tn\n}\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,12 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
start = 2^256
|
|
||||||
end = start + 10000000
|
|
||||||
|
|
||||||
for (i = start; i < end; ++i) {
|
|
||||||
print "irand(", i, ")\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,9 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
for (i = 2; i < 10000000; ++i) {
|
|
||||||
print "irand(", i, ")\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,11 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
print "for (i = 100; i < 1000; ++i) {\n"
|
|
||||||
print " v = pi(i)\n"
|
|
||||||
print " v = e(v)\n"
|
|
||||||
print " v = l(v)\n"
|
|
||||||
print "}\n"
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,23 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
print "scale = 20\n"
|
|
||||||
print "x = 1234567890 / scale\n"
|
|
||||||
print "len = length(x) + 1 + scale\n"
|
|
||||||
|
|
||||||
scale = 20
|
|
||||||
x = 1234567890 / scale
|
|
||||||
len = length(x) + 1 + scale
|
|
||||||
|
|
||||||
for (i = 0; i <= len; ++i) {
|
|
||||||
print "a[", i, "] = x * (10^", i, ")\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i <= 10000; ++i) {
|
|
||||||
for (j = 0; j < len; ++j) {
|
|
||||||
print "v = a[0] * a[", j, "]\n"
|
|
||||||
print "v = a[", i, "] * a[", j, "]\n"
|
|
||||||
print "v = (a[0] * ", i, ") * a[", j, "]\n"
|
|
||||||
print "v = a[0] * (a[", j, "] * ", i, ")\n"
|
|
||||||
print "v = (a[0] * ", i, ") * (a[", j, "] * ", i, ")\n"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
max = 1000000
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
print "i++\ni--\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,2 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
|||||||
#! /usr/bin/bc
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
max = 1000000
|
|
||||||
|
|
||||||
print "\qasotehnuasnotehustnaoheusntaoheustnaoheusntaoehunsatoheuastoehuaosnetuhaosetnuhaosentuahoesntuahoeuhstoeunhatoehusanotehusatnoheus\q\n"
|
|
||||||
|
|
||||||
for (i = 0; i < max; ++i) {
|
|
||||||
print "\qabc", i, " = ", i, "\\n\q\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
print "halt\n"
|
|
||||||
|
|
||||||
halt
|
|
@ -1,22 +0,0 @@
|
|||||||
#! /usr/bin/bc -lq
|
|
||||||
|
|
||||||
print "scale = 20\n"
|
|
||||||
print "x = 1234567890 / scale\n"
|
|
||||||
print "len = length(x) + 1 + scale\n"
|
|
||||||
print "len *= 2\n"
|
|
||||||
|
|
||||||
scale = 20
|
|
||||||
x = 1234567890 / scale
|
|
||||||
len = length(x) + 1 + scale
|
|
||||||
len *= 2
|
|
||||||
|
|
||||||
for (i = 0; i <= len; ++i) {
|
|
||||||
print "a[", i, "] = x * (10^", i, ")\n"
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i <= 10000; ++i) {
|
|
||||||
for (j = 0; j < len; ++j) {
|
|
||||||
print "v = a[", i, "] - a[", j, "]\n"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
#! /usr/bin/dc
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
[ ]ss
|
|
||||||
[|]so
|
|
||||||
100sm 0si
|
|
||||||
[
|
|
||||||
li1+si 0sj
|
|
||||||
[
|
|
||||||
lj1+sj 0sk
|
|
||||||
[
|
|
||||||
lk1+sk lin lsn ljn lsn lkn lsn lon 10P lk lm !<z
|
|
||||||
]dszx
|
|
||||||
lj lm !<y
|
|
||||||
]dsyx
|
|
||||||
li lm !<x
|
|
||||||
]dsxx
|
|
@ -37,6 +37,6 @@
|
|||||||
#define BC_VERSION_H
|
#define BC_VERSION_H
|
||||||
|
|
||||||
/// The current version.
|
/// The current version.
|
||||||
#define VERSION 5.3.1
|
#define VERSION 5.3.3
|
||||||
|
|
||||||
#endif // BC_VERSION_H
|
#endif // BC_VERSION_H
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,673 +0,0 @@
|
|||||||
# Benchmarks
|
|
||||||
|
|
||||||
The results of these benchmarks suggest that building this `bc` with
|
|
||||||
optimization at `-O3` with link-time optimization (`-flto`) will result in the
|
|
||||||
best performance. However, using `-march=native` can result in **WORSE**
|
|
||||||
performance.
|
|
||||||
|
|
||||||
*Note*: all benchmarks were run four times, and the fastest run is the one
|
|
||||||
shown. Also, `[bc]` means whichever `bc` was being run, and the assumed working
|
|
||||||
directory is the root directory of this repository. Also, this `bc` was at
|
|
||||||
version `3.0.0` while GNU `bc` was at version `1.07.1`, and all tests were
|
|
||||||
conducted on an `x86_64` machine running Gentoo Linux with `clang` `9.0.1` as
|
|
||||||
the compiler.
|
|
||||||
|
|
||||||
## Typical Optimization Level
|
|
||||||
|
|
||||||
These benchmarks were run with both `bc`'s compiled with the typical `-O2`
|
|
||||||
optimizations and no link-time optimization.
|
|
||||||
|
|
||||||
### Addition
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc add.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.54
|
|
||||||
user 1.21
|
|
||||||
sys 1.32
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.88
|
|
||||||
user 0.85
|
|
||||||
sys 0.02
|
|
||||||
```
|
|
||||||
|
|
||||||
### Subtraction
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc subtract.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.51
|
|
||||||
user 1.05
|
|
||||||
sys 1.45
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.91
|
|
||||||
user 0.85
|
|
||||||
sys 0.05
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multiplication
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc multiply.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 7.15
|
|
||||||
user 4.69
|
|
||||||
sys 2.46
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.20
|
|
||||||
user 2.10
|
|
||||||
sys 0.09
|
|
||||||
```
|
|
||||||
|
|
||||||
### Division
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc divide.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 3.36
|
|
||||||
user 1.87
|
|
||||||
sys 1.48
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 1.61
|
|
||||||
user 1.57
|
|
||||||
sys 0.03
|
|
||||||
```
|
|
||||||
|
|
||||||
### Power
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
printf '1234567890^100000; halt\n' | time -p [bc] -q > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 11.30
|
|
||||||
user 11.30
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.73
|
|
||||||
user 0.72
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
### Scripts
|
|
||||||
|
|
||||||
[This file][1] was downloaded, saved at `../timeconst.bc` and the following
|
|
||||||
patch was applied:
|
|
||||||
|
|
||||||
```
|
|
||||||
--- ../timeconst.bc 2018-09-28 11:32:22.808669000 -0600
|
|
||||||
+++ ../timeconst.bc 2019-06-07 07:26:36.359913078 -0600
|
|
||||||
@@ -110,8 +110,10 @@
|
|
||||||
|
|
||||||
print "#endif /* KERNEL_TIMECONST_H */\n"
|
|
||||||
}
|
|
||||||
- halt
|
|
||||||
}
|
|
||||||
|
|
||||||
-hz = read();
|
|
||||||
-timeconst(hz)
|
|
||||||
+for (i = 0; i <= 50000; ++i) {
|
|
||||||
+ timeconst(i)
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+halt
|
|
||||||
```
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../timeconst.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 16.71
|
|
||||||
user 16.06
|
|
||||||
sys 0.65
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 13.16
|
|
||||||
user 13.15
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
Because this `bc` is faster when doing math, it might be a better comparison to
|
|
||||||
run a script that is not running any math. As such, I put the following into
|
|
||||||
`../test.bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
for (i = 0; i < 100000000; ++i) {
|
|
||||||
y = i
|
|
||||||
}
|
|
||||||
|
|
||||||
i
|
|
||||||
y
|
|
||||||
|
|
||||||
halt
|
|
||||||
```
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../test.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 16.60
|
|
||||||
user 16.59
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 22.76
|
|
||||||
user 22.75
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
I also put the following into `../test2.bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
i = 0
|
|
||||||
|
|
||||||
while (i < 100000000) {
|
|
||||||
i += 1
|
|
||||||
}
|
|
||||||
|
|
||||||
i
|
|
||||||
|
|
||||||
halt
|
|
||||||
```
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../test2.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 17.32
|
|
||||||
user 17.30
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 16.98
|
|
||||||
user 16.96
|
|
||||||
sys 0.01
|
|
||||||
```
|
|
||||||
|
|
||||||
It seems that the improvements to the interpreter helped a lot in certain cases.
|
|
||||||
|
|
||||||
Also, I have no idea why GNU `bc` did worse when it is technically doing less
|
|
||||||
work.
|
|
||||||
|
|
||||||
## Recommended Optimizations from `2.7.0`
|
|
||||||
|
|
||||||
Note that, when running the benchmarks, the optimizations used are not the ones
|
|
||||||
I recommended for version `2.7.0`, which are `-O3 -flto -march=native`.
|
|
||||||
|
|
||||||
This `bc` separates its code into modules that, when optimized at link time,
|
|
||||||
removes a lot of the inefficiency that comes from function overhead. This is
|
|
||||||
most keenly felt with one function: `bc_vec_item()`, which should turn into just
|
|
||||||
one instruction (on `x86_64`) when optimized at link time and inlined. There are
|
|
||||||
other functions that matter as well.
|
|
||||||
|
|
||||||
I also recommended `-march=native` on the grounds that newer instructions would
|
|
||||||
increase performance on math-heavy code. We will see if that assumption was
|
|
||||||
correct. (Spoiler: **NO**.)
|
|
||||||
|
|
||||||
When compiling both `bc`'s with the optimizations I recommended for this `bc`
|
|
||||||
for version `2.7.0`, the results are as follows.
|
|
||||||
|
|
||||||
### Addition
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc add.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.44
|
|
||||||
user 1.11
|
|
||||||
sys 1.32
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.59
|
|
||||||
user 0.54
|
|
||||||
sys 0.05
|
|
||||||
```
|
|
||||||
|
|
||||||
### Subtraction
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc subtract.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.42
|
|
||||||
user 1.02
|
|
||||||
sys 1.40
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.64
|
|
||||||
user 0.57
|
|
||||||
sys 0.06
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multiplication
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc multiply.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 7.01
|
|
||||||
user 4.50
|
|
||||||
sys 2.50
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 1.59
|
|
||||||
user 1.53
|
|
||||||
sys 0.05
|
|
||||||
```
|
|
||||||
|
|
||||||
### Division
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc divide.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 3.26
|
|
||||||
user 1.82
|
|
||||||
sys 1.44
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 1.24
|
|
||||||
user 1.20
|
|
||||||
sys 0.03
|
|
||||||
```
|
|
||||||
|
|
||||||
### Power
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
printf '1234567890^100000; halt\n' | time -p [bc] -q > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 11.08
|
|
||||||
user 11.07
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.71
|
|
||||||
user 0.70
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
### Scripts
|
|
||||||
|
|
||||||
The command for the `../timeconst.bc` script was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../timeconst.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 15.62
|
|
||||||
user 15.08
|
|
||||||
sys 0.53
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 10.09
|
|
||||||
user 10.08
|
|
||||||
sys 0.01
|
|
||||||
```
|
|
||||||
|
|
||||||
The command for the next script, the `for` loop script, was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../test.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 14.76
|
|
||||||
user 14.75
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 17.95
|
|
||||||
user 17.94
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
The command for the next script, the `while` loop script, was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../test2.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 14.84
|
|
||||||
user 14.83
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 13.53
|
|
||||||
user 13.52
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
## Link-Time Optimization Only
|
|
||||||
|
|
||||||
Just for kicks, let's see if `-march=native` is even useful.
|
|
||||||
|
|
||||||
The optimizations I used for both `bc`'s were `-O3 -flto`.
|
|
||||||
|
|
||||||
### Addition
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc add.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.41
|
|
||||||
user 1.05
|
|
||||||
sys 1.35
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.58
|
|
||||||
user 0.52
|
|
||||||
sys 0.05
|
|
||||||
```
|
|
||||||
|
|
||||||
### Subtraction
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc subtract.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 2.39
|
|
||||||
user 1.10
|
|
||||||
sys 1.28
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.65
|
|
||||||
user 0.57
|
|
||||||
sys 0.07
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multiplication
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc multiply.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 6.82
|
|
||||||
user 4.30
|
|
||||||
sys 2.51
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 1.57
|
|
||||||
user 1.49
|
|
||||||
sys 0.08
|
|
||||||
```
|
|
||||||
|
|
||||||
### Division
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
tests/script.sh bc divide.bc 1 0 1 1 [bc]
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 3.25
|
|
||||||
user 1.81
|
|
||||||
sys 1.43
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 1.27
|
|
||||||
user 1.23
|
|
||||||
sys 0.04
|
|
||||||
```
|
|
||||||
|
|
||||||
### Power
|
|
||||||
|
|
||||||
The command used was:
|
|
||||||
|
|
||||||
```
|
|
||||||
printf '1234567890^100000; halt\n' | time -p [bc] -q > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 10.50
|
|
||||||
user 10.49
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 0.72
|
|
||||||
user 0.71
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
### Scripts
|
|
||||||
|
|
||||||
The command for the `../timeconst.bc` script was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../timeconst.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 15.50
|
|
||||||
user 14.81
|
|
||||||
sys 0.68
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 10.17
|
|
||||||
user 10.15
|
|
||||||
sys 0.01
|
|
||||||
```
|
|
||||||
|
|
||||||
The command for the next script, the `for` loop script, was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../test.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 14.99
|
|
||||||
user 14.99
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 16.85
|
|
||||||
user 16.84
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
The command for the next script, the `while` loop script, was:
|
|
||||||
|
|
||||||
```
|
|
||||||
time -p [bc] ../test2.bc > /dev/null
|
|
||||||
```
|
|
||||||
|
|
||||||
For GNU `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 14.92
|
|
||||||
user 14.91
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
For this `bc`:
|
|
||||||
|
|
||||||
```
|
|
||||||
real 12.75
|
|
||||||
user 12.75
|
|
||||||
sys 0.00
|
|
||||||
```
|
|
||||||
|
|
||||||
It turns out that `-march=native` can be a problem. As such, I have removed the
|
|
||||||
recommendation to build with `-march=native`.
|
|
||||||
|
|
||||||
## Recommended Compiler
|
|
||||||
|
|
||||||
When I ran these benchmarks with my `bc` compiled under `clang` vs. `gcc`, it
|
|
||||||
performed much better under `clang`. I recommend compiling this `bc` with
|
|
||||||
`clang`.
|
|
||||||
|
|
||||||
[1]: https://github.com/torvalds/linux/blob/master/kernel/time/timeconst.bc
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,27 +0,0 @@
|
|||||||
.\"
|
|
||||||
.\" SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
.\"
|
|
||||||
.\" Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
.\"
|
|
||||||
.\" Redistribution and use in source and binary forms, with or without
|
|
||||||
.\" modification, are permitted provided that the following conditions are met:
|
|
||||||
.\"
|
|
||||||
.\" * Redistributions of source code must retain the above copyright notice,
|
|
||||||
.\" this list of conditions and the following disclaimer.
|
|
||||||
.\"
|
|
||||||
.\" * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
.\" this list of conditions and the following disclaimer in the documentation
|
|
||||||
.\" and/or other materials provided with the distribution.
|
|
||||||
.\"
|
|
||||||
.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
.\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
.\"
|
|
@ -1 +0,0 @@
|
|||||||
.TH "BC" "1" "June 2021" "Gavin D. Howard" "General Commands Manual"
|
|
@ -1 +0,0 @@
|
|||||||
.TH "BCL" "3" "June 2021" "Gavin D. Howard" "Libraries Manual"
|
|
@ -1 +0,0 @@
|
|||||||
.TH "DC" "1" "June 2021" "Gavin D. Howard" "General Commands Manual"
|
|
@ -1,72 +0,0 @@
|
|||||||
# Release Checklist
|
|
||||||
|
|
||||||
This is the checklist for cutting a release.
|
|
||||||
|
|
||||||
For a lot of these steps, they are only needed if the code that would be
|
|
||||||
affected was changed. For example, I don't need to run the `scripts/randmath.py`
|
|
||||||
test if I did not change any of the math code.
|
|
||||||
|
|
||||||
1. Update the README.
|
|
||||||
2. Update the manuals.
|
|
||||||
3. Test history manually.
|
|
||||||
4. Test with POSIX test suite.
|
|
||||||
5. Run the `scripts/randmath.py` script an excessive amount and add failing
|
|
||||||
tests to test suite.
|
|
||||||
* debug
|
|
||||||
* release
|
|
||||||
* minrelease
|
|
||||||
6. Fuzz with AFL.
|
|
||||||
* reldebug
|
|
||||||
7. Fix AFL crashes.
|
|
||||||
8. Find ASan crashes on AFL test cases.
|
|
||||||
9. Fix ASan crashes.
|
|
||||||
10. Build on Windows, no errors or warnings.
|
|
||||||
* Debug/`x64`.
|
|
||||||
* Debug/`x86`.
|
|
||||||
* Release{MD,MT}/`x64`.
|
|
||||||
* Release{MD,MT}/`x86`.
|
|
||||||
11. Run and pass the `scripts/release.sh` script on my own machine.
|
|
||||||
12. Run and pass the `scripts/release.sh` script, without generated tests and
|
|
||||||
sanitizers, on FreeBSD.
|
|
||||||
13. Run and pass the `scripts/release.sh` script, without generated tests,
|
|
||||||
sanitizers, and 64-bit, on an ARM server.
|
|
||||||
14. Run and pass the release script, with no generated tests, no clang, no
|
|
||||||
sanitizers, and no valgrind, on NetBSD.
|
|
||||||
15. Run and pass the release script, with no generated tests, no sanitizers, and
|
|
||||||
no valgrind, on OpenBSD.
|
|
||||||
16. Run `scan-build make`.
|
|
||||||
17. Repeat steps 3-16 again and repeat until nothing is found.
|
|
||||||
18. Update the benchmarks.
|
|
||||||
19. Update the version and `NEWS.md` and commit.
|
|
||||||
20. Boot into Windows.
|
|
||||||
21. Build all release versions of everything.
|
|
||||||
* Release/`x64` for `bc`.
|
|
||||||
* Release/`x64` for `dc`.
|
|
||||||
* Release{MD,MT}/`x64` for `bcl`.
|
|
||||||
* Release/`x86` for `bc`.
|
|
||||||
* Release/`x86` for `dc`.
|
|
||||||
* Release{MD,MT}/`x86` for `bcl`.
|
|
||||||
22. Put the builds where Linux can access them.
|
|
||||||
23. Boot back into Linux.
|
|
||||||
24. Run `make clean_tests`.
|
|
||||||
25. Run the `scripts/package.sh` script.
|
|
||||||
26. Upload the custom tarball and Windows builds to Yzena Gitea.
|
|
||||||
27. Add output from `scripts/package.sh` to Yzena Gitea release notes.
|
|
||||||
28. Edit Yzena Gitea release notes for the changelog.
|
|
||||||
29. Upload the custom tarball to GitHub.
|
|
||||||
30. Add output from `scripts/package.sh` to GitHub release notes.
|
|
||||||
31. Edit GitHub release notes for the changelog.
|
|
||||||
32. Notify the following:
|
|
||||||
* FreeBSD
|
|
||||||
* Adelie Linux
|
|
||||||
* Ataraxia Linux
|
|
||||||
* Sabotage
|
|
||||||
* xstatic
|
|
||||||
* OpenBSD
|
|
||||||
* NetBSD
|
|
||||||
33. Submit new packages for the following:
|
|
||||||
* Alpine Linux
|
|
||||||
* Void Linux
|
|
||||||
* Gentoo Linux
|
|
||||||
* Linux from Scratch
|
|
||||||
* Arch Linux
|
|
@ -1,245 +0,0 @@
|
|||||||
#! /usr/bin/python3 -B
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
# Print the usage and exit with an error.
|
|
||||||
def usage():
|
|
||||||
print("usage: {} [--asan] dir [results_dir [exe options...]]".format(script))
|
|
||||||
print(" The valid values for dir are: 'bc1', 'bc2', 'bc3', and 'dc'.")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
# Check for a crash.
|
|
||||||
# @param exebase The calculator that crashed.
|
|
||||||
# @param out The file to copy the crash file to.
|
|
||||||
# @param error The error code (negative).
|
|
||||||
# @param file The crash file.
|
|
||||||
# @param type The type of run that caused the crash. This is just a string
|
|
||||||
# that would make sense to the user.
|
|
||||||
# @param test The contents of the crash file, or which line caused the crash
|
|
||||||
# for a run through stdin.
|
|
||||||
def check_crash(exebase, out, error, file, type, test):
|
|
||||||
if error < 0:
|
|
||||||
print("\n{} crashed ({}) on {}:\n".format(exebase, -error, type))
|
|
||||||
print(" {}".format(test))
|
|
||||||
print("\nCopying to \"{}\"".format(out))
|
|
||||||
shutil.copy2(file, out)
|
|
||||||
print("\nexiting...")
|
|
||||||
sys.exit(error)
|
|
||||||
|
|
||||||
|
|
||||||
# Runs a test. This function is used to ensure that if a test times out, it is
|
|
||||||
# discarded. Otherwise, some tests result in incredibly long runtimes. We need
|
|
||||||
# to ignore those.
|
|
||||||
#
|
|
||||||
# @param cmd The command to run.
|
|
||||||
# @param exebase The calculator to test.
|
|
||||||
# @param tout The timeout to use.
|
|
||||||
# @param indata The data to push through stdin for the test.
|
|
||||||
# @param out The file to copy the test file to if it causes a crash.
|
|
||||||
# @param file The test file.
|
|
||||||
# @param type The type of test. This is just a string that would make sense
|
|
||||||
# to the user.
|
|
||||||
# @param test The test. It could be an entire file, or just one line.
|
|
||||||
# @param environ The environment to run the command under.
|
|
||||||
def run_test(cmd, exebase, tout, indata, out, file, type, test, environ=None):
|
|
||||||
try:
|
|
||||||
p = subprocess.run(cmd, timeout=tout, input=indata, stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.PIPE, env=environ)
|
|
||||||
check_crash(exebase, out, p.returncode, file, type, test)
|
|
||||||
except subprocess.TimeoutExpired:
|
|
||||||
print("\n {} timed out. Continuing...\n".format(exebase))
|
|
||||||
|
|
||||||
|
|
||||||
# Creates and runs a test. This basically just takes a file, runs it through the
|
|
||||||
# appropriate calculator as a whole file, then runs it through the calculator
|
|
||||||
# using stdin.
|
|
||||||
# @param file The file to test.
|
|
||||||
# @param tout The timeout to use.
|
|
||||||
# @param environ The environment to run under.
|
|
||||||
def create_test(file, tout, environ=None):
|
|
||||||
|
|
||||||
print(" {}".format(file))
|
|
||||||
|
|
||||||
base = os.path.basename(file)
|
|
||||||
|
|
||||||
if base == "README.txt":
|
|
||||||
return
|
|
||||||
|
|
||||||
with open(file, "rb") as f:
|
|
||||||
lines = f.readlines()
|
|
||||||
|
|
||||||
print(" Running whole file...")
|
|
||||||
|
|
||||||
run_test(exe + [ file ], exebase, tout, halt.encode(), out, file, "file", file, environ)
|
|
||||||
|
|
||||||
print(" Running file through stdin...")
|
|
||||||
|
|
||||||
with open(file, "rb") as f:
|
|
||||||
content = f.read()
|
|
||||||
|
|
||||||
run_test(exe, exebase, tout, content, out, file,
|
|
||||||
"running {} through stdin".format(file), file, environ)
|
|
||||||
|
|
||||||
|
|
||||||
# Get the children of a directory.
|
|
||||||
# @param dir The directory to get the children of.
|
|
||||||
# @param get_files True if files should be gotten, false if directories should
|
|
||||||
# be gotten.
|
|
||||||
def get_children(dir, get_files):
|
|
||||||
dirs = []
|
|
||||||
with os.scandir(dir) as it:
|
|
||||||
for entry in it:
|
|
||||||
if not entry.name.startswith('.') and \
|
|
||||||
((entry.is_dir() and not get_files) or \
|
|
||||||
(entry.is_file() and get_files)):
|
|
||||||
dirs.append(entry.name)
|
|
||||||
dirs.sort()
|
|
||||||
return dirs
|
|
||||||
|
|
||||||
|
|
||||||
# Returns the correct executable name for the directory under test.
|
|
||||||
# @param d The directory under test.
|
|
||||||
def exe_name(d):
|
|
||||||
return "bc" if d == "bc1" or d == "bc2" or d == "bc3" else "dc"
|
|
||||||
|
|
||||||
|
|
||||||
# Housekeeping.
|
|
||||||
script = sys.argv[0]
|
|
||||||
scriptdir = os.path.dirname(script)
|
|
||||||
|
|
||||||
# Must run this script alone.
|
|
||||||
if __name__ != "__main__":
|
|
||||||
usage()
|
|
||||||
|
|
||||||
timeout = 2.5
|
|
||||||
|
|
||||||
if len(sys.argv) < 2:
|
|
||||||
usage()
|
|
||||||
|
|
||||||
idx = 1
|
|
||||||
|
|
||||||
exedir = sys.argv[idx]
|
|
||||||
|
|
||||||
asan = (exedir == "--asan")
|
|
||||||
|
|
||||||
# We could possibly run under ASan. See later for what that means.
|
|
||||||
if asan:
|
|
||||||
idx += 1
|
|
||||||
if len(sys.argv) < idx + 1:
|
|
||||||
usage()
|
|
||||||
exedir = sys.argv[idx]
|
|
||||||
|
|
||||||
print("exedir: {}".format(exedir))
|
|
||||||
|
|
||||||
# Grab the correct directory of AFL++ results.
|
|
||||||
if len(sys.argv) >= idx + 2:
|
|
||||||
resultsdir = sys.argv[idx + 1]
|
|
||||||
else:
|
|
||||||
if exedir == "bc1":
|
|
||||||
resultsdir = scriptdir + "/../tests/fuzzing/bc_outputs1"
|
|
||||||
elif exedir == "bc2":
|
|
||||||
resultsdir = scriptdir + "/../tests/fuzzing/bc_outputs2"
|
|
||||||
elif exedir == "bc3":
|
|
||||||
resultsdir = scriptdir + "/../tests/fuzzing/bc_outputs3"
|
|
||||||
elif exedir == "dc":
|
|
||||||
resultsdir = scriptdir + "/../tests/fuzzing/dc_outputs"
|
|
||||||
else:
|
|
||||||
raise ValueError("exedir must be either bc1, bc2, bc3, or dc");
|
|
||||||
|
|
||||||
print("resultsdir: {}".format(resultsdir))
|
|
||||||
|
|
||||||
# More command-line processing.
|
|
||||||
if len(sys.argv) >= idx + 3:
|
|
||||||
exe = sys.argv[idx + 2]
|
|
||||||
else:
|
|
||||||
exe = scriptdir + "/../bin/" + exe_name(exedir)
|
|
||||||
|
|
||||||
exebase = os.path.basename(exe)
|
|
||||||
|
|
||||||
|
|
||||||
# Use the correct options.
|
|
||||||
if exebase == "bc":
|
|
||||||
halt = "halt\n"
|
|
||||||
options = "-lq"
|
|
||||||
seed = ["-e", "seed = 1280937142.20981723890730892738902938071028973408912703984712093", "-f-" ]
|
|
||||||
else:
|
|
||||||
halt = "q\n"
|
|
||||||
options = "-x"
|
|
||||||
seed = ["-e", "1280937142.20981723890730892738902938071028973408912703984712093j", "-f-" ]
|
|
||||||
|
|
||||||
# More command-line processing.
|
|
||||||
if len(sys.argv) >= idx + 4:
|
|
||||||
exe = [ exe, sys.argv[idx + 3:], options ] + seed
|
|
||||||
else:
|
|
||||||
exe = [ exe, options ] + seed
|
|
||||||
for i in range(4, len(sys.argv)):
|
|
||||||
exe.append(sys.argv[i])
|
|
||||||
|
|
||||||
out = scriptdir + "/../.test.txt"
|
|
||||||
|
|
||||||
print(os.path.realpath(os.getcwd()))
|
|
||||||
|
|
||||||
dirs = get_children(resultsdir, False)
|
|
||||||
|
|
||||||
# Set the correct ASAN_OPTIONS.
|
|
||||||
if asan:
|
|
||||||
env = os.environ.copy()
|
|
||||||
env['ASAN_OPTIONS'] = 'abort_on_error=1:allocator_may_return_null=1'
|
|
||||||
|
|
||||||
for d in dirs:
|
|
||||||
|
|
||||||
d = resultsdir + "/" + d
|
|
||||||
|
|
||||||
print(d)
|
|
||||||
|
|
||||||
# Check the crash files.
|
|
||||||
files = get_children(d + "/crashes/", True)
|
|
||||||
|
|
||||||
for file in files:
|
|
||||||
file = d + "/crashes/" + file
|
|
||||||
create_test(file, timeout)
|
|
||||||
|
|
||||||
# If we are running under ASan, we want to check all files. Otherwise, skip.
|
|
||||||
if not asan:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Check all of the test cases found by AFL++.
|
|
||||||
files = get_children(d + "/queue/", True)
|
|
||||||
|
|
||||||
for file in files:
|
|
||||||
file = d + "/queue/" + file
|
|
||||||
create_test(file, timeout * 2, env)
|
|
||||||
|
|
||||||
print("Done")
|
|
@ -1,84 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This script is only really useful for running on Linux. It tests the code to
|
|
||||||
# free temps in order to make an allocation work. In order to see it work, I
|
|
||||||
# suggest adding code after the following line in src/vm.c:
|
|
||||||
#
|
|
||||||
# if (BC_ERR(ptr == NULL)) bc_vm_fatalError(BC_ERR_FATAL_ALLOC_ERR);
|
|
||||||
#
|
|
||||||
# The code you should add is the following:
|
|
||||||
#
|
|
||||||
# bc_file_printf(&vm.ferr, "If you see this, the code worked.\n");
|
|
||||||
# bc_file_flush(&vm.ferr, bc_flush_none);
|
|
||||||
#
|
|
||||||
# If you do not see the that message printed, the code did not work. Or, in the
|
|
||||||
# case of some allocators, like jemalloc, the allocator just isn't great with
|
|
||||||
# turning a bunch of small allocations into a bigger allocation,
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
|
|
||||||
export LANG=C
|
|
||||||
|
|
||||||
virtlimit=1000000
|
|
||||||
|
|
||||||
ulimit -v $virtlimit
|
|
||||||
|
|
||||||
# This script is designed to allocate lots of memory with a lot of caching of
|
|
||||||
# numbers (the function f() specifically). Then, it's designed allocate one
|
|
||||||
# large number and grow it until allocation failure (the function g()).
|
|
||||||
"$scriptdir/../bin/bc" <<*EOF
|
|
||||||
|
|
||||||
define f(i, n) {
|
|
||||||
if (n == 0) return i;
|
|
||||||
return f(i + 1, n - 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
define g(n) {
|
|
||||||
t = (10^9)^(2^24)
|
|
||||||
while (n) {
|
|
||||||
n *= t
|
|
||||||
print "success\n"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
iterations=2000000
|
|
||||||
|
|
||||||
for (l=0; l < 100; l++) {
|
|
||||||
iterations
|
|
||||||
j = f(0, iterations$)
|
|
||||||
iterations += 100000
|
|
||||||
print "here\n"
|
|
||||||
n=10^235929600
|
|
||||||
g(n)
|
|
||||||
print "success\n"
|
|
||||||
n=0
|
|
||||||
}
|
|
||||||
*EOF
|
|
@ -1,159 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This script depends on the GNU time utility, but I am okay with that because
|
|
||||||
# this script is only for maintainers.
|
|
||||||
|
|
||||||
# Just print the usage and exit with an error.
|
|
||||||
usage() {
|
|
||||||
printf 'usage: %s [-n<runs>] [-p<pause>] dir benchmark...\n' "$0" 1>&2
|
|
||||||
printf ' -n runs is how many runs to run the benchmark, default 10.\n'
|
|
||||||
printf ' -p pause is how many seconds to pause before running the benchmarks.\n'
|
|
||||||
printf '\n'
|
|
||||||
printf 'The fields are put in this order:\n'
|
|
||||||
printf '1. Elapsed Time\n'
|
|
||||||
printf '2. System Time\n'
|
|
||||||
printf '3. User Time\n'
|
|
||||||
printf '4. Max RSS\n'
|
|
||||||
printf '5. Average RSS\n'
|
|
||||||
printf '6. Average Total Memory Use\n'
|
|
||||||
printf '7. Average Unshared Data\n'
|
|
||||||
printf '8. Average Unshared Stack\n'
|
|
||||||
printf '9. Average Shared Text\n'
|
|
||||||
printf '10. Major Page Faults\n'
|
|
||||||
printf '11. Minor Page Faults\n'
|
|
||||||
printf '12. Swaps\n'
|
|
||||||
printf '13. Involuntary Context Switches\n'
|
|
||||||
printf '14. Voluntary Context Switches\n'
|
|
||||||
printf '15. Inputs\n'
|
|
||||||
printf '16. Outputs\n'
|
|
||||||
printf '17. Signals Delivered\n'
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
|
|
||||||
runs=10
|
|
||||||
pause=0
|
|
||||||
|
|
||||||
# Process command-line arguments.
|
|
||||||
while getopts "n:p:" opt; do
|
|
||||||
|
|
||||||
case "$opt" in
|
|
||||||
n) runs="$OPTARG" ;;
|
|
||||||
p) pause="$OPTARG" ;;
|
|
||||||
?) usage "Invalid option: $opt" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
while [ "$#" -gt 0 ] && [ "$OPTIND" -gt 1 ]; do
|
|
||||||
|
|
||||||
OPTIND=$(bin/bc -e "$OPTIND - 1")
|
|
||||||
shift
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$#" -lt 2 ]; then
|
|
||||||
usage
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$scriptdir/.."
|
|
||||||
|
|
||||||
d="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
benchmarks=""
|
|
||||||
|
|
||||||
# Create the list of benchmarks from the arguments.
|
|
||||||
while [ "$#" -gt 0 ]; do
|
|
||||||
|
|
||||||
if [ "$benchmarks" = "" ]; then
|
|
||||||
benchmarks="$1"
|
|
||||||
else
|
|
||||||
benchmarks="$benchmarks $1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
files=""
|
|
||||||
|
|
||||||
# Create the list of files from the benchmarks.
|
|
||||||
for b in $benchmarks; do
|
|
||||||
|
|
||||||
f=$(printf "benchmarks/%s/%s.txt" "$d" "$b")
|
|
||||||
|
|
||||||
if [ "$files" = "" ]; then
|
|
||||||
files="$f"
|
|
||||||
else
|
|
||||||
files="$files $f"
|
|
||||||
fi
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$d" = "bc" ]; then
|
|
||||||
opts="-lq"
|
|
||||||
halt="halt"
|
|
||||||
else
|
|
||||||
opts="-x"
|
|
||||||
halt="q"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Generate all of the benchmarks.
|
|
||||||
for b in $benchmarks; do
|
|
||||||
|
|
||||||
if [ ! -f "./benchmarks/$d/$b.txt" ]; then
|
|
||||||
printf 'Benchmarking generation of benchmarks/%s/%s.txt...\n' "$d" "$b" >&2
|
|
||||||
printf '%s\n' "$halt" | /usr/bin/time -v bin/$d $opts "./benchmarks/$d/$b.$d" \
|
|
||||||
> "./benchmarks/$d/$b.txt"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# We use this format to make things easier to use with ministat.
|
|
||||||
format="%e %S %U %M %t %K %D %p %X %F %R %W %c %w %I %O %k"
|
|
||||||
|
|
||||||
printf 'Benchmarking %s...\n' "$files" >&2
|
|
||||||
|
|
||||||
if [ "$pause" -gt 0 ]; then
|
|
||||||
sleep "$pause"
|
|
||||||
fi
|
|
||||||
|
|
||||||
i=0
|
|
||||||
|
|
||||||
# Run the benchmarks as many times as told to.
|
|
||||||
while [ "$i" -lt "$runs" ]; do
|
|
||||||
|
|
||||||
printf '%s\n' "$halt" | /usr/bin/time -f "$format" bin/$d $opts $files 2>&1 > /dev/null
|
|
||||||
|
|
||||||
# Might as well use the existing bc.
|
|
||||||
i=$(printf '%s + 1\n' "$i" | bin/bc)
|
|
||||||
|
|
||||||
done
|
|
@ -1,240 +0,0 @@
|
|||||||
/*
|
|
||||||
* *****************************************************************************
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
*
|
|
||||||
* Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
|
||||||
* and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
* *****************************************************************************
|
|
||||||
*
|
|
||||||
* A generator for bitwise operations test.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#define NTESTS (100)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abort with an error message.
|
|
||||||
* @param msg The error message.
|
|
||||||
*/
|
|
||||||
void err(const char *msg) {
|
|
||||||
fprintf(stderr, "%s\n", msg);
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t rev(uint64_t a, size_t bits) {
|
|
||||||
|
|
||||||
size_t i;
|
|
||||||
uint64_t res = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < bits; ++i) {
|
|
||||||
res <<= 1;
|
|
||||||
res |= a & 1;
|
|
||||||
a >>= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t mod(uint64_t a, size_t bits) {
|
|
||||||
|
|
||||||
uint64_t mod;
|
|
||||||
|
|
||||||
if (bits < 64) mod = (uint64_t) ((1ULL << bits) - 1);
|
|
||||||
else mod = UINT64_MAX;
|
|
||||||
|
|
||||||
return a & mod;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t rol(uint64_t a, uint64_t p, size_t bits) {
|
|
||||||
|
|
||||||
uint64_t res;
|
|
||||||
|
|
||||||
assert(bits <= 64);
|
|
||||||
|
|
||||||
p %= bits;
|
|
||||||
|
|
||||||
if (!p) return a;
|
|
||||||
|
|
||||||
res = (a << p) | (a >> (bits - p));
|
|
||||||
|
|
||||||
return mod(res, bits);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t ror(uint64_t a, uint64_t p, size_t bits) {
|
|
||||||
|
|
||||||
uint64_t res;
|
|
||||||
|
|
||||||
assert(bits <= 64);
|
|
||||||
|
|
||||||
p %= bits;
|
|
||||||
|
|
||||||
if (!p) return a;
|
|
||||||
|
|
||||||
res = (a << (bits - p)) | (a >> p);
|
|
||||||
|
|
||||||
return mod(res, bits);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
|
|
||||||
uint64_t a = 0, b = 0, t;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
// We attempt to open this or /dev/random to get random data.
|
|
||||||
int fd = open("/dev/urandom", O_RDONLY);
|
|
||||||
|
|
||||||
if (fd < 0) {
|
|
||||||
|
|
||||||
fd = open("/dev/random", O_RDONLY);
|
|
||||||
|
|
||||||
if (fd < 0) err("cannot open a random number generator");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate NTESTS tests.
|
|
||||||
for (i = 0; i < NTESTS; ++i) {
|
|
||||||
|
|
||||||
ssize_t nread;
|
|
||||||
|
|
||||||
// Generate random data for the first operand.
|
|
||||||
nread = read(fd, (char*) &a, sizeof(uint64_t));
|
|
||||||
if (nread != sizeof(uint64_t)) err("I/O error");
|
|
||||||
|
|
||||||
// Generate random data for the second operand.
|
|
||||||
nread = read(fd, (char*) &b, sizeof(uint64_t));
|
|
||||||
if (nread != sizeof(uint64_t)) err("I/O error");
|
|
||||||
|
|
||||||
// Output the tests to stdout.
|
|
||||||
printf("band(%lu, %lu)\n", a, b);
|
|
||||||
printf("bor(%lu, %lu)\n", a, b);
|
|
||||||
printf("bxor(%lu, %lu)\n", a, b);
|
|
||||||
printf("bshl(%lu, %lu)\n", mod(a, 32), mod(b, 5));
|
|
||||||
printf("bshr(%lu, %lu)\n", mod(a, 32), mod(b, 5));
|
|
||||||
printf("bshl(%lu, %lu)\n", mod(b, 32), mod(a, 5));
|
|
||||||
printf("bshr(%lu, %lu)\n", mod(b, 32), mod(a, 5));
|
|
||||||
printf("bnot8(%lu)\nbnot8(%lu)\n", a, mod(a, 8));
|
|
||||||
printf("bnot16(%lu)\nbnot16(%lu)\n", a, mod(a, 16));
|
|
||||||
printf("bnot32(%lu)\nbnot32(%lu)\n", a, mod(a, 32));
|
|
||||||
printf("bnot64(%lu)\n", a);
|
|
||||||
printf("brev8(%lu)\nbrev8(%lu)\n", a, mod(a, 8));
|
|
||||||
printf("brev16(%lu)\nbrev16(%lu)\n", a, mod(a, 16));
|
|
||||||
printf("brev32(%lu)\nbrev32(%lu)\n", a, mod(a, 32));
|
|
||||||
printf("brev64(%lu)\n", a);
|
|
||||||
printf("brol8(%lu, %lu)\n", a, b);
|
|
||||||
printf("brol8(%lu, %lu)\n", mod(a, 8), b);
|
|
||||||
printf("brol8(%lu, %lu)\n", a, mod(b, 8));
|
|
||||||
printf("brol8(%lu, %lu)\n", mod(a, 8), mod(b, 8));
|
|
||||||
printf("brol16(%lu, %lu)\n", a, b);
|
|
||||||
printf("brol16(%lu, %lu)\n", mod(a, 16), b);
|
|
||||||
printf("brol16(%lu, %lu)\n", a, mod(b, 16));
|
|
||||||
printf("brol16(%lu, %lu)\n", mod(a, 16), mod(b, 16));
|
|
||||||
printf("brol32(%lu, %lu)\n", a, b);
|
|
||||||
printf("brol32(%lu, %lu)\n", mod(a, 32), b);
|
|
||||||
printf("brol32(%lu, %lu)\n", a, mod(b, 32));
|
|
||||||
printf("brol32(%lu, %lu)\n", mod(a, 32), mod(b, 32));
|
|
||||||
printf("brol64(%lu, %lu)\n", a, b);
|
|
||||||
printf("bror8(%lu, %lu)\n", a, b);
|
|
||||||
printf("bror8(%lu, %lu)\n", mod(a, 8), b);
|
|
||||||
printf("bror8(%lu, %lu)\n", a, mod(b, 8));
|
|
||||||
printf("bror8(%lu, %lu)\n", mod(a, 8), mod(b, 8));
|
|
||||||
printf("bror16(%lu, %lu)\n", a, b);
|
|
||||||
printf("bror16(%lu, %lu)\n", mod(a, 16), b);
|
|
||||||
printf("bror16(%lu, %lu)\n", a, mod(b, 16));
|
|
||||||
printf("bror16(%lu, %lu)\n", mod(a, 16), mod(b, 16));
|
|
||||||
printf("bror32(%lu, %lu)\n", a, b);
|
|
||||||
printf("bror32(%lu, %lu)\n", mod(a, 32), b);
|
|
||||||
printf("bror32(%lu, %lu)\n", a, mod(b, 32));
|
|
||||||
printf("bror32(%lu, %lu)\n", mod(a, 32), mod(b, 32));
|
|
||||||
printf("bror64(%lu, %lu)\n", a, b);
|
|
||||||
printf("bmod8(%lu)\nbmod8(%lu)\n", a, mod(a, 8));
|
|
||||||
printf("bmod16(%lu)\nbmod16(%lu)\n", a, mod(a, 16));
|
|
||||||
printf("bmod32(%lu)\nbmod32(%lu)\n", a, mod(a, 32));
|
|
||||||
printf("bmod64(%lu)\n", a);
|
|
||||||
|
|
||||||
// Output the results to stderr.
|
|
||||||
fprintf(stderr, "%lu\n", a & b);
|
|
||||||
fprintf(stderr, "%lu\n", a | b);
|
|
||||||
fprintf(stderr, "%lu\n", a ^ b);
|
|
||||||
fprintf(stderr, "%lu\n", mod(a, 32) << mod(b, 5));
|
|
||||||
fprintf(stderr, "%lu\n", mod(a, 32) >> mod(b, 5));
|
|
||||||
fprintf(stderr, "%lu\n", mod(b, 32) << mod(a, 5));
|
|
||||||
fprintf(stderr, "%lu\n", mod(b, 32) >> mod(a, 5));
|
|
||||||
t = mod(~a, 8);
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", t, t);
|
|
||||||
t = mod(~a, 16);
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", t, t);
|
|
||||||
t = mod(~a, 32);
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", t, t);
|
|
||||||
fprintf(stderr, "%lu\n", ~a);
|
|
||||||
t = rev(a, 8);
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", t, t);
|
|
||||||
t = rev(a, 16);
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", t, t);
|
|
||||||
t = rev(a, 32);
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", t, t);
|
|
||||||
t = rev(a, 64);
|
|
||||||
fprintf(stderr, "%lu\n", t);
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", rol(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", rol(a, b, 64));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 8), mod(b, 8), 8));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 16), mod(b, 16), 16));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", ror(mod(a, 32), mod(b, 32), 32));
|
|
||||||
fprintf(stderr, "%lu\n", ror(a, b, 64));
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", mod(a, 8), mod(a, 8));
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", mod(a, 16), mod(a, 16));
|
|
||||||
fprintf(stderr, "%lu\n%lu\n", mod(a, 32), mod(a, 32));
|
|
||||||
fprintf(stderr, "%lu\n", a);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,81 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Just print the usage and exit with an error.
|
|
||||||
usage() {
|
|
||||||
printf 'usage: %s [-a] [afl_compiler]\n' "$0" 1>&2
|
|
||||||
printf '\n'
|
|
||||||
printf ' If -a is given, then an ASan ready build is created.\n'
|
|
||||||
printf ' Otherwise, a normal fuzz build is created.\n'
|
|
||||||
printf ' The ASan-ready build is for running under\n'
|
|
||||||
printf ' `tests/afl.py --asan`, which checks that there were no\n'
|
|
||||||
printf ' memory errors in any path found by the fuzzer.\n'
|
|
||||||
printf ' It might also be useful to run scripts/randmath.py on an\n'
|
|
||||||
printf ' ASan-ready binary.\n'
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
|
|
||||||
asan=0
|
|
||||||
|
|
||||||
# Process command-line arguments.
|
|
||||||
while getopts "a" opt; do
|
|
||||||
|
|
||||||
case "$opt" in
|
|
||||||
a) asan=1 ; shift ;;
|
|
||||||
?) usage "Invalid option: $opt" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $# -lt 1 ]; then
|
|
||||||
CC=afl-clang-lto
|
|
||||||
else
|
|
||||||
CC="$1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We want this for extra sensitive crashing
|
|
||||||
AFL_HARDEN=1
|
|
||||||
|
|
||||||
cd "$scriptdir/.."
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ "$asan" -ne 0 ]; then
|
|
||||||
CFLAGS="-flto -fsanitize=address"
|
|
||||||
else
|
|
||||||
CFLAGS="-flto"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We want a debug build because asserts are counted as crashes too.
|
|
||||||
CC="$CC" CFLAGS="$CFLAGS" ./configure.sh -gO3 -z
|
|
||||||
|
|
||||||
make -j16
|
|
@ -1,175 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# Print the usage and exit with an error.
|
|
||||||
usage() {
|
|
||||||
printf "usage: %s manpage\n" "$0" 1>&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Generate a manpage and print it to a file.
|
|
||||||
# @param md The markdown manual to generate a manpage for.
|
|
||||||
# @param out The file to print the manpage to.
|
|
||||||
gen_manpage() {
|
|
||||||
|
|
||||||
_gen_manpage_md="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_gen_manpage_out="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
cat "$manualsdir/header.txt" > "$_gen_manpage_out"
|
|
||||||
cat "$manualsdir/header_${manpage}.txt" >> "$_gen_manpage_out"
|
|
||||||
|
|
||||||
pandoc -f commonmark_x -t man "$_gen_manpage_md" >> "$_gen_manpage_out"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Generate a manual from a template and print it to a file before generating
|
|
||||||
# its manpage.
|
|
||||||
# param args The type of markdown manual to generate. This is a string that
|
|
||||||
# corresponds to build type (see the Build Type section of the
|
|
||||||
# manuals/build.md manual).
|
|
||||||
gen_manual() {
|
|
||||||
|
|
||||||
_gen_manual_args="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
# Set up some local variables. $manualsdir and $manpage from from the
|
|
||||||
# variables outside the function.
|
|
||||||
_gen_manual_status="$ALL"
|
|
||||||
_gen_manual_out="$manualsdir/$manpage/$_gen_manual_args.1"
|
|
||||||
_gen_manual_md="$manualsdir/$manpage/$_gen_manual_args.1.md"
|
|
||||||
_gen_manual_temp="$manualsdir/temp.1.md"
|
|
||||||
|
|
||||||
# We need to set IFS, so we store it here for restoration later.
|
|
||||||
_gen_manual_ifs="$IFS"
|
|
||||||
|
|
||||||
# Remove the files that will be generated.
|
|
||||||
rm -rf "$_gen_manual_out" "$_gen_manual_md"
|
|
||||||
|
|
||||||
# Here is the magic. This loop reads the template line-by-line, and based on
|
|
||||||
# _gen_manual_status, either prints it to the markdown manual or not.
|
|
||||||
#
|
|
||||||
# Here is how the template is set up: it is a normal markdown file except
|
|
||||||
# that there are sections surrounded tags that look like this:
|
|
||||||
#
|
|
||||||
# {{ <build_type_list> }}
|
|
||||||
# ...
|
|
||||||
# {{ end }}
|
|
||||||
#
|
|
||||||
# Those tags mean that whatever build types are found in the
|
|
||||||
# <build_type_list> get to keep that section. Otherwise, skip.
|
|
||||||
#
|
|
||||||
# Obviously, the tag itself and its end are not printed to the markdown
|
|
||||||
# manual.
|
|
||||||
while IFS= read -r line; do
|
|
||||||
|
|
||||||
# If we have found an end, reset the status.
|
|
||||||
if [ "$line" = "{{ end }}" ]; then
|
|
||||||
|
|
||||||
# Some error checking. This helps when editing the templates.
|
|
||||||
if [ "$_gen_manual_status" -eq "$ALL" ]; then
|
|
||||||
err_exit "{{ end }} tag without corresponding start tag" 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
_gen_manual_status="$ALL"
|
|
||||||
|
|
||||||
# We have found a tag that allows our build type to use it.
|
|
||||||
elif [ "${line#\{\{* $_gen_manual_args *\}\}}" != "$line" ]; then
|
|
||||||
|
|
||||||
# More error checking. We don't want tags nested.
|
|
||||||
if [ "$_gen_manual_status" -ne "$ALL" ]; then
|
|
||||||
err_exit "start tag nested in start tag" 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
_gen_manual_status="$NOSKIP"
|
|
||||||
|
|
||||||
# We have found a tag that is *not* allowed for our build type.
|
|
||||||
elif [ "${line#\{\{*\}\}}" != "$line" ]; then
|
|
||||||
|
|
||||||
if [ "$_gen_manual_status" -ne "$ALL" ]; then
|
|
||||||
err_exit "start tag nested in start tag" 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
_gen_manual_status="$SKIP"
|
|
||||||
|
|
||||||
# This is for normal lines. If we are not skipping, print.
|
|
||||||
else
|
|
||||||
if [ "$_gen_manual_status" -ne "$SKIP" ]; then
|
|
||||||
printf '%s\n' "$line" >> "$_gen_manual_temp"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
done < "$manualsdir/${manpage}.1.md.in"
|
|
||||||
|
|
||||||
# Remove multiple blank lines.
|
|
||||||
uniq "$_gen_manual_temp" "$_gen_manual_md"
|
|
||||||
|
|
||||||
# Remove the temp file.
|
|
||||||
rm -rf "$_gen_manual_temp"
|
|
||||||
|
|
||||||
# Reset IFS.
|
|
||||||
IFS="$_gen_manual_ifs"
|
|
||||||
|
|
||||||
# Generate the manpage.
|
|
||||||
gen_manpage "$_gen_manual_md" "$_gen_manual_out"
|
|
||||||
}
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
manualsdir="$scriptdir/../manuals"
|
|
||||||
|
|
||||||
. "$scriptdir/functions.sh"
|
|
||||||
|
|
||||||
# Constants for use later. If the set of build types is changed, $ARGS must be
|
|
||||||
# updated.
|
|
||||||
ARGS="A E H N EH EN HN EHN"
|
|
||||||
ALL=0
|
|
||||||
NOSKIP=1
|
|
||||||
SKIP=2
|
|
||||||
|
|
||||||
# Process command-line arguments.
|
|
||||||
test "$#" -eq 1 || usage
|
|
||||||
|
|
||||||
manpage="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [ "$manpage" != "bcl" ]; then
|
|
||||||
|
|
||||||
# Generate a manual and manpage for each build type.
|
|
||||||
for a in $ARGS; do
|
|
||||||
gen_manual "$a"
|
|
||||||
done
|
|
||||||
|
|
||||||
else
|
|
||||||
# For bcl, just generate the manpage.
|
|
||||||
gen_manpage "$manualsdir/${manpage}.3.md" "$manualsdir/${manpage}.3"
|
|
||||||
fi
|
|
@ -1,675 +0,0 @@
|
|||||||
/*-
|
|
||||||
* SPDX-License-Identifier: Beerware
|
|
||||||
*
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
||||||
* <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you
|
|
||||||
* can do whatever you want with this stuff. If we meet some day, and you think
|
|
||||||
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
|
|
||||||
* ----------------------------------------------------------------------------
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __GNU_LIBRARY__
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
#endif // __GNU_LIBRARY__
|
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
|
|
||||||
#ifdef __GNU_LIBRARY__
|
|
||||||
#include <sys/queue.h>
|
|
||||||
#endif // __GNU_LIBRARY__
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <err.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define NSTUDENT 100
|
|
||||||
#define NCONF 6
|
|
||||||
static double const studentpct[] = { 80, 90, 95, 98, 99, 99.5 };
|
|
||||||
static double const student[NSTUDENT + 1][NCONF] = {
|
|
||||||
/* inf */ { 1.282, 1.645, 1.960, 2.326, 2.576, 3.090 },
|
|
||||||
/* 1. */ { 3.078, 6.314, 12.706, 31.821, 63.657, 318.313 },
|
|
||||||
/* 2. */ { 1.886, 2.920, 4.303, 6.965, 9.925, 22.327 },
|
|
||||||
/* 3. */ { 1.638, 2.353, 3.182, 4.541, 5.841, 10.215 },
|
|
||||||
/* 4. */ { 1.533, 2.132, 2.776, 3.747, 4.604, 7.173 },
|
|
||||||
/* 5. */ { 1.476, 2.015, 2.571, 3.365, 4.032, 5.893 },
|
|
||||||
/* 6. */ { 1.440, 1.943, 2.447, 3.143, 3.707, 5.208 },
|
|
||||||
/* 7. */ { 1.415, 1.895, 2.365, 2.998, 3.499, 4.782 },
|
|
||||||
/* 8. */ { 1.397, 1.860, 2.306, 2.896, 3.355, 4.499 },
|
|
||||||
/* 9. */ { 1.383, 1.833, 2.262, 2.821, 3.250, 4.296 },
|
|
||||||
/* 10. */ { 1.372, 1.812, 2.228, 2.764, 3.169, 4.143 },
|
|
||||||
/* 11. */ { 1.363, 1.796, 2.201, 2.718, 3.106, 4.024 },
|
|
||||||
/* 12. */ { 1.356, 1.782, 2.179, 2.681, 3.055, 3.929 },
|
|
||||||
/* 13. */ { 1.350, 1.771, 2.160, 2.650, 3.012, 3.852 },
|
|
||||||
/* 14. */ { 1.345, 1.761, 2.145, 2.624, 2.977, 3.787 },
|
|
||||||
/* 15. */ { 1.341, 1.753, 2.131, 2.602, 2.947, 3.733 },
|
|
||||||
/* 16. */ { 1.337, 1.746, 2.120, 2.583, 2.921, 3.686 },
|
|
||||||
/* 17. */ { 1.333, 1.740, 2.110, 2.567, 2.898, 3.646 },
|
|
||||||
/* 18. */ { 1.330, 1.734, 2.101, 2.552, 2.878, 3.610 },
|
|
||||||
/* 19. */ { 1.328, 1.729, 2.093, 2.539, 2.861, 3.579 },
|
|
||||||
/* 20. */ { 1.325, 1.725, 2.086, 2.528, 2.845, 3.552 },
|
|
||||||
/* 21. */ { 1.323, 1.721, 2.080, 2.518, 2.831, 3.527 },
|
|
||||||
/* 22. */ { 1.321, 1.717, 2.074, 2.508, 2.819, 3.505 },
|
|
||||||
/* 23. */ { 1.319, 1.714, 2.069, 2.500, 2.807, 3.485 },
|
|
||||||
/* 24. */ { 1.318, 1.711, 2.064, 2.492, 2.797, 3.467 },
|
|
||||||
/* 25. */ { 1.316, 1.708, 2.060, 2.485, 2.787, 3.450 },
|
|
||||||
/* 26. */ { 1.315, 1.706, 2.056, 2.479, 2.779, 3.435 },
|
|
||||||
/* 27. */ { 1.314, 1.703, 2.052, 2.473, 2.771, 3.421 },
|
|
||||||
/* 28. */ { 1.313, 1.701, 2.048, 2.467, 2.763, 3.408 },
|
|
||||||
/* 29. */ { 1.311, 1.699, 2.045, 2.462, 2.756, 3.396 },
|
|
||||||
/* 30. */ { 1.310, 1.697, 2.042, 2.457, 2.750, 3.385 },
|
|
||||||
/* 31. */ { 1.309, 1.696, 2.040, 2.453, 2.744, 3.375 },
|
|
||||||
/* 32. */ { 1.309, 1.694, 2.037, 2.449, 2.738, 3.365 },
|
|
||||||
/* 33. */ { 1.308, 1.692, 2.035, 2.445, 2.733, 3.356 },
|
|
||||||
/* 34. */ { 1.307, 1.691, 2.032, 2.441, 2.728, 3.348 },
|
|
||||||
/* 35. */ { 1.306, 1.690, 2.030, 2.438, 2.724, 3.340 },
|
|
||||||
/* 36. */ { 1.306, 1.688, 2.028, 2.434, 2.719, 3.333 },
|
|
||||||
/* 37. */ { 1.305, 1.687, 2.026, 2.431, 2.715, 3.326 },
|
|
||||||
/* 38. */ { 1.304, 1.686, 2.024, 2.429, 2.712, 3.319 },
|
|
||||||
/* 39. */ { 1.304, 1.685, 2.023, 2.426, 2.708, 3.313 },
|
|
||||||
/* 40. */ { 1.303, 1.684, 2.021, 2.423, 2.704, 3.307 },
|
|
||||||
/* 41. */ { 1.303, 1.683, 2.020, 2.421, 2.701, 3.301 },
|
|
||||||
/* 42. */ { 1.302, 1.682, 2.018, 2.418, 2.698, 3.296 },
|
|
||||||
/* 43. */ { 1.302, 1.681, 2.017, 2.416, 2.695, 3.291 },
|
|
||||||
/* 44. */ { 1.301, 1.680, 2.015, 2.414, 2.692, 3.286 },
|
|
||||||
/* 45. */ { 1.301, 1.679, 2.014, 2.412, 2.690, 3.281 },
|
|
||||||
/* 46. */ { 1.300, 1.679, 2.013, 2.410, 2.687, 3.277 },
|
|
||||||
/* 47. */ { 1.300, 1.678, 2.012, 2.408, 2.685, 3.273 },
|
|
||||||
/* 48. */ { 1.299, 1.677, 2.011, 2.407, 2.682, 3.269 },
|
|
||||||
/* 49. */ { 1.299, 1.677, 2.010, 2.405, 2.680, 3.265 },
|
|
||||||
/* 50. */ { 1.299, 1.676, 2.009, 2.403, 2.678, 3.261 },
|
|
||||||
/* 51. */ { 1.298, 1.675, 2.008, 2.402, 2.676, 3.258 },
|
|
||||||
/* 52. */ { 1.298, 1.675, 2.007, 2.400, 2.674, 3.255 },
|
|
||||||
/* 53. */ { 1.298, 1.674, 2.006, 2.399, 2.672, 3.251 },
|
|
||||||
/* 54. */ { 1.297, 1.674, 2.005, 2.397, 2.670, 3.248 },
|
|
||||||
/* 55. */ { 1.297, 1.673, 2.004, 2.396, 2.668, 3.245 },
|
|
||||||
/* 56. */ { 1.297, 1.673, 2.003, 2.395, 2.667, 3.242 },
|
|
||||||
/* 57. */ { 1.297, 1.672, 2.002, 2.394, 2.665, 3.239 },
|
|
||||||
/* 58. */ { 1.296, 1.672, 2.002, 2.392, 2.663, 3.237 },
|
|
||||||
/* 59. */ { 1.296, 1.671, 2.001, 2.391, 2.662, 3.234 },
|
|
||||||
/* 60. */ { 1.296, 1.671, 2.000, 2.390, 2.660, 3.232 },
|
|
||||||
/* 61. */ { 1.296, 1.670, 2.000, 2.389, 2.659, 3.229 },
|
|
||||||
/* 62. */ { 1.295, 1.670, 1.999, 2.388, 2.657, 3.227 },
|
|
||||||
/* 63. */ { 1.295, 1.669, 1.998, 2.387, 2.656, 3.225 },
|
|
||||||
/* 64. */ { 1.295, 1.669, 1.998, 2.386, 2.655, 3.223 },
|
|
||||||
/* 65. */ { 1.295, 1.669, 1.997, 2.385, 2.654, 3.220 },
|
|
||||||
/* 66. */ { 1.295, 1.668, 1.997, 2.384, 2.652, 3.218 },
|
|
||||||
/* 67. */ { 1.294, 1.668, 1.996, 2.383, 2.651, 3.216 },
|
|
||||||
/* 68. */ { 1.294, 1.668, 1.995, 2.382, 2.650, 3.214 },
|
|
||||||
/* 69. */ { 1.294, 1.667, 1.995, 2.382, 2.649, 3.213 },
|
|
||||||
/* 70. */ { 1.294, 1.667, 1.994, 2.381, 2.648, 3.211 },
|
|
||||||
/* 71. */ { 1.294, 1.667, 1.994, 2.380, 2.647, 3.209 },
|
|
||||||
/* 72. */ { 1.293, 1.666, 1.993, 2.379, 2.646, 3.207 },
|
|
||||||
/* 73. */ { 1.293, 1.666, 1.993, 2.379, 2.645, 3.206 },
|
|
||||||
/* 74. */ { 1.293, 1.666, 1.993, 2.378, 2.644, 3.204 },
|
|
||||||
/* 75. */ { 1.293, 1.665, 1.992, 2.377, 2.643, 3.202 },
|
|
||||||
/* 76. */ { 1.293, 1.665, 1.992, 2.376, 2.642, 3.201 },
|
|
||||||
/* 77. */ { 1.293, 1.665, 1.991, 2.376, 2.641, 3.199 },
|
|
||||||
/* 78. */ { 1.292, 1.665, 1.991, 2.375, 2.640, 3.198 },
|
|
||||||
/* 79. */ { 1.292, 1.664, 1.990, 2.374, 2.640, 3.197 },
|
|
||||||
/* 80. */ { 1.292, 1.664, 1.990, 2.374, 2.639, 3.195 },
|
|
||||||
/* 81. */ { 1.292, 1.664, 1.990, 2.373, 2.638, 3.194 },
|
|
||||||
/* 82. */ { 1.292, 1.664, 1.989, 2.373, 2.637, 3.193 },
|
|
||||||
/* 83. */ { 1.292, 1.663, 1.989, 2.372, 2.636, 3.191 },
|
|
||||||
/* 84. */ { 1.292, 1.663, 1.989, 2.372, 2.636, 3.190 },
|
|
||||||
/* 85. */ { 1.292, 1.663, 1.988, 2.371, 2.635, 3.189 },
|
|
||||||
/* 86. */ { 1.291, 1.663, 1.988, 2.370, 2.634, 3.188 },
|
|
||||||
/* 87. */ { 1.291, 1.663, 1.988, 2.370, 2.634, 3.187 },
|
|
||||||
/* 88. */ { 1.291, 1.662, 1.987, 2.369, 2.633, 3.185 },
|
|
||||||
/* 89. */ { 1.291, 1.662, 1.987, 2.369, 2.632, 3.184 },
|
|
||||||
/* 90. */ { 1.291, 1.662, 1.987, 2.368, 2.632, 3.183 },
|
|
||||||
/* 91. */ { 1.291, 1.662, 1.986, 2.368, 2.631, 3.182 },
|
|
||||||
/* 92. */ { 1.291, 1.662, 1.986, 2.368, 2.630, 3.181 },
|
|
||||||
/* 93. */ { 1.291, 1.661, 1.986, 2.367, 2.630, 3.180 },
|
|
||||||
/* 94. */ { 1.291, 1.661, 1.986, 2.367, 2.629, 3.179 },
|
|
||||||
/* 95. */ { 1.291, 1.661, 1.985, 2.366, 2.629, 3.178 },
|
|
||||||
/* 96. */ { 1.290, 1.661, 1.985, 2.366, 2.628, 3.177 },
|
|
||||||
/* 97. */ { 1.290, 1.661, 1.985, 2.365, 2.627, 3.176 },
|
|
||||||
/* 98. */ { 1.290, 1.661, 1.984, 2.365, 2.627, 3.175 },
|
|
||||||
/* 99. */ { 1.290, 1.660, 1.984, 2.365, 2.626, 3.175 },
|
|
||||||
/* 100. */ { 1.290, 1.660, 1.984, 2.364, 2.626, 3.174 }
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAX_DS 8
|
|
||||||
static char symbol[MAX_DS] = { ' ', 'x', '+', '*', '%', '#', '@', 'O' };
|
|
||||||
|
|
||||||
struct dataset {
|
|
||||||
char *name;
|
|
||||||
double *points;
|
|
||||||
size_t lpoints;
|
|
||||||
double sy, syy;
|
|
||||||
size_t n;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct dataset *
|
|
||||||
NewSet(void)
|
|
||||||
{
|
|
||||||
struct dataset *ds;
|
|
||||||
|
|
||||||
ds = calloc(1, sizeof *ds);
|
|
||||||
assert(ds != NULL);
|
|
||||||
ds->lpoints = 100000;
|
|
||||||
ds->points = calloc(sizeof *ds->points, ds->lpoints);
|
|
||||||
assert(ds->points != NULL);
|
|
||||||
ds->syy = NAN;
|
|
||||||
return(ds);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
AddPoint(struct dataset *ds, double a)
|
|
||||||
{
|
|
||||||
double *dp;
|
|
||||||
|
|
||||||
if (ds->n >= ds->lpoints) {
|
|
||||||
dp = ds->points;
|
|
||||||
ds->lpoints *= 4;
|
|
||||||
ds->points = calloc(sizeof *ds->points, ds->lpoints);
|
|
||||||
assert(ds->points != NULL);
|
|
||||||
memcpy(ds->points, dp, sizeof *dp * ds->n);
|
|
||||||
free(dp);
|
|
||||||
}
|
|
||||||
ds->points[ds->n++] = a;
|
|
||||||
ds->sy += a;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
Min(const struct dataset *ds)
|
|
||||||
{
|
|
||||||
|
|
||||||
return (ds->points[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
Max(const struct dataset *ds)
|
|
||||||
{
|
|
||||||
|
|
||||||
return (ds->points[ds->n -1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
Avg(const struct dataset *ds)
|
|
||||||
{
|
|
||||||
|
|
||||||
return(ds->sy / ds->n);
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
Median(const struct dataset *ds)
|
|
||||||
{
|
|
||||||
const size_t m = ds->n / 2;
|
|
||||||
|
|
||||||
if ((ds->n % 2) == 0)
|
|
||||||
return ((ds->points[m] + (ds->points[m - 1])) / 2);
|
|
||||||
return (ds->points[m]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
Var(struct dataset *ds)
|
|
||||||
{
|
|
||||||
size_t z;
|
|
||||||
const double a = Avg(ds);
|
|
||||||
|
|
||||||
if (isnan(ds->syy)) {
|
|
||||||
ds->syy = 0.0;
|
|
||||||
for (z = 0; z < ds->n; z++)
|
|
||||||
ds->syy += (ds->points[z] - a) * (ds->points[z] - a);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (ds->syy / (ds->n - 1.0));
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
Stddev(struct dataset *ds)
|
|
||||||
{
|
|
||||||
|
|
||||||
return sqrt(Var(ds));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
VitalsHead(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
printf(" N Min Max Median Avg Stddev\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
Vitals(struct dataset *ds, int flag)
|
|
||||||
{
|
|
||||||
|
|
||||||
printf("%c %3zu %13.8g %13.8g %13.8g %13.8g %13.8g", symbol[flag],
|
|
||||||
ds->n, Min(ds), Max(ds), Median(ds), Avg(ds), Stddev(ds));
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
Relative(struct dataset *ds, struct dataset *rs, int confidx)
|
|
||||||
{
|
|
||||||
double spool, s, d, e, t;
|
|
||||||
double re;
|
|
||||||
size_t z;
|
|
||||||
|
|
||||||
z = ds->n + rs->n - 2;
|
|
||||||
if (z > NSTUDENT)
|
|
||||||
t = student[0][confidx];
|
|
||||||
else
|
|
||||||
t = student[z][confidx];
|
|
||||||
spool = (ds->n - 1) * Var(ds) + (rs->n - 1) * Var(rs);
|
|
||||||
spool /= ds->n + rs->n - 2;
|
|
||||||
spool = sqrt(spool);
|
|
||||||
s = spool * sqrt(1.0 / ds->n + 1.0 / rs->n);
|
|
||||||
d = Avg(ds) - Avg(rs);
|
|
||||||
e = t * s;
|
|
||||||
|
|
||||||
re = (ds->n - 1) * Var(ds) + (rs->n - 1) * Var(rs) *
|
|
||||||
(Avg(ds) * Avg(ds)) / (Avg(rs) * Avg(rs));
|
|
||||||
re *= (ds->n + rs->n) / (ds->n * rs->n * (ds->n + rs->n - 2.0));
|
|
||||||
re = t * sqrt(re);
|
|
||||||
|
|
||||||
if (fabs(d) > e) {
|
|
||||||
printf("Difference at %.1f%% confidence\n", studentpct[confidx]);
|
|
||||||
printf(" %g +/- %g\n", d, e);
|
|
||||||
printf(" %g%% +/- %g%%\n", d * 100 / Avg(rs), re * 100 / Avg(rs));
|
|
||||||
printf(" (Student's t, pooled s = %g)\n", spool);
|
|
||||||
} else {
|
|
||||||
printf("No difference proven at %.1f%% confidence\n",
|
|
||||||
studentpct[confidx]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct plot {
|
|
||||||
double min;
|
|
||||||
double max;
|
|
||||||
double span;
|
|
||||||
int width;
|
|
||||||
|
|
||||||
double x0, dx;
|
|
||||||
size_t height;
|
|
||||||
char *data;
|
|
||||||
char **bar;
|
|
||||||
int separate_bars;
|
|
||||||
int num_datasets;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct plot plot;
|
|
||||||
|
|
||||||
static void
|
|
||||||
SetupPlot(int width, int separate, int num_datasets)
|
|
||||||
{
|
|
||||||
struct plot *pl;
|
|
||||||
|
|
||||||
pl = &plot;
|
|
||||||
pl->width = width;
|
|
||||||
pl->height = 0;
|
|
||||||
pl->data = NULL;
|
|
||||||
pl->bar = NULL;
|
|
||||||
pl->separate_bars = separate;
|
|
||||||
pl->num_datasets = num_datasets;
|
|
||||||
pl->min = 999e99;
|
|
||||||
pl->max = -999e99;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
AdjPlot(double a)
|
|
||||||
{
|
|
||||||
struct plot *pl;
|
|
||||||
|
|
||||||
pl = &plot;
|
|
||||||
if (a < pl->min)
|
|
||||||
pl->min = a;
|
|
||||||
if (a > pl->max)
|
|
||||||
pl->max = a;
|
|
||||||
pl->span = pl->max - pl->min;
|
|
||||||
pl->dx = pl->span / (pl->width - 1.0);
|
|
||||||
pl->x0 = pl->min - .5 * pl->dx;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
DimPlot(struct dataset *ds)
|
|
||||||
{
|
|
||||||
AdjPlot(Min(ds));
|
|
||||||
AdjPlot(Max(ds));
|
|
||||||
AdjPlot(Avg(ds) - Stddev(ds));
|
|
||||||
AdjPlot(Avg(ds) + Stddev(ds));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
PlotSet(struct dataset *ds, int val)
|
|
||||||
{
|
|
||||||
struct plot *pl;
|
|
||||||
int i, x;
|
|
||||||
size_t m, j, z;
|
|
||||||
size_t n;
|
|
||||||
int bar;
|
|
||||||
double av, sd;
|
|
||||||
|
|
||||||
pl = &plot;
|
|
||||||
if (pl->span == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (pl->separate_bars)
|
|
||||||
bar = val-1;
|
|
||||||
else
|
|
||||||
bar = 0;
|
|
||||||
|
|
||||||
if (pl->bar == NULL) {
|
|
||||||
pl->bar = calloc(sizeof(char *), pl->num_datasets);
|
|
||||||
assert(pl->bar != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pl->bar[bar] == NULL) {
|
|
||||||
pl->bar[bar] = malloc(pl->width);
|
|
||||||
assert(pl->bar[bar] != NULL);
|
|
||||||
memset(pl->bar[bar], 0, pl->width);
|
|
||||||
}
|
|
||||||
|
|
||||||
m = 1;
|
|
||||||
i = -1;
|
|
||||||
j = 0;
|
|
||||||
/* Set m to max(j) + 1, to allocate required memory */
|
|
||||||
for (n = 0; n < ds->n; n++) {
|
|
||||||
x = (ds->points[n] - pl->x0) / pl->dx;
|
|
||||||
if (x == i) {
|
|
||||||
j++;
|
|
||||||
if (j > m)
|
|
||||||
m = j;
|
|
||||||
} else {
|
|
||||||
j = 1;
|
|
||||||
i = x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m += 1;
|
|
||||||
if (m > pl->height) {
|
|
||||||
pl->data = realloc(pl->data, pl->width * m);
|
|
||||||
assert(pl->data != NULL);
|
|
||||||
memset(pl->data + pl->height * pl->width, 0,
|
|
||||||
(m - pl->height) * pl->width);
|
|
||||||
}
|
|
||||||
pl->height = m;
|
|
||||||
i = -1;
|
|
||||||
for (n = 0; n < ds->n; n++) {
|
|
||||||
x = (ds->points[n] - pl->x0) / pl->dx;
|
|
||||||
if (x == i) {
|
|
||||||
j++;
|
|
||||||
} else {
|
|
||||||
j = 1;
|
|
||||||
i = x;
|
|
||||||
}
|
|
||||||
pl->data[j * pl->width + x] |= val;
|
|
||||||
}
|
|
||||||
av = Avg(ds);
|
|
||||||
sd = Stddev(ds);
|
|
||||||
if (!isnan(sd)) {
|
|
||||||
x = ((av - sd) - pl->x0) / pl->dx;
|
|
||||||
m = ((av + sd) - pl->x0) / pl->dx;
|
|
||||||
pl->bar[bar][m] = '|';
|
|
||||||
pl->bar[bar][x] = '|';
|
|
||||||
for (z = x + 1; z < m; z++)
|
|
||||||
if (pl->bar[bar][z] == 0)
|
|
||||||
pl->bar[bar][z] = '_';
|
|
||||||
}
|
|
||||||
x = (Median(ds) - pl->x0) / pl->dx;
|
|
||||||
pl->bar[bar][x] = 'M';
|
|
||||||
x = (av - pl->x0) / pl->dx;
|
|
||||||
pl->bar[bar][x] = 'A';
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
DumpPlot(void)
|
|
||||||
{
|
|
||||||
struct plot *pl;
|
|
||||||
int i, j, k;
|
|
||||||
size_t z;
|
|
||||||
|
|
||||||
pl = &plot;
|
|
||||||
if (pl->span == 0) {
|
|
||||||
printf("[no plot, span is zero width]\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
putchar('+');
|
|
||||||
for (i = 0; i < pl->width; i++)
|
|
||||||
putchar('-');
|
|
||||||
putchar('+');
|
|
||||||
putchar('\n');
|
|
||||||
for (z = 1; z < pl->height; z++) {
|
|
||||||
putchar('|');
|
|
||||||
for (j = 0; j < pl->width; j++) {
|
|
||||||
k = pl->data[(pl->height - z) * pl->width + j];
|
|
||||||
if (k >= 0 && k < MAX_DS)
|
|
||||||
putchar(symbol[k]);
|
|
||||||
else
|
|
||||||
printf("[%02x]", k);
|
|
||||||
}
|
|
||||||
putchar('|');
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
for (i = 0; i < pl->num_datasets; i++) {
|
|
||||||
if (pl->bar[i] == NULL)
|
|
||||||
continue;
|
|
||||||
putchar('|');
|
|
||||||
for (j = 0; j < pl->width; j++) {
|
|
||||||
k = pl->bar[i][j];
|
|
||||||
if (k == 0)
|
|
||||||
k = ' ';
|
|
||||||
putchar(k);
|
|
||||||
}
|
|
||||||
putchar('|');
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
putchar('+');
|
|
||||||
for (i = 0; i < pl->width; i++)
|
|
||||||
putchar('-');
|
|
||||||
putchar('+');
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
dbl_cmp(const void *a, const void *b)
|
|
||||||
{
|
|
||||||
const double *aa = a;
|
|
||||||
const double *bb = b;
|
|
||||||
|
|
||||||
if (*aa < *bb)
|
|
||||||
return (-1);
|
|
||||||
else if (*aa > *bb)
|
|
||||||
return (1);
|
|
||||||
else
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct dataset *
|
|
||||||
ReadSet(FILE *f, const char *n, int column, const char *delim)
|
|
||||||
{
|
|
||||||
char buf[BUFSIZ], *p, *t;
|
|
||||||
struct dataset *s;
|
|
||||||
double d;
|
|
||||||
int line;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
s = NewSet();
|
|
||||||
s->name = strdup(n);
|
|
||||||
assert(s->name != NULL);
|
|
||||||
line = 0;
|
|
||||||
while (fgets(buf, sizeof buf, f) != NULL) {
|
|
||||||
line++;
|
|
||||||
|
|
||||||
i = strlen(buf);
|
|
||||||
while (i > 0 && isspace(buf[i - 1]))
|
|
||||||
buf[--i] = '\0';
|
|
||||||
for (i = 1, t = strtok(buf, delim);
|
|
||||||
t != NULL && *t != '#';
|
|
||||||
i++, t = strtok(NULL, delim)) {
|
|
||||||
if (i == column)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (t == NULL || *t == '#')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
d = strtod(t, &p);
|
|
||||||
if (p != NULL && *p != '\0')
|
|
||||||
errx(2, "Invalid data on line %d in %s", line, n);
|
|
||||||
if (*buf != '\0')
|
|
||||||
AddPoint(s, d);
|
|
||||||
}
|
|
||||||
if (s->n < 3) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Dataset %s must contain at least 3 data points\n", n);
|
|
||||||
exit (2);
|
|
||||||
}
|
|
||||||
qsort(s->points, s->n, sizeof *s->points, dbl_cmp);
|
|
||||||
return (s);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage(char const *whine)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
fprintf(stderr, "%s\n", whine);
|
|
||||||
fprintf(stderr,
|
|
||||||
"Usage: ministat [-C column] [-c confidence] [-d delimiter(s)] [-Ans] [-w width] [file [file ...]]\n");
|
|
||||||
fprintf(stderr, "\tconfidence = {");
|
|
||||||
for (i = 0; i < NCONF; i++) {
|
|
||||||
fprintf(stderr, "%s%g%%",
|
|
||||||
i ? ", " : "",
|
|
||||||
studentpct[i]);
|
|
||||||
}
|
|
||||||
fprintf(stderr, "}\n");
|
|
||||||
fprintf(stderr, "\t-A : print statistics only. suppress the graph.\n");
|
|
||||||
fprintf(stderr, "\t-C : column number to extract (starts and defaults to 1)\n");
|
|
||||||
fprintf(stderr, "\t-d : delimiter(s) string, default to \" \\t\"\n");
|
|
||||||
fprintf(stderr, "\t-n : print summary statistics only, no graph/test\n");
|
|
||||||
fprintf(stderr, "\t-s : print avg/median/stddev bars on separate lines\n");
|
|
||||||
fprintf(stderr, "\t-w : width of graph/test output (default 74 or terminal width)\n");
|
|
||||||
exit (2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
const char *setfilenames[MAX_DS - 1];
|
|
||||||
struct dataset *ds[MAX_DS - 1];
|
|
||||||
FILE *setfiles[MAX_DS - 1];
|
|
||||||
int nds;
|
|
||||||
double a;
|
|
||||||
const char *delim = " \t";
|
|
||||||
char *p;
|
|
||||||
int c, i, ci;
|
|
||||||
int column = 1;
|
|
||||||
int flag_s = 0;
|
|
||||||
int flag_n = 0;
|
|
||||||
int termwidth = 74;
|
|
||||||
int suppress_plot = 0;
|
|
||||||
|
|
||||||
if (isatty(STDOUT_FILENO)) {
|
|
||||||
struct winsize wsz;
|
|
||||||
|
|
||||||
if ((p = getenv("COLUMNS")) != NULL && *p != '\0')
|
|
||||||
termwidth = atoi(p);
|
|
||||||
else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &wsz) != -1 &&
|
|
||||||
wsz.ws_col > 0)
|
|
||||||
termwidth = wsz.ws_col - 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
ci = -1;
|
|
||||||
while ((c = getopt(argc, argv, "AC:c:d:snw:")) != -1)
|
|
||||||
switch (c) {
|
|
||||||
case 'A':
|
|
||||||
suppress_plot = 1;
|
|
||||||
break;
|
|
||||||
case 'C':
|
|
||||||
column = strtol(optarg, &p, 10);
|
|
||||||
if (p != NULL && *p != '\0')
|
|
||||||
usage("Invalid column number.");
|
|
||||||
if (column <= 0)
|
|
||||||
usage("Column number should be positive.");
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
a = strtod(optarg, &p);
|
|
||||||
if (p != NULL && *p != '\0')
|
|
||||||
usage("Not a floating point number");
|
|
||||||
for (i = 0; i < NCONF; i++)
|
|
||||||
if (a == studentpct[i])
|
|
||||||
ci = i;
|
|
||||||
if (ci == -1)
|
|
||||||
usage("No support for confidence level");
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
if (*optarg == '\0')
|
|
||||||
usage("Can't use empty delimiter string");
|
|
||||||
delim = optarg;
|
|
||||||
break;
|
|
||||||
case 'n':
|
|
||||||
flag_n = 1;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
flag_s = 1;
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
termwidth = strtol(optarg, &p, 10);
|
|
||||||
if (p != NULL && *p != '\0')
|
|
||||||
usage("Invalid width, not a number.");
|
|
||||||
if (termwidth < 0)
|
|
||||||
usage("Unable to move beyond left margin.");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
usage("Unknown option");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ci == -1)
|
|
||||||
ci = 2;
|
|
||||||
argc -= optind;
|
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
if (argc == 0) {
|
|
||||||
setfilenames[0] = "<stdin>";
|
|
||||||
setfiles[0] = stdin;
|
|
||||||
nds = 1;
|
|
||||||
} else {
|
|
||||||
if (argc > (MAX_DS - 1))
|
|
||||||
usage("Too many datasets.");
|
|
||||||
nds = argc;
|
|
||||||
for (i = 0; i < nds; i++) {
|
|
||||||
setfilenames[i] = argv[i];
|
|
||||||
if (!strcmp(argv[i], "-"))
|
|
||||||
setfiles[0] = stdin;
|
|
||||||
else
|
|
||||||
setfiles[i] = fopen(argv[i], "r");
|
|
||||||
if (setfiles[i] == NULL)
|
|
||||||
err(2, "Cannot open %s", argv[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nds; i++) {
|
|
||||||
ds[i] = ReadSet(setfiles[i], setfilenames[i], column, delim);
|
|
||||||
if (setfiles[i] != stdin)
|
|
||||||
fclose(setfiles[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nds; i++)
|
|
||||||
printf("%c %s\n", symbol[i+1], ds[i]->name);
|
|
||||||
|
|
||||||
if (!flag_n && !suppress_plot) {
|
|
||||||
SetupPlot(termwidth, flag_s, nds);
|
|
||||||
for (i = 0; i < nds; i++)
|
|
||||||
DimPlot(ds[i]);
|
|
||||||
for (i = 0; i < nds; i++)
|
|
||||||
PlotSet(ds[i], i + 1);
|
|
||||||
DumpPlot();
|
|
||||||
}
|
|
||||||
VitalsHead();
|
|
||||||
Vitals(ds[0], 1);
|
|
||||||
for (i = 1; i < nds; i++) {
|
|
||||||
Vitals(ds[i], i + 1);
|
|
||||||
if (!flag_n)
|
|
||||||
Relative(ds[i], ds[0], ci);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
}
|
|
@ -1,261 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This script requires some non-POSIX utilities, but that's okay because it's
|
|
||||||
# really for maintainer use only.
|
|
||||||
#
|
|
||||||
# The non-POSIX utilities include:
|
|
||||||
#
|
|
||||||
# * git
|
|
||||||
# * stat
|
|
||||||
# * tar
|
|
||||||
# * gzip
|
|
||||||
# * xz
|
|
||||||
# * sha512sum
|
|
||||||
# * sha256sum
|
|
||||||
# * gpg
|
|
||||||
# * zip
|
|
||||||
# * unzip
|
|
||||||
|
|
||||||
shasum() {
|
|
||||||
|
|
||||||
f="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
# All this fancy stuff takes the sha512 and sha256 sums and signs it. The
|
|
||||||
# output after this point is what I usually copy into the release notes.
|
|
||||||
# (See manuals/release.md for more information.)
|
|
||||||
printf '$ sha512sum %s\n' "$f"
|
|
||||||
sha512sum "$f"
|
|
||||||
printf '\n'
|
|
||||||
printf '$ sha256sum %s\n' "$f"
|
|
||||||
sha256sum "$f"
|
|
||||||
printf '\n'
|
|
||||||
printf "$ stat -c '%%s %%n'\n" "$f"
|
|
||||||
stat -c '%s %n' "$f"
|
|
||||||
|
|
||||||
if [ -f "$f.sig" ]; then
|
|
||||||
rm -f "$f.sig"
|
|
||||||
fi
|
|
||||||
|
|
||||||
gpg --detach-sig -o "$f.sig" "$f" 2> /dev/null
|
|
||||||
|
|
||||||
printf '\n'
|
|
||||||
printf '$ sha512sum %s.sig\n' "$f"
|
|
||||||
sha512sum "$f.sig"
|
|
||||||
printf '\n'
|
|
||||||
printf '$ sha256sum %s.sig\n' "$f"
|
|
||||||
sha256sum "$f.sig"
|
|
||||||
printf '\n'
|
|
||||||
printf "$ stat -c '%%s %%n'\n" "$f.sig"
|
|
||||||
stat -c '%s %n' "$f.sig"
|
|
||||||
}
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
|
|
||||||
repo="$scriptdir/.."
|
|
||||||
proj="bc"
|
|
||||||
|
|
||||||
cd "$repo"
|
|
||||||
|
|
||||||
if [ ! -f "../vs.zip" ]; then
|
|
||||||
printf 'Must have Windows builds!\n'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# We want the absolute path for later.
|
|
||||||
repo=$(pwd)
|
|
||||||
|
|
||||||
# This convoluted mess does pull the version out. If you change the format of
|
|
||||||
# include/version.h, you may have to change this line.
|
|
||||||
version=$(cat include/version.h | grep "VERSION " - | awk '{ print $3 }' -)
|
|
||||||
|
|
||||||
tag_msg="Version $version"
|
|
||||||
projver="${proj}-${version}"
|
|
||||||
|
|
||||||
tempdir="/tmp/${projver}"
|
|
||||||
rm -rf $tempdir
|
|
||||||
mkdir -p $tempdir
|
|
||||||
|
|
||||||
make clean_tests > /dev/null 2> /dev/null
|
|
||||||
|
|
||||||
# Delete the tag and recreate it. This is the part of the script that makes it
|
|
||||||
# so you cannot run it twice on the same version, unless you know what you are
|
|
||||||
# doing. In fact, you cannot run it again if users have already started to use
|
|
||||||
# the old version of the tag.
|
|
||||||
if git rev-parse "$version" > /dev/null 2>&1; then
|
|
||||||
git push --delete origin "$version" > /dev/null 2> /dev/null
|
|
||||||
git tag --delete "$version" > /dev/null 2> /dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
git push > /dev/null 2> /dev/null
|
|
||||||
git tg "$version" -m "$tag_msg" > /dev/null 2> /dev/null
|
|
||||||
git push --tags > /dev/null 2> /dev/null
|
|
||||||
|
|
||||||
# This line grabs the names of all of the files in .gitignore that still exist.
|
|
||||||
ignores=$(git check-ignore * **/*)
|
|
||||||
|
|
||||||
cp -r ./* "$tempdir"
|
|
||||||
|
|
||||||
cd $tempdir
|
|
||||||
|
|
||||||
# Delete all the ignored files.
|
|
||||||
for i in $ignores; do
|
|
||||||
rm -rf "./$i"
|
|
||||||
done
|
|
||||||
|
|
||||||
# This is a list of files that end users (including *software packagers* and
|
|
||||||
# *distro maintainers*!) do not care about. In particular, they *do* care about
|
|
||||||
# the testing infrastructure for the regular test suite because distro
|
|
||||||
# maintainers probably want to ensure the test suite runs. However, they
|
|
||||||
# probably don't care about fuzzing or other randomized testing. Also, I
|
|
||||||
# technically can't distribute tests/bc/scripts/timeconst.bc because it's from
|
|
||||||
# the Linux kernel, which is GPL.
|
|
||||||
extras=$(cat <<*EOF
|
|
||||||
.git/
|
|
||||||
.gitignore
|
|
||||||
.gitattributes
|
|
||||||
benchmarks/
|
|
||||||
manuals/bc.1.md.in
|
|
||||||
manuals/dc.1.md.in
|
|
||||||
manuals/benchmarks.md
|
|
||||||
manuals/development.md
|
|
||||||
manuals/header_bcl.txt
|
|
||||||
manuals/header_bc.txt
|
|
||||||
manuals/header_dc.txt
|
|
||||||
manuals/header.txt
|
|
||||||
manuals/release.md
|
|
||||||
scripts/afl.py
|
|
||||||
scripts/alloc.sh
|
|
||||||
scripts/benchmark.sh
|
|
||||||
scripts/bitfuncgen.c
|
|
||||||
scripts/fuzz_prep.sh
|
|
||||||
scripts/manpage.sh
|
|
||||||
scripts/ministat.c
|
|
||||||
scripts/package.sh
|
|
||||||
scripts/radamsa.sh
|
|
||||||
scripts/radamsa.txt
|
|
||||||
scripts/randmath.py
|
|
||||||
scripts/release_settings.txt
|
|
||||||
scripts/release.sh
|
|
||||||
scripts/test_settings.sh
|
|
||||||
scripts/test_settings.txt
|
|
||||||
tests/bc_outputs/
|
|
||||||
tests/dc_outputs/
|
|
||||||
tests/fuzzing/
|
|
||||||
tests/bc/scripts/timeconst.bc
|
|
||||||
*EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
for i in $extras; do
|
|
||||||
rm -rf "./$i"
|
|
||||||
done
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
parent="$repo/.."
|
|
||||||
|
|
||||||
# Cleanup old stuff.
|
|
||||||
if [ -f "$projver.tar.gz" ]; then
|
|
||||||
rm -rf "$projver.tar.gz"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "$projver.tar.gz.sig" ]; then
|
|
||||||
rm -rf "$projver.tar.gz.sig"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "$projver.tar.xz" ]; then
|
|
||||||
rm -rf "$projver.tar.xz"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f "$projver.tar.xz.sig" ]; then
|
|
||||||
rm -rf "$projver.tar.xz.sig"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Tar and compress and move into the parent directory of the repo.
|
|
||||||
tar cf "$projver.tar" "$projver/"
|
|
||||||
gzip -k "$projver.tar"
|
|
||||||
mv "$projver.tar.gz" "$parent"
|
|
||||||
xz -z -v -9 -e "$projver.tar" > /dev/null 2> /dev/null
|
|
||||||
mv "$projver.tar.xz" "$parent"
|
|
||||||
|
|
||||||
cd "$parent"
|
|
||||||
|
|
||||||
# Clean up old Windows stuff.
|
|
||||||
if [ -d windows ]; then
|
|
||||||
rm -rf windows
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f windows.zip ]; then
|
|
||||||
rm -rf $projver-windows.zip
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prepare Windows stuff.
|
|
||||||
unzip vs.zip > /dev/null
|
|
||||||
mv vs windows
|
|
||||||
|
|
||||||
# Remove unneeded Windows stuff.
|
|
||||||
rm -rf windows/*.vcxproj.user
|
|
||||||
rm -rf windows/src2
|
|
||||||
rm -rf windows/tests
|
|
||||||
rm -rf windows/*.sln
|
|
||||||
rm -rf windows/*.vcxproj
|
|
||||||
rm -rf windows/*.vcxproj.filters
|
|
||||||
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/*.obj
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/*.iobj
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.exe.recipe
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.ilk
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.log
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.tlog
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.pdb
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.ipdb
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/bc.vcxproj.FileListAbsolute.txt
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/strgen.exe
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/vc142.idb
|
|
||||||
rm -rf windows/bin/{Win32,x64}/{Debug,Release}/vc142.pdb
|
|
||||||
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/*.obj
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/bcl.lib.recipe
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/bcl.log
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/bcl.tlog
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/bcl.idb
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/bcl.pdb
|
|
||||||
rm -rf windows/lib/{Win32,x64}/{Debug,ReleaseMD,ReleaseMT}/bcl.vcxproj.FileListAbsolute.txt
|
|
||||||
|
|
||||||
# Zip the Windows stuff.
|
|
||||||
zip -r $projver-windows.zip windows > /dev/null
|
|
||||||
|
|
||||||
printf '\n'
|
|
||||||
shasum "$projver.tar.gz"
|
|
||||||
printf '\n'
|
|
||||||
shasum "$projver.tar.xz"
|
|
||||||
printf '\n'
|
|
||||||
shasum "$projver-windows.zip"
|
|
@ -1,133 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This script uses some non-POSIX behavior, but since it's meant for bc
|
|
||||||
# maintainers only, I can accept that.
|
|
||||||
|
|
||||||
# Get an entry from the file. If an argument exists, it is an index. Get that
|
|
||||||
# line. Otherwise, get a random line.
|
|
||||||
getentry() {
|
|
||||||
|
|
||||||
# Figure out if we get a specific or random line.
|
|
||||||
if [ $# -gt 0 ]; then
|
|
||||||
entnum="$1"
|
|
||||||
else
|
|
||||||
entnum=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get data from stdin and figure out how many lines there are.
|
|
||||||
e=$(cat -)
|
|
||||||
num=$(printf '%s\n' "$e" | wc -l)
|
|
||||||
|
|
||||||
# Figure out what line we are going to get. Uses bc's own PRNG.
|
|
||||||
if [ "$entnum" -eq 0 ]; then
|
|
||||||
rand=$(printf 'irand(%s) + 1\n' "$num" | "$bcdir/bc")
|
|
||||||
else
|
|
||||||
rand="$entnum"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get the line.
|
|
||||||
ent=$(printf '%s\n' "$e" | tail -n +$rand | head -n 1)
|
|
||||||
|
|
||||||
printf '%s\n' "$ent"
|
|
||||||
}
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
dir=$(dirname "$script")
|
|
||||||
|
|
||||||
. "$dir/functions.sh"
|
|
||||||
|
|
||||||
# Command-line processing.
|
|
||||||
if [ "$#" -lt 1 ]; then
|
|
||||||
printf 'usage: %s dir\n' "$0"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
d="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
bcdir="$dir/../bin"
|
|
||||||
|
|
||||||
# Figure out the correct input directory.
|
|
||||||
if [ "$d" = "bc" ]; then
|
|
||||||
inputs="$dir/../tests/fuzzing/bc_inputs1"
|
|
||||||
opts="-lq"
|
|
||||||
elif [ "$d" = "dc" ]; then
|
|
||||||
inputs="$dir/../test/fuzzing/dc_inputs"
|
|
||||||
opts="-x"
|
|
||||||
else
|
|
||||||
err_exit "wrong type of executable" 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
export ASAN_OPTIONS="abort_on_error=1:allocator_may_return_null=1"
|
|
||||||
|
|
||||||
entries=$(cat "$dir/radamsa.txt")
|
|
||||||
|
|
||||||
IFS=$'\n'
|
|
||||||
|
|
||||||
go=1
|
|
||||||
|
|
||||||
# Infinite loop.
|
|
||||||
while [ "$go" -ne 0 ]; do
|
|
||||||
|
|
||||||
# If we are running bc, fuzz command-line arguments in BC_ENV_ARGS.
|
|
||||||
if [ "$d" = "bc" ]; then
|
|
||||||
|
|
||||||
entry=$(cat -- "$dir/radamsa.txt" | getentry)
|
|
||||||
items=$(printf '%s\n' "$entry" | radamsa -n 10)
|
|
||||||
|
|
||||||
printf '%s\n' "$items"
|
|
||||||
|
|
||||||
for i in `seq 1 10`; do
|
|
||||||
|
|
||||||
item=$(printf '%s\n' "$items" | getentry "$i")
|
|
||||||
|
|
||||||
export BC_ENV_ARGS="$item"
|
|
||||||
echo 'halt' | "$bcdir/$d"
|
|
||||||
err=$?
|
|
||||||
|
|
||||||
checkcrash "$d" "$err" "radamsa env args: \"$item\""
|
|
||||||
done
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
f=$(ls "$inputs" | getentry)
|
|
||||||
l=$(cat "$inputs/$f" | wc -l)
|
|
||||||
ll=$(printf '%s^2\n' "$l" | bc)
|
|
||||||
|
|
||||||
# Fuzz on the AFL++ inputs.
|
|
||||||
for i in $(seq 1 2); do
|
|
||||||
data=$(cat "$inputs/$f" | radamsa -n 1)
|
|
||||||
printf '%s\n' "$data" > "$dir/../.log_${d}_test.txt"
|
|
||||||
printf '%s\n' "$data" | timeout -s SIGTERM 5 "$bcdir/$d" "$opts" > /dev/null
|
|
||||||
err=$?
|
|
||||||
checkcrash "$d" "$err" "radamsa stdin"
|
|
||||||
done
|
|
||||||
|
|
||||||
done
|
|
@ -1,17 +0,0 @@
|
|||||||
-lq '/home/gavin/.bcrc'
|
|
||||||
-lq "/home/gavin/.bcrc"
|
|
||||||
-lqg '/home/gavin/bc stuff.bc'
|
|
||||||
-lqg "/home/gavin/bc stuff.bc"
|
|
||||||
-lqg '/home/gavin/"bc" stuff.bc'
|
|
||||||
-lqg "/home/gavin/'bc' stuff.bc"
|
|
||||||
-lqg '/home/gavin/bc stuff.bc
|
|
||||||
-lqg "/home/gavin/bc stuff.bc
|
|
||||||
-lqg '/home/gavin/"bc" stuff.bc
|
|
||||||
-lqg "/home/gavin/'bc' stuff.bc
|
|
||||||
--mathlib --expand
|
|
||||||
--file="/home/gavin/.bcrc"
|
|
||||||
--file=/home/gavin/.bcrc
|
|
||||||
--file="/home/gavin/bc stuff.bc"
|
|
||||||
--file
|
|
||||||
--expression "4+4"
|
|
||||||
-e "irand(128)" -f /home/gavin/.bcrc
|
|
@ -1,421 +0,0 @@
|
|||||||
#! /usr/bin/python3 -B
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
import os, errno
|
|
||||||
import random
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
# I want line length to *not* affect differences between the two, so I set it
|
|
||||||
# as high as possible.
|
|
||||||
env = {
|
|
||||||
"BC_LINE_LENGTH": "65535",
|
|
||||||
"DC_LINE_LENGTH": "65535"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Generate a random integer between 0 and 2^limit.
|
|
||||||
# @param limit The power of two for the upper limit.
|
|
||||||
def gen(limit=4):
|
|
||||||
return random.randint(0, 2 ** (8 * limit))
|
|
||||||
|
|
||||||
|
|
||||||
# Returns a random boolean for whether a number should be negative or not.
|
|
||||||
def negative():
|
|
||||||
return random.randint(0, 1) == 1
|
|
||||||
|
|
||||||
|
|
||||||
# Returns a random boolean for whether a number should be 0 or not. I decided to
|
|
||||||
# have it be 0 every 2^4 times since sometimes it is used to make a number less
|
|
||||||
# than 1.
|
|
||||||
def zero():
|
|
||||||
return random.randint(0, 2 ** (4) - 1) == 0
|
|
||||||
|
|
||||||
|
|
||||||
# Generate a real portion of a number.
|
|
||||||
def gen_real():
|
|
||||||
|
|
||||||
# Figure out if we should have a real portion. If so generate it.
|
|
||||||
if negative():
|
|
||||||
n = str(gen(25))
|
|
||||||
length = gen(7 / 8)
|
|
||||||
if len(n) < length:
|
|
||||||
n = ("0" * (length - len(n))) + n
|
|
||||||
else:
|
|
||||||
n = "0"
|
|
||||||
|
|
||||||
return n
|
|
||||||
|
|
||||||
|
|
||||||
# Generates a number (as a string) based on the parameters.
|
|
||||||
# @param op The operation under test.
|
|
||||||
# @param neg Whether the number can be negative.
|
|
||||||
# @param real Whether the number can be a non-integer.
|
|
||||||
# @param z Whether the number can be zero.
|
|
||||||
# @param limit The power of 2 upper limit for the number.
|
|
||||||
def num(op, neg, real, z, limit=4):
|
|
||||||
|
|
||||||
# Handle zero first.
|
|
||||||
if z:
|
|
||||||
z = zero()
|
|
||||||
else:
|
|
||||||
z = False
|
|
||||||
|
|
||||||
if z:
|
|
||||||
# Generate a real portion maybe
|
|
||||||
if real:
|
|
||||||
n = gen_real()
|
|
||||||
if n != "0":
|
|
||||||
return "0." + n
|
|
||||||
return "0"
|
|
||||||
|
|
||||||
# Figure out if we should be negative.
|
|
||||||
if neg:
|
|
||||||
neg = negative()
|
|
||||||
|
|
||||||
# Generate the integer portion.
|
|
||||||
g = gen(limit)
|
|
||||||
|
|
||||||
# Figure out if we should have a real number. negative() is used to give a
|
|
||||||
# 50/50 chance of getting a negative number.
|
|
||||||
if real:
|
|
||||||
n = gen_real()
|
|
||||||
else:
|
|
||||||
n = "0"
|
|
||||||
|
|
||||||
# Generate the string.
|
|
||||||
g = str(g)
|
|
||||||
if n != "0":
|
|
||||||
g = g + "." + n
|
|
||||||
|
|
||||||
# Make sure to use the right negative sign.
|
|
||||||
if neg and g != "0":
|
|
||||||
if op != modexp:
|
|
||||||
g = "-" + g
|
|
||||||
else:
|
|
||||||
g = "_" + g
|
|
||||||
|
|
||||||
return g
|
|
||||||
|
|
||||||
|
|
||||||
# Add a failed test to the list.
|
|
||||||
# @param test The test that failed.
|
|
||||||
# @param op The operation for the test.
|
|
||||||
def add(test, op):
|
|
||||||
tests.append(test)
|
|
||||||
gen_ops.append(op)
|
|
||||||
|
|
||||||
|
|
||||||
# Compare the output between the two.
|
|
||||||
# @param exe The executable under test.
|
|
||||||
# @param options The command-line options.
|
|
||||||
# @param p The object returned from subprocess.run() for the calculator
|
|
||||||
# under test.
|
|
||||||
# @param test The test.
|
|
||||||
# @param halt The halt string for the calculator under test.
|
|
||||||
# @param expected The expected result.
|
|
||||||
# @param op The operation under test.
|
|
||||||
# @param do_add If true, add a failing test to the list, otherwise, don't.
|
|
||||||
def compare(exe, options, p, test, halt, expected, op, do_add=True):
|
|
||||||
|
|
||||||
# Check for error from the calculator under test.
|
|
||||||
if p.returncode != 0:
|
|
||||||
|
|
||||||
print(" {} returned an error ({})".format(exe, p.returncode))
|
|
||||||
|
|
||||||
if do_add:
|
|
||||||
print(" adding to checklist...")
|
|
||||||
add(test, op)
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
actual = p.stdout.decode()
|
|
||||||
|
|
||||||
# Check for a difference in output.
|
|
||||||
if actual != expected:
|
|
||||||
|
|
||||||
if op >= exponent:
|
|
||||||
|
|
||||||
# This is here because GNU bc, like mine can be flaky on the
|
|
||||||
# functions in the math library. This is basically testing if adding
|
|
||||||
# 10 to the scale works to make them match. If so, the difference is
|
|
||||||
# only because of that.
|
|
||||||
indata = "scale += 10; {}; {}".format(test, halt)
|
|
||||||
args = [ exe, options ]
|
|
||||||
p2 = subprocess.run(args, input=indata.encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
|
|
||||||
expected = p2.stdout[:-10].decode()
|
|
||||||
|
|
||||||
if actual == expected:
|
|
||||||
print(" failed because of bug in other {}".format(exe))
|
|
||||||
print(" continuing...")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Do the correct output for the situation.
|
|
||||||
if do_add:
|
|
||||||
print(" failed; adding to checklist...")
|
|
||||||
add(test, op)
|
|
||||||
else:
|
|
||||||
print(" failed {}".format(test))
|
|
||||||
print(" expected:")
|
|
||||||
print(" {}".format(expected))
|
|
||||||
print(" actual:")
|
|
||||||
print(" {}".format(actual))
|
|
||||||
|
|
||||||
|
|
||||||
# Generates a test for op. I made sure that there was no clashing between
|
|
||||||
# calculators. Each calculator is responsible for certain ops.
|
|
||||||
# @param op The operation to test.
|
|
||||||
def gen_test(op):
|
|
||||||
|
|
||||||
# First, figure out how big the scale should be.
|
|
||||||
scale = num(op, False, False, True, 5 / 8)
|
|
||||||
|
|
||||||
# Do the right thing for each op. Generate the test based on the format
|
|
||||||
# string and the constraints of each op. For example, some ops can't accept
|
|
||||||
# 0 in some arguments, and some must have integers in some arguments.
|
|
||||||
if op < div:
|
|
||||||
s = fmts[op].format(scale, num(op, True, True, True), num(op, True, True, True))
|
|
||||||
elif op == div or op == mod:
|
|
||||||
s = fmts[op].format(scale, num(op, True, True, True), num(op, True, True, False))
|
|
||||||
elif op == power:
|
|
||||||
s = fmts[op].format(scale, num(op, True, True, True, 7 / 8), num(op, True, False, True, 6 / 8))
|
|
||||||
elif op == modexp:
|
|
||||||
s = fmts[op].format(scale, num(op, True, False, True), num(op, True, False, True),
|
|
||||||
num(op, True, False, False))
|
|
||||||
elif op == sqrt:
|
|
||||||
s = "1"
|
|
||||||
while s == "1":
|
|
||||||
s = num(op, False, True, True, 1)
|
|
||||||
s = fmts[op].format(scale, s)
|
|
||||||
else:
|
|
||||||
|
|
||||||
if op == exponent:
|
|
||||||
first = num(op, True, True, True, 6 / 8)
|
|
||||||
elif op == bessel:
|
|
||||||
first = num(op, False, True, True, 6 / 8)
|
|
||||||
else:
|
|
||||||
first = num(op, True, True, True)
|
|
||||||
|
|
||||||
if op != bessel:
|
|
||||||
s = fmts[op].format(scale, first)
|
|
||||||
else:
|
|
||||||
s = fmts[op].format(scale, first, 6 / 8)
|
|
||||||
|
|
||||||
return s
|
|
||||||
|
|
||||||
|
|
||||||
# Runs a test with number t.
|
|
||||||
# @param t The number of the test.
|
|
||||||
def run_test(t):
|
|
||||||
|
|
||||||
# Randomly select the operation.
|
|
||||||
op = random.randrange(bessel + 1)
|
|
||||||
|
|
||||||
# Select the right calculator.
|
|
||||||
if op != modexp:
|
|
||||||
exe = "bc"
|
|
||||||
halt = "halt"
|
|
||||||
options = "-lq"
|
|
||||||
else:
|
|
||||||
exe = "dc"
|
|
||||||
halt = "q"
|
|
||||||
options = ""
|
|
||||||
|
|
||||||
# Generate the test.
|
|
||||||
test = gen_test(op)
|
|
||||||
|
|
||||||
# These don't work very well for some reason.
|
|
||||||
if "c(0)" in test or "scale = 4; j(4" in test:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Make sure the calculator will halt.
|
|
||||||
bcexe = exedir + "/" + exe
|
|
||||||
indata = test + "\n" + halt
|
|
||||||
|
|
||||||
print("Test {}: {}".format(t, test))
|
|
||||||
|
|
||||||
# Only bc has options.
|
|
||||||
if exe == "bc":
|
|
||||||
args = [ exe, options ]
|
|
||||||
else:
|
|
||||||
args = [ exe ]
|
|
||||||
|
|
||||||
# Run the GNU bc.
|
|
||||||
p = subprocess.run(args, input=indata.encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
|
|
||||||
|
|
||||||
output1 = p.stdout.decode()
|
|
||||||
|
|
||||||
# Error checking for GNU.
|
|
||||||
if p.returncode != 0 or output1 == "":
|
|
||||||
print(" other {} returned an error ({}); continuing...".format(exe, p.returncode))
|
|
||||||
return
|
|
||||||
|
|
||||||
if output1 == "\n":
|
|
||||||
print(" other {} has a bug; continuing...".format(exe))
|
|
||||||
return
|
|
||||||
|
|
||||||
# Don't know why GNU has this problem...
|
|
||||||
if output1 == "-0\n":
|
|
||||||
output1 = "0\n"
|
|
||||||
elif output1 == "-0":
|
|
||||||
output1 = "0"
|
|
||||||
|
|
||||||
args = [ bcexe, options ]
|
|
||||||
|
|
||||||
# Run this bc/dc and compare.
|
|
||||||
p = subprocess.run(args, input=indata.encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
|
|
||||||
compare(exe, options, p, test, halt, output1, op)
|
|
||||||
|
|
||||||
|
|
||||||
# This script must be run by itself.
|
|
||||||
if __name__ != "__main__":
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
script = sys.argv[0]
|
|
||||||
testdir = os.path.dirname(script)
|
|
||||||
|
|
||||||
exedir = testdir + "/../bin"
|
|
||||||
|
|
||||||
# The following are tables used to generate numbers.
|
|
||||||
|
|
||||||
# The operations to test.
|
|
||||||
ops = [ '+', '-', '*', '/', '%', '^', '|' ]
|
|
||||||
|
|
||||||
# The functions that can be tested.
|
|
||||||
funcs = [ "sqrt", "e", "l", "a", "s", "c", "j" ]
|
|
||||||
|
|
||||||
# The files (corresponding to the operations with the functions appended) to add
|
|
||||||
# tests to if they fail.
|
|
||||||
files = [ "add", "subtract", "multiply", "divide", "modulus", "power", "modexp",
|
|
||||||
"sqrt", "exponent", "log", "arctangent", "sine", "cosine", "bessel" ]
|
|
||||||
|
|
||||||
# The format strings corresponding to each operation and then each function.
|
|
||||||
fmts = [ "scale = {}; {} + {}", "scale = {}; {} - {}", "scale = {}; {} * {}",
|
|
||||||
"scale = {}; {} / {}", "scale = {}; {} % {}", "scale = {}; {} ^ {}",
|
|
||||||
"{}k {} {} {}|pR", "scale = {}; sqrt({})", "scale = {}; e({})",
|
|
||||||
"scale = {}; l({})", "scale = {}; a({})", "scale = {}; s({})",
|
|
||||||
"scale = {}; c({})", "scale = {}; j({}, {})" ]
|
|
||||||
|
|
||||||
# Constants to make some code easier later.
|
|
||||||
div = 3
|
|
||||||
mod = 4
|
|
||||||
power = 5
|
|
||||||
modexp = 6
|
|
||||||
sqrt = 7
|
|
||||||
exponent = 8
|
|
||||||
bessel = 13
|
|
||||||
|
|
||||||
gen_ops = []
|
|
||||||
tests = []
|
|
||||||
|
|
||||||
# Infinite loop until the user sends SIGINT.
|
|
||||||
try:
|
|
||||||
i = 0
|
|
||||||
while True:
|
|
||||||
run_test(i)
|
|
||||||
i = i + 1
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# This is where we start processing the checklist of possible failures. Why only
|
|
||||||
# possible failures? Because some operations, specifically the functions in the
|
|
||||||
# math library, are not guaranteed to be exactly correct. Because of that, we
|
|
||||||
# need to present every failed test to the user for a final check before we
|
|
||||||
# add them as test cases.
|
|
||||||
|
|
||||||
# No items, just exit.
|
|
||||||
if len(tests) == 0:
|
|
||||||
print("\nNo items in checklist.")
|
|
||||||
print("Exiting")
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
print("\nGoing through the checklist...\n")
|
|
||||||
|
|
||||||
# Just do some error checking. If this fails here, it's a bug in this script.
|
|
||||||
if len(tests) != len(gen_ops):
|
|
||||||
print("Corrupted checklist!")
|
|
||||||
print("Exiting...")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Go through each item in the checklist.
|
|
||||||
for i in range(0, len(tests)):
|
|
||||||
|
|
||||||
# Yes, there's some code duplication. Sue me.
|
|
||||||
|
|
||||||
print("\n{}".format(tests[i]))
|
|
||||||
|
|
||||||
op = int(gen_ops[i])
|
|
||||||
|
|
||||||
if op != modexp:
|
|
||||||
exe = "bc"
|
|
||||||
halt = "halt"
|
|
||||||
options = "-lq"
|
|
||||||
else:
|
|
||||||
exe = "dc"
|
|
||||||
halt = "q"
|
|
||||||
options = ""
|
|
||||||
|
|
||||||
# We want to run the test again to show the user the difference.
|
|
||||||
indata = tests[i] + "\n" + halt
|
|
||||||
|
|
||||||
args = [ exe, options ]
|
|
||||||
|
|
||||||
p = subprocess.run(args, input=indata.encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
|
|
||||||
|
|
||||||
expected = p.stdout.decode()
|
|
||||||
|
|
||||||
bcexe = exedir + "/" + exe
|
|
||||||
args = [ bcexe, options ]
|
|
||||||
|
|
||||||
p = subprocess.run(args, input=indata.encode(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
|
|
||||||
|
|
||||||
compare(exe, options, p, tests[i], halt, expected, op, False)
|
|
||||||
|
|
||||||
# Ask the user to make a decision on the failed test.
|
|
||||||
answer = input("\nAdd test ({}/{}) to test suite? [y/N]: ".format(i + 1, len(tests)))
|
|
||||||
|
|
||||||
# Quick and dirty answer parsing.
|
|
||||||
if 'Y' in answer or 'y' in answer:
|
|
||||||
|
|
||||||
print("Yes")
|
|
||||||
|
|
||||||
name = testdir + "/" + exe + "/" + files[op]
|
|
||||||
|
|
||||||
# Write the test to the test file and the expected result to the
|
|
||||||
# results file.
|
|
||||||
with open(name + ".txt", "a") as f:
|
|
||||||
f.write(tests[i] + "\n")
|
|
||||||
|
|
||||||
with open(name + "_results.txt", "a") as f:
|
|
||||||
f.write(expected)
|
|
||||||
|
|
||||||
else:
|
|
||||||
print("No")
|
|
||||||
|
|
||||||
print("Done!")
|
|
@ -1,811 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# For OpenBSD, run using the following:
|
|
||||||
#
|
|
||||||
# scripts/release.sh 1 0 1 0 0 0 0 1 0 0 0 0 0 0
|
|
||||||
#
|
|
||||||
# For FreeBSD, run using the following:
|
|
||||||
#
|
|
||||||
# scripts/release.sh 1 0 1 0 0 0 0 1 0 1 0 0 0 0
|
|
||||||
#
|
|
||||||
# There is one problem with running this script on FreeBSD: it takes overcommit
|
|
||||||
# to the extreme. This means that some tests that try to create allocation
|
|
||||||
# failures instead make bc and dc crash. So running this script on FreeBSD does
|
|
||||||
# not work right now.
|
|
||||||
#
|
|
||||||
# For Linux, run two separate ones (in different checkouts), like so:
|
|
||||||
#
|
|
||||||
# scripts/release.sh 1 1 1 0 1 0 0 1 0 1 0 1 0 0
|
|
||||||
# cd build; ../scripts/release.sh 1 1 0 1 0 1 0 1 0 1 0 0 1 1
|
|
||||||
#
|
|
||||||
# Yes, I usually do sanitizers with Clang and Valgrind with GCC, and I also do
|
|
||||||
# out-of-source builds with GCC.
|
|
||||||
#
|
|
||||||
# To run sanitizers or Valgrind with generated tests, use the following:
|
|
||||||
#
|
|
||||||
# scripts/release.sh 1 1 1 0 1 0 0 1 0 1 0 1 0 0
|
|
||||||
# cd build; ../scripts/release.sh 1 1 0 1 0 1 0 1 0 1 0 0 1 1
|
|
||||||
#
|
|
||||||
# The reason I run history tests with GCC and not with Clang is because Clang
|
|
||||||
# already runs slower as a result of running with sanitizers, and the history
|
|
||||||
# tests are a little sensitive to load on a system.
|
|
||||||
#
|
|
||||||
# If this script fails on any platform when starting the Karatsuba test, check
|
|
||||||
# that Python is installed, especially if the error says something like:
|
|
||||||
# "karatsuba.py: not found".
|
|
||||||
|
|
||||||
# Print the usage and exit with an error. Each parameter should be an integer.
|
|
||||||
# Non-zero activates, and zero deactivates.
|
|
||||||
usage() {
|
|
||||||
printf 'usage: %s [run_tests] [generate_tests] [test_with_clang] [test_with_gcc] \n' "$script"
|
|
||||||
printf ' [run_sanitizers] [run_valgrind] [test_settings] [run_64_bit] \n'
|
|
||||||
printf ' [run_gen_script] [test_c11] [test_128_bit] [test_computed_goto]\n'
|
|
||||||
printf ' [test_karatsuba] [test_history]\n'
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Print a header with a message. This is just to make it easy to track progress.
|
|
||||||
# @param msg The message to print in the header.
|
|
||||||
header() {
|
|
||||||
|
|
||||||
_header_msg="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
printf '\n'
|
|
||||||
printf '*******************\n'
|
|
||||||
printf "$_header_msg"
|
|
||||||
printf '\n'
|
|
||||||
printf '*******************\n'
|
|
||||||
printf '\n'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Easy way to call make.
|
|
||||||
do_make() {
|
|
||||||
# No reason to do 64 except to see if I actually can overload my system. :)
|
|
||||||
# Well, also that it might actually improve throughput as other jobs can run
|
|
||||||
# while some are waiting.
|
|
||||||
make -j64 "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run configure.sh.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param GEN_HOST The setting for GEN_HOST.
|
|
||||||
# @param LONG_BIT The setting for LONG_BIT.
|
|
||||||
configure() {
|
|
||||||
|
|
||||||
_configure_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_configure_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_configure_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_configure_GEN_HOST="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_configure_LONG_BIT="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
# Make sure to not generate tests if necessary.
|
|
||||||
if [ "$gen_tests" -eq 0 ]; then
|
|
||||||
_configure_configure_flags="-G $_configure_configure_flags"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Choose the right extra flags.
|
|
||||||
if [ "$_configure_CC" = "clang" ]; then
|
|
||||||
_configure_CFLAGS="$clang_flags $_configure_CFLAGS"
|
|
||||||
elif [ "$_configure_CC" = "gcc" ]; then
|
|
||||||
_configure_CFLAGS="$gcc_flags $_configure_CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Print the header and do the job.
|
|
||||||
_configure_header=$(printf 'Running configure.sh %s ...' "$_configure_configure_flags")
|
|
||||||
_configure_header=$(printf "$_configure_header\n CC=\"%s\"\n" "$_configure_CC")
|
|
||||||
_configure_header=$(printf "$_configure_header\n CFLAGS=\"%s\"\n" "$_configure_CFLAGS")
|
|
||||||
_configure_header=$(printf "$_configure_header\n LONG_BIT=%s" "$_configure_LONG_BIT")
|
|
||||||
_configure_header=$(printf "$_configure_header\n GEN_HOST=%s" "$_configure_GEN_HOST")
|
|
||||||
|
|
||||||
header "$_configure_header"
|
|
||||||
CFLAGS="$_configure_CFLAGS" CC="$_configure_CC" GEN_HOST="$_configure_GEN_HOST" \
|
|
||||||
LONG_BIT="$_configure_LONG_BIT" "$real/configure.sh" $_configure_configure_flags > /dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build with make. This function also captures and outputs any warnings if they
|
|
||||||
# exists because as far as I am concerned, warnings are not acceptable for
|
|
||||||
# release.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param GEN_HOST The setting for GEN_HOST.
|
|
||||||
# @param LONG_BIT The setting for LONG_BIT.
|
|
||||||
build() {
|
|
||||||
|
|
||||||
_build_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_build_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_build_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_build_GEN_HOST="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_build_LONG_BIT="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
configure "$_build_CFLAGS" "$_build_CC" "$_build_configure_flags" "$_build_GEN_HOST" "$_build_LONG_BIT"
|
|
||||||
|
|
||||||
_build_header=$(printf 'Building...\n CC=%s' "$_build_CC")
|
|
||||||
_build_header=$(printf "$_build_header\n CFLAGS=\"%s\"" "$_build_CFLAGS")
|
|
||||||
_build_header=$(printf "$_build_header\n LONG_BIT=%s" "$_build_LONG_BIT")
|
|
||||||
_build_header=$(printf "$_build_header\n GEN_HOST=%s" "$_build_GEN_HOST")
|
|
||||||
|
|
||||||
header "$_build_header"
|
|
||||||
|
|
||||||
# Capture and print warnings.
|
|
||||||
do_make > /dev/null 2> "./.test.txt"
|
|
||||||
|
|
||||||
if [ -s "./.test.txt" ]; then
|
|
||||||
printf '%s generated warning(s):\n' "$_build_CC"
|
|
||||||
printf '\n'
|
|
||||||
cat "./.test.txt"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Run tests with make.
|
|
||||||
runtest() {
|
|
||||||
|
|
||||||
header "Running tests"
|
|
||||||
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
do_make "$@"
|
|
||||||
else
|
|
||||||
|
|
||||||
do_make test
|
|
||||||
|
|
||||||
if [ "$test_history" -ne 0 ]; then
|
|
||||||
do_make test_history
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs tests with both calculators, then bc only, then dc only. If
|
|
||||||
# run_tests is false, then it just does the builds.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param GEN_HOST The setting for GEN_HOST.
|
|
||||||
# @param LONG_BIT The setting for LONG_BIT.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
runconfigtests() {
|
|
||||||
|
|
||||||
_runconfigtests_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigtests_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigtests_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigtests_GEN_HOST="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigtests_LONG_BIT="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigtests_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [ "$_runconfigtests_run_tests" -ne 0 ]; then
|
|
||||||
_runconfigtests_header=$(printf 'Running tests with configure flags')
|
|
||||||
else
|
|
||||||
_runconfigtests_header=$(printf 'Building with configure flags')
|
|
||||||
fi
|
|
||||||
|
|
||||||
_runconfigtests_header=$(printf "$_runconfigtests_header \"%s\" ...\n" "$_runconfigtests_configure_flags")
|
|
||||||
_runconfigtests_header=$(printf "$_runconfigtests_header\n CC=%s\n" "$_runconfigseries_CC")
|
|
||||||
_runconfigtests_header=$(printf "$_runconfigtests_header\n CFLAGS=\"%s\"" "$_runconfigseries_CFLAGS")
|
|
||||||
_runconfigtests_header=$(printf "$_runconfigtests_header\n LONG_BIT=%s" "$_runconfigtests_LONG_BIT")
|
|
||||||
_runconfigtests_header=$(printf "$_runconfigtests_header\n GEN_HOST=%s" "$_runconfigtests_GEN_HOST")
|
|
||||||
|
|
||||||
header "$_runconfigtests_header"
|
|
||||||
|
|
||||||
build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
|
|
||||||
"$_runconfigtests_configure_flags" "$_runconfigtests_GEN_HOST" \
|
|
||||||
"$_runconfigtests_LONG_BIT"
|
|
||||||
|
|
||||||
if [ "$_runconfigtests_run_tests" -ne 0 ]; then
|
|
||||||
runtest
|
|
||||||
fi
|
|
||||||
|
|
||||||
do_make clean
|
|
||||||
|
|
||||||
build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
|
|
||||||
"$_runconfigtests_configure_flags -b" "$_runconfigtests_GEN_HOST" \
|
|
||||||
"$_runconfigtests_LONG_BIT"
|
|
||||||
|
|
||||||
if [ "$_runconfigtests_run_tests" -ne 0 ]; then
|
|
||||||
runtest
|
|
||||||
fi
|
|
||||||
|
|
||||||
do_make clean
|
|
||||||
|
|
||||||
build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
|
|
||||||
"$_runconfigtests_configure_flags -d" "$_runconfigtests_GEN_HOST" \
|
|
||||||
"$_runconfigtests_LONG_BIT"
|
|
||||||
|
|
||||||
if [ "$_runconfigtests_run_tests" -ne 0 ]; then
|
|
||||||
runtest
|
|
||||||
fi
|
|
||||||
|
|
||||||
do_make clean
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs tests with runconfigtests(), but also does 64-bit, 32-bit, and
|
|
||||||
# 128-bit rand, if requested. It also does it with the gen script (strgen.sh) if
|
|
||||||
# requested. If run_tests is false, it just does the builds.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
runconfigseries() {
|
|
||||||
|
|
||||||
_runconfigseries_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigseries_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigseries_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runconfigseries_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [ "$run_64_bit" -ne 0 ]; then
|
|
||||||
|
|
||||||
if [ "$test_128_bit" -ne 0 ]; then
|
|
||||||
runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
|
|
||||||
"$_runconfigseries_configure_flags" 1 64 "$_runconfigseries_run_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$run_gen_script" -ne 0 ]; then
|
|
||||||
runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
|
|
||||||
"$_runconfigseries_configure_flags" 0 64 "$_runconfigseries_run_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
runconfigtests "$_runconfigseries_CFLAGS -DBC_RAND_BUILTIN=0" "$_runconfigseries_CC" \
|
|
||||||
"$_runconfigseries_configure_flags" 1 64 "$_runconfigseries_run_tests"
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
|
|
||||||
"$_runconfigseries_configure_flags" 1 32 "$_runconfigseries_run_tests"
|
|
||||||
|
|
||||||
if [ "$run_gen_script" -ne 0 ]; then
|
|
||||||
runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
|
|
||||||
"$_runconfigseries_configure_flags" 0 32 "$_runconfigseries_run_tests"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs tests with each setting combo running runconfigseries(). If
|
|
||||||
# run_tests is false, it just does the builds.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
runsettingsseries() {
|
|
||||||
|
|
||||||
_runsettingsseries_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runsettingsseries_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runsettingsseries_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runsettingsseries_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [ "$test_settings" -ne 0 ]; then
|
|
||||||
|
|
||||||
while read _runsettingsseries_s; do
|
|
||||||
runconfigseries "$_runsettingsseries_CFLAGS" "$_runsettingsseries_CC" \
|
|
||||||
"$_runsettingsseries_configure_flags $_runsettingsseries_s" \
|
|
||||||
"$_runsettingsseries_run_tests"
|
|
||||||
done < "$scriptdir/release_settings.txt"
|
|
||||||
|
|
||||||
else
|
|
||||||
runconfigseries "$_runsettingsseries_CFLAGS" "$_runsettingsseries_CC" \
|
|
||||||
"$_runsettingsseries_configure_flags" "$_runsettingsseries_run_tests"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs tests with each build type running runsettingsseries(). If
|
|
||||||
# run_tests is false, it just does the builds.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
runtestseries() {
|
|
||||||
|
|
||||||
_runtestseries_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtestseries_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtestseries_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtestseries_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtestseries_flags="E H N EH EN HN EHN"
|
|
||||||
|
|
||||||
runsettingsseries "$_runtestseries_CFLAGS" "$_runtestseries_CC" \
|
|
||||||
"$_runtestseries_configure_flags" "$_runtestseries_run_tests"
|
|
||||||
|
|
||||||
for _runtestseries_f in $_runtestseries_flags; do
|
|
||||||
runsettingsseries "$_runtestseries_CFLAGS" "$_runtestseries_CC" \
|
|
||||||
"$_runtestseries_configure_flags -$_runtestseries_f" "$_runtestseries_run_tests"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs the tests for bcl. If run_tests is false, it just does the
|
|
||||||
# builds.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
runlibtests() {
|
|
||||||
|
|
||||||
_runlibtests_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runlibtests_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runlibtests_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runlibtests_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runlibtests_configure_flags="$_runlibtests_configure_flags -a"
|
|
||||||
|
|
||||||
build "$_runlibtests_CFLAGS" "$_runlibtests_CC" "$_runlibtests_configure_flags" 1 64
|
|
||||||
|
|
||||||
if [ "$_runlibtests_run_tests" -ne 0 ]; then
|
|
||||||
runtest test
|
|
||||||
fi
|
|
||||||
|
|
||||||
build "$_runlibtests_CFLAGS" "$_runlibtests_CC" "$_runlibtests_configure_flags" 1 32
|
|
||||||
|
|
||||||
if [ "$_runlibtests_run_tests" -ne 0 ]; then
|
|
||||||
runtest test
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs tests under C99, then C11, if requested, using
|
|
||||||
# runtestseries(). If run_tests is false, it just does the builds.
|
|
||||||
# @param CFLAGS The CFLAGS.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param configure_flags The flags for configure.sh itself.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
runtests() {
|
|
||||||
|
|
||||||
_runtests_CFLAGS="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtests_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtests_configure_flags="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_runtests_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
runtestseries "-std=c99 $_runtests_CFLAGS" "$_runtests_CC" "$_runtests_configure_flags" "$_runtests_run_tests"
|
|
||||||
|
|
||||||
if [ "$test_c11" -ne 0 ]; then
|
|
||||||
runtestseries "-std=c11 $_runtests_CFLAGS" "$_runtests_CC" "$_runtests_configure_flags" "$_runtests_run_tests"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Runs the karatsuba tests.
|
|
||||||
karatsuba() {
|
|
||||||
|
|
||||||
header "Running Karatsuba tests"
|
|
||||||
do_make karatsuba_test
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds and runs under valgrind. It runs both, bc only, then dc only.
|
|
||||||
vg() {
|
|
||||||
|
|
||||||
header "Running valgrind"
|
|
||||||
|
|
||||||
if [ "$run_64_bit" -ne 0 ]; then
|
|
||||||
_vg_bits=64
|
|
||||||
else
|
|
||||||
_vg_bits=32
|
|
||||||
fi
|
|
||||||
|
|
||||||
build "$debug -std=c99" "gcc" "-O3 -gv" "1" "$_vg_bits"
|
|
||||||
runtest test
|
|
||||||
|
|
||||||
do_make clean_config
|
|
||||||
|
|
||||||
build "$debug -std=c99" "gcc" "-O3 -gvb" "1" "$_vg_bits"
|
|
||||||
runtest test
|
|
||||||
|
|
||||||
do_make clean_config
|
|
||||||
|
|
||||||
build "$debug -std=c99" "gcc" "-O3 -gvd" "1" "$_vg_bits"
|
|
||||||
runtest test
|
|
||||||
|
|
||||||
do_make clean_config
|
|
||||||
|
|
||||||
build "$debug -std=c99" "gcc" "-O3 -gva" "1" "$_vg_bits"
|
|
||||||
runtest test
|
|
||||||
|
|
||||||
do_make clean_config
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds the debug series and runs the tests if run_tests allows. If sanitizers
|
|
||||||
# are enabled, it also does UBSan.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
debug() {
|
|
||||||
|
|
||||||
_debug_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_debug_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$_debug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
|
|
||||||
runtests "$debug -fsanitize=undefined" "$_debug_CC" "-gm" "$_debug_run_tests"
|
|
||||||
else
|
|
||||||
runtests "$debug" "$_debug_CC" "-g" "$_debug_run_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$_debug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
|
|
||||||
runlibtests "$debug -fsanitize=undefined" "$_debug_CC" "-gm" "$_debug_run_tests"
|
|
||||||
else
|
|
||||||
runlibtests "$debug" "$_debug_CC" "-g" "$_debug_run_tests"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds the release series and runs the test if run_tests allows.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
release() {
|
|
||||||
|
|
||||||
_release_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_release_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
runtests "$release" "$_release_CC" "-O3" "$_release_run_tests"
|
|
||||||
|
|
||||||
runlibtests "$release" "$_release_CC" "-O3" "$_release_run_tests"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds the release debug series and runs the test if run_tests allows. If
|
|
||||||
# sanitizers are enabled, it also does ASan and MSan.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
reldebug() {
|
|
||||||
|
|
||||||
_reldebug_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_reldebug_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$_reldebug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
|
|
||||||
runtests "$debug -fsanitize=address" "$_reldebug_CC" "-mgO3" "$_reldebug_run_tests"
|
|
||||||
runtests "$debug -fsanitize=memory" "$_reldebug_CC" "-mgO3" "$_reldebug_run_tests"
|
|
||||||
else
|
|
||||||
runtests "$debug" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$_reldebug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
|
|
||||||
runlibtests "$debug -fsanitize=address" "$_reldebug_CC" "-mgO3" "$_reldebug_run_tests"
|
|
||||||
runlibtests "$debug -fsanitize=memory" "$_reldebug_CC" "-mgO3" "$_reldebug_run_tests"
|
|
||||||
else
|
|
||||||
runlibtests "$debug" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds the min size release series and runs the test if run_tests allows.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
minsize() {
|
|
||||||
|
|
||||||
_minsize_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_minsize_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
runtests "$release" "$_minsize_CC" "-Os" "$_minsize_run_tests"
|
|
||||||
|
|
||||||
runlibtests "$release" "$_minsize_CC" "-Os" "$_minsize_run_tests"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Builds all sets: debug, release, release debug, and min size, and runs the
|
|
||||||
# tests if run_tests allows.
|
|
||||||
# @param CC The C compiler.
|
|
||||||
# @param run_tests Whether to run tests or not.
|
|
||||||
build_set() {
|
|
||||||
|
|
||||||
_build_set_CC="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
_build_set_run_tests="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
debug "$_build_set_CC" "$_build_set_run_tests"
|
|
||||||
release "$_build_set_CC" "$_build_set_run_tests"
|
|
||||||
reldebug "$_build_set_CC" "$_build_set_run_tests"
|
|
||||||
minsize "$_build_set_CC" "$_build_set_run_tests"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set some strict warning flags. Clang's -Weverything can be way too strict, so
|
|
||||||
# we actually have to turn off some things.
|
|
||||||
clang_flags="-Weverything -Wno-padded -Wno-switch-enum -Wno-format-nonliteral"
|
|
||||||
clang_flags="$clang_flags -Wno-cast-align -Wno-missing-noreturn -Wno-disabled-macro-expansion"
|
|
||||||
clang_flags="$clang_flags -Wno-unreachable-code -Wno-unreachable-code-return"
|
|
||||||
clang_flags="$clang_flags -Wno-implicit-fallthrough -Wno-unused-macros -Wno-gnu-label-as-value"
|
|
||||||
clang_flags="$clang_flags -Wno-declaration-after-statement"
|
|
||||||
# -Wno-undef is here because Clang seems to think BC_C11 is undefined, when it's defined.
|
|
||||||
clang_flags="$clang_flags -Wno-undef"
|
|
||||||
gcc_flags="-Wno-maybe-uninitialized -Wno-clobbered"
|
|
||||||
|
|
||||||
# Common CFLAGS.
|
|
||||||
cflags="-Wall -Wextra -Werror -pedantic -Wno-conditional-uninitialized"
|
|
||||||
|
|
||||||
# Common debug and release flags.
|
|
||||||
debug="$cflags -fno-omit-frame-pointer"
|
|
||||||
release="$cflags -DNDEBUG"
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
|
|
||||||
real=$(realpath "$scriptdir/../")
|
|
||||||
|
|
||||||
# Whether to run tests.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
run_tests="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
run_tests=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to generate tests. On platforms like OpenBSD, there is no GNU bc to
|
|
||||||
# generate tests, so this must be off.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
gen_tests="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
gen_tests=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test with clang.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_with_clang="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_with_clang=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test with gcc.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_with_gcc="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_with_gcc=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test with sanitizers.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
run_sanitizers="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
run_sanitizers=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test with valgrind.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
run_valgrind="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
run_valgrind=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test all settings combos.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_settings="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_settings=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test 64-bit in addition to 32-bit.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
run_64_bit="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
run_64_bit=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test with strgen.sh in addition to strgen.c.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
run_gen_script="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
run_gen_script=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test on C11 in addition to C99.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_c11="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_c11=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test 128-bit integers in addition to no 128-bit integers.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_128_bit="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_128_bit=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test with computed goto or not.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_computed_goto="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_computed_goto=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test history or not.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_karatsuba="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_karatsuba=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Whether to test history or not.
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
test_history="$1"
|
|
||||||
shift
|
|
||||||
else
|
|
||||||
test_history=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$run_64_bit" -ne 0 ]; then
|
|
||||||
bits=64
|
|
||||||
else
|
|
||||||
bits=32
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$test_computed_goto" -eq 0 ]; then
|
|
||||||
clang_flags="-DBC_NO_COMPUTED_GOTO $clang_flags"
|
|
||||||
gcc_flags="-DBC_NO_COMPUTED_GOTO $gcc_flags"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Setup a default compiler.
|
|
||||||
if [ "$test_with_clang" -ne 0 ]; then
|
|
||||||
defcc="clang"
|
|
||||||
elif [ "$test_with_gcc" -ne 0 ]; then
|
|
||||||
defcc="gcc"
|
|
||||||
else
|
|
||||||
defcc="c99"
|
|
||||||
fi
|
|
||||||
|
|
||||||
export ASAN_OPTIONS="abort_on_error=1,allocator_may_return_null=1:strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1:detect_invalid_pointer_pairs=2"
|
|
||||||
export UBSAN_OPTIONS="print_stack_trace=1,silence_unsigned_overflow=1"
|
|
||||||
|
|
||||||
build "$debug -std=c99" "$defcc" "-g" "1" "$bits"
|
|
||||||
|
|
||||||
header "Running math library under --standard"
|
|
||||||
|
|
||||||
# Make sure the math library is POSIX compliant.
|
|
||||||
printf 'quit\n' | bin/bc -ls
|
|
||||||
|
|
||||||
do_make clean_tests
|
|
||||||
|
|
||||||
# Run the clang build sets.
|
|
||||||
if [ "$test_with_clang" -ne 0 ]; then
|
|
||||||
build_set "clang" "$run_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run the gcc build sets.
|
|
||||||
if [ "$test_with_gcc" -ne 0 ]; then
|
|
||||||
build_set "gcc" "$run_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$run_tests" -ne 0 ]; then
|
|
||||||
|
|
||||||
build "$release" "$defcc" "-O3" "1" "$bits"
|
|
||||||
|
|
||||||
# Run karatsuba.
|
|
||||||
if [ "$test_karatsuba" -ne 0 ]; then
|
|
||||||
karatsuba
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Valgrind.
|
|
||||||
if [ "$run_valgrind" -ne 0 -a "$test_with_gcc" -ne 0 ]; then
|
|
||||||
vg
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '\n'
|
|
||||||
printf 'Tests successful.\n'
|
|
||||||
|
|
||||||
# I just assume that I am going to be fuzzing when I am done.
|
|
||||||
header "Building for AFL++..."
|
|
||||||
|
|
||||||
"$scriptdir/fuzz_prep.sh"
|
|
||||||
|
|
||||||
printf '\n'
|
|
||||||
printf 'Ready for scripts/randmath.py and for fuzzing.\n'
|
|
||||||
printf '\n'
|
|
||||||
printf 'Run scripts/randmath.py if you changed any math code.\n'
|
|
||||||
printf '\n'
|
|
||||||
printf 'Then if there are no problems, run the fuzzer.\n'
|
|
||||||
printf '\n'
|
|
||||||
printf 'Then run `scripts/fuzz_prep.sh -a`.\n'
|
|
||||||
printf '\n'
|
|
||||||
printf 'Then run `scripts/afl.py --asan`.\n'
|
|
||||||
|
|
||||||
fi
|
|
@ -1,16 +0,0 @@
|
|||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
@ -1,77 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
#
|
|
||||||
# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright notice, this
|
|
||||||
# list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
# this list of conditions and the following disclaimer in the documentation
|
|
||||||
# and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
||||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This script's argument is a number, which is the index of the setting set
|
|
||||||
# that is under test. This script is for maintainers only.
|
|
||||||
#
|
|
||||||
# The procedure is this: run the script with:
|
|
||||||
#
|
|
||||||
# ./scripts/test_settings.sh 1
|
|
||||||
#
|
|
||||||
# Then run bc and dc to ensure their stuff is correct. Then run this script
|
|
||||||
# again with:
|
|
||||||
#
|
|
||||||
# ./scripts/test_settings.sh 2
|
|
||||||
#
|
|
||||||
# And repeat. You can also test various environment variable sets with them.
|
|
||||||
|
|
||||||
# Print the usage and exit with an error.
|
|
||||||
usage() {
|
|
||||||
printf 'usage: %s index\n' "$0" 1>&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
script="$0"
|
|
||||||
scriptdir=$(dirname "$script")
|
|
||||||
|
|
||||||
cd "$scriptdir/.."
|
|
||||||
|
|
||||||
test "$#" -eq 1 || usage
|
|
||||||
|
|
||||||
target="$1"
|
|
||||||
shift
|
|
||||||
|
|
||||||
line=0
|
|
||||||
|
|
||||||
# This loop just loops until it gets to the right line. Quick and dirty.
|
|
||||||
while read s; do
|
|
||||||
|
|
||||||
line=$(printf '%s + 1\n' "$line" | bc)
|
|
||||||
|
|
||||||
if [ "$line" -eq "$target" ]; then
|
|
||||||
|
|
||||||
# Configure, build, and exit.
|
|
||||||
./configure.sh -O3 $s
|
|
||||||
|
|
||||||
make -j16 > /dev/null
|
|
||||||
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
done < "$scriptdir/test_settings.txt"
|
|
@ -1,93 +0,0 @@
|
|||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -sbc.prompt -Sdc.prompt
|
|
||||||
-sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
||||||
-Sbc.sigint_reset -Sdc.sigint_reset -Sbc.tty_mode -Sdc.tty_mode -Sbc.history -Sdc.history -Sbc.prompt -Sdc.prompt
|
|
@ -157,20 +157,23 @@ sigjmp_buf bc_history_jmpbuf;
|
|||||||
volatile sig_atomic_t bc_history_inlinelib;
|
volatile sig_atomic_t bc_history_inlinelib;
|
||||||
|
|
||||||
static char* bc_history_prompt;
|
static char* bc_history_prompt;
|
||||||
|
static char bc_history_no_prompt[] = "";
|
||||||
static HistEvent bc_history_event;
|
static HistEvent bc_history_event;
|
||||||
|
|
||||||
static char*
|
static char*
|
||||||
bc_history_promptFunc(EditLine* el)
|
bc_history_promptFunc(EditLine* el)
|
||||||
{
|
{
|
||||||
BC_UNUSED(el);
|
BC_UNUSED(el);
|
||||||
return bc_history_prompt;
|
return BC_PROMPT ? bc_history_prompt : bc_history_no_prompt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
bc_history_init(BcHistory* h)
|
bc_history_init(BcHistory* h)
|
||||||
{
|
{
|
||||||
BcVec v;
|
BcVec v;
|
||||||
char* home = getenv("HOME");
|
char* home;
|
||||||
|
|
||||||
|
home = getenv("HOME");
|
||||||
|
|
||||||
// This will hold the true path to the editrc.
|
// This will hold the true path to the editrc.
|
||||||
bc_vec_init(&v, 1, BC_DTOR_NONE);
|
bc_vec_init(&v, 1, BC_DTOR_NONE);
|
||||||
@ -214,7 +217,7 @@ bc_history_init(BcHistory* h)
|
|||||||
void
|
void
|
||||||
bc_history_free(BcHistory* h)
|
bc_history_free(BcHistory* h)
|
||||||
{
|
{
|
||||||
if (bc_history_prompt != NULL) free(bc_history_prompt);
|
if (BC_PROMPT && bc_history_prompt != NULL) free(bc_history_prompt);
|
||||||
el_end(h->el);
|
el_end(h->el);
|
||||||
history_end(h->hist);
|
history_end(h->hist);
|
||||||
}
|
}
|
||||||
@ -238,16 +241,19 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt)
|
|||||||
// This is so the signal handler can handle line libraries properly.
|
// This is so the signal handler can handle line libraries properly.
|
||||||
bc_history_inlinelib = 1;
|
bc_history_inlinelib = 1;
|
||||||
|
|
||||||
// Make sure to set the prompt.
|
if (BC_PROMPT)
|
||||||
if (bc_history_prompt != NULL)
|
|
||||||
{
|
{
|
||||||
if (strcmp(bc_history_prompt, prompt))
|
// Make sure to set the prompt.
|
||||||
|
if (bc_history_prompt != NULL)
|
||||||
{
|
{
|
||||||
free(bc_history_prompt);
|
if (strcmp(bc_history_prompt, prompt))
|
||||||
bc_history_prompt = bc_vm_strdup(prompt);
|
{
|
||||||
|
free(bc_history_prompt);
|
||||||
|
bc_history_prompt = bc_vm_strdup(prompt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else bc_history_prompt = bc_vm_strdup(prompt);
|
||||||
}
|
}
|
||||||
else bc_history_prompt = bc_vm_strdup(prompt);
|
|
||||||
|
|
||||||
// Get the line.
|
// Get the line.
|
||||||
line = el_gets(h->el, &len);
|
line = el_gets(h->el, &len);
|
||||||
@ -261,7 +267,11 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt)
|
|||||||
if (errno == ENOMEM) bc_err(BC_ERR_FATAL_ALLOC_ERR);
|
if (errno == ENOMEM) bc_err(BC_ERR_FATAL_ALLOC_ERR);
|
||||||
bc_err(BC_ERR_FATAL_IO_ERR);
|
bc_err(BC_ERR_FATAL_IO_ERR);
|
||||||
}
|
}
|
||||||
else s = BC_STATUS_EOF;
|
else
|
||||||
|
{
|
||||||
|
bc_file_printf(&vm.fout, "\n");
|
||||||
|
s = BC_STATUS_EOF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// If there is a line...
|
// If there is a line...
|
||||||
else
|
else
|
||||||
@ -341,7 +351,7 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the line.
|
// Get the line.
|
||||||
h->line = readline(prompt);
|
h->line = readline(BC_PROMPT ? prompt : "");
|
||||||
|
|
||||||
// If there was a line, add it to the history. Otherwise, just return an
|
// If there was a line, add it to the history. Otherwise, just return an
|
||||||
// empty line. Oh, and NULL actually means EOF.
|
// empty line. Oh, and NULL actually means EOF.
|
||||||
@ -358,7 +368,7 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt)
|
|||||||
}
|
}
|
||||||
else if (h->line == NULL)
|
else if (h->line == NULL)
|
||||||
{
|
{
|
||||||
bc_file_printf(&vm.fout, "%s", "^D");
|
bc_file_printf(&vm.fout, "%s\n", "^D");
|
||||||
s = BC_STATUS_EOF;
|
s = BC_STATUS_EOF;
|
||||||
}
|
}
|
||||||
else bc_vec_string(vec, 1, "\n");
|
else bc_vec_string(vec, 1, "\n");
|
||||||
|
@ -1,125 +0,0 @@
|
|||||||
session_name: bc_afl
|
|
||||||
|
|
||||||
windows:
|
|
||||||
- window_name: control
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- echo core | doas tee /proc/sys/kernel/core_pattern
|
|
||||||
- echo performance | doas tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
|
||||||
- rm -rf tests/fuzzing/bc_outputs1/
|
|
||||||
- rm -rf tests/fuzzing/bc_outputs2/
|
|
||||||
- rm -rf tests/fuzzing/bc_outputs3/
|
|
||||||
- rm -rf tests/fuzzing/dc_outputs/
|
|
||||||
- window_name: bc11
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 15
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs1 -o tests/fuzzing/bc_outputs1 -p exploit -D -M bc11 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc12
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 16
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs1 -o tests/fuzzing/bc_outputs1 -p coe -S bc12 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc13
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 17
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs1 -o tests/fuzzing/bc_outputs1 -p fast -S bc13 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc14
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 18
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs1 -o tests/fuzzing/bc_outputs1 -p explore -S bc14 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc21
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 19
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs2 -o tests/fuzzing/bc_outputs2 -p exploit -D -M bc21 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc22
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 20
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs2 -o tests/fuzzing/bc_outputs2 -p coe -S bc22 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc23
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 21
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs2 -o tests/fuzzing/bc_outputs2 -p fast -S bc23 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc24
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 22
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs2 -o tests/fuzzing/bc_outputs2 -p explore -S bc24 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc31
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 23
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs3 -o tests/fuzzing/bc_outputs3 -p exploit -D -M bc31 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc32
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 24
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs3 -o tests/fuzzing/bc_outputs3 -p coe -S bc32 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc33
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 25
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs3 -o tests/fuzzing/bc_outputs3 -p fast -S bc33 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc34
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 26
|
|
||||||
- afl-fuzz -i tests/fuzzing/bc_inputs3 -o tests/fuzzing/bc_outputs3 -p explore -S bc34 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: dc11
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 27
|
|
||||||
- afl-fuzz -i tests/fuzzing/dc_inputs -o tests/fuzzing/dc_outputs -p exploit -D -M dc11 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
||||||
- window_name: dc12
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 28
|
|
||||||
- afl-fuzz -i tests/fuzzing/dc_inputs -o tests/fuzzing/dc_outputs -p coe -S dc12 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
||||||
- window_name: dc13
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 29
|
|
||||||
- afl-fuzz -i tests/fuzzing/dc_inputs -o tests/fuzzing/dc_outputs -p fast -S dc13 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
||||||
- window_name: dc14
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 30
|
|
||||||
- afl-fuzz -i tests/fuzzing/dc_inputs -o tests/fuzzing/dc_outputs -p explore -S dc14 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
@ -1,122 +0,0 @@
|
|||||||
session_name: bc_afl_continue
|
|
||||||
start_directory: ./
|
|
||||||
|
|
||||||
windows:
|
|
||||||
- window_name: control
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- echo core | doas tee /proc/sys/kernel/core_pattern
|
|
||||||
- echo performance | doas tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
|
||||||
- window_name: bc11
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 4
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs1 -p exploit -D -M bc11 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc12
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 5
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs1 -p coe -S bc12 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc13
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 6
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs1 -p fast -S bc13 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc14
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 7
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs1 -p explore -S bc14 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc21
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 8
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs2 -p exploit -D -M bc21 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc22
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 9
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs2 -p coe -S bc22 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc23
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 10
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs2 -p fast -S bc23 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc24
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 11
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs2 -p explore -S bc24 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc31
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 12
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs3 -p exploit -D -M bc31 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc32
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 13
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs3 -p coe -S bc32 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc33
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 14
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs3 -p fast -S bc33 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: bc34
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 15
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/bc_outputs3 -p explore -S bc34 bin/bc -lq -e "seed = 1280937142.20981723890730892738902938071028973408912703984712093" -f-
|
|
||||||
- window_name: dc11
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 16
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/dc_outputs -p exploit -D -M dc11 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
||||||
- window_name: dc12
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 17
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/dc_outputs -p coe -S dc12 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
||||||
- window_name: dc13
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 18
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/dc_outputs -p fast -S dc13 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
||||||
- window_name: dc14
|
|
||||||
layout: even-horizontal
|
|
||||||
panes:
|
|
||||||
- shell_command:
|
|
||||||
- export AFL_AUTORESUME=1
|
|
||||||
- sleep 19
|
|
||||||
- afl-fuzz -i- -o tests/fuzzing/dc_outputs -p explore -S dc14 bin/dc -x -e "1280937142.20981723890730892738902938071028973408912703984712093j" -f-
|
|
@ -1,60 +0,0 @@
|
|||||||
#! /usr/bin/bc -q
|
|
||||||
|
|
||||||
define z(a[]) {
|
|
||||||
for (i = 0; i < l; ++i) {
|
|
||||||
a[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
define x(a[]) {
|
|
||||||
|
|
||||||
# Test for separate vars and arrays.
|
|
||||||
auto a
|
|
||||||
|
|
||||||
for (a = 0; a < l; ++a) {
|
|
||||||
a[a] = -a
|
|
||||||
}
|
|
||||||
|
|
||||||
z(a[])
|
|
||||||
}
|
|
||||||
|
|
||||||
define g(x[], y[]) {
|
|
||||||
return x[0] - y[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
define h(y[], x[]) {
|
|
||||||
return g(x[], y[])
|
|
||||||
}
|
|
||||||
|
|
||||||
define m(*x[], *y[]) {
|
|
||||||
return x[0] / y[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
define n(*y[], *x[]) {
|
|
||||||
return m(x[], y[])
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 101; ++i) {
|
|
||||||
a[i] = i
|
|
||||||
}
|
|
||||||
|
|
||||||
a[104] = 204
|
|
||||||
|
|
||||||
l = length(a[])
|
|
||||||
|
|
||||||
for (i = 0; i <= l; ++i) {
|
|
||||||
a[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
z(a[])
|
|
||||||
x(a[])
|
|
||||||
z(a[])
|
|
||||||
l
|
|
||||||
|
|
||||||
x[0] = 5
|
|
||||||
y[0] = 4
|
|
||||||
|
|
||||||
h(x[], y[])
|
|
||||||
n(x[], y[])
|
|
||||||
|
|
||||||
halt
|
|
@ -1,30 +0,0 @@
|
|||||||
0
|
|
||||||
0.0
|
|
||||||
000000000000000000000000.00000000000000000000000
|
|
||||||
000000000000000000000000000135482346782356
|
|
||||||
000000000000000000000000002
|
|
||||||
1
|
|
||||||
1023468723275435238491972521917846
|
|
||||||
4343472432431705867392073517038270398027352709027389273920739037937960379637893607893607893670530278200795207952702873892786172916728961783907893607418973587857386079679267926737520730925372983782793652793
|
|
||||||
-1
|
|
||||||
-18586
|
|
||||||
-31378682943772818461924738352952347258
|
|
||||||
-823945628745673589495067238723986520375698237620834674509627345273096287563846592384526349872634895763257893467523987578690283762897568459072348758071071087813501875908127359018715023841710239872301387278
|
|
||||||
.123521346523546
|
|
||||||
0.1245923756273856
|
|
||||||
-.1024678456387
|
|
||||||
-0.8735863475634587
|
|
||||||
4.0
|
|
||||||
-6.0
|
|
||||||
234237468293576.000000000000000000000000000000
|
|
||||||
23987623568943567.00000000000000000005677834650000000000000
|
|
||||||
23856934568940675.000000000000000435676782300000000000000456784
|
|
||||||
77567648698496.000000000000000000587674750000000000458563800000000000000
|
|
||||||
2348672354968723.2374823546000000000003256987394502346892435623870000000034578
|
|
||||||
-2354768.000000000000000000000000000000000000
|
|
||||||
-96739874567.000000000347683456
|
|
||||||
-3764568345.000000000004573845000000347683460
|
|
||||||
-356784356.934568495770004586495678300000000
|
|
||||||
74325437345273852773827101738273127312738521733017537073520735207307570358738257390761276072160719802671980267018728630178.7082681027680521760217867841276127681270867827821768173178207830710978017738178678012767377058785378278207385237085237803278203782037237582795870
|
|
||||||
-756752732785273851273728537852738257837283678965738527385272983678372867327835672967385278372637862738627836279863782673862783670.71738178361738718367186378610738617836781603760178367018603760178107735278372832783728367826738627836278378260736270367362073867097307925
|
|
||||||
9812734012837410982345719208345712908357412903587192048571920458712.23957182459817249058172945781
|
|
@ -1,7 +0,0 @@
|
|||||||
e(0.5)
|
|
||||||
|
|
||||||
define e(x) {
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
e(0.5)
|
|
@ -1,48 +0,0 @@
|
|||||||
define fast_gcd(a, b) {
|
|
||||||
|
|
||||||
if (a == b) return a;
|
|
||||||
if (a > b) return fast_gcd(a - b, b)
|
|
||||||
|
|
||||||
return fast_gcd(a, b - a);
|
|
||||||
}
|
|
||||||
|
|
||||||
define void r_reduce(*r[]) {
|
|
||||||
|
|
||||||
auto g,s;
|
|
||||||
|
|
||||||
if (length(r[]) != 2) sqrt(-1);
|
|
||||||
if (scale(r[0])) 2^r[0];
|
|
||||||
if (scale(r[1])) 2^r[1];
|
|
||||||
|
|
||||||
if (r[0] >= 0 && r[1] >= 0) g = fast_gcd(r[0], r[1]);
|
|
||||||
else g = gcd(r[0], r[1]);
|
|
||||||
|
|
||||||
s = scale;
|
|
||||||
scale = 0;
|
|
||||||
|
|
||||||
r[0] /= g;
|
|
||||||
r[1] /= g;
|
|
||||||
|
|
||||||
scale = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
define void r_init(*r[], a, b) {
|
|
||||||
r[0] = a;
|
|
||||||
r[1] = b;
|
|
||||||
r_reduce(r[]);
|
|
||||||
}
|
|
||||||
|
|
||||||
define void r_initi(*r[], i, a, b) {
|
|
||||||
|
|
||||||
length(r[]);
|
|
||||||
|
|
||||||
r[0] = i * b + a;
|
|
||||||
r[1] = b;
|
|
||||||
|
|
||||||
length(r[]);
|
|
||||||
|
|
||||||
r_reduce(r[]);
|
|
||||||
}
|
|
||||||
|
|
||||||
length(a[])
|
|
||||||
r_initi(a[], 5, 63, 94);
|
|
@ -1,4 +0,0 @@
|
|||||||
l10(0)
|
|
||||||
l10(99)
|
|
||||||
l10(100)
|
|
||||||
l10(-100)
|
|
@ -1 +0,0 @@
|
|||||||
uint(0)
|
|
@ -1,15 +0,0 @@
|
|||||||
r(0, 0)
|
|
||||||
r(0, 1)
|
|
||||||
r(0, 100)
|
|
||||||
r(1, 0)
|
|
||||||
r(1, 3)
|
|
||||||
r(1.4, 0)
|
|
||||||
r(1.5, 0)
|
|
||||||
r(34.45, 2)
|
|
||||||
r(64.1223, 4)
|
|
||||||
r(-1, 0)
|
|
||||||
r(-1, 3)
|
|
||||||
r(-1.4, 0)
|
|
||||||
r(-1.5, 0)
|
|
||||||
r(-34.45, 2)
|
|
||||||
r(-64.1223, 4)
|
|
@ -1,6 +0,0 @@
|
|||||||
f(0)
|
|
||||||
f(1)
|
|
||||||
f(2)
|
|
||||||
f(3)
|
|
||||||
f(4)
|
|
||||||
f(5)
|
|
@ -1,5 +0,0 @@
|
|||||||
pi(5)
|
|
||||||
p=pi(scale)
|
|
||||||
r2d(-p)
|
|
||||||
d2r(180)
|
|
||||||
d2r(-180)
|
|
@ -1,42 +0,0 @@
|
|||||||
band(13946233938940740889, 12028823668264674112)
|
|
||||||
bor(13946233938940740889, 12028823668264674112)
|
|
||||||
bxor(13946233938940740889, 12028823668264674112)
|
|
||||||
bshl(2366588185, 0)
|
|
||||||
bshr(2366588185, 0)
|
|
||||||
bshl(347743040, 25)
|
|
||||||
bshr(347743040, 25)
|
|
||||||
bnot8(13946233938940740889)
|
|
||||||
bnot8(25)
|
|
||||||
bnot16(13946233938940740889)
|
|
||||||
bnot16(17689)
|
|
||||||
bnot32(13946233938940740889)
|
|
||||||
bnot32(2366588185)
|
|
||||||
bnot64(13946233938940740889)
|
|
||||||
brev8(13946233938940740889)
|
|
||||||
brev8(25)
|
|
||||||
brev16(13946233938940740889)
|
|
||||||
brev16(17689)
|
|
||||||
brev32(13946233938940740889)
|
|
||||||
brev32(2366588185)
|
|
||||||
brev64(13946233938940740889)
|
|
||||||
brol8(13946233938940740889, 12028823668264674112)
|
|
||||||
brol8(25, 64)
|
|
||||||
brol16(13946233938940740889, 12028823668264674112)
|
|
||||||
brol16(17689, 9024)
|
|
||||||
brol32(13946233938940740889, 12028823668264674112)
|
|
||||||
brol32(2366588185, 347743040)
|
|
||||||
brol64(13946233938940740889, 12028823668264674112)
|
|
||||||
bror8(13946233938940740889, 12028823668264674112)
|
|
||||||
bror8(25, 64)
|
|
||||||
bror16(13946233938940740889, 12028823668264674112)
|
|
||||||
bror16(17689, 9024)
|
|
||||||
bror32(13946233938940740889, 12028823668264674112)
|
|
||||||
bror32(2366588185, 347743040)
|
|
||||||
bror64(13946233938940740889, 12028823668264674112)
|
|
||||||
bmod8(13946233938940740889)
|
|
||||||
bmod8(25)
|
|
||||||
bmod16(13946233938940740889)
|
|
||||||
bmod16(17689)
|
|
||||||
bmod32(13946233938940740889)
|
|
||||||
bmod32(2366588185)
|
|
||||||
bmod64(13946233938940740889)
|
|
@ -1 +0,0 @@
|
|||||||
uint(1)
|
|
@ -1 +0,0 @@
|
|||||||
int(1)
|
|
@ -1,12 +0,0 @@
|
|||||||
for (i = 0; i < A; ++i)
|
|
||||||
{print "n"
|
|
||||||
if(1)if(1){3
|
|
||||||
}
|
|
||||||
if(0)if(1){3
|
|
||||||
}
|
|
||||||
else 4
|
|
||||||
if(0){if(1){3
|
|
||||||
}}
|
|
||||||
else 5
|
|
||||||
{i}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
1 % 1
|
|
||||||
2 % 1
|
|
||||||
16 % 4
|
|
||||||
17 % 4
|
|
||||||
3496723859067234 % 298375462837546928347623059375486
|
|
||||||
-1 % 1
|
|
||||||
-2 % 1
|
|
||||||
-1274852934765 % 2387628935486273546
|
|
||||||
1 % -1
|
|
||||||
2 % -1
|
|
||||||
2 % -3
|
|
||||||
16 % 5
|
|
||||||
89237423 % -237856923854
|
|
||||||
-1 % -1
|
|
||||||
-2 % -1
|
|
||||||
-2 % -2
|
|
||||||
-2 % -3
|
|
||||||
-13 % -7
|
|
||||||
-14 % -7
|
|
||||||
-15 % -7
|
|
||||||
-127849612 % -23712347682193
|
|
||||||
scale = 0
|
|
||||||
1 % 1
|
|
||||||
2 % 1
|
|
||||||
scale = 0; -899510228 % -2448300078.40314
|
|
||||||
scale = 0; -7424863 % -207.2609738667
|
|
||||||
scale = 0; 3769798918 % 0.6
|
|
@ -1,408 +0,0 @@
|
|||||||
#! /usr/bin/bc -q
|
|
||||||
|
|
||||||
define printarray(a[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
define a2(a[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a[i] = a[i] * a[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
printarray(a[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
define a4(a__[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a__[i] = a__[i] * a__[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
printarray(a__[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
define a6(*a__[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a__[i] = a__[i] * a__[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
printarray(a__[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
define a1(*a[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a[i] = i
|
|
||||||
}
|
|
||||||
|
|
||||||
a2(a[], len)
|
|
||||||
|
|
||||||
printarray(a[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
define a3(*a__[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a__[i] = i
|
|
||||||
}
|
|
||||||
|
|
||||||
a4(a__[], len)
|
|
||||||
|
|
||||||
printarray(a__[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
define a5(*a__[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a__[i] = i
|
|
||||||
}
|
|
||||||
|
|
||||||
a2(a__[], len)
|
|
||||||
|
|
||||||
printarray(a__[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
define a7(*a__[], len) {
|
|
||||||
|
|
||||||
auto i
|
|
||||||
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
a__[i] = i
|
|
||||||
}
|
|
||||||
|
|
||||||
a6(a__[], len)
|
|
||||||
|
|
||||||
printarray(a__[], len)
|
|
||||||
}
|
|
||||||
|
|
||||||
len = 16
|
|
||||||
|
|
||||||
a1(a[], len)
|
|
||||||
printarray(a[], len)
|
|
||||||
a3(a[], len)
|
|
||||||
printarray(a[], len)
|
|
||||||
a5(a[], len)
|
|
||||||
printarray(a[], len)
|
|
||||||
a7(a[], len)
|
|
||||||
printarray(a[], len)
|
|
||||||
|
|
||||||
a1(b[], len)
|
|
||||||
printarray(b[], len)
|
|
||||||
a3(b[], len)
|
|
||||||
printarray(b[], len)
|
|
||||||
a5(b[], len)
|
|
||||||
printarray(b[], len)
|
|
||||||
a7(b[], len)
|
|
||||||
printarray(b[], len)
|
|
||||||
|
|
||||||
a1[0] = 0
|
|
||||||
a2[0] = 0
|
|
||||||
a3[0] = 0
|
|
||||||
a4[0] = 0
|
|
||||||
a5[0] = 0
|
|
||||||
a6[0] = 0
|
|
||||||
a7[0] = 0
|
|
||||||
a8[0] = 0
|
|
||||||
a9[0] = 0
|
|
||||||
a10[0] = 0
|
|
||||||
a11[0] = 0
|
|
||||||
a12[0] = 0
|
|
||||||
a13[0] = 0
|
|
||||||
a14[0] = 0
|
|
||||||
a15[0] = 0
|
|
||||||
a16[0] = 0
|
|
||||||
a17[0] = 0
|
|
||||||
a18[0] = 0
|
|
||||||
a19[0] = 0
|
|
||||||
a20[0] = 0
|
|
||||||
a21[0] = 0
|
|
||||||
a22[0] = 0
|
|
||||||
a23[0] = 0
|
|
||||||
a24[0] = 0
|
|
||||||
a25[0] = 0
|
|
||||||
a26[0] = 0
|
|
||||||
a27[0] = 0
|
|
||||||
a28[0] = 0
|
|
||||||
a29[0] = 0
|
|
||||||
a30[0] = 0
|
|
||||||
a31[0] = 0
|
|
||||||
a32[0] = 0
|
|
||||||
a33[0] = 0
|
|
||||||
a34[0] = 0
|
|
||||||
a35[0] = 0
|
|
||||||
a36[0] = 0
|
|
||||||
a37[0] = 0
|
|
||||||
a38[0] = 0
|
|
||||||
a39[0] = 0
|
|
||||||
a40[0] = 0
|
|
||||||
a41[0] = 0
|
|
||||||
a42[0] = 0
|
|
||||||
a43[0] = 0
|
|
||||||
a44[0] = 0
|
|
||||||
a45[0] = 0
|
|
||||||
a46[0] = 0
|
|
||||||
a47[0] = 0
|
|
||||||
a48[0] = 0
|
|
||||||
a49[0] = 0
|
|
||||||
a50[0] = 0
|
|
||||||
a51[0] = 0
|
|
||||||
a52[0] = 0
|
|
||||||
a53[0] = 0
|
|
||||||
a54[0] = 0
|
|
||||||
a55[0] = 0
|
|
||||||
a56[0] = 0
|
|
||||||
a57[0] = 0
|
|
||||||
a58[0] = 0
|
|
||||||
a59[0] = 0
|
|
||||||
a60[0] = 0
|
|
||||||
a61[0] = 0
|
|
||||||
a62[0] = 0
|
|
||||||
a63[0] = 0
|
|
||||||
a64[0] = 0
|
|
||||||
a65[0] = 0
|
|
||||||
a66[0] = 0
|
|
||||||
a67[0] = 0
|
|
||||||
a68[0] = 0
|
|
||||||
a69[0] = 0
|
|
||||||
a70[0] = 0
|
|
||||||
a71[0] = 0
|
|
||||||
a72[0] = 0
|
|
||||||
a73[0] = 0
|
|
||||||
a74[0] = 0
|
|
||||||
a75[0] = 0
|
|
||||||
a76[0] = 0
|
|
||||||
a77[0] = 0
|
|
||||||
a78[0] = 0
|
|
||||||
a79[0] = 0
|
|
||||||
a80[0] = 0
|
|
||||||
a81[0] = 0
|
|
||||||
a82[0] = 0
|
|
||||||
a83[0] = 0
|
|
||||||
a84[0] = 0
|
|
||||||
a85[0] = 0
|
|
||||||
a86[0] = 0
|
|
||||||
a87[0] = 0
|
|
||||||
a88[0] = 0
|
|
||||||
a89[0] = 0
|
|
||||||
a90[0] = 0
|
|
||||||
a91[0] = 0
|
|
||||||
a92[0] = 0
|
|
||||||
a93[0] = 0
|
|
||||||
a94[0] = 0
|
|
||||||
a95[0] = 0
|
|
||||||
a96[0] = 0
|
|
||||||
a97[0] = 0
|
|
||||||
a98[0] = 0
|
|
||||||
a99[0] = 0
|
|
||||||
a100[0] = 0
|
|
||||||
a101[0] = 0
|
|
||||||
a102[0] = 0
|
|
||||||
a103[0] = 0
|
|
||||||
a104[0] = 0
|
|
||||||
a105[0] = 0
|
|
||||||
a106[0] = 0
|
|
||||||
a107[0] = 0
|
|
||||||
a108[0] = 0
|
|
||||||
a109[0] = 0
|
|
||||||
a110[0] = 0
|
|
||||||
a111[0] = 0
|
|
||||||
a112[0] = 0
|
|
||||||
a113[0] = 0
|
|
||||||
a114[0] = 0
|
|
||||||
a115[0] = 0
|
|
||||||
a116[0] = 0
|
|
||||||
a117[0] = 0
|
|
||||||
a118[0] = 0
|
|
||||||
a119[0] = 0
|
|
||||||
a120[0] = 0
|
|
||||||
a121[0] = 0
|
|
||||||
a122[0] = 0
|
|
||||||
a123[0] = 0
|
|
||||||
a124[0] = 0
|
|
||||||
a125[0] = 0
|
|
||||||
a126[0] = 0
|
|
||||||
a127[0] = 0
|
|
||||||
a128[0] = 0
|
|
||||||
a129[0] = 0
|
|
||||||
a130[0] = 0
|
|
||||||
a131[0] = 0
|
|
||||||
a132[0] = 0
|
|
||||||
a133[0] = 0
|
|
||||||
a134[0] = 0
|
|
||||||
a135[0] = 0
|
|
||||||
a136[0] = 0
|
|
||||||
a137[0] = 0
|
|
||||||
a138[0] = 0
|
|
||||||
a139[0] = 0
|
|
||||||
a140[0] = 0
|
|
||||||
a141[0] = 0
|
|
||||||
a142[0] = 0
|
|
||||||
a143[0] = 0
|
|
||||||
a144[0] = 0
|
|
||||||
a145[0] = 0
|
|
||||||
a146[0] = 0
|
|
||||||
a147[0] = 0
|
|
||||||
a148[0] = 0
|
|
||||||
a149[0] = 0
|
|
||||||
a150[0] = 0
|
|
||||||
a151[0] = 0
|
|
||||||
a152[0] = 0
|
|
||||||
a153[0] = 0
|
|
||||||
a154[0] = 0
|
|
||||||
a155[0] = 0
|
|
||||||
a156[0] = 0
|
|
||||||
a157[0] = 0
|
|
||||||
a158[0] = 0
|
|
||||||
a159[0] = 0
|
|
||||||
a160[0] = 0
|
|
||||||
a161[0] = 0
|
|
||||||
a162[0] = 0
|
|
||||||
a163[0] = 0
|
|
||||||
a164[0] = 0
|
|
||||||
a165[0] = 0
|
|
||||||
a166[0] = 0
|
|
||||||
a167[0] = 0
|
|
||||||
a168[0] = 0
|
|
||||||
a169[0] = 0
|
|
||||||
a170[0] = 0
|
|
||||||
a171[0] = 0
|
|
||||||
a172[0] = 0
|
|
||||||
a173[0] = 0
|
|
||||||
a174[0] = 0
|
|
||||||
a175[0] = 0
|
|
||||||
a176[0] = 0
|
|
||||||
a177[0] = 0
|
|
||||||
a178[0] = 0
|
|
||||||
a179[0] = 0
|
|
||||||
a180[0] = 0
|
|
||||||
a181[0] = 0
|
|
||||||
a182[0] = 0
|
|
||||||
a183[0] = 0
|
|
||||||
a184[0] = 0
|
|
||||||
a185[0] = 0
|
|
||||||
a186[0] = 0
|
|
||||||
a187[0] = 0
|
|
||||||
a188[0] = 0
|
|
||||||
a189[0] = 0
|
|
||||||
a190[0] = 0
|
|
||||||
a191[0] = 0
|
|
||||||
a192[0] = 0
|
|
||||||
a193[0] = 0
|
|
||||||
a194[0] = 0
|
|
||||||
a195[0] = 0
|
|
||||||
a196[0] = 0
|
|
||||||
a197[0] = 0
|
|
||||||
a198[0] = 0
|
|
||||||
a199[0] = 0
|
|
||||||
a200[0] = 0
|
|
||||||
a201[0] = 0
|
|
||||||
a202[0] = 0
|
|
||||||
a203[0] = 0
|
|
||||||
a204[0] = 0
|
|
||||||
a205[0] = 0
|
|
||||||
a206[0] = 0
|
|
||||||
a207[0] = 0
|
|
||||||
a208[0] = 0
|
|
||||||
a209[0] = 0
|
|
||||||
a210[0] = 0
|
|
||||||
a211[0] = 0
|
|
||||||
a212[0] = 0
|
|
||||||
a213[0] = 0
|
|
||||||
a214[0] = 0
|
|
||||||
a215[0] = 0
|
|
||||||
a216[0] = 0
|
|
||||||
a217[0] = 0
|
|
||||||
a218[0] = 0
|
|
||||||
a219[0] = 0
|
|
||||||
a220[0] = 0
|
|
||||||
a221[0] = 0
|
|
||||||
a222[0] = 0
|
|
||||||
a223[0] = 0
|
|
||||||
a224[0] = 0
|
|
||||||
a225[0] = 0
|
|
||||||
a226[0] = 0
|
|
||||||
a227[0] = 0
|
|
||||||
a228[0] = 0
|
|
||||||
a229[0] = 0
|
|
||||||
a230[0] = 0
|
|
||||||
a231[0] = 0
|
|
||||||
a232[0] = 0
|
|
||||||
a233[0] = 0
|
|
||||||
a234[0] = 0
|
|
||||||
a235[0] = 0
|
|
||||||
a236[0] = 0
|
|
||||||
a237[0] = 0
|
|
||||||
a238[0] = 0
|
|
||||||
a239[0] = 0
|
|
||||||
a240[0] = 0
|
|
||||||
a241[0] = 0
|
|
||||||
a242[0] = 0
|
|
||||||
a243[0] = 0
|
|
||||||
a244[0] = 0
|
|
||||||
a245[0] = 0
|
|
||||||
a246[0] = 0
|
|
||||||
a247[0] = 0
|
|
||||||
a248[0] = 0
|
|
||||||
a249[0] = 0
|
|
||||||
a250[0] = 0
|
|
||||||
a251[0] = 0
|
|
||||||
a252[0] = 0
|
|
||||||
a253[0] = 0
|
|
||||||
a254[0] = 0
|
|
||||||
a255[0] = 0
|
|
||||||
a256[0] = 0
|
|
||||||
|
|
||||||
a1(a253[], len)
|
|
||||||
printarray(a253[], len)
|
|
||||||
a3(a253[], len)
|
|
||||||
printarray(a253[], len)
|
|
||||||
a5(a253[], len)
|
|
||||||
printarray(a253[], len)
|
|
||||||
a7(a253[], len)
|
|
||||||
printarray(a253[], len)
|
|
||||||
|
|
||||||
a1(a254[], len)
|
|
||||||
printarray(a254[], len)
|
|
||||||
a3(a254[], len)
|
|
||||||
printarray(a254[], len)
|
|
||||||
a5(a254[], len)
|
|
||||||
printarray(a254[], len)
|
|
||||||
a7(a254[], len)
|
|
||||||
printarray(a254[], len)
|
|
||||||
|
|
||||||
a1(a255[], len)
|
|
||||||
printarray(a255[], len)
|
|
||||||
a3(a255[], len)
|
|
||||||
printarray(a255[], len)
|
|
||||||
a5(a255[], len)
|
|
||||||
printarray(a255[], len)
|
|
||||||
a7(a255[], len)
|
|
||||||
printarray(a255[], len)
|
|
||||||
|
|
||||||
a1(a256[], len)
|
|
||||||
printarray(a256[], len)
|
|
||||||
a3(a256[], len)
|
|
||||||
printarray(a256[], len)
|
|
||||||
a5(a256[], len)
|
|
||||||
printarray(a256[], len)
|
|
||||||
a7(a256[], len)
|
|
||||||
printarray(a256[], len)
|
|
@ -1 +0,0 @@
|
|||||||
obase^= 20-f-b-4^-f-4-4^-f-4^-d
|
|
@ -1,2 +0,0 @@
|
|||||||
for (i = 0; ; )
|
|
||||||
for (i = 0; ;(p(s(ssqrtt()-p())))000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000#000
|
|
@ -1 +0,0 @@
|
|||||||
while (i == 0) {
|
|
@ -1,8 +0,0 @@
|
|||||||
for(q=F;i<=020; ++i) #00
|
|
||||||
{print "0"
|
|
||||||
if(6)if(6){3
|
|
||||||
}
|
|
||||||
{pr0n}
|
|
||||||
""}
|
|
||||||
{pr0n}
|
|
||||||
{print "" ""
|
|
@ -1 +0,0 @@
|
|||||||
d000$++
|
|
@ -1,2 +0,0 @@
|
|||||||
for (v ;!j -90-90; ++i)
|
|
||||||
a= ibase ++;0
|
|
@ -1 +0,0 @@
|
|||||||
"0
|
|
@ -1,15 +0,0 @@
|
|||||||
0$
|
|
||||||
1$
|
|
||||||
2$
|
|
||||||
0.8249167203486$
|
|
||||||
1.28937150237$
|
|
||||||
2.0$
|
|
||||||
28937.92837605126$
|
|
||||||
2890.000000000$
|
|
||||||
-1$
|
|
||||||
-1.128973$
|
|
||||||
-9812387.28910273$
|
|
||||||
x = 83.298
|
|
||||||
x$
|
|
||||||
x = -1893.19
|
|
||||||
(x)$
|
|
@ -1,2 +0,0 @@
|
|||||||
[[000000000
|
|
||||||
00000]
|
|
@ -1,5 +0,0 @@
|
|||||||
0 R
|
|
||||||
2 1
|
|
||||||
1 0+pRpp
|
|
||||||
30.x
|
|
||||||
[00000000]ip1+pR
|
|
@ -1,2 +0,0 @@
|
|||||||
0 lip1-si0l0+200sx_9lq+pR 30.x
|
|
||||||
[li100L0dp1+s+sX10lM<0]sL0sJlLx
|
|
@ -1,9 +0,0 @@
|
|||||||
zp100000000.000004p1+pR
|
|
||||||
0 1 1+kpR
|
|
||||||
1 1+pR
|
|
||||||
1 0IpR
|
|
||||||
2 9+iR
|
|
||||||
037 483+pR
|
|
||||||
999 999+pR
|
|
||||||
237467456283846vpR
|
|
||||||
.0000000ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsdddddddddddddddddddddddddddddddddddddddddddddddddddddsdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd/ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfddddddddddddddddddddddddddddddddddddddddddddddddddddddcdddddddddddd9000000000000000000
|
|
@ -1,3 +0,0 @@
|
|||||||
04000000000000300sx_9000.00000syzpRlxlq+pR
|
|
||||||
30.x
|
|
||||||
[li1000000sxL0LLLL900000.00000sLLL]sL0s0lLx
|
|
@ -1 +0,0 @@
|
|||||||
00Q;pd60 p d9S06+00I;pd60Q2 0^pR
|
|
@ -1,3 +0,0 @@
|
|||||||
1 0 1|dR
|
|
||||||
1 [li0L]SL10sildR
|
|
||||||
1 [li0L]sL10|Lx
|
|
@ -1 +0,0 @@
|
|||||||
0 2+p[lip1-si0li!=0^di>0]S098sil0x
|
|
@ -1,9 +0,0 @@
|
|||||||
#00000
|
|
||||||
0sm[Nx]0s0[]0s0x[]zs0x[]0s0[]zs0c
|
|
||||||
0s0[Nx]0s0[]zs0x[]zs0x[Nx]0s0[]zs0#000000000
|
|
||||||
0s0[Nx]0s_[]zs0x[li]zs^x[l0000000]0sm[]zs0x[liNx]zs0x[li;0lilix]
|
|
||||||
x[liN]zsWx[liN]zs0x[li;0lilix]
|
|
||||||
x[liNzs0x#000000000
|
|
||||||
*sm[Nx]0sm[]zs0x[li]zs0x[Nx]0sm[]zsdc
|
|
||||||
0sm[Nx]0sm[]zs0x[li]zs0x[Nx]0sm[]x]zsxx#000000000
|
|
||||||
*s0[Nx]0sm[]0s00[00]zs0x[Nx]0sm[]z0dc
|
|
@ -1,11 +0,0 @@
|
|||||||
#0000
|
|
||||||
0sm[Nx]0sm[]0s0x[li]0s0x[Nfvfff[]0sm[]zs0x[li]zs0x[Nx]0sm[]zs0c
|
|
||||||
0sm[Nx]0sm[]x[li]zs0x[Nx]0sm[]zs0c
|
|
||||||
0sm[Nx]0sm[]zs0x[li]zs0x[Nx]0sm[]zs0c
|
|
||||||
0sm[Nx]0sm[]zs0x[li]zs0x[Nx]0sm[]zs0#000000000
|
|
||||||
0sm[Nx]0s0[]zs0x[li]zs0x[0000000000]0sm[]zs0x[liNx]zs0x[li;0l0l0x]
|
|
||||||
x[liNx]zs0x#000000000
|
|
||||||
0sm[Nx]0sm[]zs0x[li]zs0x[000]0sm[]x[li]zs0x[Nx]0sm[]zs0c
|
|
||||||
0sm[Nx]0sm[]zs0x[li]zs0x[Nx]0sm[]zs0#0000
|
|
||||||
0sm[Nx]0sm[]zs0x[li]zs0x[Nx]0sm[]zs0#000000000
|
|
||||||
0sm[Nx]0s_@]zs0x[li]s^x[0000000000]0s0[]zsW[0000]zsxx[000000000]
|
|
@ -1,4 +0,0 @@
|
|||||||
#00000000
|
|
||||||
[[00000]aa]sM[lip1-si0li>0eM]s010sil0x
|
|
||||||
[[0000]00]sM[]s010sil0x
|
|
||||||
[R]sM[lip=000]s0;0
|
|
@ -1,2 +0,0 @@
|
|||||||
1;09R0si[lii000000000000000000000000000000000000000000]li1000 2346dvdddd;ddddddddddddd?-sdddddddddd0+dd0 1+pR
|
|
||||||
0dvdddd;ddSddddddddddd 0si[lid1+sil0sili10li?-s0]dsxx[00000000]li1000 2000dvddddddddddddddddddddddddd0 0+ddd 1+pR
|
|
@ -1,7 +0,0 @@
|
|||||||
zp10[00000000\00]pppppppppppppppR
|
|
||||||
_1 _1(pR
|
|
||||||
_1 _2(pR
|
|
||||||
2 1{pR
|
|
||||||
_1 1{pR 990+pR
|
|
||||||
2000000 300000300000000+pR
|
|
||||||
2070000000aaaaaaaaaaaaaaxaaaaaaaaaaaaR
|
|
@ -1,7 +0,0 @@
|
|||||||
0bpR
|
|
||||||
1bpR
|
|
||||||
.200000bpR
|
|
||||||
100000.0000600bpR
|
|
||||||
_10bpR
|
|
||||||
_.1000000bpR
|
|
||||||
_30000.00bpR:
|
|
@ -1,11 +0,0 @@
|
|||||||
0bpax1bpR
|
|
||||||
1bpR
|
|
||||||
.30b900pR
|
|
||||||
_10bp/90
|
|
||||||
_30_.1/10bp30_.1/90
|
|
||||||
_300.1/90/90
|
|
||||||
_30_.1/90
|
|
||||||
_30000.1/90
|
|
||||||
90
|
|
||||||
_30000.1/90
|
|
||||||
70.000 70u
|
|
@ -1 +0,0 @@
|
|||||||
0 0;^dddddRps0R@s016dddRRd^2ddRZ(b-P;;$p;;;;;;9;;;;;;$ppppppppppppp30
|
|
@ -1,20 +0,0 @@
|
|||||||
0 1(pR
|
|
||||||
1;;;;;pR
|
|
||||||
1
|
|
||||||
0 18d[0000000
|
|
||||||
000000000000000000000000000000]sM[liv1-si0li!<0pR
|
|
||||||
_1 0{pR
|
|
||||||
_1 _1{pR
|
|
||||||
_1 f0070000000000.0000000000000_10000000000006.00000000000005~pRpR
|
|
||||||
_23745860900000.070000000000000 _0.20542357869124050~pRpR
|
|
||||||
_3000000000000000.0000000700000006002 _7000000000000005000000000.000F000000000000003~pRpR20000000 300000000003.00000000000000030~pRpR
|
|
||||||
_30000000000000000000000000
|
|
||||||
1 0.001.00000000030
|
|
||||||
1 0.000000000000000000000000000000000000000000000000000000000000000000002x30000000000000000000000000000000000000$80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000<0800000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000.000F000000000000003~pRpR20000000 300000000003.00000000000000030~pRpR
|
|
||||||
_30000000000000.00000000000
|
|
||||||
1 0.070.70000000000
|
|
||||||
1 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000$80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000<080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000S8800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Z800000000000
|
|
||||||
_10pR
|
|
||||||
=390NpR
|
|
||||||
_2000
|
|
||||||
40000 5000C 2i>0eM]s01@sil0x
|
|
@ -1,3 +0,0 @@
|
|||||||
1oVVf[li;WORli1S0Zli1;rORli1dH|2li@d-NliO+rK28729@9547628O745/pR
|
|
||||||
_29307546189299999999999999999999999999999999999995 0.00000000000000000000000000009999999999999999999+99$9999999999.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999995 0.0000000000000000000000000000000000R0000000000000000000000000000000000000+0000000000000000-0000000000000000000005+pR
|
|
||||||
99999999999999999999999999999999999999999999999999999999999.999999999999999999999.99999999999999999999999999999999999999999900000000000000000000000R0000000000000000000000000000000000000+0000000000000000-0000000000000000000005+pR999999999999999999999999999999999999999999 0.00000000000000000000000000000000000000000000000000000000000C0020P00000000000000000000000000000000000007fli1+7fli1+si;d7dli1+si;0=Rls1d:0li +i100>x]dsxx[0000000]dsxx[p000]l010000000 00000000000pR
|
|
@ -1,3 +0,0 @@
|
|||||||
#0000
|
|
||||||
I20PPrP PPPP PPs0daP1:0pR
|
|
||||||
PPP1d:0pRR
|
|
@ -1,5 +0,0 @@
|
|||||||
0bpR
|
|
||||||
1bpR
|
|
||||||
.200000bpR
|
|
||||||
100000.0000600bpR
|
|
||||||
S09bpR
|
|
@ -1,36 +0,0 @@
|
|||||||
[0000000000000]ZpR
|
|
||||||
[He00
|
|
||||||
[0000000\00000000]00
|
|
||||||
[0000000\00000000]000
|
|
||||||
[0000000\00000000]00
|
|
||||||
[0000]
|
|
||||||
00000]
|
|
||||||
[28pR]
|
|
||||||
[27pR]
|
|
||||||
[26pR]
|
|
||||||
[25pR]
|
|
||||||
[24pR]
|
|
||||||
[23pR]
|
|
||||||
[22pR]
|
|
||||||
[21pR]
|
|
||||||
[20pR]
|
|
||||||
[19pR]
|
|
||||||
[18pR]
|
|
||||||
[17pR]
|
|
||||||
[16pR]
|
|
||||||
[15pR]
|
|
||||||
[14pR]
|
|
||||||
[13pR]
|
|
||||||
[12pR]
|
|
||||||
[11pR]
|
|
||||||
[10pR]
|
|
||||||
[9pR]
|
|
||||||
[8pR]
|
|
||||||
[7pR]
|
|
||||||
[6pR]
|
|
||||||
[5pR]
|
|
||||||
[4pR]
|
|
||||||
[3pR]
|
|
||||||
[2pR]
|
|
||||||
[1pR]
|
|
||||||
[xz0<x]dsxx
|
|
@ -1,2 +0,0 @@
|
|||||||
#00000000
|
|
||||||
[[0000]00]SM[l0p1-s00l0`000]s010sil0x
|
|
@ -1 +0,0 @@
|
|||||||
[] 0:xX:0 0:0X:0n/dc.000C00}pR
|
|
@ -1,6 +0,0 @@
|
|||||||
#00000000
|
|
||||||
0s0[l0d:0l01;0d:0l01;0pRl01+s0l010>x]dsxx0sx0s0
|
|
||||||
1 2
|
|
||||||
s0[l0d:0l01;0d:0l01;0pRl01+s0l010>x]dsxx0sx0s0
|
|
||||||
1 2
|
|
||||||
€
|
|
@ -1,155 +0,0 @@
|
|||||||
0bpR
|
|
||||||
1bp0
|
|
||||||
.20bpR
|
|
||||||
100000.0000005bpR
|
|
||||||
_10bpR
|
|
||||||
_.1000[l0;0;rpRl01+s0l010>x]dsxx0sx0s0
|
|
||||||
1 2+p+p
|
|
||||||
3+p
|
|
||||||
4+p
|
|
||||||
5+p
|
|
||||||
6+p
|
|
||||||
7+p
|
|
||||||
8+p
|
|
||||||
9+p
|
|
||||||
10+p
|
|
||||||
11+p
|
|
||||||
12+p
|
|
||||||
13+p
|
|
||||||
14+p
|
|
||||||
15+p
|
|
||||||
16+p
|
|
||||||
17+p
|
|
||||||
18+p
|
|
||||||
19+p
|
|
||||||
20+p
|
|
||||||
21+0+p
|
|
||||||
71+o
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
22+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
40+1+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60bpR
|
|
||||||
1bp0
|
|
||||||
.20bpR
|
|
||||||
100000.0070000bpR
|
|
||||||
_10bpR
|
|
||||||
_.1000[l0;0;rpRl01+s0l010>x]dsxx0sx0s0
|
|
||||||
1 2+p+p
|
|
||||||
3+p
|
|
||||||
4+p
|
|
||||||
5+p
|
|
||||||
6+p
|
|
||||||
7+p
|
|
||||||
8+p
|
|
||||||
9+p
|
|
||||||
10+p
|
|
||||||
11+p
|
|
||||||
12+p
|
|
||||||
13+p
|
|
||||||
14+p
|
|
||||||
15+p
|
|
||||||
16+p
|
|
||||||
17+p
|
|
||||||
18+p
|
|
||||||
19+p
|
|
||||||
20+p
|
|
||||||
21+0+p
|
|
||||||
71+o
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
22+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
20+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
30+p
|
|
||||||
40+1+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
40+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
50+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60+p
|
|
||||||
60
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
70+p
|
|
||||||
80+p
|
|
||||||
ネ
|
|
@ -1,2 +0,0 @@
|
|||||||
"0000000\
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
10 4%0:i[000] 1:b 0;0 p 1;b0:b [000] 1:b 0;b p 1;b~b 0;b p 0;b~~~0k
|
|
@ -1,13 +0,0 @@
|
|||||||
10 4%0:b [200] 1:b 0;b 1;b X
|
|
||||||
2000 1%p0
|
|
||||||
3460:b [200] 1:b 0;b p bp0
|
|
||||||
.2 1%pR
|
|
||||||
6 4%pR
|
|
||||||
10 4%0:b [200] 1:b 0;b p 1;b X
|
|
||||||
20000 1%pR
|
|
||||||
b 0;b p 0;b2
|
|
||||||
1bpb [200] 1:u 0;b p 1;b X
|
|
||||||
2
|
|
||||||
[000] 0:b [200] 0:b 0;b p S0b p
|
|
||||||
[s0]XpR
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
0;0[]0:b;bs0l0x;0
|
|
@ -1,7 +0,0 @@
|
|||||||
0bpR
|
|
||||||
1bpR
|
|
||||||
.218933bpR
|
|
||||||
138963.9873645bpR
|
|
||||||
_19bpR
|
|
||||||
_.1298376bpR
|
|
||||||
_3892173.289375bpR
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user