diff options
106 files changed, 8400 insertions, 10089 deletions
diff --git a/cogapp.py b/cogapp.py index 54c5e5e3a..ea43433c3 100644 --- a/cogapp.py +++ b/cogapp.py @@ -5,13 +5,10 @@ """ # $Id: cogapp.py 141 2008-05-22 10:56:43Z nedbat $ -# modified to run with Python1.5.2 by Andreas Rumpf +# modified to run with Python1.5.2 and Python3.0 by Andreas Rumpf -import md5, os, re, string, sys, traceback, types -import imp -import copy, getopt, shlex -from cStringIO import StringIO -from string import strip, split, join, replace +import os, re, string, sys, traceback, types, imp, copy, getopt, shlex +from pycompab import * __all__ = ['Cog', 'CogUsageError'] @@ -37,15 +34,14 @@ OPTIONS: -s STRING Suffix all generated output lines with STRING. -U Write the output with Unix newlines (only LF line-endings). -w CMD Use CMD if the output file needs to be made writable. - A %s in the CMD will be filled with the filename. + A $1 in the CMD will be filled with the filename. -x Excise all the generated output without running the generators. -z The [[[end]]] marker can be omitted, and is assumed at eof. -v Print the version of cog and exit. -h Print this help. """ -# Get True and False right even if they aren't already defined. -True, False = 0==0, 0==1 +gErrorMsg = "" # this is needed to support Python 1.5.2 till 3.0 # Other package modules from whiteutils import * @@ -54,10 +50,12 @@ class CogError(Exception): """ Any exception raised by Cog. """ def __init__(self, msg, file='', line=0): + global gErrorMsg if file: - Exception.__init__(self, "%s(%d): %s" % (file, line, msg)) + gErrorMsg = Subs("$1($2): $2", file, line, msg) else: - Exception.__init__(self, msg) + gErrorMsg = msg + Exception.__init__(self, gErrorMsg) class CogUsageError(CogError): """ An error in usage of command-line arguments in cog. @@ -97,15 +95,15 @@ class CogGenerator(Redirectable): self.markers = [] self.lines = [] - def parseMarker(self, l): - self.markers.append(l) + def parseMarker(self, L): + self.markers.append(L) - def parseLine(self, l): + def parseLine(self, L): s = 0 - e = len(l) - while s < len(l) and l[s] == '\n': s = s + 1 - while e >= 1 and l[e-1] == '\n': e = e - 1 - self.lines.append(l[s:e+1]) + e = len(L) + while s < len(L) and L[s] == '\n': s = s + 1 + while e >= 1 and L[e-1] == '\n': e = e - 1 + self.lines.append(L[s:e+1]) def getCode(self): """ Extract the executable Python code from the generator. @@ -116,10 +114,10 @@ class CogGenerator(Redirectable): prefIn = commonPrefix(self.markers + self.lines) if prefIn: tmp = [] - for l in self.markers: tmp.append(replace(l, prefIn, '', 1)) + for L in self.markers: tmp.append(replace(L, prefIn, '', 1)) self.markers = tmp tmp = [] - for l in self.lines: tmp.append(replace(l, prefIn, '', 1)) + for L in self.lines: tmp.append(replace(L, prefIn, '', 1)) self.lines = tmp #self.markers = [ l.replace(prefIn, '', 1) for l in self.markers ] #self.lines = [ l.replace(prefIn, '', 1) for l in self.lines ] @@ -163,7 +161,7 @@ class CogGenerator(Redirectable): def msg(self, s): self.stdout.write("Message: "+s+"\n") - def out(self, sOut='', dedent=False, trimblanklines=False): + def out(self, sOut='', dedent=false, trimblanklines=false): """ The cog.out function. """ if trimblanklines and ('\n' in sOut): @@ -177,7 +175,7 @@ class CogGenerator(Redirectable): sOut = reindentBlock(sOut) self.outstring = self.outstring + sOut - def outl(self, sOut='', dedent=False, trimblanklines=False): + def outl(self, sOut='', dedent=false, trimblanklines=false): """ The cog.outl function. """ self.out(sOut, dedent, trimblanklines) @@ -200,10 +198,10 @@ class NumberedFileReader: self.n = 0 def readline(self): - l = self.f.readline() - if l: + L = self.f.readline() + if L: self.n = self.n + 1 - return l + return L def linenumber(self): return self.n @@ -217,17 +215,17 @@ class CogOptions: self.args = [] self.includePath = [] self.defines = {} - self.bShowVersion = False + self.bShowVersion = false self.sMakeWritableCmd = None - self.bReplace = False - self.bNoGenerate = False + self.bReplace = false + self.bNoGenerate = false self.sOutputName = None - self.bWarnEmpty = False - self.bHashOutput = False - self.bDeleteCode = False - self.bEofCanBeEnd = False + self.bWarnEmpty = false + self.bHashOutput = false + self.bDeleteCode = false + self.bEofCanBeEnd = false self.sSuffix = None - self.bNewlines = False + self.bNewlines = false def __cmp__(self, other): """ Comparison operator for tests to use. @@ -249,44 +247,44 @@ class CogOptions: # Parse the command line arguments. try: opts, self.args = getopt.getopt(argv, 'cdD:eI:o:rs:Uvw:xz') - except getopt.error, msg: - raise CogUsageError(msg) + except getopt.error: + raise CogUsageError("invalid command line") # Handle the command line arguments. for o, a in opts: if o == '-c': - self.bHashOutput = True + self.bHashOutput = true elif o == '-d': - self.bDeleteCode = True + self.bDeleteCode = true elif o == '-D': if a.count('=') < 1: raise CogUsageError("-D takes a name=value argument") name, value = split(a, '=', 1) self.defines[name] = value elif o == '-e': - self.bWarnEmpty = True + self.bWarnEmpty = true elif o == '-I': self.addToIncludePath(a) elif o == '-o': self.sOutputName = a elif o == '-r': - self.bReplace = True + self.bReplace = true elif o == '-s': self.sSuffix = a elif o == '-U': - self.bNewlines = True + self.bNewlines = true elif o == '-v': - self.bShowVersion = True + self.bShowVersion = true elif o == '-w': self.sMakeWritableCmd = a elif o == '-x': - self.bNoGenerate = True + self.bNoGenerate = true elif o == '-z': - self.bEofCanBeEnd = True + self.bEofCanBeEnd = true else: # Since getopt.getopt is given a list of possible flags, # this is an internal error. - raise CogInternalError("Don't understand argument %s" % o) + raise CogInternalError(Subs("Don't understand argument $1", o)) def validate(self): """ Does nothing if everything is OK, raises CogError's if it's not. @@ -297,15 +295,6 @@ class CogOptions: if self.bReplace and self.sOutputName: raise CogUsageError("Can't use -o with -r (they are opposites)") - -def mydigest(hasher): - result = "" - for c in hasher.digest(): - x = hex(ord(c))[2:] - if len(x) == 1: x = "0" + x - result = result + x - return result - class Cog(Redirectable): """ The Cog engine. """ @@ -315,7 +304,7 @@ class Cog(Redirectable): self.sEndSpec = ']]]' self.sEndOutput = '[[[end]]]' self.reEndOutput = re.compile(r'\[\[\[end]]](?P<hashsect> *\(checksum: (?P<hash>[a-f0-9]+)\))') - self.sEndFormat = '[[[end]]] (checksum: %s)' + self.sEndFormat = '[[[end]]] (checksum: $1)' self.options = CogOptions() self.sOutputMode = 'w' @@ -326,14 +315,14 @@ class Cog(Redirectable): self.stdout.write("Warning: " + msg + "\n") def isBeginSpecLine(self, s): - return string.find(s, self.sBeginSpec) >= 0 + return find(s, self.sBeginSpec) >= 0 def isEndSpecLine(self, s): - return string.find(s, self.sEndSpec) >= 0 and \ + return find(s, self.sEndSpec) >= 0 and \ not self.isEndOutputLine(s) def isEndOutputLine(self, s): - return string.find(s, self.sEndOutput) >= 0 + return find(s, self.sEndOutput) >= 0 def installCogModule(self): """ Magic mumbo-jumbo so that imported Python modules @@ -362,7 +351,7 @@ class Cog(Redirectable): fIn = NumberedFileReader(fIn) - bSawCog = False + bSawCog = false self.cogmodule.inFile = sFileIn self.cogmodule.outFile = sFileOut @@ -375,102 +364,102 @@ class Cog(Redirectable): globals.update(self.options.defines) # loop over generator chunks - l = fIn.readline() - while l: + L = fIn.readline() + while L: # Find the next spec begin - while l and not self.isBeginSpecLine(l): - if self.isEndSpecLine(l): - raise CogError("Unexpected '%s'" % self.sEndSpec, + while L and not self.isBeginSpecLine(L): + if self.isEndSpecLine(L): + raise CogError(Subs("Unexpected '$1'", self.sEndSpec), file=sFileIn, line=fIn.linenumber()) - if self.isEndOutputLine(l): - raise CogError("Unexpected '%s'" % self.sEndOutput, + if self.isEndOutputLine(L): + raise CogError(Subs("Unexpected '$1'", self.sEndOutput), file=sFileIn, line=fIn.linenumber()) - fOut.write(l) - l = fIn.readline() - if not l: + fOut.write(L) + L = fIn.readline() + if not L: break if not self.options.bDeleteCode: - fOut.write(l) + fOut.write(L) - # l is the begin spec + # L is the begin spec gen = CogGenerator() gen.setOutput(stdout=self.stdout) - gen.parseMarker(l) + gen.parseMarker(L) firstLineNum = fIn.linenumber() self.cogmodule.firstLineNum = firstLineNum # If the spec begin is also a spec end, then process the single # line of code inside. - if self.isEndSpecLine(l): - beg = string.find(l, self.sBeginSpec) - end = string.find(l, self.sEndSpec) + if self.isEndSpecLine(L): + beg = find(L, self.sBeginSpec) + end = find(L, self.sEndSpec) if beg > end: raise CogError("Cog code markers inverted", file=sFileIn, line=firstLineNum) else: - sCode = strip(l[beg+len(self.sBeginSpec):end]) + sCode = strip(L[beg+len(self.sBeginSpec):end]) gen.parseLine(sCode) else: # Deal with an ordinary code block. - l = fIn.readline() + L = fIn.readline() # Get all the lines in the spec - while l and not self.isEndSpecLine(l): - if self.isBeginSpecLine(l): - raise CogError("Unexpected '%s'" % self.sBeginSpec, + while L and not self.isEndSpecLine(L): + if self.isBeginSpecLine(L): + raise CogError(Subs("Unexpected '$1'", self.sBeginSpec), file=sFileIn, line=fIn.linenumber()) - if self.isEndOutputLine(l): - raise CogError("Unexpected '%s'" % self.sEndOutput, + if self.isEndOutputLine(L): + raise CogError(Subs("Unexpected '$1'", self.sEndOutput), file=sFileIn, line=fIn.linenumber()) if not self.options.bDeleteCode: - fOut.write(l) - gen.parseLine(l) - l = fIn.readline() - if not l: + fOut.write(L) + gen.parseLine(L) + L = fIn.readline() + if not L: raise CogError( "Cog block begun but never ended.", file=sFileIn, line=firstLineNum) if not self.options.bDeleteCode: - fOut.write(l) - gen.parseMarker(l) + fOut.write(L) + gen.parseMarker(L) - l = fIn.readline() + L = fIn.readline() # Eat all the lines in the output section. While reading past # them, compute the md5 hash of the old output. - hasher = md5.new() - while l and not self.isEndOutputLine(l): - if self.isBeginSpecLine(l): - raise CogError("Unexpected '%s'" % self.sBeginSpec, + hasher = newMD5() + while L and not self.isEndOutputLine(L): + if self.isBeginSpecLine(L): + raise CogError(Subs("Unexpected '$1'", self.sBeginSpec), file=sFileIn, line=fIn.linenumber()) - if self.isEndSpecLine(l): - raise CogError("Unexpected '%s'" % self.sEndSpec, + if self.isEndSpecLine(L): + raise CogError(Subs("Unexpected '$1'", self.sEndSpec), file=sFileIn, line=fIn.linenumber()) - hasher.update(l) - l = fIn.readline() + MD5update(hasher, L) + L = fIn.readline() curHash = mydigest(hasher) - if not l and not self.options.bEofCanBeEnd: + if not L and not self.options.bEofCanBeEnd: # We reached end of file before we found the end output line. - raise CogError("Missing '%s' before end of file." % self.sEndOutput, + raise CogError(Subs("Missing '$1' before end of file.", self.sEndOutput), file=sFileIn, line=fIn.linenumber()) # Write the output of the spec to be the new output if we're # supposed to generate code. - hasher = md5.new() + hasher = newMD5() if not self.options.bNoGenerate: - sFile = "%s+%d" % (sFileIn, firstLineNum) + sFile = Subs("$1+$2", sFileIn, firstLineNum) sGen = gen.evaluate(cog=self, globals=globals, fname=sFile) sGen = self.suffixLines(sGen) - hasher.update(sGen) + MD5update(hasher, sGen) fOut.write(sGen) newHash = mydigest(hasher) - bSawCog = True + bSawCog = true # Write the ending output line - hashMatch = self.reEndOutput.search(l) + hashMatch = self.reEndOutput.search(L) if self.options.bHashOutput: if hashMatch: oldHash = hashMatch.groupdict()['hash'] @@ -478,23 +467,23 @@ class Cog(Redirectable): raise CogError("Output has been edited! Delete old checksum to unprotect.", file=sFileIn, line=fIn.linenumber()) # Create a new end line with the correct hash. - endpieces = split(l, hashMatch.group(0), 1) + endpieces = split(L, hashMatch.group(0), 1) else: # There was no old hash, but we want a new hash. - endpieces = split(l, self.sEndOutput, 1) - l = join(endpieces, (self.sEndFormat % newHash)) + endpieces = split(L, self.sEndOutput, 1) + L = join(endpieces, Subs(self.sEndFormat, newHash)) else: # We don't want hashes output, so if there was one, get rid of # it. if hashMatch: - l = replace(l, hashMatch.groupdict()['hashsect'], '', 1) + L = replace(L, hashMatch.groupdict()['hashsect'], '', 1) if not self.options.bDeleteCode: - fOut.write(l) - l = fIn.readline() + fOut.write(L) + L = fIn.readline() if not bSawCog and self.options.bWarnEmpty: - self.showWarning("no cog code found in %s" % sFileIn) + self.showWarning("no cog code found in " + sFileIn) # A regex for non-empty lines, used by suffixLines. reNonEmptyLines = re.compile("^\s*\S+.*$", re.MULTILINE) @@ -525,13 +514,13 @@ class Cog(Redirectable): # Need to ensure we can write. if self.options.sMakeWritableCmd: # Use an external command to make the file writable. - cmd = replace(self.options.sMakeWritableCmd, '%s', sOldPath) + cmd = replace(self.options.sMakeWritableCmd, '$1', sOldPath) self.stdout.write(os.popen(cmd).read()) if not os.access(sOldPath, os.W_OK): - raise CogError("Couldn't make %s writable" % sOldPath) + raise CogError(Subs("Couldn't make $1 writable", sOldPath)) else: # Can't write! - raise CogError("Can't overwrite %s" % sOldPath) + raise CogError("Can't overwrite " + sOldPath) f = open(sOldPath, self.sOutputMode) f.write(sNewText) f.close() @@ -573,8 +562,8 @@ class Cog(Redirectable): elif self.options.bReplace: # We want to replace the cog file with the output, # but only if they differ. - self.stdout.write("Cogging %s" % sFile) - bNeedNewline = True + self.stdout.write("Cogging " + sFile) + bNeedNewline = true try: fOldFile = open(sFile) @@ -583,7 +572,7 @@ class Cog(Redirectable): sNewText = self.processString(sOldText, fname=sFile) if sOldText != sNewText: self.stdout.write(" (changed)\n") - bNeedNewline = False + bNeedNewline = false self.replaceFile(sFile, sNewText) finally: # The try-finally block is so we can print a partial line @@ -600,10 +589,10 @@ class Cog(Redirectable): def processFileList(self, sFileList): """ Process the files in a file list. """ - for l in open(sFileList).readlines(): + for L in open(sFileList).readlines(): # Use shlex to parse the line like a shell. - lex = shlex.shlex(l, posix=True) - lex.whitespace_split = True + lex = shlex.shlex(L, posix=true) + lex.whitespace_split = true lex.commenters = '#' # No escapes, so that backslash can be part of the path lex.escape = '' @@ -645,7 +634,7 @@ class Cog(Redirectable): self.options.validate() if self.options.bShowVersion: - self.stdout.write("Cog version %s\n" % __version__) + self.stdout.write(Subs("Cog version $1\n", __version__)) return if self.options.args: @@ -657,19 +646,20 @@ class Cog(Redirectable): def main(self, argv): """ Handle the command-line execution for cog. """ + global gErrorMsg try: self.callableMain(argv) return 0 - except CogUsageError, err: - self.stderr.write(err + "\n") + except CogUsageError: + self.stderr.write(gErrorMsg + "\n") self.stderr.write("(for help use -?)\n") return 2 - except CogGeneratedError, err: - self.stderr.write("Error: %s\n" % err) + except CogGeneratedError: + self.stderr.write(Subs("Error: $1\n", gErrorMsg)) return 3 - except CogError, err: - self.stderr.write(err + "\n") + except CogError: + self.stderr.write(gErrorMsg + "\n") return 1 except: traceback.print_exc(None, self.stderr) diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg index 9a946b641..73886ceee 100644 --- a/config/nimdoc.cfg +++ b/config/nimdoc.cfg @@ -1,5 +1,5 @@ # This is the config file for the documentation generator. -# (c) 2008 Andreas Rumpf +# (c) 2009 Andreas Rumpf # Feel free to edit the templates as you need. split.item.toc = "20" diff --git a/config/nimrod.cfg b/config/nimrod.cfg index dd3b980c9..e06472cf5 100644 --- a/config/nimrod.cfg +++ b/config/nimrod.cfg @@ -1,5 +1,5 @@ # Configuration file for the Nimrod Compiler. -# (c) 2008 Andreas Rumpf +# (c) 2009 Andreas Rumpf # Feel free to edit the default values as you need. @@ -7,7 +7,7 @@ # @putenv "key" "val" # Environment variables cannot be used in the options, however! -cc = @if windows: llvm_gcc @else: gcc @end +cc = gcc lib="$nimrod/lib" path="$lib/base" path="$lib/base/gtk" @@ -68,10 +68,8 @@ vcc.options.size = "/O1" # Configuration for the GNU C/C++ compiler: @if windows: - gcc.path = r"C:\eigenes\compiler\mingw\bin" + gcc.path = r"$nimrod\dist\mingw\bin" @end -#gcc.exe = "gcc-4.1" -#gcc.linkerExe = "gcc-4.1" gcc.options.debug = "-g" @if macosx: gcc.options.always = "-w -fasm-blocks" @@ -83,13 +81,8 @@ gcc.options.size = "-Os" # Configuration for the Digital Mars C/C++ compiler: @if windows: - dmc.path = r"C:\eigenes\compiler\d\dm\bin" + dmc.path = r"$nimrod\dist\dm\bin" @end # Configuration for the Tiny C Compiler: -@if windows: - tcc.path = r"C:\Eigenes\compiler\tcc-0.9.23\tcc" - tcc.options.always = r"-IC:\Eigenes\compiler\tcc-0.9.23\include " & - r"-IC:\Eigenes\compiler\tcc-0.9.23\include\winapi" -@end tcc.options.always = "-w" diff --git a/data/advopt.txt b/data/advopt.txt index ecf3b7b75..1fc1f4845 100644 --- a/data/advopt.txt +++ b/data/advopt.txt @@ -27,7 +27,6 @@ Advanced options: --checkpoints:on|off turn on|off checkpoints; for debugging Nimrod --skip_cfg do not read the general configuration file --skip_proj_cfg do not read the project's configuration file - --import:MODULE_FILE import the given module implicitly for each module --index:FILE use FILE to generate a documenation index file --putenv:key=value set an environment variable --list_cmd list the commands used to execute external programs diff --git a/data/ast.yml b/data/ast.yml index b1d55327f..c4b261bba 100644 --- a/data/ast.yml +++ b/data/ast.yml @@ -212,7 +212,6 @@ 'nkFromStmt', # a from * import statement 'nkImportAs', # an `import xyx as abc` section 'nkIncludeStmt', # an include statement - 'nkAccessStmt', # used internally for iterators 'nkCommentStmt', # a comment statement 'nkStmtListExpr', # a statement list followed by an expr; this is used # to allow powerful multi-line templates diff --git a/data/basicopt.txt b/data/basicopt.txt index c10cba63b..9ba29c265 100644 --- a/data/basicopt.txt +++ b/data/basicopt.txt @@ -19,14 +19,14 @@ Options: --debugger:on|off turn Embedded Nimrod Debugger ON|OFF -x, --checks:on|off code generation for all runtime checks ON|OFF --obj_checks:on|off code generation for obj conversion checks ON|OFF - --field_checks:on|off code generation for case record fields ON|OFF + --field_checks:on|off code generation for case variant fields ON|OFF --range_checks:on|off code generation for range checks ON|OFF --bound_checks:on|off code generation for bound checks ON|OFF --overflow_checks:on|off code generation for over-/underflow checks ON|OFF -a, --assertions:on|off code generation for assertions ON|OFF --dead_code_elim:on|off whole program dead code elimination ON|OFF --opt:none|speed|size optimize not at all or for speed|size - --app:console|gui|lib generate a console|GUI application or a shared lib + --app:console|gui generate a console|GUI application -r, --run run the compiled program with given arguments --advanced show advanced command line switches -h, --help show this help diff --git a/data/messages.yml b/data/messages.yml index c319aa693..b5b37c6c5 100644 --- a/data/messages.yml +++ b/data/messages.yml @@ -1,5 +1,5 @@ # This file contains all the messages of the Nimrod compiler -# (c) 2008 Andreas Rumpf +# (c) 2009 Andreas Rumpf [ # fatal errors: @@ -208,7 +208,7 @@ {'errXNotAllowedHere': '$1 here not allowed'}, {'errInvalidControlFlowX': 'invalid control flow: $1'}, {'errATypeHasNoValue': 'a type has no value'}, -{'errXisNoType': "'$1' is no type"}, +{'errXisNoType': "invalid type: '$1'"}, {'errCircumNeedsPointer': "'^' needs a pointer or reference type"}, {'errInvalidContextForBuiltinX': "invalid context for builtin '$1'"}, {'errInvalidExpression': 'invalid expression'}, @@ -254,6 +254,7 @@ {'errXRequiresOneArgument': "converter requires one parameter"}, {'errUnhandledExceptionX': "unhandled exception: $1"}, {'errCyclicTree': "macro returned a cyclic abstract syntax tree"}, +{'errXisNoMacroOrTemplate': "'$1' is no macro or template"}, # user error message: {'errUser': '$1'}, diff --git a/doc/docs.txt b/doc/docs.txt index 431a79a29..a731b1504 100644 --- a/doc/docs.txt +++ b/doc/docs.txt @@ -1,28 +1,25 @@ - "Incorrect documentation is often worse than no documentation." + Incorrect documentation is often worse than no documentation. -- Bertrand Meyer The documentation consists of several documents: -- | `Nimrod tutorial (part I) <tut1.html>`_ +- | `Tutorial (part I) <tut1.html>`_ | The Nimrod tutorial part one deals with the basics. -- | `Nimrod tutorial (part II) <tut2.html>`_ +- | `Tutorial (part II) <tut2.html>`_ | The Nimrod tutorial part two deals with the advanced language constructs. -- | `Nimrod manual <manual.html>`_ - | The Nimrod manual is a draft that will evolve into a proper specification. +- | `Library documentation <lib.html>`_ + | This document describes Nimrod's standard library. -- | `User guide for the Nimrod Compiler <nimrodc.html>`_ +- | `User guide <nimrodc.html>`_ | The user guide lists command line arguments, special features of the compiler, etc. -- | `User guide for the Embedded Nimrod Debugger <endb.html>`_ - | This document describes how to use the Embedded Debugger. - -- | `Nimrod library documentation <lib.html>`_ - | This document describes Nimrod's standard library. +- | `Manual <manual.html>`_ + | The Nimrod manual is a draft that will evolve into a proper specification. -- | `Nimrod internal documentation <intern.html>`_ +- | `Internal documentation <intern.html>`_ | The internal documentation describes how the compiler is implemented. Read this if you want to hack the compiler. diff --git a/doc/filelist.txt b/doc/filelist.txt index fb2f67a37..e094b6fb3 100644 --- a/doc/filelist.txt +++ b/doc/filelist.txt @@ -5,7 +5,7 @@ Short description of Nimrod's modules Module Description ============== ========================================================== nimrod main module: parses the command line and calls - ```main.MainCommand`` + ``main.MainCommand`` main implements the top-level command dispatching lexbase buffer handling of the lexical analyser scanner lexical analyser @@ -31,6 +31,7 @@ sigmatch contains the matching algorithm that is used for proc semexprs contains the semantic checking phase for expressions semstmts contains the semantic checking phase for statements semtypes contains the semantic checking phase for types +seminst instantiation of generic procs and types semfold contains code to deal with constant folding evals contains an AST interpreter for compile time evaluation pragmas semantic checking of pragmas diff --git a/doc/grammar.txt b/doc/grammar.txt index fa5a0d036..9fbd1eb15 100644 --- a/doc/grammar.txt +++ b/doc/grammar.txt @@ -118,7 +118,7 @@ ifStmt ::= 'if' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt] whenStmt ::= 'when' expr ':' stmt ('elif' expr ':' stmt)* ['else' ':' stmt] caseStmt ::= 'case' expr [':'] ('of' sliceExprList ':' stmt)* ('elif' expr ':' stmt)* - ['else' ':' stmt] + ['else' ':' stmt] whileStmt ::= 'while' expr ':' stmt forStmt ::= 'for' symbol (comma symbol)* 'in' expr ['..' expr] ':' stmt exceptList ::= [qualifiedIdent (comma qualifiedIdent)*] diff --git a/doc/lib.txt b/doc/lib.txt index ccd97aa6e..b45c02262 100644 --- a/doc/lib.txt +++ b/doc/lib.txt @@ -6,12 +6,15 @@ Nimrod Standard Library :Version: |nimrodversion| Though the Nimrod Standard Library is still evolving, it is already quite -usable. It is divided into basic libraries that contains modules that virtually -every program will need and advanced libraries which are more heavy weight. -Advanced libraries are in the ``lib/base`` directory. +usable. It is divided into *pure libraries*, *impure libraries* and *wrappers*. -Basic libraries -=============== +Pure libraries do not depend on any external ``*.dll`` or ``lib*.so`` binary +while impure libraries do. A wrapper is an impure library that is a very +low-level interface to a C library. + + +Pure libraries +============== * `system <system.html>`_ Basic procs and operators that every program needs. It also provides IO @@ -51,6 +54,12 @@ Basic libraries literals, raw string literals and triple quote string literals are supported as in the Nimrod programming language. +* `parsexml <parsexml.html>`_ + The ``parsexml`` module implements a simple high performance XML/HTML parser. + The only encoding that is supported is UTF-8. The parser has been designed + to be somewhat error correcting, so that even some "wild HTML" found on the + web can be parsed with it. + * `strtabs <strtabs.html>`_ The ``strtabs`` module implements an efficient hash table that is a mapping from strings to strings. Supports a case-sensitive, case-insensitive and @@ -68,17 +77,31 @@ Basic libraries Nimrod types. * `lexbase <lexbase.html>`_ - This is a low level module that implements an extremely efficent buffering + This is a low level module that implements an extremely efficient buffering scheme for lexers and parsers. This is used by the ``parsecfg`` module. +* `terminal <terminal.html>`_ + This module contains a few procedures to control the *terminal* + (also called *console*). The implementation simply uses ANSI escape + sequences and does not depend on any other module. + +* `cgi <cgi.html>`_ + This module implements helper procs for CGI applictions. -Advanced libaries -================= +* `unicode <unicode.html>`_ + This module provides support to handle the Unicode UTF-8 encoding. * `regexprs <regexprs.html>`_ This module contains procedures and operators for handling regular expressions. +* `md5 <md5.html>`_ + This module implements the MD5 checksum algorithm. + + +Impure libraries +================ + * `dialogs <dialogs.html>`_ This module implements portable dialogs for Nimrod; the implementation builds on the GTK interface. On Windows, native dialogs are shown if @@ -86,6 +109,11 @@ Advanced libaries * `zipfiles <zipfiles.html>`_ This module implements a zip archive creator/reader/modifier. + +* `web <web.html>`_ + This module contains simple high-level procedures for dealing with the + web like loading the contents of a web page from an URL. + Wrappers ======== @@ -97,6 +125,12 @@ not contained in the distribution. You can then find them on the website. Contains a wrapper for the POSIX standard. * `windows <windows.html>`_ Contains a wrapper for the Win32 API. +* `mysql <mysql.html>`_ + Contains a wrapper for the mySQL API. +* `sqlite3 <sqlite3.html>`_ + Contains a wrapper for SQLite 3 API. +* `libcurl <libcurl.html>`_ + Contains a wrapper for the libcurl library. * `shellapi <shellapi.html>`_ Contains a wrapper for the ``shellapi.h`` header. * `shfolder <shfolder.html>`_ diff --git a/doc/manual.txt b/doc/manual.txt index 04b8bb97b..2fa24f756 100644 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -1011,8 +1011,8 @@ char '\0' bool false ref or pointer type nil procedural type nil -sequence nil (**not** ``@[]``) -string nil (**not** "") +sequence nil (*not* ``@[]``) +string nil (*not* "") tuple[x: A, y: B, ...] (default(A), default(B), ...) (analogous for objects) array[0..., T] [default(T), ...] @@ -1080,9 +1080,9 @@ Case statement Syntax:: - caseStmt ::= 'case' expr ('of' sliceExprList ':' stmt)* - ('elif' expr ':' stmt)* - ['else' ':' stmt] + caseStmt ::= 'case' expr [':'] ('of' sliceExprList ':' stmt)* + ('elif' expr ':' stmt)* + ['else' ':' stmt] Example: @@ -1241,11 +1241,11 @@ sugar for: ``return`` without an expression is a short notation for ``return result`` if the proc has a return type. The `result`:idx: variable is always the return value of the procedure. It is automatically declared by the compiler. As all -variables, ``result`` is initialized to (binary) zero:: +variables, ``result`` is initialized to (binary) zero: .. code-block:: nimrod - proc returnZero(): int = - # implicitely returns 0 + proc returnZero(): int = + # implicitely returns 0 Yield statement @@ -1649,7 +1649,7 @@ possible within a single ``type`` section. Generics ~~~~~~~~ -`Version 0.7.4: Complex generic types like in the example do not work.`:red: +`Version 0.7.6: Generic types like in the example do not work.`:red: Example: diff --git a/doc/nimrodc.txt b/doc/nimrodc.txt index 18f9bce5d..f4949ada2 100644 --- a/doc/nimrodc.txt +++ b/doc/nimrodc.txt @@ -208,8 +208,9 @@ Acyclic Pragma ~~~~~~~~~~~~~~ The `acyclic`:idx: pragma can be used for object types to mark them as acyclic even though they seem to be cyclic. This is an **optimization** for the garbage -collector to not consider objects of this type as part of a cycle:: +collector to not consider objects of this type as part of a cycle: +.. code-block:: nimrod type PNode = ref TNode TNode {.acyclic, final.} = object diff --git a/doc/theindex.txt b/doc/theindex.txt index 1afbdb791..6aeb786fa 100644 --- a/doc/theindex.txt +++ b/doc/theindex.txt @@ -1,7539 +1,4769 @@ - -===== -Index -===== - -.. index:: - - - `!=`:idx: - `system.html#351 <system.html#351>`_ - - `$`:idx: - * `system.html#422 <system.html#422>`_ - * `system.html#423 <system.html#423>`_ - * `system.html#424 <system.html#424>`_ - * `system.html#425 <system.html#425>`_ - * `system.html#426 <system.html#426>`_ - * `system.html#427 <system.html#427>`_ - * `system.html#428 <system.html#428>`_ - * `system.html#429 <system.html#429>`_ - * `times.html#109 <times.html#109>`_ - * `times.html#110 <times.html#110>`_ - - `%`:idx: - * `strutils.html#134 <strutils.html#134>`_ - * `strutils.html#135 <strutils.html#135>`_ - * `strtabs.html#112 <strtabs.html#112>`_ - - `%%`:idx: - * `system.html#296 <system.html#296>`_ - * `system.html#297 <system.html#297>`_ - * `system.html#298 <system.html#298>`_ - * `system.html#299 <system.html#299>`_ - * `system.html#300 <system.html#300>`_ - - `&`:idx: - * `system.html#362 <system.html#362>`_ - * `system.html#363 <system.html#363>`_ - * `system.html#364 <system.html#364>`_ - * `system.html#365 <system.html#365>`_ - * `system.html#453 <system.html#453>`_ - * `system.html#454 <system.html#454>`_ - * `system.html#455 <system.html#455>`_ - * `system.html#456 <system.html#456>`_ - - `*`:idx: - * `system.html#206 <system.html#206>`_ - * `system.html#207 <system.html#207>`_ - * `system.html#208 <system.html#208>`_ - * `system.html#209 <system.html#209>`_ - * `system.html#210 <system.html#210>`_ - * `system.html#315 <system.html#315>`_ - * `system.html#323 <system.html#323>`_ - * `complex.html#107 <complex.html#107>`_ - - `*%`:idx: - * `system.html#286 <system.html#286>`_ - * `system.html#287 <system.html#287>`_ - * `system.html#288 <system.html#288>`_ - * `system.html#289 <system.html#289>`_ - * `system.html#290 <system.html#290>`_ - - `+`:idx: - * `system.html#181 <system.html#181>`_ - * `system.html#182 <system.html#182>`_ - * `system.html#183 <system.html#183>`_ - * `system.html#184 <system.html#184>`_ - * `system.html#185 <system.html#185>`_ - * `system.html#196 <system.html#196>`_ - * `system.html#197 <system.html#197>`_ - * `system.html#198 <system.html#198>`_ - * `system.html#199 <system.html#199>`_ - * `system.html#200 <system.html#200>`_ - * `system.html#311 <system.html#311>`_ - * `system.html#313 <system.html#313>`_ - * `system.html#324 <system.html#324>`_ - * `complex.html#103 <complex.html#103>`_ - - `+%`:idx: - * `system.html#276 <system.html#276>`_ - * `system.html#277 <system.html#277>`_ - * `system.html#278 <system.html#278>`_ - * `system.html#279 <system.html#279>`_ - * `system.html#280 <system.html#280>`_ - - `-`:idx: - * `system.html#186 <system.html#186>`_ - * `system.html#187 <system.html#187>`_ - * `system.html#188 <system.html#188>`_ - * `system.html#189 <system.html#189>`_ - * `system.html#190 <system.html#190>`_ - * `system.html#201 <system.html#201>`_ - * `system.html#202 <system.html#202>`_ - * `system.html#203 <system.html#203>`_ - * `system.html#204 <system.html#204>`_ - * `system.html#205 <system.html#205>`_ - * `system.html#312 <system.html#312>`_ - * `system.html#314 <system.html#314>`_ - * `system.html#325 <system.html#325>`_ - * `complex.html#104 <complex.html#104>`_ - * `complex.html#105 <complex.html#105>`_ - * `times.html#113 <times.html#113>`_ - - `-%`:idx: - * `system.html#281 <system.html#281>`_ - * `system.html#282 <system.html#282>`_ - * `system.html#283 <system.html#283>`_ - * `system.html#284 <system.html#284>`_ - * `system.html#285 <system.html#285>`_ - - `-+-`:idx: - `system.html#326 <system.html#326>`_ - - `/`:idx: - * `system.html#316 <system.html#316>`_ - * `os.html#119 <os.html#119>`_ - * `complex.html#106 <complex.html#106>`_ - - `/%`:idx: - * `system.html#291 <system.html#291>`_ - * `system.html#292 <system.html#292>`_ - * `system.html#293 <system.html#293>`_ - * `system.html#294 <system.html#294>`_ - * `system.html#295 <system.html#295>`_ - - `/../`:idx: - `os.html#123 <os.html#123>`_ - - `<`:idx: - * `system.html#256 <system.html#256>`_ - * `system.html#257 <system.html#257>`_ - * `system.html#258 <system.html#258>`_ - * `system.html#259 <system.html#259>`_ - * `system.html#260 <system.html#260>`_ - * `system.html#319 <system.html#319>`_ - * `system.html#343 <system.html#343>`_ - * `system.html#344 <system.html#344>`_ - * `system.html#345 <system.html#345>`_ - * `system.html#346 <system.html#346>`_ - * `system.html#347 <system.html#347>`_ - * `system.html#348 <system.html#348>`_ - * `system.html#349 <system.html#349>`_ - * `system.html#350 <system.html#350>`_ - * `times.html#114 <times.html#114>`_ - - `<%`:idx: - * `system.html#306 <system.html#306>`_ - * `system.html#307 <system.html#307>`_ - * `system.html#308 <system.html#308>`_ - * `system.html#309 <system.html#309>`_ - * `system.html#310 <system.html#310>`_ - - `<=`:idx: - * `system.html#251 <system.html#251>`_ - * `system.html#252 <system.html#252>`_ - * `system.html#253 <system.html#253>`_ - * `system.html#254 <system.html#254>`_ - * `system.html#255 <system.html#255>`_ - * `system.html#318 <system.html#318>`_ - * `system.html#336 <system.html#336>`_ - * `system.html#337 <system.html#337>`_ - * `system.html#338 <system.html#338>`_ - * `system.html#339 <system.html#339>`_ - * `system.html#340 <system.html#340>`_ - * `system.html#341 <system.html#341>`_ - * `system.html#342 <system.html#342>`_ - - `<=`:idx: - `times.html#115 <times.html#115>`_ - - `<=%`:idx: - * `system.html#301 <system.html#301>`_ - * `system.html#302 <system.html#302>`_ - * `system.html#303 <system.html#303>`_ - * `system.html#304 <system.html#304>`_ - * `system.html#305 <system.html#305>`_ - - `==`:idx: - * `system.html#246 <system.html#246>`_ - * `system.html#247 <system.html#247>`_ - * `system.html#248 <system.html#248>`_ - * `system.html#249 <system.html#249>`_ - * `system.html#250 <system.html#250>`_ - * `system.html#317 <system.html#317>`_ - * `system.html#327 <system.html#327>`_ - * `system.html#328 <system.html#328>`_ - * `system.html#329 <system.html#329>`_ - * `system.html#330 <system.html#330>`_ - * `system.html#331 <system.html#331>`_ - * `system.html#332 <system.html#332>`_ - * `system.html#333 <system.html#333>`_ - * `system.html#334 <system.html#334>`_ - * `system.html#335 <system.html#335>`_ - * `system.html#458 <system.html#458>`_ - * `complex.html#102 <complex.html#102>`_ - - `>`:idx: - `system.html#353 <system.html#353>`_ - - `>%`:idx: - `system.html#421 <system.html#421>`_ - - `>=`:idx: - `system.html#352 <system.html#352>`_ - - `>=%`:idx: - `system.html#420 <system.html#420>`_ - - `@`:idx: - `system.html#361 <system.html#361>`_ - - `[]`:idx: - `strtabs.html#107 <strtabs.html#107>`_ - - `[]=`:idx: - `strtabs.html#106 <strtabs.html#106>`_ - - `[ESC]`:idx: - `manual.html#134 <manual.html#134>`_ - - `ABDAY_1`:idx: - `posix.html#403 <posix.html#403>`_ - - `ABDAY_2`:idx: - `posix.html#404 <posix.html#404>`_ - - `ABDAY_3`:idx: - `posix.html#405 <posix.html#405>`_ - - `ABDAY_4`:idx: - `posix.html#406 <posix.html#406>`_ - - `ABDAY_5`:idx: - `posix.html#407 <posix.html#407>`_ - - `ABDAY_6`:idx: - `posix.html#408 <posix.html#408>`_ - - `ABDAY_7`:idx: - `posix.html#409 <posix.html#409>`_ - - `ABMON_1`:idx: - `posix.html#422 <posix.html#422>`_ - - `ABMON_10`:idx: - `posix.html#431 <posix.html#431>`_ - - `ABMON_11`:idx: - `posix.html#432 <posix.html#432>`_ - - `ABMON_12`:idx: - `posix.html#433 <posix.html#433>`_ - - `ABMON_2`:idx: - `posix.html#423 <posix.html#423>`_ - - `ABMON_3`:idx: - `posix.html#424 <posix.html#424>`_ - - `ABMON_4`:idx: - `posix.html#425 <posix.html#425>`_ - - `ABMON_5`:idx: - `posix.html#426 <posix.html#426>`_ - - `ABMON_6`:idx: - `posix.html#427 <posix.html#427>`_ - - `ABMON_7`:idx: - `posix.html#428 <posix.html#428>`_ - - `ABMON_8`:idx: - `posix.html#429 <posix.html#429>`_ - - `ABMON_9`:idx: - `posix.html#430 <posix.html#430>`_ - - `abs`:idx: - * `system.html#261 <system.html#261>`_ - * `system.html#262 <system.html#262>`_ - * `system.html#263 <system.html#263>`_ - * `system.html#264 <system.html#264>`_ - * `system.html#265 <system.html#265>`_ - * `system.html#320 <system.html#320>`_ - * `complex.html#108 <complex.html#108>`_ - - `access`:idx: - `posix.html#966 <posix.html#966>`_ - - `acyclic`:idx: - `nimrodc.html#113 <nimrodc.html#113>`_ - - `add`:idx: - * `system.html#366 <system.html#366>`_ - * `system.html#367 <system.html#367>`_ - * `system.html#368 <system.html#368>`_ - * `system.html#369 <system.html#369>`_ - * `system.html#370 <system.html#370>`_ - - `addFile`:idx: - * `zipfiles.html#105 <zipfiles.html#105>`_ - * `zipfiles.html#106 <zipfiles.html#106>`_ - * `zipfiles.html#107 <zipfiles.html#107>`_ - - `addQuitProc`:idx: - `system.html#404 <system.html#404>`_ - - `adler32`:idx: - `zlib.html#174 <zlib.html#174>`_ - - `AIO_ALLDONE`:idx: - `posix.html#207 <posix.html#207>`_ - - `aio_cancel`:idx: - `posix.html#784 <posix.html#784>`_ - - `AIO_CANCELED`:idx: - `posix.html#208 <posix.html#208>`_ - - `aio_error`:idx: - `posix.html#785 <posix.html#785>`_ - - `aio_fsync`:idx: - `posix.html#786 <posix.html#786>`_ - - `AIO_NOTCANCELED`:idx: - `posix.html#209 <posix.html#209>`_ - - `aio_read`:idx: - `posix.html#787 <posix.html#787>`_ - - `aio_return`:idx: - `posix.html#788 <posix.html#788>`_ - - `aio_suspend`:idx: - `posix.html#789 <posix.html#789>`_ - - `aio_write`:idx: - `posix.html#790 <posix.html#790>`_ - - `alarm`:idx: - `posix.html#967 <posix.html#967>`_ - - `alert`:idx: - `manual.html#131 <manual.html#131>`_ - - `allCharsInSet`:idx: - `strutils.html#139 <strutils.html#139>`_ - - `alloc`:idx: - `system.html#413 <system.html#413>`_ - - `alloc0`:idx: - `system.html#414 <system.html#414>`_ - - `ALT_DIGITS`:idx: - `posix.html#438 <posix.html#438>`_ - - `AltSep`:idx: - `os.html#104 <os.html#104>`_ - - `AM_STR`:idx: - `posix.html#394 <posix.html#394>`_ - - `and`:idx: - * `system.html#116 <system.html#116>`_ - * `system.html#231 <system.html#231>`_ - * `system.html#232 <system.html#232>`_ - * `system.html#233 <system.html#233>`_ - * `system.html#234 <system.html#234>`_ - * `system.html#235 <system.html#235>`_ - - `apostrophe`:idx: - `manual.html#129 <manual.html#129>`_ - - `AppendFileExt`:idx: - `os.html#131 <os.html#131>`_ - - `arccos`:idx: - `math.html#117 <math.html#117>`_ - - `arcsin`:idx: - `math.html#118 <math.html#118>`_ - - `arctan`:idx: - `math.html#119 <math.html#119>`_ - - `arctan2`:idx: - `math.html#120 <math.html#120>`_ - - `arithmetic bit shifts`:idx: - `tut1.html#110 <tut1.html#110>`_ - - `array`:idx: - * `tut1.html#117 <tut1.html#117>`_ - * `system.html#124 <system.html#124>`_ - - `array properties`:idx: - `tut2.html#105 <tut2.html#105>`_ - - `Arrays`:idx: - `manual.html#152 <manual.html#152>`_ - - `asctime`:idx: - `posix.html#1092 <posix.html#1092>`_ - - `asctime_r`:idx: - `posix.html#1093 <posix.html#1093>`_ - - `assembler`:idx: - `manual.html#196 <manual.html#196>`_ - - `assert`:idx: - `system.html#418 <system.html#418>`_ - - `Automatic type conversion`:idx: - * `manual.html#144 <manual.html#144>`_ - * `tut1.html#111 <tut1.html#111>`_ - - `backslash`:idx: - * `manual.html#127 <manual.html#127>`_ - * `regexprs.html#101 <regexprs.html#101>`_ - - `backspace`:idx: - `manual.html#132 <manual.html#132>`_ - - `basename`:idx: - `posix.html#844 <posix.html#844>`_ - - `BiggestFloat`:idx: - `system.html#374 <system.html#374>`_ - - `BiggestInt`:idx: - `system.html#373 <system.html#373>`_ - - `block`:idx: - `manual.html#192 <manual.html#192>`_ - - `bool`:idx: - `system.html#109 <system.html#109>`_ - - `boolean`:idx: - * `manual.html#146 <manual.html#146>`_ - * `tut1.html#107 <tut1.html#107>`_ - - `break`:idx: - `manual.html#193 <manual.html#193>`_ - - `breakpoint`:idx: - `endb.html#103 <endb.html#103>`_ - - `bsd_signal`:idx: - `posix.html#1122 <posix.html#1122>`_ - - `Byte`:idx: - `system.html#128 <system.html#128>`_ - - `calling conventions`:idx: - `manual.html#163 <manual.html#163>`_ - - `capitalize`:idx: - `strutils.html#110 <strutils.html#110>`_ - - `card`:idx: - `system.html#169 <system.html#169>`_ - - `carriage return`:idx: - `manual.html#122 <manual.html#122>`_ - - `case`:idx: - `manual.html#181 <manual.html#181>`_ - - `catclose`:idx: - `posix.html#1149 <posix.html#1149>`_ - - `catgets`:idx: - `posix.html#1150 <posix.html#1150>`_ - - `catopen`:idx: - `posix.html#1151 <posix.html#1151>`_ - - `cchar`:idx: - `system.html#375 <system.html#375>`_ - - `cdecl`:idx: - `manual.html#165 <manual.html#165>`_ - - `cdouble`:idx: - `system.html#382 <system.html#382>`_ - - `cfloat`:idx: - `system.html#381 <system.html#381>`_ - - `ChangeFileExt`:idx: - `os.html#132 <os.html#132>`_ - - `char`:idx: - `system.html#110 <system.html#110>`_ - - `character type`:idx: - `manual.html#147 <manual.html#147>`_ - - `character with decimal value d`:idx: - `manual.html#130 <manual.html#130>`_ - - `character with hex value HH`:idx: - `manual.html#135 <manual.html#135>`_ - - `chdir`:idx: - `posix.html#968 <posix.html#968>`_ - - `checked runtime error`:idx: - `manual.html#110 <manual.html#110>`_ - - `chmod`:idx: - `posix.html#1058 <posix.html#1058>`_ - - `ChooseDir`:idx: - `dialogs.html#108 <dialogs.html#108>`_ - - `ChooseFilesToOpen`:idx: - `dialogs.html#106 <dialogs.html#106>`_ - - `ChooseFileToOpen`:idx: - `dialogs.html#105 <dialogs.html#105>`_ - - `ChooseFileToSave`:idx: - `dialogs.html#107 <dialogs.html#107>`_ - - `chown`:idx: - `posix.html#969 <posix.html#969>`_ - - `chr`:idx: - `system.html#171 <system.html#171>`_ - - `cint`:idx: - `system.html#378 <system.html#378>`_ - - `C_IRGRP`:idx: - `posix.html#104 <posix.html#104>`_ - - `C_IROTH`:idx: - `posix.html#107 <posix.html#107>`_ - - `C_IRUSR`:idx: - `posix.html#101 <posix.html#101>`_ - - `C_ISBLK`:idx: - `posix.html#116 <posix.html#116>`_ - - `C_ISCHR`:idx: - `posix.html#117 <posix.html#117>`_ - - `C_ISCTG`:idx: - `posix.html#118 <posix.html#118>`_ - - `C_ISDIR`:idx: - `posix.html#113 <posix.html#113>`_ - - `C_ISFIFO`:idx: - `posix.html#114 <posix.html#114>`_ - - `C_ISGID`:idx: - `posix.html#111 <posix.html#111>`_ - - `C_ISLNK`:idx: - `posix.html#119 <posix.html#119>`_ - - `C_ISREG`:idx: - `posix.html#115 <posix.html#115>`_ - - `C_ISSOCK`:idx: - `posix.html#120 <posix.html#120>`_ - - `C_ISUID`:idx: - `posix.html#110 <posix.html#110>`_ - - `C_ISVTX`:idx: - `posix.html#112 <posix.html#112>`_ - - `C_IWGRP`:idx: - `posix.html#105 <posix.html#105>`_ - - `C_IWOTH`:idx: - `posix.html#108 <posix.html#108>`_ - - `C_IWUSR`:idx: - `posix.html#102 <posix.html#102>`_ - - `C_IXGRP`:idx: - `posix.html#106 <posix.html#106>`_ - - `C_IXOTH`:idx: - `posix.html#109 <posix.html#109>`_ - - `C_IXUSR`:idx: - `posix.html#103 <posix.html#103>`_ - - `classify`:idx: - `math.html#104 <math.html#104>`_ - - `clock`:idx: - `posix.html#1094 <posix.html#1094>`_ - - `clock_getcpuclockid`:idx: - `posix.html#1095 <posix.html#1095>`_ - - `clock_getres`:idx: - `posix.html#1096 <posix.html#1096>`_ - - `clock_gettime`:idx: - `posix.html#1097 <posix.html#1097>`_ - - `CLOCK_MONOTONIC`:idx: - `posix.html#700 <posix.html#700>`_ - - `clock_nanosleep`:idx: - `posix.html#1098 <posix.html#1098>`_ - - `CLOCK_PROCESS_CPUTIME_ID`:idx: - `posix.html#696 <posix.html#696>`_ - - `CLOCK_REALTIME`:idx: - `posix.html#698 <posix.html#698>`_ - - `clock_settime`:idx: - `posix.html#1099 <posix.html#1099>`_ - - `CLOCKS_PER_SEC`:idx: - `posix.html#695 <posix.html#695>`_ - - `CLOCK_THREAD_CPUTIME_ID`:idx: - `posix.html#697 <posix.html#697>`_ - - `clong`:idx: - `system.html#379 <system.html#379>`_ - - `clongdouble`:idx: - `system.html#383 <system.html#383>`_ - - `clonglong`:idx: - `system.html#380 <system.html#380>`_ - - `close`:idx: - * `posix.html#970 <posix.html#970>`_ - * `lexbase.html#105 <lexbase.html#105>`_ - * `parsecfg.html#105 <parsecfg.html#105>`_ - * `zipfiles.html#103 <zipfiles.html#103>`_ - - `closedir`:idx: - `posix.html#800 <posix.html#800>`_ - - `CloseFile`:idx: - `system.html#488 <system.html#488>`_ - - `closure`:idx: - `manual.html#170 <manual.html#170>`_ - - `cmp`:idx: - * `system.html#359 <system.html#359>`_ - * `system.html#360 <system.html#360>`_ - - `cmpIgnoreCase`:idx: - `strutils.html#123 <strutils.html#123>`_ - - `cmpIgnoreStyle`:idx: - `strutils.html#124 <strutils.html#124>`_ - - `cmpPaths`:idx: - `os.html#130 <os.html#130>`_ - - `CODESET`:idx: - `posix.html#389 <posix.html#389>`_ - - `comment pieces`:idx: - * `manual.html#115 <manual.html#115>`_ - * `tut1.html#103 <tut1.html#103>`_ - - `Comments`:idx: - * `manual.html#114 <manual.html#114>`_ - * `tut1.html#102 <tut1.html#102>`_ - - `CompileDate`:idx: - `system.html#391 <system.html#391>`_ - - `CompileTime`:idx: - `system.html#392 <system.html#392>`_ - - `complex statements`:idx: - `manual.html#175 <manual.html#175>`_ - - `compress`:idx: - `zlib.html#154 <zlib.html#154>`_ - - `compress2`:idx: - `zlib.html#155 <zlib.html#155>`_ - - `confstr`:idx: - `posix.html#971 <posix.html#971>`_ - - `const`:idx: - `manual.html#179 <manual.html#179>`_ - - `constant expressions`:idx: - `manual.html#108 <manual.html#108>`_ - - `Constants`:idx: - * `manual.html#139 <manual.html#139>`_ - * `tut1.html#104 <tut1.html#104>`_ - - `constZIP_SOURCE_FREE`:idx: - `libzip.html#169 <libzip.html#169>`_ - - `contains`:idx: - * `system.html#354 <system.html#354>`_ - * `strutils.html#125 <strutils.html#125>`_ - * `strutils.html#126 <strutils.html#126>`_ - * `strutils.html#127 <strutils.html#127>`_ - - `continue`:idx: - `manual.html#195 <manual.html#195>`_ - - `copy`:idx: - * `system.html#405 <system.html#405>`_ - * `system.html#406 <system.html#406>`_ - - `copyFile`:idx: - `os.html#134 <os.html#134>`_ - - `copyMem`:idx: - `system.html#410 <system.html#410>`_ - - `cos`:idx: - `math.html#121 <math.html#121>`_ - - `cosh`:idx: - `math.html#122 <math.html#122>`_ - - `countBits`:idx: - `math.html#107 <math.html#107>`_ - - `countdown`:idx: - `system.html#439 <system.html#439>`_ - - `countup`:idx: - `system.html#440 <system.html#440>`_ - - `cpuEndian`:idx: - `system.html#397 <system.html#397>`_ - - `crc32`:idx: - `zlib.html#175 <zlib.html#175>`_ - - `creat`:idx: - `posix.html#811 <posix.html#811>`_ - - `createDir`:idx: - * `os.html#138 <os.html#138>`_ - * `zipfiles.html#104 <zipfiles.html#104>`_ - - `CRNCYSTR`:idx: - `posix.html#443 <posix.html#443>`_ - - `crypt`:idx: - `posix.html#972 <posix.html#972>`_ - - `cschar`:idx: - `system.html#376 <system.html#376>`_ - - `cshort`:idx: - `system.html#377 <system.html#377>`_ - - `cSIG_HOLD`:idx: - `posix.html#721 <posix.html#721>`_ - - `CS_PATH`:idx: - `posix.html#482 <posix.html#482>`_ - - `CS_POSIX_V6_ILP32_OFF32_CFLAGS`:idx: - `posix.html#483 <posix.html#483>`_ - - `CS_POSIX_V6_ILP32_OFF32_LDFLAGS`:idx: - `posix.html#484 <posix.html#484>`_ - - `CS_POSIX_V6_ILP32_OFF32_LIBS`:idx: - `posix.html#485 <posix.html#485>`_ - - `CS_POSIX_V6_ILP32_OFFBIG_CFLAGS`:idx: - `posix.html#486 <posix.html#486>`_ - - `CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS`:idx: - `posix.html#487 <posix.html#487>`_ - - `CS_POSIX_V6_ILP32_OFFBIG_LIBS`:idx: - `posix.html#488 <posix.html#488>`_ - - `CS_POSIX_V6_LP64_OFF64_CFLAGS`:idx: - `posix.html#489 <posix.html#489>`_ - - `CS_POSIX_V6_LP64_OFF64_LDFLAGS`:idx: - `posix.html#490 <posix.html#490>`_ - - `CS_POSIX_V6_LP64_OFF64_LIBS`:idx: - `posix.html#491 <posix.html#491>`_ - - `CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS`:idx: - `posix.html#492 <posix.html#492>`_ - - `CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS`:idx: - `posix.html#493 <posix.html#493>`_ - - `CS_POSIX_V6_LPBIG_OFFBIG_LIBS`:idx: - `posix.html#494 <posix.html#494>`_ - - `CS_POSIX_V6_WIDTH_RESTRICTED_ENVS`:idx: - `posix.html#495 <posix.html#495>`_ - - `cstring`:idx: - `system.html#112 <system.html#112>`_ - - `cstringArray`:idx: - `system.html#384 <system.html#384>`_ - - `ctermid`:idx: - `posix.html#973 <posix.html#973>`_ - - `ctime`:idx: - `posix.html#1100 <posix.html#1100>`_ - - `ctime_r`:idx: - `posix.html#1101 <posix.html#1101>`_ - - `CurDir`:idx: - `os.html#101 <os.html#101>`_ - - `dangling else problem`:idx: - `manual.html#176 <manual.html#176>`_ - - `DAY_1`:idx: - `posix.html#396 <posix.html#396>`_ - - `DAY_2`:idx: - `posix.html#397 <posix.html#397>`_ - - `DAY_3`:idx: - `posix.html#398 <posix.html#398>`_ - - `DAY_4`:idx: - `posix.html#399 <posix.html#399>`_ - - `DAY_5`:idx: - `posix.html#400 <posix.html#400>`_ - - `DAY_6`:idx: - `posix.html#401 <posix.html#401>`_ - - `DAY_7`:idx: - `posix.html#402 <posix.html#402>`_ - - `daylight`:idx: - `posix.html#701 <posix.html#701>`_ - - `dbgLineHook`:idx: - `system.html#435 <system.html#435>`_ - - `dead_code_elim`:idx: - `nimrodc.html#114 <nimrodc.html#114>`_ - - `dealloc`:idx: - `system.html#416 <system.html#416>`_ - - `debugger`:idx: - `nimrodc.html#110 <nimrodc.html#110>`_ - - `dec`:idx: - `system.html#160 <system.html#160>`_ - - `define`:idx: - `manual.html#222 <manual.html#222>`_ - - `defined`:idx: - `system.html#114 <system.html#114>`_ - - `deflate`:idx: - `zlib.html#143 <zlib.html#143>`_ - - `deflateCopy`:idx: - `zlib.html#148 <zlib.html#148>`_ - - `deflateEnd`:idx: - `zlib.html#144 <zlib.html#144>`_ - - `deflateInit`:idx: - `zlib.html#178 <zlib.html#178>`_ - - `deflateInit2`:idx: - `zlib.html#182 <zlib.html#182>`_ - - `deflateInit2u`:idx: - `zlib.html#180 <zlib.html#180>`_ - - `deflateInitu`:idx: - `zlib.html#176 <zlib.html#176>`_ - - `deflateParams`:idx: - `zlib.html#150 <zlib.html#150>`_ - - `deflateReset`:idx: - `zlib.html#149 <zlib.html#149>`_ - - `deflateSetDictionary`:idx: - `zlib.html#147 <zlib.html#147>`_ - - `deleteStr`:idx: - `strutils.html#117 <strutils.html#117>`_ - - `D_FMT`:idx: - `posix.html#391 <posix.html#391>`_ - - `difftime`:idx: - `posix.html#1102 <posix.html#1102>`_ - - `dirname`:idx: - `posix.html#845 <posix.html#845>`_ - - `DirSep`:idx: - `os.html#103 <os.html#103>`_ - - `discard`:idx: - `manual.html#177 <manual.html#177>`_ - - `div`:idx: - * `system.html#211 <system.html#211>`_ - * `system.html#212 <system.html#212>`_ - * `system.html#213 <system.html#213>`_ - * `system.html#214 <system.html#214>`_ - * `system.html#215 <system.html#215>`_ - - `dlclose`:idx: - `posix.html#807 <posix.html#807>`_ - - `dlerror`:idx: - `posix.html#808 <posix.html#808>`_ - - `dlopen`:idx: - `posix.html#809 <posix.html#809>`_ - - `dlsym`:idx: - `posix.html#810 <posix.html#810>`_ - - `dom`:idx: - `nimrodc.html#120 <nimrodc.html#120>`_ - - `domain specific languages`:idx: - * `manual.html#211 <manual.html#211>`_ - * `tut2.html#112 <tut2.html#112>`_ - - `D_T_FMT`:idx: - `posix.html#390 <posix.html#390>`_ - - `dup`:idx: - `posix.html#974 <posix.html#974>`_ - - `dup2`:idx: - `posix.html#975 <posix.html#975>`_ - - `dynamic type`:idx: - `manual.html#104 <manual.html#104>`_ - - `dynlib`:idx: - `nimrodc.html#103 <nimrodc.html#103>`_ - - `E`:idx: - `math.html#102 <math.html#102>`_ - - `E2BIG`:idx: - `posix.html#220 <posix.html#220>`_ - - `EACCES`:idx: - `posix.html#221 <posix.html#221>`_ - - `EAccessViolation`:idx: - `system.html#143 <system.html#143>`_ - - `EADDRINUSE`:idx: - `posix.html#222 <posix.html#222>`_ - - `EADDRNOTAVAIL`:idx: - `posix.html#223 <posix.html#223>`_ - - `EAFNOSUPPORT`:idx: - `posix.html#224 <posix.html#224>`_ - - `EAGAIN`:idx: - `posix.html#225 <posix.html#225>`_ - - `EALREADY`:idx: - `posix.html#226 <posix.html#226>`_ - - `EArithmetic`:idx: - `system.html#140 <system.html#140>`_ - - `EAssertionFailed`:idx: - `system.html#144 <system.html#144>`_ - - `EAsynch`:idx: - `system.html#134 <system.html#134>`_ - - `EBADF`:idx: - `posix.html#227 <posix.html#227>`_ - - `EBADMSG`:idx: - `posix.html#228 <posix.html#228>`_ - - `E_Base`:idx: - `system.html#133 <system.html#133>`_ - - `EBUSY`:idx: - `posix.html#229 <posix.html#229>`_ - - `ECANCELED`:idx: - `posix.html#230 <posix.html#230>`_ - - `ECHILD`:idx: - `posix.html#231 <posix.html#231>`_ - - `echo`:idx: - * `system.html#474 <system.html#474>`_ - * `system.html#475 <system.html#475>`_ - - `ECMAScript`:idx: - `nimrodc.html#115 <nimrodc.html#115>`_ - - `ECONNABORTED`:idx: - `posix.html#232 <posix.html#232>`_ - - `ECONNREFUSED`:idx: - `posix.html#233 <posix.html#233>`_ - - `ECONNRESET`:idx: - `posix.html#234 <posix.html#234>`_ - - `EControlC`:idx: - `system.html#145 <system.html#145>`_ - - `EDEADLK`:idx: - `posix.html#235 <posix.html#235>`_ - - `EDESTADDRREQ`:idx: - `posix.html#236 <posix.html#236>`_ - - `editDistance`:idx: - `strutils.html#144 <strutils.html#144>`_ - - `EDivByZero`:idx: - `system.html#141 <system.html#141>`_ - - `EDOM`:idx: - `posix.html#237 <posix.html#237>`_ - - `EDQUOT`:idx: - `posix.html#238 <posix.html#238>`_ - - `EEXIST`:idx: - `posix.html#239 <posix.html#239>`_ - - `EFAULT`:idx: - `posix.html#240 <posix.html#240>`_ - - `EFBIG`:idx: - `posix.html#241 <posix.html#241>`_ - - `EHOSTUNREACH`:idx: - `posix.html#242 <posix.html#242>`_ - - `EIDRM`:idx: - `posix.html#243 <posix.html#243>`_ - - `EILSEQ`:idx: - `posix.html#244 <posix.html#244>`_ - - `EINPROGRESS`:idx: - `posix.html#245 <posix.html#245>`_ - - `EINTR`:idx: - `posix.html#246 <posix.html#246>`_ - - `EINVAL`:idx: - `posix.html#247 <posix.html#247>`_ - - `EInvalidField`:idx: - `system.html#149 <system.html#149>`_ - - `EInvalidIndex`:idx: - `system.html#148 <system.html#148>`_ - - `EInvalidObjectAssignment`:idx: - `system.html#153 <system.html#153>`_ - - `EInvalidObjectConversion`:idx: - `system.html#154 <system.html#154>`_ - - `EInvalidRegEx`:idx: - `regexprs.html#104 <regexprs.html#104>`_ - - `EInvalidValue`:idx: - `system.html#146 <system.html#146>`_ - - `EIO`:idx: - * `posix.html#248 <posix.html#248>`_ - * `system.html#137 <system.html#137>`_ - - `EISCONN`:idx: - `posix.html#249 <posix.html#249>`_ - - `EISDIR`:idx: - `posix.html#250 <posix.html#250>`_ - - `ELOOP`:idx: - `posix.html#251 <posix.html#251>`_ - - `Embedded Nimrod Debugger`:idx: - `endb.html#101 <endb.html#101>`_ - - `EMFILE`:idx: - `posix.html#252 <posix.html#252>`_ - - `EMLINK`:idx: - `posix.html#253 <posix.html#253>`_ - - `EMSGSIZE`:idx: - `posix.html#254 <posix.html#254>`_ - - `EMULTIHOP`:idx: - `posix.html#255 <posix.html#255>`_ - - `ENAMETOOLONG`:idx: - `posix.html#256 <posix.html#256>`_ - - `encrypt`:idx: - `posix.html#976 <posix.html#976>`_ - - `ENDB`:idx: - `endb.html#102 <endb.html#102>`_ - - `endgrent`:idx: - `posix.html#838 <posix.html#838>`_ - - `EndOfFile`:idx: - * `system.html#489 <system.html#489>`_ - * `lexbase.html#101 <lexbase.html#101>`_ - - `endpwent`:idx: - `posix.html#863 <posix.html#863>`_ - - `endsWith`:idx: - `strutils.html#138 <strutils.html#138>`_ - - `ENETDOWN`:idx: - `posix.html#257 <posix.html#257>`_ - - `ENETRESET`:idx: - `posix.html#258 <posix.html#258>`_ - - `ENETUNREACH`:idx: - `posix.html#259 <posix.html#259>`_ - - `ENFILE`:idx: - `posix.html#260 <posix.html#260>`_ - - `ENOBUFS`:idx: - `posix.html#261 <posix.html#261>`_ - - `ENODATA`:idx: - `posix.html#262 <posix.html#262>`_ - - `ENODEV`:idx: - `posix.html#263 <posix.html#263>`_ - - `ENOENT`:idx: - `posix.html#264 <posix.html#264>`_ - - `ENoExceptionToReraise`:idx: - * `manual.html#184 <manual.html#184>`_ - * `system.html#152 <system.html#152>`_ - - `ENOEXEC`:idx: - `posix.html#265 <posix.html#265>`_ - - `ENOLCK`:idx: - `posix.html#266 <posix.html#266>`_ - - `ENOLINK`:idx: - `posix.html#267 <posix.html#267>`_ - - `ENOMEM`:idx: - `posix.html#268 <posix.html#268>`_ - - `ENOMSG`:idx: - `posix.html#269 <posix.html#269>`_ - - `ENOPROTOOPT`:idx: - `posix.html#270 <posix.html#270>`_ - - `ENOSPC`:idx: - `posix.html#271 <posix.html#271>`_ - - `ENOSR`:idx: - `posix.html#272 <posix.html#272>`_ - - `ENOSTR`:idx: - `posix.html#273 <posix.html#273>`_ - - `ENOSYS`:idx: - `posix.html#274 <posix.html#274>`_ - - `ENOTCONN`:idx: - `posix.html#275 <posix.html#275>`_ - - `ENOTDIR`:idx: - `posix.html#276 <posix.html#276>`_ - - `ENOTEMPTY`:idx: - `posix.html#277 <posix.html#277>`_ - - `ENOTSOCK`:idx: - `posix.html#278 <posix.html#278>`_ - - `ENOTSUP`:idx: - `posix.html#279 <posix.html#279>`_ - - `ENOTTY`:idx: - `posix.html#280 <posix.html#280>`_ - - `Enumeration`:idx: - `manual.html#148 <manual.html#148>`_ - - `enumeration`:idx: - `tut1.html#113 <tut1.html#113>`_ - - `ENXIO`:idx: - `posix.html#281 <posix.html#281>`_ - - `EOPNOTSUPP`:idx: - `posix.html#282 <posix.html#282>`_ - - `EOS`:idx: - `system.html#138 <system.html#138>`_ - - `EOutOfMemory`:idx: - `system.html#147 <system.html#147>`_ - - `EOutOfRange`:idx: - * `manual.html#145 <manual.html#145>`_ - * `tut1.html#112 <tut1.html#112>`_ - * `system.html#150 <system.html#150>`_ - - `EOVERFLOW`:idx: - `posix.html#283 <posix.html#283>`_ - - `EOverflow`:idx: - `system.html#142 <system.html#142>`_ - - `EPERM`:idx: - `posix.html#284 <posix.html#284>`_ - - `EPIPE`:idx: - `posix.html#285 <posix.html#285>`_ - - `EPROTO`:idx: - `posix.html#286 <posix.html#286>`_ - - `EPROTONOSUPPORT`:idx: - `posix.html#287 <posix.html#287>`_ - - `EPROTOTYPE`:idx: - `posix.html#288 <posix.html#288>`_ - - `equalMem`:idx: - `system.html#412 <system.html#412>`_ - - `ERA`:idx: - `posix.html#434 <posix.html#434>`_ - - `ERA_D_FMT`:idx: - `posix.html#435 <posix.html#435>`_ - - `ERA_D_T_FMT`:idx: - `posix.html#436 <posix.html#436>`_ - - `ERANGE`:idx: - `posix.html#289 <posix.html#289>`_ - - `ERA_T_FMT`:idx: - `posix.html#437 <posix.html#437>`_ - - `ERessourceExhausted`:idx: - `system.html#139 <system.html#139>`_ - - `EROFS`:idx: - `posix.html#290 <posix.html#290>`_ - - `errno`:idx: - `posix.html#219 <posix.html#219>`_ - - `error`:idx: - * `dialogs.html#104 <dialogs.html#104>`_ - * `manual.html#221 <manual.html#221>`_ - * `manual.html#224 <manual.html#224>`_ - - `errorStr`:idx: - `parsecfg.html#110 <parsecfg.html#110>`_ - - `escape`:idx: - * `manual.html#133 <manual.html#133>`_ - * `strutils.html#143 <strutils.html#143>`_ - - `escape sequences`:idx: - `manual.html#120 <manual.html#120>`_ - - `ESPIPE`:idx: - `posix.html#291 <posix.html#291>`_ - - `ESRCH`:idx: - `posix.html#292 <posix.html#292>`_ - - `EStackOverflow`:idx: - `system.html#151 <system.html#151>`_ - - `ESTALE`:idx: - `posix.html#293 <posix.html#293>`_ - - `ESynch`:idx: - `system.html#135 <system.html#135>`_ - - `ESystem`:idx: - `system.html#136 <system.html#136>`_ - - `ETIME`:idx: - `posix.html#294 <posix.html#294>`_ - - `ETIMEDOUT`:idx: - `posix.html#295 <posix.html#295>`_ - - `ETXTBSY`:idx: - `posix.html#296 <posix.html#296>`_ - - `EWOULDBLOCK`:idx: - `posix.html#297 <posix.html#297>`_ - - `except`:idx: - `manual.html#187 <manual.html#187>`_ - - `exception handlers`:idx: - `manual.html#186 <manual.html#186>`_ - - `exceptions`:idx: - `tut2.html#107 <tut2.html#107>`_ - - `excl`:idx: - `system.html#168 <system.html#168>`_ - - `EXDEV`:idx: - `posix.html#298 <posix.html#298>`_ - - `execl`:idx: - `posix.html#977 <posix.html#977>`_ - - `execle`:idx: - `posix.html#978 <posix.html#978>`_ - - `execlp`:idx: - `posix.html#979 <posix.html#979>`_ - - `executeShellCommand`:idx: - `os.html#133 <os.html#133>`_ - - `execv`:idx: - `posix.html#980 <posix.html#980>`_ - - `execve`:idx: - `posix.html#981 <posix.html#981>`_ - - `execvp`:idx: - `posix.html#982 <posix.html#982>`_ - - `ExeExt`:idx: - `os.html#107 <os.html#107>`_ - - `existsDir`:idx: - `os.html#139 <os.html#139>`_ - - `existsEnv`:idx: - `os.html#144 <os.html#144>`_ - - `ExistsFile`:idx: - `os.html#117 <os.html#117>`_ - - `exp`:idx: - `math.html#114 <math.html#114>`_ - - `expandFilename`:idx: - `os.html#116 <os.html#116>`_ - - `exportc`:idx: - `nimrodc.html#102 <nimrodc.html#102>`_ - - `expression macros`:idx: - `tut2.html#113 <tut2.html#113>`_ - - `extractDir`:idx: - `os.html#126 <os.html#126>`_ - - `extractFileExt`:idx: - `os.html#128 <os.html#128>`_ - - `extractFilename`:idx: - `os.html#127 <os.html#127>`_ - - `extractFileTrunk`:idx: - `os.html#129 <os.html#129>`_ - - `ExtSep`:idx: - `os.html#109 <os.html#109>`_ - - `fastcall`:idx: - `manual.html#168 <manual.html#168>`_ - - `fatal`:idx: - `manual.html#225 <manual.html#225>`_ - - `fchdir`:idx: - `posix.html#984 <posix.html#984>`_ - - `fchmod`:idx: - `posix.html#1059 <posix.html#1059>`_ - - `fchown`:idx: - `posix.html#983 <posix.html#983>`_ - - `fcntl`:idx: - `posix.html#812 <posix.html#812>`_ - - `fdatasync`:idx: - `posix.html#985 <posix.html#985>`_ - - `FD_CLOEXEC`:idx: - `posix.html#309 <posix.html#309>`_ - - `FD_CLR`:idx: - `posix.html#1161 <posix.html#1161>`_ - - `FD_ISSET`:idx: - `posix.html#1162 <posix.html#1162>`_ - - `FD_SET`:idx: - `posix.html#1163 <posix.html#1163>`_ - - `FD_SETSIZE`:idx: - `posix.html#774 <posix.html#774>`_ - - `F_DUPFD`:idx: - `posix.html#299 <posix.html#299>`_ - - `FD_ZERO`:idx: - `posix.html#1164 <posix.html#1164>`_ - - `FE_ALL_EXCEPT`:idx: - `posix.html#337 <posix.html#337>`_ - - `feclearexcept`:idx: - `posix.html#816 <posix.html#816>`_ - - `FE_DFL_ENV`:idx: - `posix.html#342 <posix.html#342>`_ - - `FE_DIVBYZERO`:idx: - `posix.html#332 <posix.html#332>`_ - - `FE_DOWNWARD`:idx: - `posix.html#338 <posix.html#338>`_ - - `fegetenv`:idx: - `posix.html#823 <posix.html#823>`_ - - `fegetexceptflag`:idx: - `posix.html#817 <posix.html#817>`_ - - `fegetround`:idx: - `posix.html#821 <posix.html#821>`_ - - `feholdexcept`:idx: - `posix.html#824 <posix.html#824>`_ - - `FE_INEXACT`:idx: - `posix.html#333 <posix.html#333>`_ - - `FE_INVALID`:idx: - `posix.html#334 <posix.html#334>`_ - - `FE_OVERFLOW`:idx: - `posix.html#335 <posix.html#335>`_ - - `feraiseexcept`:idx: - `posix.html#818 <posix.html#818>`_ - - `fesetenv`:idx: - `posix.html#825 <posix.html#825>`_ - - `fesetexceptflag`:idx: - `posix.html#819 <posix.html#819>`_ - - `fesetround`:idx: - `posix.html#822 <posix.html#822>`_ - - `fetestexcept`:idx: - `posix.html#820 <posix.html#820>`_ - - `FE_TONEAREST`:idx: - `posix.html#339 <posix.html#339>`_ - - `FE_TOWARDZERO`:idx: - `posix.html#340 <posix.html#340>`_ - - `FE_UNDERFLOW`:idx: - `posix.html#336 <posix.html#336>`_ - - `feupdateenv`:idx: - `posix.html#826 <posix.html#826>`_ - - `FE_UPWARD`:idx: - `posix.html#341 <posix.html#341>`_ - - `F_GETFD`:idx: - `posix.html#300 <posix.html#300>`_ - - `F_GETFL`:idx: - `posix.html#302 <posix.html#302>`_ - - `F_GETLK`:idx: - `posix.html#304 <posix.html#304>`_ - - `F_GETOWN`:idx: - `posix.html#307 <posix.html#307>`_ - - `fileHandle`:idx: - `system.html#513 <system.html#513>`_ - - `fileNewer`:idx: - `os.html#141 <os.html#141>`_ - - `FileSystemCaseSensitive`:idx: - `os.html#106 <os.html#106>`_ - - `finally`:idx: - `manual.html#188 <manual.html#188>`_ - - `find`:idx: - * `system.html#459 <system.html#459>`_ - * `regexprs.html#109 <regexprs.html#109>`_ - * `regexprs.html#110 <regexprs.html#110>`_ - - `findChars`:idx: - `strutils.html#114 <strutils.html#114>`_ - - `findSubStr`:idx: - * `strutils.html#112 <strutils.html#112>`_ - * `strutils.html#113 <strutils.html#113>`_ - - `float`:idx: - `system.html#106 <system.html#106>`_ - - `float32`:idx: - `system.html#107 <system.html#107>`_ - - `float64`:idx: - `system.html#108 <system.html#108>`_ - - `F_LOCK`:idx: - `posix.html#496 <posix.html#496>`_ - - `FlushFile`:idx: - `system.html#491 <system.html#491>`_ - - `fmtmsg`:idx: - `posix.html#827 <posix.html#827>`_ - - `fnmatch`:idx: - `posix.html#828 <posix.html#828>`_ - - `FNM_NOESCAPE`:idx: - `posix.html#365 <posix.html#365>`_ - - `FNM_NOMATCH`:idx: - `posix.html#362 <posix.html#362>`_ - - `FNM_NOSYS`:idx: - `posix.html#366 <posix.html#366>`_ - - `FNM_PATHNAME`:idx: - `posix.html#363 <posix.html#363>`_ - - `FNM_PERIOD`:idx: - `posix.html#364 <posix.html#364>`_ - - `F_OK`:idx: - `posix.html#478 <posix.html#478>`_ - - `for`:idx: - * `manual.html#203 <manual.html#203>`_ - * `tut1.html#105 <tut1.html#105>`_ - - `fork`:idx: - `posix.html#986 <posix.html#986>`_ - - `form feed`:idx: - `manual.html#124 <manual.html#124>`_ - - `forward`:idx: - `manual.html#200 <manual.html#200>`_ - - `fpathconf`:idx: - `posix.html#987 <posix.html#987>`_ - - `F_RDLCK`:idx: - `posix.html#310 <posix.html#310>`_ - - `frexp`:idx: - `math.html#115 <math.html#115>`_ - - `F_SETFD`:idx: - `posix.html#301 <posix.html#301>`_ - - `F_SETFL`:idx: - `posix.html#303 <posix.html#303>`_ - - `F_SETLK`:idx: - `posix.html#305 <posix.html#305>`_ - - `F_SETLKW`:idx: - `posix.html#306 <posix.html#306>`_ - - `F_SETOWN`:idx: - `posix.html#308 <posix.html#308>`_ - - `fstat`:idx: - `posix.html#1060 <posix.html#1060>`_ - - `fstatvfs`:idx: - `posix.html#1057 <posix.html#1057>`_ - - `fsync`:idx: - `posix.html#988 <posix.html#988>`_ - - `F_TEST`:idx: - `posix.html#497 <posix.html#497>`_ - - `F_TLOCK`:idx: - `posix.html#498 <posix.html#498>`_ - - `ftok`:idx: - `posix.html#1055 <posix.html#1055>`_ - - `ftruncate`:idx: - `posix.html#989 <posix.html#989>`_ - - `ftw`:idx: - `posix.html#829 <posix.html#829>`_ - - `FTW_CHDIR`:idx: - `posix.html#377 <posix.html#377>`_ - - `FTW_D`:idx: - `posix.html#368 <posix.html#368>`_ - - `FTW_DEPTH`:idx: - `posix.html#376 <posix.html#376>`_ - - `FTW_DNR`:idx: - `posix.html#369 <posix.html#369>`_ - - `FTW_DP`:idx: - `posix.html#370 <posix.html#370>`_ - - `FTW_F`:idx: - `posix.html#367 <posix.html#367>`_ - - `FTW_MOUNT`:idx: - `posix.html#375 <posix.html#375>`_ - - `FTW_NS`:idx: - `posix.html#371 <posix.html#371>`_ - - `FTW_PHYS`:idx: - `posix.html#374 <posix.html#374>`_ - - `FTW_SL`:idx: - `posix.html#372 <posix.html#372>`_ - - `FTW_SLN`:idx: - `posix.html#373 <posix.html#373>`_ - - `F_ULOCK`:idx: - `posix.html#499 <posix.html#499>`_ - - `functional`:idx: - * `manual.html#162 <manual.html#162>`_ - * `tut1.html#124 <tut1.html#124>`_ - - `F_UNLCK`:idx: - `posix.html#311 <posix.html#311>`_ - - `funtions`:idx: - `manual.html#198 <manual.html#198>`_ - - `F_WRLCK`:idx: - `posix.html#312 <posix.html#312>`_ - - `GC_disable`:idx: - `system.html#460 <system.html#460>`_ - - `GC_disableMarkAndSweep`:idx: - `system.html#466 <system.html#466>`_ - - `GC_enable`:idx: - `system.html#461 <system.html#461>`_ - - `GC_enableMarkAndSweep`:idx: - `system.html#465 <system.html#465>`_ - - `GC_fullCollect`:idx: - `system.html#462 <system.html#462>`_ - - `GC_getStatistics`:idx: - `system.html#467 <system.html#467>`_ - - `GC_ref`:idx: - * `system.html#468 <system.html#468>`_ - * `system.html#469 <system.html#469>`_ - * `system.html#470 <system.html#470>`_ - - `GC_setStrategy`:idx: - `system.html#464 <system.html#464>`_ - - `GC_unref`:idx: - * `system.html#471 <system.html#471>`_ - * `system.html#472 <system.html#472>`_ - * `system.html#473 <system.html#473>`_ - - `generic character types`:idx: - `regexprs.html#102 <regexprs.html#102>`_ - - `Generics`:idx: - * `manual.html#207 <manual.html#207>`_ - * `tut2.html#109 <tut2.html#109>`_ - - `getApplicationDir`:idx: - `os.html#110 <os.html#110>`_ - - `getApplicationFilename`:idx: - `os.html#111 <os.html#111>`_ - - `getClockStr`:idx: - `times.html#112 <times.html#112>`_ - - `getColNumber`:idx: - `lexbase.html#107 <lexbase.html#107>`_ - - `getColumn`:idx: - `parsecfg.html#107 <parsecfg.html#107>`_ - - `getConfigDir`:idx: - `os.html#115 <os.html#115>`_ - - `getcontext`:idx: - `posix.html#1188 <posix.html#1188>`_ - - `get_crc_table`:idx: - `zlib.html#186 <zlib.html#186>`_ - - `getCurrentDir`:idx: - `os.html#112 <os.html#112>`_ - - `getCurrentExceptionMsg`:idx: - `system.html#431 <system.html#431>`_ - - `getCurrentLine`:idx: - `lexbase.html#106 <lexbase.html#106>`_ - - `getcwd`:idx: - `posix.html#990 <posix.html#990>`_ - - `getdate`:idx: - `posix.html#1103 <posix.html#1103>`_ - - `getDateStr`:idx: - `times.html#111 <times.html#111>`_ - - `getegid`:idx: - `posix.html#991 <posix.html#991>`_ - - `getEnv`:idx: - `os.html#143 <os.html#143>`_ - - `geteuid`:idx: - `posix.html#992 <posix.html#992>`_ - - `getFilename`:idx: - `parsecfg.html#109 <parsecfg.html#109>`_ - - `getFilePos`:idx: - `system.html#511 <system.html#511>`_ - - `getFileSize`:idx: - `system.html#503 <system.html#503>`_ - - `getFreeMem`:idx: - `system.html#437 <system.html#437>`_ - - `getgid`:idx: - `posix.html#993 <posix.html#993>`_ - - `getGMTime`:idx: - `times.html#107 <times.html#107>`_ - - `getgrent`:idx: - `posix.html#837 <posix.html#837>`_ - - `getgrgid`:idx: - `posix.html#833 <posix.html#833>`_ - - `getgrgid_r`:idx: - `posix.html#835 <posix.html#835>`_ - - `getgrnam`:idx: - `posix.html#834 <posix.html#834>`_ - - `getgrnam_r`:idx: - `posix.html#836 <posix.html#836>`_ - - `getgroups`:idx: - `posix.html#994 <posix.html#994>`_ - - `getHomeDir`:idx: - `os.html#114 <os.html#114>`_ - - `gethostid`:idx: - `posix.html#995 <posix.html#995>`_ - - `gethostname`:idx: - `posix.html#996 <posix.html#996>`_ - - `getLastModificationTime`:idx: - `os.html#140 <os.html#140>`_ - - `getLine`:idx: - `parsecfg.html#108 <parsecfg.html#108>`_ - - `getLocalTime`:idx: - `times.html#106 <times.html#106>`_ - - `getlogin`:idx: - `posix.html#997 <posix.html#997>`_ - - `getlogin_r`:idx: - `posix.html#998 <posix.html#998>`_ - - `getOccupiedMem`:idx: - `system.html#436 <system.html#436>`_ - - `getopt`:idx: - * `posix.html#999 <posix.html#999>`_ - * `parseopt.html#106 <parseopt.html#106>`_ - - `getpgid`:idx: - `posix.html#1000 <posix.html#1000>`_ - - `getpgrp`:idx: - `posix.html#1001 <posix.html#1001>`_ - - `getpid`:idx: - `posix.html#1002 <posix.html#1002>`_ - - `getppid`:idx: - `posix.html#1003 <posix.html#1003>`_ - - `getpwent`:idx: - `posix.html#864 <posix.html#864>`_ - - `getpwnam`:idx: - `posix.html#859 <posix.html#859>`_ - - `getpwnam_r`:idx: - `posix.html#861 <posix.html#861>`_ - - `getpwuid`:idx: - `posix.html#860 <posix.html#860>`_ - - `getpwuid_r`:idx: - `posix.html#862 <posix.html#862>`_ - - `getRefcount`:idx: - `system.html#430 <system.html#430>`_ - - `getRestOfCommandLine`:idx: - `parseopt.html#105 <parseopt.html#105>`_ - - `getsid`:idx: - `posix.html#1004 <posix.html#1004>`_ - - `getStartMilsecs`:idx: - `times.html#116 <times.html#116>`_ - - `getStream`:idx: - `zipfiles.html#109 <zipfiles.html#109>`_ - - `getTime`:idx: - `times.html#105 <times.html#105>`_ - - `getTotalMem`:idx: - `system.html#438 <system.html#438>`_ - - `getuid`:idx: - `posix.html#1005 <posix.html#1005>`_ - - `getwd`:idx: - `posix.html#1006 <posix.html#1006>`_ - - `glob`:idx: - `posix.html#831 <posix.html#831>`_ - - `GLOB_ABORTED`:idx: - `posix.html#385 <posix.html#385>`_ - - `GLOB_APPEND`:idx: - `posix.html#378 <posix.html#378>`_ - - `GLOB_DOOFFS`:idx: - `posix.html#379 <posix.html#379>`_ - - `GLOB_ERR`:idx: - `posix.html#380 <posix.html#380>`_ - - `globfree`:idx: - `posix.html#832 <posix.html#832>`_ - - `GLOB_MARK`:idx: - `posix.html#381 <posix.html#381>`_ - - `GLOB_NOCHECK`:idx: - `posix.html#382 <posix.html#382>`_ - - `GLOB_NOESCAPE`:idx: - `posix.html#383 <posix.html#383>`_ - - `GLOB_NOMATCH`:idx: - `posix.html#386 <posix.html#386>`_ - - `GLOB_NOSORT`:idx: - `posix.html#384 <posix.html#384>`_ - - `GLOB_NOSPACE`:idx: - `posix.html#387 <posix.html#387>`_ - - `GLOB_NOSYS`:idx: - `posix.html#388 <posix.html#388>`_ - - `gmtime`:idx: - `posix.html#1104 <posix.html#1104>`_ - - `gmtime_r`:idx: - `posix.html#1105 <posix.html#1105>`_ - - `gzclose`:idx: - `zlib.html#172 <zlib.html#172>`_ - - `gzdopen`:idx: - `zlib.html#158 <zlib.html#158>`_ - - `gzeof`:idx: - `zlib.html#171 <zlib.html#171>`_ - - `gzerror`:idx: - `zlib.html#173 <zlib.html#173>`_ - - `gzFile`:idx: - `zlib.html#115 <zlib.html#115>`_ - - `gzflush`:idx: - `zlib.html#167 <zlib.html#167>`_ - - `gzgetc`:idx: - `zlib.html#166 <zlib.html#166>`_ - - `gzgets`:idx: - `zlib.html#164 <zlib.html#164>`_ - - `gzopen`:idx: - `zlib.html#157 <zlib.html#157>`_ - - `gzprintf`:idx: - `zlib.html#162 <zlib.html#162>`_ - - `gzputc`:idx: - `zlib.html#165 <zlib.html#165>`_ - - `gzputs`:idx: - `zlib.html#163 <zlib.html#163>`_ - - `gzread`:idx: - `zlib.html#160 <zlib.html#160>`_ - - `gzrewind`:idx: - `zlib.html#169 <zlib.html#169>`_ - - `gzseek`:idx: - `zlib.html#168 <zlib.html#168>`_ - - `gzsetparams`:idx: - `zlib.html#159 <zlib.html#159>`_ - - `gztell`:idx: - `zlib.html#170 <zlib.html#170>`_ - - `gzwrite`:idx: - `zlib.html#161 <zlib.html#161>`_ - - `HandleCR`:idx: - `lexbase.html#108 <lexbase.html#108>`_ - - `HandleLF`:idx: - `lexbase.html#109 <lexbase.html#109>`_ - - `hash`:idx: - * `hashes.html#103 <hashes.html#103>`_ - * `hashes.html#104 <hashes.html#104>`_ - * `hashes.html#105 <hashes.html#105>`_ - * `hashes.html#106 <hashes.html#106>`_ - * `hashes.html#107 <hashes.html#107>`_ - - `hashData`:idx: - `hashes.html#102 <hashes.html#102>`_ - - `hashIgnoreCase`:idx: - `hashes.html#109 <hashes.html#109>`_ - - `hashIgnoreStyle`:idx: - `hashes.html#108 <hashes.html#108>`_ - - `hasKey`:idx: - `strtabs.html#108 <strtabs.html#108>`_ - - `header`:idx: - `nimrodc.html#105 <nimrodc.html#105>`_ - - `high`:idx: - `system.html#121 <system.html#121>`_ - - `hint`:idx: - * `manual.html#219 <manual.html#219>`_ - * `manual.html#227 <manual.html#227>`_ - - `hostCPU`:idx: - `system.html#399 <system.html#399>`_ - - `hostOS`:idx: - `system.html#398 <system.html#398>`_ - - `htonl`:idx: - `posix.html#792 <posix.html#792>`_ - - `htons`:idx: - `posix.html#793 <posix.html#793>`_ - - `hypot`:idx: - `math.html#123 <math.html#123>`_ - - `iconv`:idx: - `posix.html#841 <posix.html#841>`_ - - `iconv_close`:idx: - `posix.html#842 <posix.html#842>`_ - - `iconv_open`:idx: - `posix.html#840 <posix.html#840>`_ - - `identifier`:idx: - `manual.html#105 <manual.html#105>`_ - - `Identifiers`:idx: - `manual.html#116 <manual.html#116>`_ - - `if`:idx: - `manual.html#180 <manual.html#180>`_ - - `implicit block`:idx: - `manual.html#205 <manual.html#205>`_ - - `import`:idx: - * `manual.html#215 <manual.html#215>`_ - * `tut1.html#128 <tut1.html#128>`_ - - `importc`:idx: - `nimrodc.html#101 <nimrodc.html#101>`_ - - `in`:idx: - `system.html#355 <system.html#355>`_ - - `inc`:idx: - `system.html#159 <system.html#159>`_ - - `incl`:idx: - `system.html#167 <system.html#167>`_ - - `include`:idx: - `tut1.html#129 <tut1.html#129>`_ - - `indentation sensitive`:idx: - `manual.html#113 <manual.html#113>`_ - - `inet_addr`:idx: - `posix.html#796 <posix.html#796>`_ - - `inet_ntoa`:idx: - `posix.html#797 <posix.html#797>`_ - - `inet_ntop`:idx: - `posix.html#798 <posix.html#798>`_ - - `inet_pton`:idx: - `posix.html#799 <posix.html#799>`_ - - `inf`:idx: - `system.html#432 <system.html#432>`_ - - `inflate`:idx: - `zlib.html#145 <zlib.html#145>`_ - - `inflateEnd`:idx: - `zlib.html#146 <zlib.html#146>`_ - - `inflateInit`:idx: - `zlib.html#179 <zlib.html#179>`_ - - `inflateInit2`:idx: - `zlib.html#183 <zlib.html#183>`_ - - `inflateInit2u`:idx: - `zlib.html#181 <zlib.html#181>`_ - - `inflateInitu`:idx: - `zlib.html#177 <zlib.html#177>`_ - - `inflateReset`:idx: - `zlib.html#153 <zlib.html#153>`_ - - `inflateSetDictionary`:idx: - `zlib.html#151 <zlib.html#151>`_ - - `inflateSync`:idx: - `zlib.html#152 <zlib.html#152>`_ - - `inflateSyncPoint`:idx: - `zlib.html#185 <zlib.html#185>`_ - - `info`:idx: - `dialogs.html#102 <dialogs.html#102>`_ - - `information hiding`:idx: - * `manual.html#213 <manual.html#213>`_ - * `tut1.html#126 <tut1.html#126>`_ - - `init`:idx: - `parseopt.html#103 <parseopt.html#103>`_ - - `inline`:idx: - `manual.html#167 <manual.html#167>`_ - - `int`:idx: - `system.html#101 <system.html#101>`_ - - `int16`:idx: - `system.html#103 <system.html#103>`_ - - `int32`:idx: - `system.html#104 <system.html#104>`_ - - `int64`:idx: - `system.html#105 <system.html#105>`_ - - `int8`:idx: - `system.html#102 <system.html#102>`_ - - `intToStr`:idx: - `strutils.html#129 <strutils.html#129>`_ - - `IPC_CREAT`:idx: - `posix.html#642 <posix.html#642>`_ - - `IPC_EXCL`:idx: - `posix.html#643 <posix.html#643>`_ - - `IPC_NOWAIT`:idx: - `posix.html#644 <posix.html#644>`_ - - `IPC_PRIVATE`:idx: - `posix.html#645 <posix.html#645>`_ - - `IPC_RMID`:idx: - `posix.html#646 <posix.html#646>`_ - - `IPC_SET`:idx: - `posix.html#647 <posix.html#647>`_ - - `IPC_STAT`:idx: - `posix.html#648 <posix.html#648>`_ - - `is`:idx: - `system.html#357 <system.html#357>`_ - - `isatty`:idx: - `posix.html#1007 <posix.html#1007>`_ - - `isMainModule`:idx: - `system.html#390 <system.html#390>`_ - - `isNil`:idx: - * `system.html#447 <system.html#447>`_ - * `system.html#448 <system.html#448>`_ - * `system.html#449 <system.html#449>`_ - * `system.html#450 <system.html#450>`_ - * `system.html#451 <system.html#451>`_ - * `system.html#452 <system.html#452>`_ - - `is_not`:idx: - `system.html#358 <system.html#358>`_ - - `isPowerOfTwo`:idx: - `math.html#105 <math.html#105>`_ - - `items`:idx: - * `system.html#441 <system.html#441>`_ - * `system.html#442 <system.html#442>`_ - * `system.html#443 <system.html#443>`_ - * `system.html#444 <system.html#444>`_ - * `system.html#445 <system.html#445>`_ - * `system.html#446 <system.html#446>`_ - - `iterator`:idx: - `manual.html#204 <manual.html#204>`_ - - `iterOverEnvironment`:idx: - `os.html#150 <os.html#150>`_ - - `JavaScript`:idx: - `nimrodc.html#116 <nimrodc.html#116>`_ - - `JoinPath`:idx: - * `os.html#118 <os.html#118>`_ - * `os.html#120 <os.html#120>`_ - - `keywords`:idx: - `manual.html#117 <manual.html#117>`_ - - `kill`:idx: - `posix.html#1123 <posix.html#1123>`_ - - `killpg`:idx: - `posix.html#1124 <posix.html#1124>`_ - - `l-values`:idx: - `manual.html#107 <manual.html#107>`_ - - `lambda`:idx: - `tut2.html#106 <tut2.html#106>`_ - - `LC_ALL`:idx: - `posix.html#444 <posix.html#444>`_ - - `LC_COLLATE`:idx: - `posix.html#445 <posix.html#445>`_ - - `LC_CTYPE`:idx: - `posix.html#446 <posix.html#446>`_ - - `lchown`:idx: - `posix.html#1008 <posix.html#1008>`_ - - `LC_MESSAGES`:idx: - `posix.html#447 <posix.html#447>`_ - - `LC_MONETARY`:idx: - `posix.html#448 <posix.html#448>`_ - - `LC_NUMERIC`:idx: - `posix.html#449 <posix.html#449>`_ - - `LC_TIME`:idx: - `posix.html#450 <posix.html#450>`_ - - `len`:idx: - * `system.html#162 <system.html#162>`_ - * `system.html#163 <system.html#163>`_ - * `system.html#164 <system.html#164>`_ - * `system.html#165 <system.html#165>`_ - * `system.html#166 <system.html#166>`_ - * `strtabs.html#109 <strtabs.html#109>`_ - - `line feed`:idx: - `manual.html#123 <manual.html#123>`_ - - `line_dir`:idx: - `nimrodc.html#107 <nimrodc.html#107>`_ - - `lines`:idx: - `system.html#512 <system.html#512>`_ - - `line_trace`:idx: - `nimrodc.html#109 <nimrodc.html#109>`_ - - `link`:idx: - `posix.html#1009 <posix.html#1009>`_ - - `lio_listio`:idx: - `posix.html#791 <posix.html#791>`_ - - `LIO_NOP`:idx: - `posix.html#210 <posix.html#210>`_ - - `LIO_NOWAIT`:idx: - `posix.html#211 <posix.html#211>`_ - - `LIO_READ`:idx: - `posix.html#212 <posix.html#212>`_ - - `LIO_WAIT`:idx: - `posix.html#213 <posix.html#213>`_ - - `LIO_WRITE`:idx: - `posix.html#214 <posix.html#214>`_ - - `Literal strings`:idx: - `manual.html#119 <manual.html#119>`_ - - `ln`:idx: - `math.html#111 <math.html#111>`_ - - `local type inference`:idx: - `tut1.html#101 <tut1.html#101>`_ - - `localeconv`:idx: - `posix.html#846 <posix.html#846>`_ - - `localtime`:idx: - `posix.html#1106 <posix.html#1106>`_ - - `localtime_r`:idx: - `posix.html#1107 <posix.html#1107>`_ - - `locations`:idx: - `manual.html#101 <manual.html#101>`_ - - `lockf`:idx: - `posix.html#1010 <posix.html#1010>`_ - - `log10`:idx: - `math.html#112 <math.html#112>`_ - - `log2`:idx: - `math.html#113 <math.html#113>`_ - - `low`:idx: - `system.html#122 <system.html#122>`_ - - `lseek`:idx: - `posix.html#1011 <posix.html#1011>`_ - - `lstat`:idx: - `posix.html#1061 <posix.html#1061>`_ - - `Macros`:idx: - * `manual.html#210 <manual.html#210>`_ - * `tut2.html#111 <tut2.html#111>`_ - - `makecontext`:idx: - `posix.html#1189 <posix.html#1189>`_ - - `MAP_FAILED`:idx: - `posix.html#686 <posix.html#686>`_ - - `MAP_FIXED`:idx: - `posix.html#680 <posix.html#680>`_ - - `MAP_PRIVATE`:idx: - `posix.html#679 <posix.html#679>`_ - - `MAP_SHARED`:idx: - `posix.html#678 <posix.html#678>`_ - - `match`:idx: - * `regexprs.html#106 <regexprs.html#106>`_ - * `regexprs.html#107 <regexprs.html#107>`_ - - `matchLen`:idx: - `regexprs.html#108 <regexprs.html#108>`_ - - `math`:idx: - `nimrodc.html#118 <nimrodc.html#118>`_ - - `max`:idx: - * `system.html#271 <system.html#271>`_ - * `system.html#272 <system.html#272>`_ - * `system.html#273 <system.html#273>`_ - * `system.html#274 <system.html#274>`_ - * `system.html#275 <system.html#275>`_ - * `system.html#322 <system.html#322>`_ - - `MaxSubpatterns`:idx: - `regexprs.html#105 <regexprs.html#105>`_ - - `MCL_CURRENT`:idx: - `posix.html#684 <posix.html#684>`_ - - `MCL_FUTURE`:idx: - `posix.html#685 <posix.html#685>`_ - - `method call syntax`:idx: - `tut2.html#104 <tut2.html#104>`_ - - `methods`:idx: - `manual.html#197 <manual.html#197>`_ - - `min`:idx: - * `system.html#266 <system.html#266>`_ - * `system.html#267 <system.html#267>`_ - * `system.html#268 <system.html#268>`_ - * `system.html#269 <system.html#269>`_ - * `system.html#270 <system.html#270>`_ - * `system.html#321 <system.html#321>`_ - - `MINSIGSTKSZ`:idx: - `posix.html#766 <posix.html#766>`_ - - `mkdir`:idx: - `posix.html#1062 <posix.html#1062>`_ - - `mkfifo`:idx: - `posix.html#1063 <posix.html#1063>`_ - - `mknod`:idx: - `posix.html#1064 <posix.html#1064>`_ - - `mktime`:idx: - `posix.html#1108 <posix.html#1108>`_ - - `mlock`:idx: - `posix.html#1078 <posix.html#1078>`_ - - `mlockall`:idx: - `posix.html#1079 <posix.html#1079>`_ - - `mmap`:idx: - `posix.html#1080 <posix.html#1080>`_ - - `MM_APPL`:idx: - `posix.html#346 <posix.html#346>`_ - - `MM_CONSOLE`:idx: - `posix.html#357 <posix.html#357>`_ - - `MM_ERROR`:idx: - `posix.html#352 <posix.html#352>`_ - - `MM_FIRM`:idx: - `posix.html#345 <posix.html#345>`_ - - `MM_HALT`:idx: - `posix.html#351 <posix.html#351>`_ - - `MM_HARD`:idx: - `posix.html#343 <posix.html#343>`_ - - `MM_INFO`:idx: - `posix.html#354 <posix.html#354>`_ - - `MM_NOCON`:idx: - `posix.html#361 <posix.html#361>`_ - - `MM_NOMSG`:idx: - `posix.html#360 <posix.html#360>`_ - - `MM_NOSEV`:idx: - `posix.html#355 <posix.html#355>`_ - - `MM_NOTOK`:idx: - `posix.html#359 <posix.html#359>`_ - - `MM_NRECOV`:idx: - `posix.html#350 <posix.html#350>`_ - - `MM_NULLACT`:idx: - `posix.html#125 <posix.html#125>`_ - - `MM_NULLLBL`:idx: - `posix.html#121 <posix.html#121>`_ - - `MM_NULLMC`:idx: - `posix.html#123 <posix.html#123>`_ - - `MM_NULLSEV`:idx: - `posix.html#122 <posix.html#122>`_ - - `MM_NULLTAG`:idx: - `posix.html#126 <posix.html#126>`_ - - `MM_NULLTXT`:idx: - `posix.html#124 <posix.html#124>`_ - - `MM_OK`:idx: - `posix.html#358 <posix.html#358>`_ - - `MM_OPSYS`:idx: - `posix.html#348 <posix.html#348>`_ - - `MM_PRINT`:idx: - `posix.html#356 <posix.html#356>`_ - - `MM_RECOVER`:idx: - `posix.html#349 <posix.html#349>`_ - - `MM_SOFT`:idx: - `posix.html#344 <posix.html#344>`_ - - `MM_UTIL`:idx: - `posix.html#347 <posix.html#347>`_ - - `MM_WARNING`:idx: - `posix.html#353 <posix.html#353>`_ - - `mod`:idx: - * `system.html#216 <system.html#216>`_ - * `system.html#217 <system.html#217>`_ - * `system.html#218 <system.html#218>`_ - * `system.html#219 <system.html#219>`_ - * `system.html#220 <system.html#220>`_ - - `module`:idx: - * `manual.html#212 <manual.html#212>`_ - * `tut1.html#125 <tut1.html#125>`_ - - `MON_1`:idx: - `posix.html#410 <posix.html#410>`_ - - `MON_10`:idx: - `posix.html#419 <posix.html#419>`_ - - `MON_11`:idx: - `posix.html#420 <posix.html#420>`_ - - `MON_12`:idx: - `posix.html#421 <posix.html#421>`_ - - `MON_2`:idx: - `posix.html#411 <posix.html#411>`_ - - `MON_3`:idx: - `posix.html#412 <posix.html#412>`_ - - `MON_4`:idx: - `posix.html#413 <posix.html#413>`_ - - `MON_5`:idx: - `posix.html#414 <posix.html#414>`_ - - `MON_6`:idx: - `posix.html#415 <posix.html#415>`_ - - `MON_7`:idx: - `posix.html#416 <posix.html#416>`_ - - `MON_8`:idx: - `posix.html#417 <posix.html#417>`_ - - `MON_9`:idx: - `posix.html#418 <posix.html#418>`_ - - `moveFile`:idx: - `os.html#135 <os.html#135>`_ - - `moveMem`:idx: - `system.html#411 <system.html#411>`_ - - `mprotect`:idx: - `posix.html#1081 <posix.html#1081>`_ - - `mq_close`:idx: - `posix.html#849 <posix.html#849>`_ - - `mq_getattr`:idx: - `posix.html#850 <posix.html#850>`_ - - `mq_notify`:idx: - `posix.html#851 <posix.html#851>`_ - - `mq_open`:idx: - `posix.html#852 <posix.html#852>`_ - - `mq_receive`:idx: - `posix.html#853 <posix.html#853>`_ - - `mq_send`:idx: - `posix.html#854 <posix.html#854>`_ - - `mq_setattr`:idx: - `posix.html#855 <posix.html#855>`_ - - `mq_timedreceive`:idx: - `posix.html#856 <posix.html#856>`_ - - `mq_timedsend`:idx: - `posix.html#857 <posix.html#857>`_ - - `mq_unlink`:idx: - `posix.html#858 <posix.html#858>`_ - - `MS_ASYNC`:idx: - `posix.html#681 <posix.html#681>`_ - - `MS_INVALIDATE`:idx: - `posix.html#683 <posix.html#683>`_ - - `MS_SYNC`:idx: - `posix.html#682 <posix.html#682>`_ - - `msync`:idx: - `posix.html#1082 <posix.html#1082>`_ - - `munlock`:idx: - `posix.html#1083 <posix.html#1083>`_ - - `munlockall`:idx: - `posix.html#1084 <posix.html#1084>`_ - - `munmap`:idx: - `posix.html#1085 <posix.html#1085>`_ - - `nan`:idx: - `system.html#434 <system.html#434>`_ - - `nanosleep`:idx: - `posix.html#1109 <posix.html#1109>`_ - - `Natural`:idx: - `system.html#129 <system.html#129>`_ - - `neginf`:idx: - `system.html#433 <system.html#433>`_ - - `new`:idx: - * `system.html#119 <system.html#119>`_ - * `system.html#120 <system.html#120>`_ - - `newFileStream`:idx: - * `streams.html#120 <streams.html#120>`_ - * `streams.html#121 <streams.html#121>`_ - - `newline`:idx: - `manual.html#121 <manual.html#121>`_ - - `NewLines`:idx: - `lexbase.html#102 <lexbase.html#102>`_ - - `newSeq`:idx: - `system.html#161 <system.html#161>`_ - - `newString`:idx: - `system.html#408 <system.html#408>`_ - - `newStringStream`:idx: - `streams.html#117 <streams.html#117>`_ - - `newStringTable`:idx: - * `strtabs.html#104 <strtabs.html#104>`_ - * `strtabs.html#105 <strtabs.html#105>`_ - - `next`:idx: - * `parseopt.html#104 <parseopt.html#104>`_ - * `parsecfg.html#106 <parsecfg.html#106>`_ - - `nextPowerOfTwo`:idx: - `math.html#106 <math.html#106>`_ - - `nftw`:idx: - `posix.html#830 <posix.html#830>`_ - - `nice`:idx: - `posix.html#1012 <posix.html#1012>`_ - - `nimcall`:idx: - `manual.html#169 <manual.html#169>`_ - - `NimrodMajor`:idx: - `system.html#394 <system.html#394>`_ - - `NimrodMinor`:idx: - `system.html#395 <system.html#395>`_ - - `NimrodPatch`:idx: - `system.html#396 <system.html#396>`_ - - `NimrodVersion`:idx: - `system.html#393 <system.html#393>`_ - - `nl`:idx: - `strutils.html#104 <strutils.html#104>`_ - - `NL_CAT_LOCALE`:idx: - `posix.html#769 <posix.html#769>`_ - - `nl_langinfo`:idx: - `posix.html#843 <posix.html#843>`_ - - `NL_SETD`:idx: - `posix.html#768 <posix.html#768>`_ - - `noconv`:idx: - `manual.html#172 <manual.html#172>`_ - - `no_decl`:idx: - `nimrodc.html#104 <nimrodc.html#104>`_ - - `NOEXPR`:idx: - `posix.html#442 <posix.html#442>`_ - - `normalize`:idx: - `strutils.html#111 <strutils.html#111>`_ - - `not`:idx: - * `system.html#115 <system.html#115>`_ - * `system.html#191 <system.html#191>`_ - * `system.html#192 <system.html#192>`_ - * `system.html#193 <system.html#193>`_ - * `system.html#194 <system.html#194>`_ - * `system.html#195 <system.html#195>`_ - - `not_in`:idx: - `system.html#356 <system.html#356>`_ - - `ntohl`:idx: - `posix.html#794 <posix.html#794>`_ - - `ntohs`:idx: - `posix.html#795 <posix.html#795>`_ - - `Numerical constants`:idx: - `manual.html#136 <manual.html#136>`_ - - `O_ACCMODE`:idx: - `posix.html#322 <posix.html#322>`_ - - `O_APPEND`:idx: - `posix.html#317 <posix.html#317>`_ - - `object`:idx: - `manual.html#155 <manual.html#155>`_ - - `O_CREAT`:idx: - `posix.html#313 <posix.html#313>`_ - - `ODBC_ADD_DSN`:idx: - `odbcsql.html#621 <odbcsql.html#621>`_ - - `ODBC_ADD_SYS_DSN`:idx: - `odbcsql.html#624 <odbcsql.html#624>`_ - - `ODBC_CONFIG_DSN`:idx: - `odbcsql.html#622 <odbcsql.html#622>`_ - - `ODBC_CONFIG_SYS_DSN`:idx: - `odbcsql.html#625 <odbcsql.html#625>`_ - - `ODBC_REMOVE_DSN`:idx: - `odbcsql.html#623 <odbcsql.html#623>`_ - - `ODBC_REMOVE_SYS_DSN`:idx: - `odbcsql.html#626 <odbcsql.html#626>`_ - - `O_DSYNC`:idx: - `posix.html#318 <posix.html#318>`_ - - `O_EXCL`:idx: - `posix.html#314 <posix.html#314>`_ - - `O_NOCTTY`:idx: - `posix.html#315 <posix.html#315>`_ - - `O_NONBLOCK`:idx: - `posix.html#319 <posix.html#319>`_ - - `open`:idx: - * `posix.html#813 <posix.html#813>`_ - * `lexbase.html#104 <lexbase.html#104>`_ - * `parsecfg.html#104 <parsecfg.html#104>`_ - * `zipfiles.html#102 <zipfiles.html#102>`_ - - `openarray`:idx: - * `tut1.html#118 <tut1.html#118>`_ - * `system.html#125 <system.html#125>`_ - - `opendir`:idx: - `posix.html#801 <posix.html#801>`_ - - `OpenFile`:idx: - * `system.html#486 <system.html#486>`_ - * `system.html#487 <system.html#487>`_ - - `operator`:idx: - `manual.html#138 <manual.html#138>`_ - - `Operators`:idx: - `manual.html#202 <manual.html#202>`_ - - `or`:idx: - * `system.html#117 <system.html#117>`_ - * `system.html#236 <system.html#236>`_ - * `system.html#237 <system.html#237>`_ - * `system.html#238 <system.html#238>`_ - * `system.html#239 <system.html#239>`_ - * `system.html#240 <system.html#240>`_ - - `ord`:idx: - `system.html#170 <system.html#170>`_ - - `ordinal`:idx: - `tut1.html#114 <tut1.html#114>`_ - - `Ordinal types`:idx: - `manual.html#141 <manual.html#141>`_ - - `O_RDONLY`:idx: - `posix.html#323 <posix.html#323>`_ - - `O_RDWR`:idx: - `posix.html#324 <posix.html#324>`_ - - `O_RSYNC`:idx: - `posix.html#320 <posix.html#320>`_ - - `OSError`:idx: - `os.html#147 <os.html#147>`_ - - `O_SYNC`:idx: - `posix.html#321 <posix.html#321>`_ - - `O_TRUNC`:idx: - `posix.html#316 <posix.html#316>`_ - - `O_WRONLY`:idx: - `posix.html#325 <posix.html#325>`_ - - `pairs`:idx: - `strtabs.html#110 <strtabs.html#110>`_ - - `P_ALL`:idx: - `posix.html#716 <posix.html#716>`_ - - `paramCount`:idx: - `os.html#145 <os.html#145>`_ - - `paramStr`:idx: - `os.html#146 <os.html#146>`_ - - `ParDir`:idx: - `os.html#102 <os.html#102>`_ - - `parentDir`:idx: - `os.html#122 <os.html#122>`_ - - `ParseBiggestInt`:idx: - `strutils.html#131 <strutils.html#131>`_ - - `parseCmdLine`:idx: - `os.html#154 <os.html#154>`_ - - `ParseFloat`:idx: - `strutils.html#132 <strutils.html#132>`_ - - `ParseInt`:idx: - `strutils.html#130 <strutils.html#130>`_ - - `pathconf`:idx: - `posix.html#1013 <posix.html#1013>`_ - - `PathSep`:idx: - `os.html#105 <os.html#105>`_ - - `pause`:idx: - `posix.html#1014 <posix.html#1014>`_ - - `pbyte`:idx: - `zlib.html#106 <zlib.html#106>`_ - - `pbytef`:idx: - `zlib.html#107 <zlib.html#107>`_ - - `PC_2_SYMLINKS`:idx: - `posix.html#500 <posix.html#500>`_ - - `PC_ALLOC_SIZE_MIN`:idx: - `posix.html#501 <posix.html#501>`_ - - `PC_ASYNC_IO`:idx: - `posix.html#502 <posix.html#502>`_ - - `PC_CHOWN_RESTRICTED`:idx: - `posix.html#503 <posix.html#503>`_ - - `PC_FILESIZEBITS`:idx: - `posix.html#504 <posix.html#504>`_ - - `PC_LINK_MAX`:idx: - `posix.html#505 <posix.html#505>`_ - - `PC_MAX_CANON`:idx: - `posix.html#506 <posix.html#506>`_ - - `PC_MAX_INPUT`:idx: - `posix.html#507 <posix.html#507>`_ - - `PC_NAME_MAX`:idx: - `posix.html#508 <posix.html#508>`_ - - `PC_NO_TRUNC`:idx: - `posix.html#509 <posix.html#509>`_ - - `PC_PATH_MAX`:idx: - `posix.html#510 <posix.html#510>`_ - - `PC_PIPE_BUF`:idx: - `posix.html#511 <posix.html#511>`_ - - `PC_PRIO_IO`:idx: - `posix.html#512 <posix.html#512>`_ - - `PC_REC_INCR_XFER_SIZE`:idx: - `posix.html#513 <posix.html#513>`_ - - `PC_REC_MIN_XFER_SIZE`:idx: - `posix.html#514 <posix.html#514>`_ - - `PC_REC_XFER_ALIGN`:idx: - `posix.html#515 <posix.html#515>`_ - - `PC_SYMLINK_MAX`:idx: - `posix.html#516 <posix.html#516>`_ - - `PC_SYNC_IO`:idx: - `posix.html#517 <posix.html#517>`_ - - `PC_VDISABLE`:idx: - `posix.html#518 <posix.html#518>`_ - - `PFileStream`:idx: - `streams.html#118 <streams.html#118>`_ - - `PFloat32`:idx: - `system.html#386 <system.html#386>`_ - - `PFloat64`:idx: - `system.html#387 <system.html#387>`_ - - `PI`:idx: - `math.html#101 <math.html#101>`_ - - `PInt32`:idx: - `system.html#389 <system.html#389>`_ - - `PInt64`:idx: - `system.html#388 <system.html#388>`_ - - `PInternalState`:idx: - `zlib.html#111 <zlib.html#111>`_ - - `pipe`:idx: - `posix.html#1015 <posix.html#1015>`_ - - `PM_STR`:idx: - `posix.html#395 <posix.html#395>`_ - - `PObject`:idx: - `system.html#132 <system.html#132>`_ - - `pointer`:idx: - `system.html#113 <system.html#113>`_ - - `pointers`:idx: - * `manual.html#158 <manual.html#158>`_ - * `tut1.html#120 <tut1.html#120>`_ - - `Positive`:idx: - `system.html#130 <system.html#130>`_ - - `POSIX_ASYNC_IO`:idx: - `posix.html#475 <posix.html#475>`_ - - `POSIX_FADV_DONTNEED`:idx: - `posix.html#330 <posix.html#330>`_ - - `posix_fadvise`:idx: - `posix.html#814 <posix.html#814>`_ - - `POSIX_FADV_NOREUSE`:idx: - `posix.html#331 <posix.html#331>`_ - - `POSIX_FADV_NORMAL`:idx: - `posix.html#326 <posix.html#326>`_ - - `POSIX_FADV_RANDOM`:idx: - `posix.html#328 <posix.html#328>`_ - - `POSIX_FADV_SEQUENTIAL`:idx: - `posix.html#327 <posix.html#327>`_ - - `POSIX_FADV_WILLNEED`:idx: - `posix.html#329 <posix.html#329>`_ - - `posix_fallocate`:idx: - `posix.html#815 <posix.html#815>`_ - - `POSIX_MADV_DONTNEED`:idx: - `posix.html#691 <posix.html#691>`_ - - `posix_madvise`:idx: - `posix.html#1086 <posix.html#1086>`_ - - `POSIX_MADV_NORMAL`:idx: - `posix.html#687 <posix.html#687>`_ - - `POSIX_MADV_RANDOM`:idx: - `posix.html#689 <posix.html#689>`_ - - `POSIX_MADV_SEQUENTIAL`:idx: - `posix.html#688 <posix.html#688>`_ - - `POSIX_MADV_WILLNEED`:idx: - `posix.html#690 <posix.html#690>`_ - - `posix_mem_offset`:idx: - `posix.html#1087 <posix.html#1087>`_ - - `POSIX_PRIO_IO`:idx: - `posix.html#476 <posix.html#476>`_ - - `posix_spawn`:idx: - `posix.html#1167 <posix.html#1167>`_ - - `posix_spawnattr_destroy`:idx: - `posix.html#1173 <posix.html#1173>`_ - - `posix_spawnattr_getflags`:idx: - `posix.html#1175 <posix.html#1175>`_ - - `posix_spawnattr_getpgroup`:idx: - `posix.html#1176 <posix.html#1176>`_ - - `posix_spawnattr_getschedparam`:idx: - `posix.html#1177 <posix.html#1177>`_ - - `posix_spawnattr_getschedpolicy`:idx: - `posix.html#1178 <posix.html#1178>`_ - - `posix_spawnattr_getsigdefault`:idx: - `posix.html#1174 <posix.html#1174>`_ - - `posix_spawnattr_getsigmask`:idx: - `posix.html#1179 <posix.html#1179>`_ - - `posix_spawnattr_init`:idx: - `posix.html#1180 <posix.html#1180>`_ - - `posix_spawnattr_setflags`:idx: - `posix.html#1182 <posix.html#1182>`_ - - `posix_spawnattr_setpgroup`:idx: - `posix.html#1183 <posix.html#1183>`_ - - `posix_spawnattr_setschedparam`:idx: - `posix.html#1184 <posix.html#1184>`_ - - `posix_spawnattr_setschedpolicy`:idx: - `posix.html#1185 <posix.html#1185>`_ - - `posix_spawnattr_setsigdefault`:idx: - `posix.html#1181 <posix.html#1181>`_ - - `posix_spawnattr_setsigmask`:idx: - `posix.html#1186 <posix.html#1186>`_ - - `posix_spawn_file_actions_addclose`:idx: - `posix.html#1168 <posix.html#1168>`_ - - `posix_spawn_file_actions_adddup2`:idx: - `posix.html#1169 <posix.html#1169>`_ - - `posix_spawn_file_actions_addopen`:idx: - `posix.html#1170 <posix.html#1170>`_ - - `posix_spawn_file_actions_destroy`:idx: - `posix.html#1171 <posix.html#1171>`_ - - `posix_spawn_file_actions_init`:idx: - `posix.html#1172 <posix.html#1172>`_ - - `posix_spawnp`:idx: - `posix.html#1187 <posix.html#1187>`_ - - `POSIX_SPAWN_RESETIDS`:idx: - `posix.html#778 <posix.html#778>`_ - - `POSIX_SPAWN_SETPGROUP`:idx: - `posix.html#779 <posix.html#779>`_ - - `POSIX_SPAWN_SETSCHEDPARAM`:idx: - `posix.html#780 <posix.html#780>`_ - - `POSIX_SPAWN_SETSCHEDULER`:idx: - `posix.html#781 <posix.html#781>`_ - - `POSIX_SPAWN_SETSIGDEF`:idx: - `posix.html#782 <posix.html#782>`_ - - `POSIX_SPAWN_SETSIGMASK`:idx: - `posix.html#783 <posix.html#783>`_ - - `POSIX_SYNC_IO`:idx: - `posix.html#477 <posix.html#477>`_ - - `POSIX_TYPED_MEM_ALLOCATE`:idx: - `posix.html#692 <posix.html#692>`_ - - `POSIX_TYPED_MEM_ALLOCATE_CONTIG`:idx: - `posix.html#693 <posix.html#693>`_ - - `posix_typed_mem_get_info`:idx: - `posix.html#1088 <posix.html#1088>`_ - - `POSIX_TYPED_MEM_MAP_ALLOCATABLE`:idx: - `posix.html#694 <posix.html#694>`_ - - `posix_typed_mem_open`:idx: - `posix.html#1089 <posix.html#1089>`_ - - `pow`:idx: - `math.html#127 <math.html#127>`_ - - `P_PGID`:idx: - `posix.html#718 <posix.html#718>`_ - - `P_PID`:idx: - `posix.html#717 <posix.html#717>`_ - - `pread`:idx: - `posix.html#1016 <posix.html#1016>`_ - - `pred`:idx: - `system.html#158 <system.html#158>`_ - - `procedural type`:idx: - * `manual.html#161 <manual.html#161>`_ - * `tut1.html#123 <tut1.html#123>`_ - - `procedures`:idx: - `manual.html#199 <manual.html#199>`_ - - `PROT_EXEC`:idx: - `posix.html#676 <posix.html#676>`_ - - `PROT_NONE`:idx: - `posix.html#677 <posix.html#677>`_ - - `PROT_READ`:idx: - `posix.html#674 <posix.html#674>`_ - - `PROT_WRITE`:idx: - `posix.html#675 <posix.html#675>`_ - - `pselect`:idx: - `posix.html#1165 <posix.html#1165>`_ - - `PSQLCHAR`:idx: - `odbcsql.html#116 <odbcsql.html#116>`_ - - `PSQL_DATE_STRUCT`:idx: - `odbcsql.html#232 <odbcsql.html#232>`_ - - `PSQLDOUBLE`:idx: - `odbcsql.html#122 <odbcsql.html#122>`_ - - `PSQLFLOAT`:idx: - `odbcsql.html#123 <odbcsql.html#123>`_ - - `PSQLHANDLE`:idx: - `odbcsql.html#124 <odbcsql.html#124>`_ - - `PSQLINTEGER`:idx: - `odbcsql.html#117 <odbcsql.html#117>`_ - - `PSQLREAL`:idx: - `odbcsql.html#121 <odbcsql.html#121>`_ - - `PSQLSMALLINT`:idx: - `odbcsql.html#119 <odbcsql.html#119>`_ - - `PSQL_TIMESTAMP_STRUCT`:idx: - `odbcsql.html#236 <odbcsql.html#236>`_ - - `PSQL_TIME_STRUCT`:idx: - `odbcsql.html#234 <odbcsql.html#234>`_ - - `PSQLUINTEGER`:idx: - `odbcsql.html#118 <odbcsql.html#118>`_ - - `PSQLUSMALLINT`:idx: - `odbcsql.html#120 <odbcsql.html#120>`_ - - `PStream`:idx: - `streams.html#101 <streams.html#101>`_ - - `PStringStream`:idx: - `streams.html#115 <streams.html#115>`_ - - `PStringTable`:idx: - `strtabs.html#103 <strtabs.html#103>`_ - - `pthread_atfork`:idx: - `posix.html#867 <posix.html#867>`_ - - `pthread_attr_destroy`:idx: - `posix.html#868 <posix.html#868>`_ - - `pthread_attr_getdetachstate`:idx: - `posix.html#869 <posix.html#869>`_ - - `pthread_attr_getguardsize`:idx: - `posix.html#870 <posix.html#870>`_ - - `pthread_attr_getinheritsched`:idx: - `posix.html#871 <posix.html#871>`_ - - `pthread_attr_getschedparam`:idx: - `posix.html#872 <posix.html#872>`_ - - `pthread_attr_getschedpolicy`:idx: - `posix.html#873 <posix.html#873>`_ - - `pthread_attr_getscope`:idx: - `posix.html#874 <posix.html#874>`_ - - `pthread_attr_getstack`:idx: - `posix.html#875 <posix.html#875>`_ - - `pthread_attr_getstackaddr`:idx: - `posix.html#876 <posix.html#876>`_ - - `pthread_attr_getstacksize`:idx: - `posix.html#877 <posix.html#877>`_ - - `pthread_attr_init`:idx: - `posix.html#878 <posix.html#878>`_ - - `pthread_attr_setdetachstate`:idx: - `posix.html#879 <posix.html#879>`_ - - `pthread_attr_setguardsize`:idx: - `posix.html#880 <posix.html#880>`_ - - `pthread_attr_setinheritsched`:idx: - `posix.html#881 <posix.html#881>`_ - - `pthread_attr_setschedparam`:idx: - `posix.html#882 <posix.html#882>`_ - - `pthread_attr_setschedpolicy`:idx: - `posix.html#883 <posix.html#883>`_ - - `pthread_attr_setscope`:idx: - `posix.html#884 <posix.html#884>`_ - - `pthread_attr_setstack`:idx: - `posix.html#885 <posix.html#885>`_ - - `pthread_attr_setstackaddr`:idx: - `posix.html#886 <posix.html#886>`_ - - `pthread_attr_setstacksize`:idx: - `posix.html#887 <posix.html#887>`_ - - `pthread_barrierattr_destroy`:idx: - `posix.html#891 <posix.html#891>`_ - - `pthread_barrierattr_getpshared`:idx: - `posix.html#892 <posix.html#892>`_ - - `pthread_barrierattr_init`:idx: - `posix.html#893 <posix.html#893>`_ - - `pthread_barrierattr_setpshared`:idx: - `posix.html#894 <posix.html#894>`_ - - `pthread_barrier_destroy`:idx: - `posix.html#888 <posix.html#888>`_ - - `pthread_barrier_init`:idx: - `posix.html#889 <posix.html#889>`_ - - `PTHREAD_BARRIER_SERIAL_THREAD`:idx: - `posix.html#451 <posix.html#451>`_ - - `pthread_barrier_wait`:idx: - `posix.html#890 <posix.html#890>`_ - - `pthread_cancel`:idx: - `posix.html#895 <posix.html#895>`_ - - `PTHREAD_CANCEL_ASYNCHRONOUS`:idx: - `posix.html#452 <posix.html#452>`_ - - `PTHREAD_CANCEL_DEFERRED`:idx: - `posix.html#454 <posix.html#454>`_ - - `PTHREAD_CANCEL_DISABLE`:idx: - `posix.html#455 <posix.html#455>`_ - - `PTHREAD_CANCELED`:idx: - `posix.html#456 <posix.html#456>`_ - - `PTHREAD_CANCEL_ENABLE`:idx: - `posix.html#453 <posix.html#453>`_ - - `pthread_cleanup_pop`:idx: - `posix.html#897 <posix.html#897>`_ - - `pthread_cleanup_push`:idx: - `posix.html#896 <posix.html#896>`_ - - `pthread_condattr_destroy`:idx: - `posix.html#904 <posix.html#904>`_ - - `pthread_condattr_getclock`:idx: - `posix.html#905 <posix.html#905>`_ - - `pthread_condattr_getpshared`:idx: - `posix.html#906 <posix.html#906>`_ - - `pthread_condattr_init`:idx: - `posix.html#907 <posix.html#907>`_ - - `pthread_condattr_setclock`:idx: - `posix.html#908 <posix.html#908>`_ - - `pthread_condattr_setpshared`:idx: - `posix.html#909 <posix.html#909>`_ - - `pthread_cond_broadcast`:idx: - `posix.html#898 <posix.html#898>`_ - - `pthread_cond_destroy`:idx: - `posix.html#899 <posix.html#899>`_ - - `pthread_cond_init`:idx: - `posix.html#900 <posix.html#900>`_ - - `PTHREAD_COND_INITIALIZER`:idx: - `posix.html#457 <posix.html#457>`_ - - `pthread_cond_signal`:idx: - `posix.html#901 <posix.html#901>`_ - - `pthread_cond_timedwait`:idx: - `posix.html#902 <posix.html#902>`_ - - `pthread_cond_wait`:idx: - `posix.html#903 <posix.html#903>`_ - - `pthread_create`:idx: - `posix.html#910 <posix.html#910>`_ - - `PTHREAD_CREATE_DETACHED`:idx: - `posix.html#458 <posix.html#458>`_ - - `PTHREAD_CREATE_JOINABLE`:idx: - `posix.html#459 <posix.html#459>`_ - - `pthread_detach`:idx: - `posix.html#911 <posix.html#911>`_ - - `pthread_equal`:idx: - `posix.html#912 <posix.html#912>`_ - - `pthread_exit`:idx: - `posix.html#913 <posix.html#913>`_ - - `PTHREAD_EXPLICIT_SCHED`:idx: - `posix.html#460 <posix.html#460>`_ - - `pthread_getconcurrency`:idx: - `posix.html#914 <posix.html#914>`_ - - `pthread_getcpuclockid`:idx: - `posix.html#915 <posix.html#915>`_ - - `pthread_getschedparam`:idx: - `posix.html#916 <posix.html#916>`_ - - `pthread_getspecific`:idx: - `posix.html#917 <posix.html#917>`_ - - `PTHREAD_INHERIT_SCHED`:idx: - `posix.html#461 <posix.html#461>`_ - - `pthread_join`:idx: - `posix.html#918 <posix.html#918>`_ - - `pthread_key_create`:idx: - `posix.html#919 <posix.html#919>`_ - - `pthread_key_delete`:idx: - `posix.html#920 <posix.html#920>`_ - - `pthread_kill`:idx: - `posix.html#1125 <posix.html#1125>`_ - - `pthread_mutexattr_destroy`:idx: - `posix.html#929 <posix.html#929>`_ - - `pthread_mutexattr_getprioceiling`:idx: - `posix.html#930 <posix.html#930>`_ - - `pthread_mutexattr_getprotocol`:idx: - `posix.html#931 <posix.html#931>`_ - - `pthread_mutexattr_getpshared`:idx: - `posix.html#932 <posix.html#932>`_ - - `pthread_mutexattr_gettype`:idx: - `posix.html#933 <posix.html#933>`_ - - `pthread_mutexattr_init`:idx: - `posix.html#934 <posix.html#934>`_ - - `pthread_mutexattr_setprioceiling`:idx: - `posix.html#935 <posix.html#935>`_ - - `pthread_mutexattr_setprotocol`:idx: - `posix.html#936 <posix.html#936>`_ - - `pthread_mutexattr_setpshared`:idx: - `posix.html#937 <posix.html#937>`_ - - `pthread_mutexattr_settype`:idx: - `posix.html#938 <posix.html#938>`_ - - `PTHREAD_MUTEX_DEFAULT`:idx: - `posix.html#462 <posix.html#462>`_ - - `pthread_mutex_destroy`:idx: - `posix.html#921 <posix.html#921>`_ - - `PTHREAD_MUTEX_ERRORCHECK`:idx: - `posix.html#463 <posix.html#463>`_ - - `pthread_mutex_getprioceiling`:idx: - `posix.html#922 <posix.html#922>`_ - - `pthread_mutex_init`:idx: - `posix.html#923 <posix.html#923>`_ - - `PTHREAD_MUTEX_INITIALIZER`:idx: - `posix.html#464 <posix.html#464>`_ - - `pthread_mutex_lock`:idx: - `posix.html#924 <posix.html#924>`_ - - `PTHREAD_MUTEX_NORMAL`:idx: - `posix.html#465 <posix.html#465>`_ - - `PTHREAD_MUTEX_RECURSIVE`:idx: - `posix.html#466 <posix.html#466>`_ - - `pthread_mutex_setprioceiling`:idx: - `posix.html#925 <posix.html#925>`_ - - `pthread_mutex_timedlock`:idx: - `posix.html#926 <posix.html#926>`_ - - `pthread_mutex_trylock`:idx: - `posix.html#927 <posix.html#927>`_ - - `pthread_mutex_unlock`:idx: - `posix.html#928 <posix.html#928>`_ - - `pthread_once`:idx: - `posix.html#939 <posix.html#939>`_ - - `PTHREAD_ONCE_INIT`:idx: - `posix.html#467 <posix.html#467>`_ - - `PTHREAD_PRIO_INHERIT`:idx: - `posix.html#468 <posix.html#468>`_ - - `PTHREAD_PRIO_NONE`:idx: - `posix.html#469 <posix.html#469>`_ - - `PTHREAD_PRIO_PROTECT`:idx: - `posix.html#470 <posix.html#470>`_ - - `PTHREAD_PROCESS_PRIVATE`:idx: - `posix.html#472 <posix.html#472>`_ - - `PTHREAD_PROCESS_SHARED`:idx: - `posix.html#471 <posix.html#471>`_ - - `pthread_rwlockattr_destroy`:idx: - `posix.html#949 <posix.html#949>`_ - - `pthread_rwlockattr_getpshared`:idx: - `posix.html#950 <posix.html#950>`_ - - `pthread_rwlockattr_init`:idx: - `posix.html#951 <posix.html#951>`_ - - `pthread_rwlockattr_setpshared`:idx: - `posix.html#952 <posix.html#952>`_ - - `pthread_rwlock_destroy`:idx: - `posix.html#940 <posix.html#940>`_ - - `pthread_rwlock_init`:idx: - `posix.html#941 <posix.html#941>`_ - - `pthread_rwlock_rdlock`:idx: - `posix.html#942 <posix.html#942>`_ - - `pthread_rwlock_timedrdlock`:idx: - `posix.html#943 <posix.html#943>`_ - - `pthread_rwlock_timedwrlock`:idx: - `posix.html#944 <posix.html#944>`_ - - `pthread_rwlock_tryrdlock`:idx: - `posix.html#945 <posix.html#945>`_ - - `pthread_rwlock_trywrlock`:idx: - `posix.html#946 <posix.html#946>`_ - - `pthread_rwlock_unlock`:idx: - `posix.html#947 <posix.html#947>`_ - - `pthread_rwlock_wrlock`:idx: - `posix.html#948 <posix.html#948>`_ - - `PTHREAD_SCOPE_PROCESS`:idx: - `posix.html#473 <posix.html#473>`_ - - `PTHREAD_SCOPE_SYSTEM`:idx: - `posix.html#474 <posix.html#474>`_ - - `pthread_self`:idx: - `posix.html#953 <posix.html#953>`_ - - `pthread_setcancelstate`:idx: - `posix.html#954 <posix.html#954>`_ - - `pthread_setcanceltype`:idx: - `posix.html#955 <posix.html#955>`_ - - `pthread_setconcurrency`:idx: - `posix.html#956 <posix.html#956>`_ - - `pthread_setschedparam`:idx: - `posix.html#957 <posix.html#957>`_ - - `pthread_setschedprio`:idx: - `posix.html#958 <posix.html#958>`_ - - `pthread_setspecific`:idx: - `posix.html#959 <posix.html#959>`_ - - `pthread_sigmask`:idx: - `posix.html#1126 <posix.html#1126>`_ - - `pthread_spin_destroy`:idx: - `posix.html#960 <posix.html#960>`_ - - `pthread_spin_init`:idx: - `posix.html#961 <posix.html#961>`_ - - `pthread_spin_lock`:idx: - `posix.html#962 <posix.html#962>`_ - - `pthread_spin_trylock`:idx: - `posix.html#963 <posix.html#963>`_ - - `pthread_spin_unlock`:idx: - `posix.html#964 <posix.html#964>`_ - - `pthread_testcancel`:idx: - `posix.html#965 <posix.html#965>`_ - - `Pulongf`:idx: - `zlib.html#104 <zlib.html#104>`_ - - `push/pop`:idx: - `manual.html#228 <manual.html#228>`_ - - `putEnv`:idx: - `os.html#142 <os.html#142>`_ - - `PWindow`:idx: - `dialogs.html#101 <dialogs.html#101>`_ - - `pwrite`:idx: - `posix.html#1017 <posix.html#1017>`_ - - `Pzip`:idx: - `libzip.html#105 <libzip.html#105>`_ - - `Pzip_file`:idx: - `libzip.html#106 <libzip.html#106>`_ - - `PZipFileStream`:idx: - `zipfiles.html#108 <zipfiles.html#108>`_ - - `Pzip_source`:idx: - `libzip.html#107 <libzip.html#107>`_ - - `Pzip_stat`:idx: - `libzip.html#103 <libzip.html#103>`_ - - `PZstream`:idx: - `zlib.html#114 <zlib.html#114>`_ - - `quit`:idx: - * `system.html#478 <system.html#478>`_ - * `system.html#479 <system.html#479>`_ - - `QuitFailure`:idx: - `system.html#477 <system.html#477>`_ - - `QuitSuccess`:idx: - `system.html#476 <system.html#476>`_ - - `quotation mark`:idx: - `manual.html#128 <manual.html#128>`_ - - `quoteIfContainsWhite`:idx: - `strutils.html#140 <strutils.html#140>`_ - - `RADIXCHAR`:idx: - `posix.html#439 <posix.html#439>`_ - - `raise`:idx: - `posix.html#1127 <posix.html#1127>`_ - - `random`:idx: - `math.html#108 <math.html#108>`_ - - `randomize`:idx: - `math.html#109 <math.html#109>`_ - - `range`:idx: - `system.html#123 <system.html#123>`_ - - `re-raised`:idx: - `manual.html#183 <manual.html#183>`_ - - `read`:idx: - `posix.html#1018 <posix.html#1018>`_ - - `readBool`:idx: - `streams.html#106 <streams.html#106>`_ - - `readBuffer`:idx: - `system.html#506 <system.html#506>`_ - - `ReadBytes`:idx: - `system.html#504 <system.html#504>`_ - - `readChar`:idx: - * `system.html#490 <system.html#490>`_ - * `streams.html#105 <streams.html#105>`_ - - `ReadChars`:idx: - `system.html#505 <system.html#505>`_ - - `readdir`:idx: - `posix.html#802 <posix.html#802>`_ - - `readdir_r`:idx: - `posix.html#803 <posix.html#803>`_ - - `readFile`:idx: - `system.html#492 <system.html#492>`_ - - `readFloat32`:idx: - `streams.html#111 <streams.html#111>`_ - - `readFloat64`:idx: - `streams.html#112 <streams.html#112>`_ - - `readInt16`:idx: - `streams.html#108 <streams.html#108>`_ - - `readInt32`:idx: - `streams.html#109 <streams.html#109>`_ - - `readInt64`:idx: - `streams.html#110 <streams.html#110>`_ - - `readInt8`:idx: - `streams.html#107 <streams.html#107>`_ - - `readLine`:idx: - * `system.html#500 <system.html#500>`_ - * `streams.html#114 <streams.html#114>`_ - - `readlink`:idx: - `posix.html#1019 <posix.html#1019>`_ - - `readStr`:idx: - `streams.html#113 <streams.html#113>`_ - - `realloc`:idx: - `system.html#415 <system.html#415>`_ - - `Recursive module dependancies`:idx: - `manual.html#216 <manual.html#216>`_ - - `register`:idx: - `nimrodc.html#112 <nimrodc.html#112>`_ - - `removeDir`:idx: - `os.html#137 <os.html#137>`_ - - `removeFile`:idx: - `os.html#136 <os.html#136>`_ - - `repeatChar`:idx: - `strutils.html#136 <strutils.html#136>`_ - - `replaceStr`:idx: - * `strutils.html#115 <strutils.html#115>`_ - * `strutils.html#116 <strutils.html#116>`_ - - `repr`:idx: - `system.html#371 <system.html#371>`_ - - `result`:idx: - * `manual.html#190 <manual.html#190>`_ - * `manual.html#201 <manual.html#201>`_ - - `return`:idx: - `manual.html#189 <manual.html#189>`_ - - `rewinddir`:idx: - `posix.html#804 <posix.html#804>`_ - - `rmdir`:idx: - `posix.html#1020 <posix.html#1020>`_ - - `R_OK`:idx: - `posix.html#479 <posix.html#479>`_ - - `round`:idx: - `math.html#116 <math.html#116>`_ - - `RTLD_GLOBAL`:idx: - `posix.html#217 <posix.html#217>`_ - - `RTLD_LAZY`:idx: - `posix.html#215 <posix.html#215>`_ - - `RTLD_LOCAL`:idx: - `posix.html#218 <posix.html#218>`_ - - `RTLD_NOW`:idx: - `posix.html#216 <posix.html#216>`_ - - `safe`:idx: - `manual.html#112 <manual.html#112>`_ - - `safecall`:idx: - `manual.html#166 <manual.html#166>`_ - - `sameFile`:idx: - `os.html#148 <os.html#148>`_ - - `sameFileContent`:idx: - `os.html#149 <os.html#149>`_ - - `SA_NOCLDSTOP`:idx: - `posix.html#754 <posix.html#754>`_ - - `SA_NOCLDWAIT`:idx: - `posix.html#762 <posix.html#762>`_ - - `SA_NODEFER`:idx: - `posix.html#763 <posix.html#763>`_ - - `SA_ONSTACK`:idx: - `posix.html#758 <posix.html#758>`_ - - `SA_RESETHAND`:idx: - `posix.html#759 <posix.html#759>`_ - - `SA_RESTART`:idx: - `posix.html#760 <posix.html#760>`_ - - `SA_SIGINFO`:idx: - `posix.html#761 <posix.html#761>`_ - - `SC_2_C_BIND`:idx: - `posix.html#519 <posix.html#519>`_ - - `SC_2_C_DEV`:idx: - `posix.html#520 <posix.html#520>`_ - - `SC_2_CHAR_TERM`:idx: - `posix.html#521 <posix.html#521>`_ - - `SC_2_FORT_DEV`:idx: - `posix.html#522 <posix.html#522>`_ - - `SC_2_FORT_RUN`:idx: - `posix.html#523 <posix.html#523>`_ - - `SC_2_LOCALEDEF`:idx: - `posix.html#524 <posix.html#524>`_ - - `SC_2_PBS`:idx: - `posix.html#525 <posix.html#525>`_ - - `SC_2_PBS_ACCOUNTING`:idx: - `posix.html#526 <posix.html#526>`_ - - `SC_2_PBS_CHECKPOINT`:idx: - `posix.html#527 <posix.html#527>`_ - - `SC_2_PBS_LOCATE`:idx: - `posix.html#528 <posix.html#528>`_ - - `SC_2_PBS_MESSAGE`:idx: - `posix.html#529 <posix.html#529>`_ - - `SC_2_PBS_TRACK`:idx: - `posix.html#530 <posix.html#530>`_ - - `SC_2_SW_DEV`:idx: - `posix.html#531 <posix.html#531>`_ - - `SC_2_UPE`:idx: - `posix.html#532 <posix.html#532>`_ - - `SC_2_VERSION`:idx: - `posix.html#533 <posix.html#533>`_ - - `SC_ADVISORY_INFO`:idx: - `posix.html#534 <posix.html#534>`_ - - `SC_AIO_LISTIO_MAX`:idx: - `posix.html#535 <posix.html#535>`_ - - `SC_AIO_MAX`:idx: - `posix.html#536 <posix.html#536>`_ - - `SC_AIO_PRIO_DELTA_MAX`:idx: - `posix.html#537 <posix.html#537>`_ - - `SC_ARG_MAX`:idx: - `posix.html#538 <posix.html#538>`_ - - `SC_ASYNCHRONOUS_IO`:idx: - `posix.html#539 <posix.html#539>`_ - - `SC_ATEXIT_MAX`:idx: - `posix.html#540 <posix.html#540>`_ - - `SC_BARRIERS`:idx: - `posix.html#541 <posix.html#541>`_ - - `SC_BC_BASE_MAX`:idx: - `posix.html#542 <posix.html#542>`_ - - `SC_BC_DIM_MAX`:idx: - `posix.html#543 <posix.html#543>`_ - - `SC_BC_SCALE_MAX`:idx: - `posix.html#544 <posix.html#544>`_ - - `SC_BC_STRING_MAX`:idx: - `posix.html#545 <posix.html#545>`_ - - `SC_CHILD_MAX`:idx: - `posix.html#546 <posix.html#546>`_ - - `SC_CLK_TCK`:idx: - `posix.html#547 <posix.html#547>`_ - - `SC_CLOCK_SELECTION`:idx: - `posix.html#548 <posix.html#548>`_ - - `SC_COLL_WEIGHTS_MAX`:idx: - `posix.html#549 <posix.html#549>`_ - - `SC_CPUTIME`:idx: - `posix.html#550 <posix.html#550>`_ - - `SC_DELAYTIMER_MAX`:idx: - `posix.html#551 <posix.html#551>`_ - - `SC_EXPR_NEST_MAX`:idx: - `posix.html#552 <posix.html#552>`_ - - `SC_FSYNC`:idx: - `posix.html#553 <posix.html#553>`_ - - `SC_GETGR_R_SIZE_MAX`:idx: - `posix.html#554 <posix.html#554>`_ - - `SC_GETPW_R_SIZE_MAX`:idx: - `posix.html#555 <posix.html#555>`_ - - `SCHED_FIFO`:idx: - `posix.html#770 <posix.html#770>`_ - - `sched_getparam`:idx: - `posix.html#1154 <posix.html#1154>`_ - - `sched_get_priority_max`:idx: - `posix.html#1152 <posix.html#1152>`_ - - `sched_get_priority_min`:idx: - `posix.html#1153 <posix.html#1153>`_ - - `sched_getscheduler`:idx: - `posix.html#1155 <posix.html#1155>`_ - - `SCHED_OTHER`:idx: - `posix.html#773 <posix.html#773>`_ - - `SCHED_RR`:idx: - `posix.html#771 <posix.html#771>`_ - - `sched_rr_get_interval`:idx: - `posix.html#1156 <posix.html#1156>`_ - - `sched_setparam`:idx: - `posix.html#1157 <posix.html#1157>`_ - - `sched_setscheduler`:idx: - `posix.html#1158 <posix.html#1158>`_ - - `SCHED_SPORADIC`:idx: - `posix.html#772 <posix.html#772>`_ - - `sched_yield`:idx: - `posix.html#1159 <posix.html#1159>`_ - - `SC_HOST_NAME_MAX`:idx: - `posix.html#556 <posix.html#556>`_ - - `SC_IOV_MAX`:idx: - `posix.html#557 <posix.html#557>`_ - - `SC_IPV6`:idx: - `posix.html#558 <posix.html#558>`_ - - `SC_JOB_CONTROL`:idx: - `posix.html#559 <posix.html#559>`_ - - `SC_LINE_MAX`:idx: - `posix.html#560 <posix.html#560>`_ - - `SC_LOGIN_NAME_MAX`:idx: - `posix.html#561 <posix.html#561>`_ - - `SC_MAPPED_FILES`:idx: - `posix.html#562 <posix.html#562>`_ - - `SC_MEMLOCK`:idx: - `posix.html#563 <posix.html#563>`_ - - `SC_MEMLOCK_RANGE`:idx: - `posix.html#564 <posix.html#564>`_ - - `SC_MEMORY_PROTECTION`:idx: - `posix.html#565 <posix.html#565>`_ - - `SC_MESSAGE_PASSING`:idx: - `posix.html#566 <posix.html#566>`_ - - `SC_MONOTONIC_CLOCK`:idx: - `posix.html#567 <posix.html#567>`_ - - `SC_MQ_OPEN_MAX`:idx: - `posix.html#568 <posix.html#568>`_ - - `SC_MQ_PRIO_MAX`:idx: - `posix.html#569 <posix.html#569>`_ - - `SC_NGROUPS_MAX`:idx: - `posix.html#570 <posix.html#570>`_ - - `scope`:idx: - * `manual.html#106 <manual.html#106>`_ - * `manual.html#217 <manual.html#217>`_ - - `SC_OPEN_MAX`:idx: - `posix.html#571 <posix.html#571>`_ - - `SC_PAGE_SIZE`:idx: - `posix.html#572 <posix.html#572>`_ - - `SC_PRIORITIZED_IO`:idx: - `posix.html#573 <posix.html#573>`_ - - `SC_PRIORITY_SCHEDULING`:idx: - `posix.html#574 <posix.html#574>`_ - - `SC_RAW_SOCKETS`:idx: - `posix.html#575 <posix.html#575>`_ - - `SC_READER_WRITER_LOCKS`:idx: - `posix.html#577 <posix.html#577>`_ - - `SC_REALTIME_SIGNALS`:idx: - `posix.html#578 <posix.html#578>`_ - - `SC_RE_DUP_MAX`:idx: - `posix.html#576 <posix.html#576>`_ - - `SC_REGEXP`:idx: - `posix.html#579 <posix.html#579>`_ - - `ScriptExt`:idx: - `os.html#108 <os.html#108>`_ - - `SC_RTSIG_MAX`:idx: - `posix.html#580 <posix.html#580>`_ - - `SC_SAVED_IDS`:idx: - `posix.html#581 <posix.html#581>`_ - - `SC_SEMAPHORES`:idx: - `posix.html#584 <posix.html#584>`_ - - `SC_SEM_NSEMS_MAX`:idx: - `posix.html#582 <posix.html#582>`_ - - `SC_SEM_VALUE_MAX`:idx: - `posix.html#583 <posix.html#583>`_ - - `SC_SHARED_MEMORY_OBJECTS`:idx: - `posix.html#585 <posix.html#585>`_ - - `SC_SHELL`:idx: - `posix.html#586 <posix.html#586>`_ - - `SC_SIGQUEUE_MAX`:idx: - `posix.html#587 <posix.html#587>`_ - - `SC_SPAWN`:idx: - `posix.html#588 <posix.html#588>`_ - - `SC_SPIN_LOCKS`:idx: - `posix.html#589 <posix.html#589>`_ - - `SC_SPORADIC_SERVER`:idx: - `posix.html#590 <posix.html#590>`_ - - `SC_SS_REPL_MAX`:idx: - `posix.html#591 <posix.html#591>`_ - - `SC_STREAM_MAX`:idx: - `posix.html#592 <posix.html#592>`_ - - `SC_SYMLOOP_MAX`:idx: - `posix.html#593 <posix.html#593>`_ - - `SC_SYNCHRONIZED_IO`:idx: - `posix.html#594 <posix.html#594>`_ - - `SC_THREAD_ATTR_STACKADDR`:idx: - `posix.html#595 <posix.html#595>`_ - - `SC_THREAD_ATTR_STACKSIZE`:idx: - `posix.html#596 <posix.html#596>`_ - - `SC_THREAD_CPUTIME`:idx: - `posix.html#597 <posix.html#597>`_ - - `SC_THREAD_DESTRUCTOR_ITERATIONS`:idx: - `posix.html#598 <posix.html#598>`_ - - `SC_THREAD_KEYS_MAX`:idx: - `posix.html#599 <posix.html#599>`_ - - `SC_THREAD_PRIO_INHERIT`:idx: - `posix.html#600 <posix.html#600>`_ - - `SC_THREAD_PRIO_PROTECT`:idx: - `posix.html#601 <posix.html#601>`_ - - `SC_THREAD_PRIORITY_SCHEDULING`:idx: - `posix.html#602 <posix.html#602>`_ - - `SC_THREAD_PROCESS_SHARED`:idx: - `posix.html#603 <posix.html#603>`_ - - `SC_THREADS`:idx: - `posix.html#608 <posix.html#608>`_ - - `SC_THREAD_SAFE_FUNCTIONS`:idx: - `posix.html#604 <posix.html#604>`_ - - `SC_THREAD_SPORADIC_SERVER`:idx: - `posix.html#605 <posix.html#605>`_ - - `SC_THREAD_STACK_MIN`:idx: - `posix.html#606 <posix.html#606>`_ - - `SC_THREAD_THREADS_MAX`:idx: - `posix.html#607 <posix.html#607>`_ - - `SC_TIMEOUTS`:idx: - `posix.html#609 <posix.html#609>`_ - - `SC_TIMER_MAX`:idx: - `posix.html#610 <posix.html#610>`_ - - `SC_TIMERS`:idx: - `posix.html#611 <posix.html#611>`_ - - `SC_TRACE`:idx: - `posix.html#612 <posix.html#612>`_ - - `SC_TRACE_EVENT_FILTER`:idx: - `posix.html#613 <posix.html#613>`_ - - `SC_TRACE_EVENT_NAME_MAX`:idx: - `posix.html#614 <posix.html#614>`_ - - `SC_TRACE_INHERIT`:idx: - `posix.html#615 <posix.html#615>`_ - - `SC_TRACE_LOG`:idx: - `posix.html#616 <posix.html#616>`_ - - `SC_TRACE_NAME_MAX`:idx: - `posix.html#617 <posix.html#617>`_ - - `SC_TRACE_SYS_MAX`:idx: - `posix.html#618 <posix.html#618>`_ - - `SC_TRACE_USER_EVENT_MAX`:idx: - `posix.html#619 <posix.html#619>`_ - - `SC_TTY_NAME_MAX`:idx: - `posix.html#620 <posix.html#620>`_ - - `SC_TYPED_MEMORY_OBJECTS`:idx: - `posix.html#621 <posix.html#621>`_ - - `SC_TZNAME_MAX`:idx: - `posix.html#622 <posix.html#622>`_ - - `SC_V6_ILP32_OFF32`:idx: - `posix.html#623 <posix.html#623>`_ - - `SC_V6_ILP32_OFFBIG`:idx: - `posix.html#624 <posix.html#624>`_ - - `SC_V6_LP64_OFF64`:idx: - `posix.html#625 <posix.html#625>`_ - - `SC_V6_LPBIG_OFFBIG`:idx: - `posix.html#626 <posix.html#626>`_ - - `SC_VERSION`:idx: - `posix.html#627 <posix.html#627>`_ - - `SC_XBS5_ILP32_OFF32`:idx: - `posix.html#628 <posix.html#628>`_ - - `SC_XBS5_ILP32_OFFBIG`:idx: - `posix.html#629 <posix.html#629>`_ - - `SC_XBS5_LP64_OFF64`:idx: - `posix.html#630 <posix.html#630>`_ - - `SC_XBS5_LPBIG_OFFBIG`:idx: - `posix.html#631 <posix.html#631>`_ - - `SC_XOPEN_CRYPT`:idx: - `posix.html#632 <posix.html#632>`_ - - `SC_XOPEN_ENH_I18N`:idx: - `posix.html#633 <posix.html#633>`_ - - `SC_XOPEN_LEGACY`:idx: - `posix.html#634 <posix.html#634>`_ - - `SC_XOPEN_REALTIME`:idx: - `posix.html#635 <posix.html#635>`_ - - `SC_XOPEN_REALTIME_THREADS`:idx: - `posix.html#636 <posix.html#636>`_ - - `SC_XOPEN_SHM`:idx: - `posix.html#637 <posix.html#637>`_ - - `SC_XOPEN_STREAMS`:idx: - `posix.html#638 <posix.html#638>`_ - - `SC_XOPEN_UNIX`:idx: - `posix.html#639 <posix.html#639>`_ - - `SC_XOPEN_VERSION`:idx: - `posix.html#640 <posix.html#640>`_ - - `SEEK_CUR`:idx: - `posix.html#776 <posix.html#776>`_ - - `seekdir`:idx: - `posix.html#805 <posix.html#805>`_ - - `SEEK_END`:idx: - `posix.html#777 <posix.html#777>`_ - - `SEEK_SET`:idx: - `posix.html#775 <posix.html#775>`_ - - `select`:idx: - `posix.html#1166 <posix.html#1166>`_ - - `sem_close`:idx: - `posix.html#1045 <posix.html#1045>`_ - - `sem_destroy`:idx: - `posix.html#1046 <posix.html#1046>`_ - - `SEM_FAILED`:idx: - `posix.html#641 <posix.html#641>`_ - - `sem_getvalue`:idx: - `posix.html#1047 <posix.html#1047>`_ - - `sem_init`:idx: - `posix.html#1048 <posix.html#1048>`_ - - `sem_open`:idx: - `posix.html#1049 <posix.html#1049>`_ - - `sem_post`:idx: - `posix.html#1050 <posix.html#1050>`_ - - `sem_timedwait`:idx: - `posix.html#1051 <posix.html#1051>`_ - - `sem_trywait`:idx: - `posix.html#1052 <posix.html#1052>`_ - - `sem_unlink`:idx: - `posix.html#1053 <posix.html#1053>`_ - - `sem_wait`:idx: - `posix.html#1054 <posix.html#1054>`_ - - `separate compilation`:idx: - * `manual.html#214 <manual.html#214>`_ - * `tut1.html#127 <tut1.html#127>`_ - - `seq`:idx: - `system.html#126 <system.html#126>`_ - - `seqToPtr`:idx: - `system.html#457 <system.html#457>`_ - - `Sequences`:idx: - * `manual.html#153 <manual.html#153>`_ - * `tut1.html#119 <tut1.html#119>`_ - - `set`:idx: - `system.html#127 <system.html#127>`_ - - `set type`:idx: - * `manual.html#157 <manual.html#157>`_ - * `tut1.html#116 <tut1.html#116>`_ - - `setcontext`:idx: - `posix.html#1190 <posix.html#1190>`_ - - `setCurrentDir`:idx: - `os.html#113 <os.html#113>`_ - - `setegid`:idx: - `posix.html#1021 <posix.html#1021>`_ - - `seteuid`:idx: - `posix.html#1022 <posix.html#1022>`_ - - `setFilePos`:idx: - `system.html#510 <system.html#510>`_ - - `setgid`:idx: - `posix.html#1023 <posix.html#1023>`_ - - `setgrent`:idx: - `posix.html#839 <posix.html#839>`_ - - `setLen`:idx: - * `system.html#407 <system.html#407>`_ - * `system.html#417 <system.html#417>`_ - - `setlocale`:idx: - `posix.html#847 <posix.html#847>`_ - - `setpgid`:idx: - `posix.html#1024 <posix.html#1024>`_ - - `setpgrp`:idx: - `posix.html#1025 <posix.html#1025>`_ - - `setpwent`:idx: - `posix.html#865 <posix.html#865>`_ - - `setregid`:idx: - `posix.html#1026 <posix.html#1026>`_ - - `setreuid`:idx: - `posix.html#1027 <posix.html#1027>`_ - - `setsid`:idx: - `posix.html#1028 <posix.html#1028>`_ - - `setuid`:idx: - `posix.html#1029 <posix.html#1029>`_ - - `shl`:idx: - * `system.html#226 <system.html#226>`_ - * `system.html#227 <system.html#227>`_ - * `system.html#228 <system.html#228>`_ - * `system.html#229 <system.html#229>`_ - * `system.html#230 <system.html#230>`_ - - `shm_open`:idx: - `posix.html#1090 <posix.html#1090>`_ - - `shm_unlink`:idx: - `posix.html#1091 <posix.html#1091>`_ - - `shr`:idx: - * `system.html#221 <system.html#221>`_ - * `system.html#222 <system.html#222>`_ - * `system.html#223 <system.html#223>`_ - * `system.html#224 <system.html#224>`_ - * `system.html#225 <system.html#225>`_ - - `S_IFBLK`:idx: - `posix.html#650 <posix.html#650>`_ - - `S_IFCHR`:idx: - `posix.html#651 <posix.html#651>`_ - - `S_IFDIR`:idx: - `posix.html#654 <posix.html#654>`_ - - `S_IFIFO`:idx: - `posix.html#652 <posix.html#652>`_ - - `S_IFLNK`:idx: - `posix.html#655 <posix.html#655>`_ - - `S_IFMT`:idx: - `posix.html#649 <posix.html#649>`_ - - `S_IFREG`:idx: - `posix.html#653 <posix.html#653>`_ - - `S_IFSOCK`:idx: - `posix.html#656 <posix.html#656>`_ - - `SIGABRT`:idx: - `posix.html#726 <posix.html#726>`_ - - `sigaction`:idx: - `posix.html#1128 <posix.html#1128>`_ - - `sigaddset`:idx: - `posix.html#1129 <posix.html#1129>`_ - - `SIGALRM`:idx: - `posix.html#727 <posix.html#727>`_ - - `sigaltstack`:idx: - `posix.html#1130 <posix.html#1130>`_ - - `SIG_BLOCK`:idx: - `posix.html#755 <posix.html#755>`_ - - `SIGBUS`:idx: - `posix.html#728 <posix.html#728>`_ - - `SIGCHLD`:idx: - `posix.html#729 <posix.html#729>`_ - - `SIGCONT`:idx: - `posix.html#730 <posix.html#730>`_ - - `sigdelset`:idx: - `posix.html#1131 <posix.html#1131>`_ - - `SIG_DFL`:idx: - `posix.html#719 <posix.html#719>`_ - - `sigemptyset`:idx: - `posix.html#1132 <posix.html#1132>`_ - - `SIG_ERR`:idx: - `posix.html#720 <posix.html#720>`_ - - `SIGEV_NONE`:idx: - `posix.html#723 <posix.html#723>`_ - - `SIGEV_SIGNAL`:idx: - `posix.html#724 <posix.html#724>`_ - - `SIGEV_THREAD`:idx: - `posix.html#725 <posix.html#725>`_ - - `sigfillset`:idx: - `posix.html#1133 <posix.html#1133>`_ - - `SIGFPE`:idx: - `posix.html#731 <posix.html#731>`_ - - `sighold`:idx: - `posix.html#1134 <posix.html#1134>`_ - - `SIGHUP`:idx: - `posix.html#732 <posix.html#732>`_ - - `SIG_IGN`:idx: - `posix.html#722 <posix.html#722>`_ - - `sigignore`:idx: - `posix.html#1135 <posix.html#1135>`_ - - `SIGILL`:idx: - `posix.html#733 <posix.html#733>`_ - - `SIGINT`:idx: - `posix.html#734 <posix.html#734>`_ - - `siginterrupt`:idx: - `posix.html#1136 <posix.html#1136>`_ - - `sigismember`:idx: - `posix.html#1137 <posix.html#1137>`_ - - `SIGKILL`:idx: - `posix.html#735 <posix.html#735>`_ - - `signal`:idx: - `posix.html#1138 <posix.html#1138>`_ - - `sigpause`:idx: - `posix.html#1139 <posix.html#1139>`_ - - `sigpending`:idx: - `posix.html#1140 <posix.html#1140>`_ - - `SIGPIPE`:idx: - `posix.html#736 <posix.html#736>`_ - - `SIGPOLL`:idx: - `posix.html#746 <posix.html#746>`_ - - `sigprocmask`:idx: - `posix.html#1141 <posix.html#1141>`_ - - `SIGPROF`:idx: - `posix.html#747 <posix.html#747>`_ - - `sigqueue`:idx: - `posix.html#1142 <posix.html#1142>`_ - - `SIGQUIT`:idx: - `posix.html#737 <posix.html#737>`_ - - `sigrelse`:idx: - `posix.html#1143 <posix.html#1143>`_ - - `SIGSEGV`:idx: - `posix.html#738 <posix.html#738>`_ - - `sigset`:idx: - `posix.html#1144 <posix.html#1144>`_ - - `SIG_SETMASK`:idx: - `posix.html#757 <posix.html#757>`_ - - `SIGSTKSZ`:idx: - `posix.html#767 <posix.html#767>`_ - - `SIGSTOP`:idx: - `posix.html#739 <posix.html#739>`_ - - `sigsuspend`:idx: - `posix.html#1145 <posix.html#1145>`_ - - `SIGSYS`:idx: - `posix.html#748 <posix.html#748>`_ - - `SIGTERM`:idx: - `posix.html#740 <posix.html#740>`_ - - `sigtimedwait`:idx: - `posix.html#1146 <posix.html#1146>`_ - - `SIGTRAP`:idx: - `posix.html#749 <posix.html#749>`_ - - `SIGTSTP`:idx: - `posix.html#741 <posix.html#741>`_ - - `SIGTTIN`:idx: - `posix.html#742 <posix.html#742>`_ - - `SIGTTOU`:idx: - `posix.html#743 <posix.html#743>`_ - - `SIG_UNBLOCK`:idx: - `posix.html#756 <posix.html#756>`_ - - `SIGURG`:idx: - `posix.html#750 <posix.html#750>`_ - - `SIGUSR1`:idx: - `posix.html#744 <posix.html#744>`_ - - `SIGUSR2`:idx: - `posix.html#745 <posix.html#745>`_ - - `SIGVTALRM`:idx: - `posix.html#751 <posix.html#751>`_ - - `sigwait`:idx: - `posix.html#1147 <posix.html#1147>`_ - - `sigwaitinfo`:idx: - `posix.html#1148 <posix.html#1148>`_ - - `SIGXCPU`:idx: - `posix.html#752 <posix.html#752>`_ - - `SIGXFSZ`:idx: - `posix.html#753 <posix.html#753>`_ - - `simple assertions`:idx: - `regexprs.html#103 <regexprs.html#103>`_ - - `simple statements`:idx: - `manual.html#174 <manual.html#174>`_ - - `sinh`:idx: - `math.html#124 <math.html#124>`_ - - `S_IRGRP`:idx: - `posix.html#662 <posix.html#662>`_ - - `S_IROTH`:idx: - `posix.html#666 <posix.html#666>`_ - - `S_IRUSR`:idx: - `posix.html#658 <posix.html#658>`_ - - `S_IRWXG`:idx: - `posix.html#661 <posix.html#661>`_ - - `S_IRWXO`:idx: - `posix.html#665 <posix.html#665>`_ - - `S_IRWXU`:idx: - `posix.html#657 <posix.html#657>`_ - - `S_ISBLK`:idx: - `posix.html#1067 <posix.html#1067>`_ - - `S_ISCHR`:idx: - `posix.html#1068 <posix.html#1068>`_ - - `S_ISDIR`:idx: - `posix.html#1069 <posix.html#1069>`_ - - `S_ISFIFO`:idx: - `posix.html#1070 <posix.html#1070>`_ - - `S_ISGID`:idx: - `posix.html#670 <posix.html#670>`_ - - `S_ISLNK`:idx: - `posix.html#1072 <posix.html#1072>`_ - - `S_ISREG`:idx: - `posix.html#1071 <posix.html#1071>`_ - - `S_ISSOCK`:idx: - `posix.html#1073 <posix.html#1073>`_ - - `S_ISUID`:idx: - `posix.html#669 <posix.html#669>`_ - - `S_ISVTX`:idx: - `posix.html#671 <posix.html#671>`_ - - `S_IWGRP`:idx: - `posix.html#663 <posix.html#663>`_ - - `S_IWOTH`:idx: - `posix.html#667 <posix.html#667>`_ - - `S_IWUSR`:idx: - `posix.html#659 <posix.html#659>`_ - - `S_IXGRP`:idx: - `posix.html#664 <posix.html#664>`_ - - `S_IXOTH`:idx: - `posix.html#668 <posix.html#668>`_ - - `S_IXUSR`:idx: - `posix.html#660 <posix.html#660>`_ - - `sizeof`:idx: - `system.html#156 <system.html#156>`_ - - `sleep`:idx: - `posix.html#1030 <posix.html#1030>`_ - - `split`:idx: - `strutils.html#119 <strutils.html#119>`_ - - `SplitFilename`:idx: - `os.html#125 <os.html#125>`_ - - `splitLines`:idx: - `strutils.html#120 <strutils.html#120>`_ - - `splitLinesSeq`:idx: - `strutils.html#121 <strutils.html#121>`_ - - `SplitPath`:idx: - `os.html#121 <os.html#121>`_ - - `splitSeq`:idx: - `strutils.html#122 <strutils.html#122>`_ - - `SQL_ACCESS_MODE`:idx: - `odbcsql.html#406 <odbcsql.html#406>`_ - - `SQL_ADD`:idx: - `odbcsql.html#317 <odbcsql.html#317>`_ - - `SQLAllocHandle`:idx: - `odbcsql.html#627 <odbcsql.html#627>`_ - - `SQL_ALL_TYPES`:idx: - `odbcsql.html#492 <odbcsql.html#492>`_ - - `SQL_API_SQLDESCRIBEPARAM`:idx: - `odbcsql.html#229 <odbcsql.html#229>`_ - - `SQL_ARD_TYPE`:idx: - `odbcsql.html#494 <odbcsql.html#494>`_ - - `SQL_ASYNC_ENABLE`:idx: - `odbcsql.html#383 <odbcsql.html#383>`_ - - `SQL_ATTR_ACCESS_MODE`:idx: - `odbcsql.html#415 <odbcsql.html#415>`_ - - `SQL_ATTR_APP_PARAM_DESC`:idx: - `odbcsql.html#374 <odbcsql.html#374>`_ - - `SQL_ATTR_APP_ROW_DESC`:idx: - `odbcsql.html#373 <odbcsql.html#373>`_ - - `SQL_ATTR_AUTOCOMMIT`:idx: - `odbcsql.html#400 <odbcsql.html#400>`_ - - `SQL_ATTR_AUTO_IPD`:idx: - `odbcsql.html#371 <odbcsql.html#371>`_ - - `SQL_ATTR_CONCURRENCY`:idx: - `odbcsql.html#395 <odbcsql.html#395>`_ - - `SQL_ATTR_CONNECTION_DEAD`:idx: - `odbcsql.html#416 <odbcsql.html#416>`_ - - `SQL_ATTR_CONNECTION_TIMEOUT`:idx: - `odbcsql.html#417 <odbcsql.html#417>`_ - - `SQL_ATTR_CURRENT_CATALOG`:idx: - `odbcsql.html#418 <odbcsql.html#418>`_ - - `SQL_ATTR_CURSOR_SCROLLABLE`:idx: - `odbcsql.html#377 <odbcsql.html#377>`_ - - `SQL_ATTR_CURSOR_SENSITIVITY`:idx: - `odbcsql.html#378 <odbcsql.html#378>`_ - - `SQL_ATTR_CURSOR_TYPE`:idx: - `odbcsql.html#394 <odbcsql.html#394>`_ - - `SQL_ATTR_DISCONNECT_BEHAVIOR`:idx: - `odbcsql.html#419 <odbcsql.html#419>`_ - - `SQL_ATTR_ENLIST_IN_DTC`:idx: - `odbcsql.html#420 <odbcsql.html#420>`_ - - `SQL_ATTR_ENLIST_IN_XA`:idx: - `odbcsql.html#421 <odbcsql.html#421>`_ - - `SQL_ATTR_FETCH_BOOKMARK_PTR`:idx: - `odbcsql.html#396 <odbcsql.html#396>`_ - - `SQL_ATTR_IMP_PARAM_DESC`:idx: - `odbcsql.html#376 <odbcsql.html#376>`_ - - `SQL_ATTR_IMP_ROW_DESC`:idx: - `odbcsql.html#375 <odbcsql.html#375>`_ - - `SQL_ATTR_LOGIN_TIMEOUT`:idx: - `odbcsql.html#422 <odbcsql.html#422>`_ - - `SQL_ATTR_MAX_ROWS`:idx: - `odbcsql.html#404 <odbcsql.html#404>`_ - - `SQL_ATTR_METADATA_ID`:idx: - `odbcsql.html#372 <odbcsql.html#372>`_ - - `SQL_ATTR_ODBC_CURSORS`:idx: - `odbcsql.html#341 <odbcsql.html#341>`_ - - `SQL_ATTR_ODBC_VERSION`:idx: - `odbcsql.html#240 <odbcsql.html#240>`_ - - `SQL_ATTR_OUTPUT_NTS`:idx: - `odbcsql.html#370 <odbcsql.html#370>`_ - - `SQL_ATTR_PACKET_SIZE`:idx: - `odbcsql.html#423 <odbcsql.html#423>`_ - - `SQL_ATTR_QUIET_MODE`:idx: - `odbcsql.html#424 <odbcsql.html#424>`_ - - `SQL_ATTR_ROW_ARRAY_SIZE`:idx: - `odbcsql.html#620 <odbcsql.html#620>`_ - - `SQL_ATTR_ROW_NUMBER`:idx: - `odbcsql.html#401 <odbcsql.html#401>`_ - - `SQL_ATTR_ROWS_FETCHED_PTR`:idx: - `odbcsql.html#398 <odbcsql.html#398>`_ - - `SQL_ATTR_ROW_STATUS_PTR`:idx: - `odbcsql.html#397 <odbcsql.html#397>`_ - - `SQL_ATTR_TRACE`:idx: - `odbcsql.html#425 <odbcsql.html#425>`_ - - `SQL_ATTR_TRACEFILE`:idx: - `odbcsql.html#426 <odbcsql.html#426>`_ - - `SQL_ATTR_TRANSLATE_LIB`:idx: - `odbcsql.html#427 <odbcsql.html#427>`_ - - `SQL_ATTR_TRANSLATE_OPTION`:idx: - `odbcsql.html#428 <odbcsql.html#428>`_ - - `SQL_ATTR_TXN_ISOLATION`:idx: - `odbcsql.html#403 <odbcsql.html#403>`_ - - `SQL_ATTR_USE_BOOKMARKS`:idx: - `odbcsql.html#405 <odbcsql.html#405>`_ - - `SQL_AUTOCOMMIT`:idx: - `odbcsql.html#399 <odbcsql.html#399>`_ - - `SQL_AUTOCOMMIT_DEFAULT`:idx: - `odbcsql.html#434 <odbcsql.html#434>`_ - - `SQL_AUTOCOMMIT_OFF`:idx: - `odbcsql.html#432 <odbcsql.html#432>`_ - - `SQL_AUTOCOMMIT_ON`:idx: - `odbcsql.html#433 <odbcsql.html#433>`_ - - `SQL_BEST_ROWID`:idx: - `odbcsql.html#523 <odbcsql.html#523>`_ - - `SQL_BIGINT`:idx: - `odbcsql.html#130 <odbcsql.html#130>`_ - - `SQL_BINARY`:idx: - `odbcsql.html#127 <odbcsql.html#127>`_ - - `SQLBindCol`:idx: - `odbcsql.html#652 <odbcsql.html#652>`_ - - `SQLBindParameter`:idx: - `odbcsql.html#660 <odbcsql.html#660>`_ - - `SQL_BIND_TYPE`:idx: - `odbcsql.html#384 <odbcsql.html#384>`_ - - `SQL_BIT`:idx: - `odbcsql.html#132 <odbcsql.html#132>`_ - - `SQL_BOOKMARK_PERSISTENCE`:idx: - `odbcsql.html#262 <odbcsql.html#262>`_ - - `SQL_BP_CLOSE`:idx: - `odbcsql.html#264 <odbcsql.html#264>`_ - - `SQL_BP_DELETE`:idx: - `odbcsql.html#265 <odbcsql.html#265>`_ - - `SQL_BP_DROP`:idx: - `odbcsql.html#266 <odbcsql.html#266>`_ - - `SQL_BP_OTHER_HSTMT`:idx: - `odbcsql.html#269 <odbcsql.html#269>`_ - - `SQL_BP_SCROLL`:idx: - `odbcsql.html#270 <odbcsql.html#270>`_ - - `SQL_BP_TRANSACTION`:idx: - `odbcsql.html#267 <odbcsql.html#267>`_ - - `SQL_BP_UPDATE`:idx: - `odbcsql.html#268 <odbcsql.html#268>`_ - - `SQLBrowseConnect`:idx: - `odbcsql.html#636 <odbcsql.html#636>`_ - - `SQLBulkOperations`:idx: - `odbcsql.html#650 <odbcsql.html#650>`_ - - `SQL_CA1_ABSOLUTE`:idx: - `odbcsql.html#282 <odbcsql.html#282>`_ - - `SQL_CA1_BOOKMARK`:idx: - `odbcsql.html#284 <odbcsql.html#284>`_ - - `SQL_CA1_BULK_ADD`:idx: - `odbcsql.html#295 <odbcsql.html#295>`_ - - `SQL_CA1_BULK_DELETE_BY_BOOKMARK`:idx: - `odbcsql.html#297 <odbcsql.html#297>`_ - - `SQL_CA1_BULK_FETCH_BY_BOOKMARK`:idx: - `odbcsql.html#298 <odbcsql.html#298>`_ - - `SQL_CA1_BULK_UPDATE_BY_BOOKMARK`:idx: - `odbcsql.html#296 <odbcsql.html#296>`_ - - `SQL_CA1_LOCK_EXCLUSIVE`:idx: - `odbcsql.html#286 <odbcsql.html#286>`_ - - `SQL_CA1_LOCK_NO_CHANGE`:idx: - `odbcsql.html#285 <odbcsql.html#285>`_ - - `SQL_CA1_LOCK_UNLOCK`:idx: - `odbcsql.html#287 <odbcsql.html#287>`_ - - `SQL_CA1_NEXT`:idx: - `odbcsql.html#281 <odbcsql.html#281>`_ - - `SQL_CA1_POS_DELETE`:idx: - `odbcsql.html#290 <odbcsql.html#290>`_ - - `SQL_CA1_POSITIONED_DELETE`:idx: - `odbcsql.html#293 <odbcsql.html#293>`_ - - `SQL_CA1_POSITIONED_UPDATE`:idx: - `odbcsql.html#292 <odbcsql.html#292>`_ - - `SQL_CA1_POS_POSITION`:idx: - `odbcsql.html#288 <odbcsql.html#288>`_ - - `SQL_CA1_POS_REFRESH`:idx: - `odbcsql.html#291 <odbcsql.html#291>`_ - - `SQL_CA1_POS_UPDATE`:idx: - `odbcsql.html#289 <odbcsql.html#289>`_ - - `SQL_CA1_RELATIVE`:idx: - `odbcsql.html#283 <odbcsql.html#283>`_ - - `SQL_CA1_SELECT_FOR_UPDATE`:idx: - `odbcsql.html#294 <odbcsql.html#294>`_ - - `SQL_CA2_CRC_APPROXIMATE`:idx: - `odbcsql.html#313 <odbcsql.html#313>`_ - - `SQL_CA2_CRC_EXACT`:idx: - `odbcsql.html#312 <odbcsql.html#312>`_ - - `SQL_CA2_LOCK_CONCURRENCY`:idx: - `odbcsql.html#300 <odbcsql.html#300>`_ - - `SQL_CA2_MAX_ROWS_AFFECTS_ALL`:idx: - `odbcsql.html#311 <odbcsql.html#311>`_ - - `SQL_CA2_MAX_ROWS_CATALOG`:idx: - `odbcsql.html#310 <odbcsql.html#310>`_ - - `SQL_CA2_MAX_ROWS_DELETE`:idx: - `odbcsql.html#308 <odbcsql.html#308>`_ - - `SQL_CA2_MAX_ROWS_INSERT`:idx: - `odbcsql.html#307 <odbcsql.html#307>`_ - - `SQL_CA2_MAX_ROWS_SELECT`:idx: - `odbcsql.html#306 <odbcsql.html#306>`_ - - `SQL_CA2_MAX_ROWS_UPDATE`:idx: - `odbcsql.html#309 <odbcsql.html#309>`_ - - `SQL_CA2_OPT_ROWVER_CONCURRENCY`:idx: - `odbcsql.html#301 <odbcsql.html#301>`_ - - `SQL_CA2_OPT_VALUES_CONCURRENCY`:idx: - `odbcsql.html#302 <odbcsql.html#302>`_ - - `SQL_CA2_READ_ONLY_CONCURRENCY`:idx: - `odbcsql.html#299 <odbcsql.html#299>`_ - - `SQL_CA2_SENSITIVITY_ADDITIONS`:idx: - `odbcsql.html#303 <odbcsql.html#303>`_ - - `SQL_CA2_SENSITIVITY_DELETIONS`:idx: - `odbcsql.html#304 <odbcsql.html#304>`_ - - `SQL_CA2_SENSITIVITY_UPDATES`:idx: - `odbcsql.html#305 <odbcsql.html#305>`_ - - `SQL_CA2_SIMULATE_NON_UNIQUE`:idx: - `odbcsql.html#314 <odbcsql.html#314>`_ - - `SQL_CA2_SIMULATE_TRY_UNIQUE`:idx: - `odbcsql.html#315 <odbcsql.html#315>`_ - - `SQL_CA2_SIMULATE_UNIQUE`:idx: - `odbcsql.html#316 <odbcsql.html#316>`_ - - `SQL_CATALOG_NAME`:idx: - `odbcsql.html#545 <odbcsql.html#545>`_ - - `SQL_C_BINARY`:idx: - `odbcsql.html#212 <odbcsql.html#212>`_ - - `SQL_C_BIT`:idx: - `odbcsql.html#213 <odbcsql.html#213>`_ - - `SQL_C_BOOKMARK`:idx: - `odbcsql.html#223 <odbcsql.html#223>`_ - - `SQL_C_CHAR`:idx: - `odbcsql.html#184 <odbcsql.html#184>`_ - - `SQL_C_DATE`:idx: - `odbcsql.html#193 <odbcsql.html#193>`_ - - `SQL_C_DEFAULT`:idx: - `odbcsql.html#190 <odbcsql.html#190>`_ - - `SQL_C_DOUBLE`:idx: - `odbcsql.html#188 <odbcsql.html#188>`_ - - `SQL_C_FLOAT`:idx: - `odbcsql.html#187 <odbcsql.html#187>`_ - - `SQL_C_GUID`:idx: - `odbcsql.html#224 <odbcsql.html#224>`_ - - `SQL_CHAR`:idx: - `odbcsql.html#136 <odbcsql.html#136>`_ - - `SQL_C_INTERVAL_DAY`:idx: - `odbcsql.html#201 <odbcsql.html#201>`_ - - `SQL_C_INTERVAL_DAY_TO_HOUR`:idx: - `odbcsql.html#206 <odbcsql.html#206>`_ - - `SQL_C_INTERVAL_DAY_TO_MINUTE`:idx: - `odbcsql.html#207 <odbcsql.html#207>`_ - - `SQL_C_INTERVAL_DAY_TO_SECOND`:idx: - `odbcsql.html#208 <odbcsql.html#208>`_ - - `SQL_C_INTERVAL_HOUR`:idx: - `odbcsql.html#202 <odbcsql.html#202>`_ - - `SQL_C_INTERVAL_HOUR_TO_MINUTE`:idx: - `odbcsql.html#209 <odbcsql.html#209>`_ - - `SQL_C_INTERVAL_HOUR_TO_SECOND`:idx: - `odbcsql.html#210 <odbcsql.html#210>`_ - - `SQL_C_INTERVAL_MINUTE`:idx: - `odbcsql.html#203 <odbcsql.html#203>`_ - - `SQL_C_INTERVAL_MINUTE_TO_SECOND`:idx: - `odbcsql.html#211 <odbcsql.html#211>`_ - - `SQL_C_INTERVAL_MONTH`:idx: - `odbcsql.html#200 <odbcsql.html#200>`_ - - `SQL_C_INTERVAL_SECOND`:idx: - `odbcsql.html#204 <odbcsql.html#204>`_ - - `SQL_C_INTERVAL_YEAR`:idx: - `odbcsql.html#199 <odbcsql.html#199>`_ - - `SQL_C_INTERVAL_YEAR_TO_MONTH`:idx: - `odbcsql.html#205 <odbcsql.html#205>`_ - - `SQL_C_LONG`:idx: - `odbcsql.html#185 <odbcsql.html#185>`_ - - `SQL_CLOSE`:idx: - `odbcsql.html#503 <odbcsql.html#503>`_ - - `SQLCloseCursor`:idx: - `odbcsql.html#639 <odbcsql.html#639>`_ - - `SQL_C_NUMERIC`:idx: - `odbcsql.html#189 <odbcsql.html#189>`_ - - `SQL_CODE_DATE`:idx: - `odbcsql.html#495 <odbcsql.html#495>`_ - - `SQL_CODE_DAY`:idx: - `odbcsql.html#156 <odbcsql.html#156>`_ - - `SQL_CODE_DAY_TO_HOUR`:idx: - `odbcsql.html#161 <odbcsql.html#161>`_ - - `SQL_CODE_DAY_TO_MINUTE`:idx: - `odbcsql.html#162 <odbcsql.html#162>`_ - - `SQL_CODE_DAY_TO_SECOND`:idx: - `odbcsql.html#163 <odbcsql.html#163>`_ - - `SQL_CODE_HOUR`:idx: - `odbcsql.html#157 <odbcsql.html#157>`_ - - `SQL_CODE_HOUR_TO_MINUTE`:idx: - `odbcsql.html#164 <odbcsql.html#164>`_ - - `SQL_CODE_HOUR_TO_SECOND`:idx: - `odbcsql.html#165 <odbcsql.html#165>`_ - - `SQL_CODE_MINUTE`:idx: - `odbcsql.html#158 <odbcsql.html#158>`_ - - `SQL_CODE_MINUTE_TO_SECOND`:idx: - `odbcsql.html#166 <odbcsql.html#166>`_ - - `SQL_CODE_MONTH`:idx: - `odbcsql.html#155 <odbcsql.html#155>`_ - - `SQL_CODE_SECOND`:idx: - `odbcsql.html#159 <odbcsql.html#159>`_ - - `SQL_CODE_TIME`:idx: - `odbcsql.html#496 <odbcsql.html#496>`_ - - `SQL_CODE_TIMESTAMP`:idx: - `odbcsql.html#497 <odbcsql.html#497>`_ - - `SQL_CODE_YEAR`:idx: - `odbcsql.html#154 <odbcsql.html#154>`_ - - `SQL_CODE_YEAR_TO_MONTH`:idx: - `odbcsql.html#160 <odbcsql.html#160>`_ - - `SQL_COLATT_OPT_MAX`:idx: - `odbcsql.html#588 <odbcsql.html#588>`_ - - `SQLColAttribute`:idx: - `odbcsql.html#662 <odbcsql.html#662>`_ - - `SQL_COLLATION_SEQ`:idx: - `odbcsql.html#546 <odbcsql.html#546>`_ - - `SQL_COLUMN_AUTO_INCREMENT`:idx: - `odbcsql.html#580 <odbcsql.html#580>`_ - - `SQL_COLUMN_CASE_SENSITIVE`:idx: - `odbcsql.html#581 <odbcsql.html#581>`_ - - `SQL_COLUMN_COUNT`:idx: - `odbcsql.html#569 <odbcsql.html#569>`_ - - `SQL_COLUMN_DISPLAY_SIZE`:idx: - `odbcsql.html#575 <odbcsql.html#575>`_ - - `SQL_COLUMN_DRIVER_START`:idx: - `odbcsql.html#589 <odbcsql.html#589>`_ - - `SQL_COLUMN_LABEL`:idx: - `odbcsql.html#587 <odbcsql.html#587>`_ - - `SQL_COLUMN_LENGTH`:idx: - `odbcsql.html#572 <odbcsql.html#572>`_ - - `SQL_COLUMN_MONEY`:idx: - `odbcsql.html#578 <odbcsql.html#578>`_ - - `SQL_COLUMN_NAME`:idx: - `odbcsql.html#570 <odbcsql.html#570>`_ - - `SQL_COLUMN_NULLABLE`:idx: - `odbcsql.html#576 <odbcsql.html#576>`_ - - `SQL_COLUMN_OWNER_NAME`:idx: - `odbcsql.html#585 <odbcsql.html#585>`_ - - `SQL_COLUMN_PRECISION`:idx: - `odbcsql.html#573 <odbcsql.html#573>`_ - - `SQL_COLUMN_QUALIFIER_NAME`:idx: - `odbcsql.html#586 <odbcsql.html#586>`_ - - `SQLColumns`:idx: - `odbcsql.html#665 <odbcsql.html#665>`_ - - `SQL_COLUMN_SCALE`:idx: - `odbcsql.html#574 <odbcsql.html#574>`_ - - `SQL_COLUMN_SEARCHABLE`:idx: - `odbcsql.html#582 <odbcsql.html#582>`_ - - `SQL_COLUMN_TABLE_NAME`:idx: - `odbcsql.html#584 <odbcsql.html#584>`_ - - `SQL_COLUMN_TYPE`:idx: - `odbcsql.html#571 <odbcsql.html#571>`_ - - `SQL_COLUMN_TYPE_NAME`:idx: - `odbcsql.html#583 <odbcsql.html#583>`_ - - `SQL_COLUMN_UNSIGNED`:idx: - `odbcsql.html#577 <odbcsql.html#577>`_ - - `SQL_COLUMN_UPDATABLE`:idx: - `odbcsql.html#579 <odbcsql.html#579>`_ - - `SQL_COMMIT`:idx: - `odbcsql.html#618 <odbcsql.html#618>`_ - - `SQL_CONCUR_DEFAULT`:idx: - `odbcsql.html#446 <odbcsql.html#446>`_ - - `SQL_CONCUR_LOCK`:idx: - `odbcsql.html#443 <odbcsql.html#443>`_ - - `SQL_CONCUR_READ_ONLY`:idx: - `odbcsql.html#442 <odbcsql.html#442>`_ - - `SQL_CONCURRENCY`:idx: - `odbcsql.html#386 <odbcsql.html#386>`_ - - `SQL_CONCUR_ROWVER`:idx: - `odbcsql.html#444 <odbcsql.html#444>`_ - - `SQL_CONCUR_VALUES`:idx: - `odbcsql.html#445 <odbcsql.html#445>`_ - - `SQLConnect`:idx: - `odbcsql.html#633 <odbcsql.html#633>`_ - - `SQL_C_SBIGINT`:idx: - `odbcsql.html#214 <odbcsql.html#214>`_ - - `SQL_C_SHORT`:idx: - `odbcsql.html#186 <odbcsql.html#186>`_ - - `SQL_C_SLONG`:idx: - `odbcsql.html#217 <odbcsql.html#217>`_ - - `SQL_C_SSHORT`:idx: - `odbcsql.html#218 <odbcsql.html#218>`_ - - `SQL_C_STINYINT`:idx: - `odbcsql.html#219 <odbcsql.html#219>`_ - - `SQL_C_TIME`:idx: - `odbcsql.html#194 <odbcsql.html#194>`_ - - `SQL_C_TIMESTAMP`:idx: - `odbcsql.html#195 <odbcsql.html#195>`_ - - `SQL_C_TINYINT`:idx: - `odbcsql.html#216 <odbcsql.html#216>`_ - - `SQL_C_TYPE_DATE`:idx: - `odbcsql.html#196 <odbcsql.html#196>`_ - - `SQL_C_TYPE_TIME`:idx: - `odbcsql.html#197 <odbcsql.html#197>`_ - - `SQL_C_TYPE_TIMESTAMP`:idx: - `odbcsql.html#198 <odbcsql.html#198>`_ - - `SQL_C_UBIGINT`:idx: - `odbcsql.html#215 <odbcsql.html#215>`_ - - `SQL_C_ULONG`:idx: - `odbcsql.html#220 <odbcsql.html#220>`_ - - `SQL_CUR_DEFAULT`:idx: - `odbcsql.html#345 <odbcsql.html#345>`_ - - `SQL_CURRENT_QUALIFIER`:idx: - `odbcsql.html#412 <odbcsql.html#412>`_ - - `SQL_CURSOR_DYNAMIC`:idx: - `odbcsql.html#439 <odbcsql.html#439>`_ - - `SQL_CURSOR_FORWARD_ONLY`:idx: - `odbcsql.html#437 <odbcsql.html#437>`_ - - `SQL_CURSOR_KEYSET_DRIVEN`:idx: - `odbcsql.html#438 <odbcsql.html#438>`_ - - `SQL_CURSOR_SENSITIVITY`:idx: - `odbcsql.html#543 <odbcsql.html#543>`_ - - `SQL_CURSOR_STATIC`:idx: - `odbcsql.html#440 <odbcsql.html#440>`_ - - `SQL_CURSOR_TYPE`:idx: - `odbcsql.html#385 <odbcsql.html#385>`_ - - `SQL_CURSOR_TYPE_DEFAULT`:idx: - `odbcsql.html#441 <odbcsql.html#441>`_ - - `SQL_CUR_USE_DRIVER`:idx: - `odbcsql.html#344 <odbcsql.html#344>`_ - - `SQL_CUR_USE_IF_NEEDED`:idx: - `odbcsql.html#342 <odbcsql.html#342>`_ - - `SQL_CUR_USE_ODBC`:idx: - `odbcsql.html#343 <odbcsql.html#343>`_ - - `SQL_C_USHORT`:idx: - `odbcsql.html#221 <odbcsql.html#221>`_ - - `SQL_C_UTINYINT`:idx: - `odbcsql.html#222 <odbcsql.html#222>`_ - - `SQL_C_VARBOOKMARK`:idx: - `odbcsql.html#228 <odbcsql.html#228>`_ - - `SQL_DATA_AT_EXEC`:idx: - `odbcsql.html#353 <odbcsql.html#353>`_ - - `SQLDataSources`:idx: - `odbcsql.html#654 <odbcsql.html#654>`_ - - `SQL_DATE`:idx: - `odbcsql.html#149 <odbcsql.html#149>`_ - - `SQL_DATE_LEN`:idx: - `odbcsql.html#363 <odbcsql.html#363>`_ - - `SQL_DATE_STRUCT`:idx: - `odbcsql.html#231 <odbcsql.html#231>`_ - - `SQL_DATETIME`:idx: - `odbcsql.html#144 <odbcsql.html#144>`_ - - `SQL_DECIMAL`:idx: - `odbcsql.html#138 <odbcsql.html#138>`_ - - `SQL_DEFAULT`:idx: - `odbcsql.html#493 <odbcsql.html#493>`_ - - `SQL_DELETE`:idx: - `odbcsql.html#325 <odbcsql.html#325>`_ - - `SQL_DELETE_BY_BOOKMARK`:idx: - `odbcsql.html#320 <odbcsql.html#320>`_ - - `SQL_DESC_ALLOC_TYPE`:idx: - `odbcsql.html#460 <odbcsql.html#460>`_ - - `SQL_DESC_ARRAY_SIZE`:idx: - `odbcsql.html#590 <odbcsql.html#590>`_ - - `SQL_DESC_ARRAY_STATUS_PTR`:idx: - `odbcsql.html#591 <odbcsql.html#591>`_ - - `SQL_DESC_AUTO_UNIQUE_VALUE`:idx: - `odbcsql.html#592 <odbcsql.html#592>`_ - - `SQL_DESC_BASE_COLUMN_NAME`:idx: - `odbcsql.html#593 <odbcsql.html#593>`_ - - `SQL_DESC_BASE_TABLE_NAME`:idx: - `odbcsql.html#594 <odbcsql.html#594>`_ - - `SQL_DESC_BIND_OFFSET_PTR`:idx: - `odbcsql.html#595 <odbcsql.html#595>`_ - - `SQL_DESC_BIND_TYPE`:idx: - `odbcsql.html#596 <odbcsql.html#596>`_ - - `SQL_DESC_CASE_SENSITIVE`:idx: - `odbcsql.html#597 <odbcsql.html#597>`_ - - `SQL_DESC_CATALOG_NAME`:idx: - `odbcsql.html#598 <odbcsql.html#598>`_ - - `SQL_DESC_CONCISE_TYPE`:idx: - `odbcsql.html#599 <odbcsql.html#599>`_ - - `SQL_DESC_COUNT`:idx: - `odbcsql.html#447 <odbcsql.html#447>`_ - - `SQL_DESC_DATA_PTR`:idx: - `odbcsql.html#456 <odbcsql.html#456>`_ - - `SQL_DESC_DATETIME_INTERVAL_CODE`:idx: - `odbcsql.html#453 <odbcsql.html#453>`_ - - `SQL_DESC_DATETIME_INTERVAL_PRECISION`:idx: - `odbcsql.html#600 <odbcsql.html#600>`_ - - `SQL_DESC_DISPLAY_SIZE`:idx: - `odbcsql.html#601 <odbcsql.html#601>`_ - - `SQL_DESC_FIXED_PREC_SCALE`:idx: - `odbcsql.html#602 <odbcsql.html#602>`_ - - `SQL_DESC_INDICATOR_PTR`:idx: - `odbcsql.html#455 <odbcsql.html#455>`_ - - `SQL_DESC_LABEL`:idx: - `odbcsql.html#603 <odbcsql.html#603>`_ - - `SQL_DESC_LENGTH`:idx: - `odbcsql.html#449 <odbcsql.html#449>`_ - - `SQL_DESC_LITERAL_PREFIX`:idx: - `odbcsql.html#604 <odbcsql.html#604>`_ - - `SQL_DESC_LITERAL_SUFFIX`:idx: - `odbcsql.html#605 <odbcsql.html#605>`_ - - `SQL_DESC_LOCAL_TYPE_NAME`:idx: - `odbcsql.html#606 <odbcsql.html#606>`_ - - `SQL_DESC_MAXIMUM_SCALE`:idx: - `odbcsql.html#607 <odbcsql.html#607>`_ - - `SQL_DESC_MINIMUM_SCALE`:idx: - `odbcsql.html#608 <odbcsql.html#608>`_ - - `SQL_DESC_NAME`:idx: - `odbcsql.html#457 <odbcsql.html#457>`_ - - `SQL_DESC_NULLABLE`:idx: - `odbcsql.html#454 <odbcsql.html#454>`_ - - `SQL_DESC_NUM_PREC_RADIX`:idx: - `odbcsql.html#609 <odbcsql.html#609>`_ - - `SQL_DESC_OCTET_LENGTH`:idx: - `odbcsql.html#459 <odbcsql.html#459>`_ - - `SQL_DESC_OCTET_LENGTH_PTR`:idx: - `odbcsql.html#450 <odbcsql.html#450>`_ - - `SQL_DESC_PARAMETER_TYPE`:idx: - `odbcsql.html#610 <odbcsql.html#610>`_ - - `SQL_DESC_PRECISION`:idx: - `odbcsql.html#451 <odbcsql.html#451>`_ - - `SQLDescribeCol`:idx: - `odbcsql.html#643 <odbcsql.html#643>`_ - - `SQL_DESCRIBE_PARAMETER`:idx: - `odbcsql.html#544 <odbcsql.html#544>`_ - - `SQL_DESC_ROWS_PROCESSED_PTR`:idx: - `odbcsql.html#611 <odbcsql.html#611>`_ - - `SQL_DESC_SCALE`:idx: - `odbcsql.html#452 <odbcsql.html#452>`_ - - `SQL_DESC_SCHEMA_NAME`:idx: - `odbcsql.html#612 <odbcsql.html#612>`_ - - `SQL_DESC_SEARCHABLE`:idx: - `odbcsql.html#613 <odbcsql.html#613>`_ - - `SQL_DESC_TABLE_NAME`:idx: - `odbcsql.html#615 <odbcsql.html#615>`_ - - `SQL_DESC_TYPE`:idx: - `odbcsql.html#448 <odbcsql.html#448>`_ - - `SQL_DESC_TYPE_NAME`:idx: - `odbcsql.html#614 <odbcsql.html#614>`_ - - `SQL_DESC_UNNAMED`:idx: - `odbcsql.html#458 <odbcsql.html#458>`_ - - `SQL_DESC_UNSIGNED`:idx: - `odbcsql.html#616 <odbcsql.html#616>`_ - - `SQL_DESC_UPDATABLE`:idx: - `odbcsql.html#617 <odbcsql.html#617>`_ - - `SQL_DIAG_ALTER_TABLE`:idx: - `odbcsql.html#473 <odbcsql.html#473>`_ - - `SQL_DIAG_CLASS_ORIGIN`:idx: - `odbcsql.html#468 <odbcsql.html#468>`_ - - `SQL_DIAG_CONNECTION_NAME`:idx: - `odbcsql.html#470 <odbcsql.html#470>`_ - - `SQL_DIAG_CREATE_INDEX`:idx: - `odbcsql.html#474 <odbcsql.html#474>`_ - - `SQL_DIAG_CREATE_TABLE`:idx: - `odbcsql.html#475 <odbcsql.html#475>`_ - - `SQL_DIAG_CREATE_VIEW`:idx: - `odbcsql.html#476 <odbcsql.html#476>`_ - - `SQL_DIAG_DELETE_WHERE`:idx: - `odbcsql.html#477 <odbcsql.html#477>`_ - - `SQL_DIAG_DROP_INDEX`:idx: - `odbcsql.html#478 <odbcsql.html#478>`_ - - `SQL_DIAG_DROP_TABLE`:idx: - `odbcsql.html#479 <odbcsql.html#479>`_ - - `SQL_DIAG_DROP_VIEW`:idx: - `odbcsql.html#480 <odbcsql.html#480>`_ - - `SQL_DIAG_DYNAMIC_DELETE_CURSOR`:idx: - `odbcsql.html#481 <odbcsql.html#481>`_ - - `SQL_DIAG_DYNAMIC_FUNCTION`:idx: - `odbcsql.html#467 <odbcsql.html#467>`_ - - `SQL_DIAG_DYNAMIC_FUNCTION_CODE`:idx: - `odbcsql.html#472 <odbcsql.html#472>`_ - - `SQL_DIAG_DYNAMIC_UPDATE_CURSOR`:idx: - `odbcsql.html#482 <odbcsql.html#482>`_ - - `SQL_DIAG_GRANT`:idx: - `odbcsql.html#483 <odbcsql.html#483>`_ - - `SQL_DIAG_INSERT`:idx: - `odbcsql.html#484 <odbcsql.html#484>`_ - - `SQL_DIAG_MESSAGE_TEXT`:idx: - `odbcsql.html#466 <odbcsql.html#466>`_ - - `SQL_DIAG_NATIVE`:idx: - `odbcsql.html#465 <odbcsql.html#465>`_ - - `SQL_DIAG_NUMBER`:idx: - `odbcsql.html#462 <odbcsql.html#462>`_ - - `SQL_DIAG_RETURNCODE`:idx: - `odbcsql.html#461 <odbcsql.html#461>`_ - - `SQL_DIAG_REVOKE`:idx: - `odbcsql.html#485 <odbcsql.html#485>`_ - - `SQL_DIAG_ROW_COUNT`:idx: - `odbcsql.html#463 <odbcsql.html#463>`_ - - `SQL_DIAG_SELECT_CURSOR`:idx: - `odbcsql.html#486 <odbcsql.html#486>`_ - - `SQL_DIAG_SERVER_NAME`:idx: - `odbcsql.html#471 <odbcsql.html#471>`_ - - `SQL_DIAG_SQLSTATE`:idx: - `odbcsql.html#464 <odbcsql.html#464>`_ - - `SQL_DIAG_SUBCLASS_ORIGIN`:idx: - `odbcsql.html#469 <odbcsql.html#469>`_ - - `SQL_DIAG_UNKNOWN_STATEMENT`:idx: - `odbcsql.html#487 <odbcsql.html#487>`_ - - `SQL_DIAG_UPDATE_WHERE`:idx: - `odbcsql.html#488 <odbcsql.html#488>`_ - - `SQLDisconnect`:idx: - `odbcsql.html#634 <odbcsql.html#634>`_ - - `SQL_DOUBLE`:idx: - `odbcsql.html#143 <odbcsql.html#143>`_ - - `SQL_DRIVER_COMPLETE`:idx: - `odbcsql.html#242 <odbcsql.html#242>`_ - - `SQL_DRIVER_COMPLETE_REQUIRED`:idx: - `odbcsql.html#244 <odbcsql.html#244>`_ - - `SQLDriverConnect`:idx: - `odbcsql.html#635 <odbcsql.html#635>`_ - - `SQL_DRIVER_NOPROMPT`:idx: - `odbcsql.html#241 <odbcsql.html#241>`_ - - `SQL_DRIVER_PROMPT`:idx: - `odbcsql.html#243 <odbcsql.html#243>`_ - - `SQLDrivers`:idx: - `odbcsql.html#655 <odbcsql.html#655>`_ - - `SQL_DROP`:idx: - `odbcsql.html#504 <odbcsql.html#504>`_ - - `SQL_DYNAMIC_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#271 <odbcsql.html#271>`_ - - `SQL_DYNAMIC_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#272 <odbcsql.html#272>`_ - - `SQLEndTran`:idx: - `odbcsql.html#663 <odbcsql.html#663>`_ - - `SQL_ENSURE`:idx: - `odbcsql.html#529 <odbcsql.html#529>`_ - - `SQL_ERROR`:idx: - `odbcsql.html#357 <odbcsql.html#357>`_ - - `SQLExecDirect`:idx: - `odbcsql.html#637 <odbcsql.html#637>`_ - - `SQLExecute`:idx: - `odbcsql.html#640 <odbcsql.html#640>`_ - - `SQLExtendedFetch`:idx: - `odbcsql.html#645 <odbcsql.html#645>`_ - - `SQL_FALSE`:idx: - `odbcsql.html#498 <odbcsql.html#498>`_ - - `SQLFetch`:idx: - `odbcsql.html#641 <odbcsql.html#641>`_ - - `SQL_FETCH_ABSOLUTE`:idx: - `odbcsql.html#513 <odbcsql.html#513>`_ - - `SQL_FETCH_BOOKMARK`:idx: - `odbcsql.html#250 <odbcsql.html#250>`_ - - `SQL_FETCH_BY_BOOKMARK`:idx: - `odbcsql.html#321 <odbcsql.html#321>`_ - - `SQL_FETCH_FIRST`:idx: - `odbcsql.html#508 <odbcsql.html#508>`_ - - `SQL_FETCH_FIRST_SYSTEM`:idx: - `odbcsql.html#510 <odbcsql.html#510>`_ - - `SQL_FETCH_FIRST_USER`:idx: - `odbcsql.html#509 <odbcsql.html#509>`_ - - `SQL_FETCH_LAST`:idx: - `odbcsql.html#511 <odbcsql.html#511>`_ - - `SQL_FETCH_NEXT`:idx: - `odbcsql.html#507 <odbcsql.html#507>`_ - - `SQL_FETCH_PRIOR`:idx: - `odbcsql.html#512 <odbcsql.html#512>`_ - - `SQL_FETCH_RELATIVE`:idx: - `odbcsql.html#514 <odbcsql.html#514>`_ - - `SQLFetchScroll`:idx: - `odbcsql.html#644 <odbcsql.html#644>`_ - - `SQL_FLOAT`:idx: - `odbcsql.html#141 <odbcsql.html#141>`_ - - `SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#273 <odbcsql.html#273>`_ - - `SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#274 <odbcsql.html#274>`_ - - `SQLFreeHandle`:idx: - `odbcsql.html#630 <odbcsql.html#630>`_ - - `SQLFreeStmt`:idx: - `odbcsql.html#661 <odbcsql.html#661>`_ - - `SQL_GET_BOOKMARK`:idx: - `odbcsql.html#392 <odbcsql.html#392>`_ - - `SQLGetCursorName`:idx: - `odbcsql.html#657 <odbcsql.html#657>`_ - - `SQLGetData`:idx: - `odbcsql.html#646 <odbcsql.html#646>`_ - - `SQLGetDiagField`:idx: - `odbcsql.html#632 <odbcsql.html#632>`_ - - `SQLGetDiagRec`:idx: - `odbcsql.html#631 <odbcsql.html#631>`_ - - `SQLGetEnvAttr`:idx: - `odbcsql.html#629 <odbcsql.html#629>`_ - - `SQLGetInfo`:idx: - `odbcsql.html#649 <odbcsql.html#649>`_ - - `SQLGetStmtAttr`:idx: - `odbcsql.html#648 <odbcsql.html#648>`_ - - `SQL_GUID`:idx: - `odbcsql.html#153 <odbcsql.html#153>`_ - - `SQL_HANDLE_DBC`:idx: - `odbcsql.html#367 <odbcsql.html#367>`_ - - `SQL_HANDLE_DESC`:idx: - `odbcsql.html#369 <odbcsql.html#369>`_ - - `SQL_HANDLE_ENV`:idx: - `odbcsql.html#366 <odbcsql.html#366>`_ - - `SQL_HANDLE_STMT`:idx: - `odbcsql.html#368 <odbcsql.html#368>`_ - - `SQL_INDEX_ALL`:idx: - `odbcsql.html#527 <odbcsql.html#527>`_ - - `SQL_INDEX_CLUSTERED`:idx: - `odbcsql.html#531 <odbcsql.html#531>`_ - - `SQL_INDEX_HASHED`:idx: - `odbcsql.html#532 <odbcsql.html#532>`_ - - `SQL_INDEX_KEYWORDS`:idx: - `odbcsql.html#275 <odbcsql.html#275>`_ - - `SQL_INDEX_OTHER`:idx: - `odbcsql.html#533 <odbcsql.html#533>`_ - - `SQL_INDEX_UNIQUE`:idx: - `odbcsql.html#526 <odbcsql.html#526>`_ - - `SQL_INFO_SCHEMA_VIEWS`:idx: - `odbcsql.html#276 <odbcsql.html#276>`_ - - `SQL_INSENSITIVE`:idx: - `odbcsql.html#490 <odbcsql.html#490>`_ - - `SQL_INTEGER`:idx: - `odbcsql.html#139 <odbcsql.html#139>`_ - - `SQL_INTERVAL`:idx: - `odbcsql.html#152 <odbcsql.html#152>`_ - - `SQL_INTERVAL_DAY`:idx: - `odbcsql.html#169 <odbcsql.html#169>`_ - - `SQL_INTERVAL_DAY_TO_HOUR`:idx: - `odbcsql.html#174 <odbcsql.html#174>`_ - - `SQL_INTERVAL_DAY_TO_MINUTE`:idx: - `odbcsql.html#175 <odbcsql.html#175>`_ - - `SQL_INTERVAL_DAY_TO_SECOND`:idx: - `odbcsql.html#176 <odbcsql.html#176>`_ - - `SQL_INTERVAL_HOUR`:idx: - `odbcsql.html#170 <odbcsql.html#170>`_ - - `SQL_INTERVAL_HOUR_TO_MINUTE`:idx: - `odbcsql.html#177 <odbcsql.html#177>`_ - - `SQL_INTERVAL_HOUR_TO_SECOND`:idx: - `odbcsql.html#178 <odbcsql.html#178>`_ - - `SQL_INTERVAL_MINUTE`:idx: - `odbcsql.html#171 <odbcsql.html#171>`_ - - `SQL_INTERVAL_MINUTE_TO_SECOND`:idx: - `odbcsql.html#179 <odbcsql.html#179>`_ - - `SQL_INTERVAL_MONTH`:idx: - `odbcsql.html#168 <odbcsql.html#168>`_ - - `SQL_INTERVAL_SECOND`:idx: - `odbcsql.html#172 <odbcsql.html#172>`_ - - `SQL_INTERVAL_YEAR`:idx: - `odbcsql.html#167 <odbcsql.html#167>`_ - - `SQL_INTERVAL_YEAR_TO_MONTH`:idx: - `odbcsql.html#173 <odbcsql.html#173>`_ - - `SQL_INVALID_HANDLE`:idx: - `odbcsql.html#358 <odbcsql.html#358>`_ - - `SQL_IS_INTEGER`:idx: - `odbcsql.html#247 <odbcsql.html#247>`_ - - `SQL_IS_POINTER`:idx: - `odbcsql.html#245 <odbcsql.html#245>`_ - - `SQL_IS_SMALLINT`:idx: - `odbcsql.html#249 <odbcsql.html#249>`_ - - `SQL_IS_UINTEGER`:idx: - `odbcsql.html#246 <odbcsql.html#246>`_ - - `SQL_IS_USMALLINT`:idx: - `odbcsql.html#248 <odbcsql.html#248>`_ - - `SQL_KEYSET_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#277 <odbcsql.html#277>`_ - - `SQL_KEYSET_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#278 <odbcsql.html#278>`_ - - `SQL_KEYSET_SIZE`:idx: - `odbcsql.html#387 <odbcsql.html#387>`_ - - `SQL_LOCK_EXCLUSIVE`:idx: - `odbcsql.html#327 <odbcsql.html#327>`_ - - `SQL_LOCK_NO_CHANGE`:idx: - `odbcsql.html#326 <odbcsql.html#326>`_ - - `SQL_LOCK_UNLOCK`:idx: - `odbcsql.html#328 <odbcsql.html#328>`_ - - `SQL_LOGIN_TIMEOUT`:idx: - `odbcsql.html#407 <odbcsql.html#407>`_ - - `SQL_LONGVARBINARY`:idx: - `odbcsql.html#129 <odbcsql.html#129>`_ - - `SQL_LONGVARCHAR`:idx: - `odbcsql.html#126 <odbcsql.html#126>`_ - - `SQL_MAX_DSN_LENGTH`:idx: - `odbcsql.html#338 <odbcsql.html#338>`_ - - `SQL_MAX_IDENTIFIER_LEN`:idx: - `odbcsql.html#547 <odbcsql.html#547>`_ - - `SQL_MAXIMUM_IDENTIFIER_LENGTH`:idx: - `odbcsql.html#548 <odbcsql.html#548>`_ - - `SQL_MAX_LENGTH`:idx: - `odbcsql.html#382 <odbcsql.html#382>`_ - - `SQL_MAX_MESSAGE_LENGTH`:idx: - `odbcsql.html#362 <odbcsql.html#362>`_ - - `SQL_MAX_OPTION_STRING_LENGTH`:idx: - `odbcsql.html#339 <odbcsql.html#339>`_ - - `SQL_MAX_ROWS`:idx: - `odbcsql.html#380 <odbcsql.html#380>`_ - - `SQL_MODE_DEFAULT`:idx: - `odbcsql.html#431 <odbcsql.html#431>`_ - - `SQL_MODE_READ_ONLY`:idx: - `odbcsql.html#430 <odbcsql.html#430>`_ - - `SQL_MODE_READ_WRITE`:idx: - `odbcsql.html#429 <odbcsql.html#429>`_ - - `SQL_NAME_LEN`:idx: - `odbcsql.html#237 <odbcsql.html#237>`_ - - `SQL_NEED_DATA`:idx: - `odbcsql.html#360 <odbcsql.html#360>`_ - - `SQL_NO_DATA`:idx: - `odbcsql.html#356 <odbcsql.html#356>`_ - - `SQL_NONSCROLLABLE`:idx: - `odbcsql.html#435 <odbcsql.html#435>`_ - - `SQL_NO_NULLS`:idx: - `odbcsql.html#500 <odbcsql.html#500>`_ - - `SQL_NOSCAN`:idx: - `odbcsql.html#381 <odbcsql.html#381>`_ - - `SQL_NO_TOTAL`:idx: - `odbcsql.html#230 <odbcsql.html#230>`_ - - `SQL_NTS`:idx: - `odbcsql.html#361 <odbcsql.html#361>`_ - - `SQL_NULLABLE`:idx: - `odbcsql.html#501 <odbcsql.html#501>`_ - - `SQL_NULLABLE_UNKNOWN`:idx: - `odbcsql.html#502 <odbcsql.html#502>`_ - - `SQL_NULL_DATA`:idx: - `odbcsql.html#352 <odbcsql.html#352>`_ - - `SQL_NULL_HANDLE`:idx: - `odbcsql.html#519 <odbcsql.html#519>`_ - - `SQL_NULL_HDBC`:idx: - `odbcsql.html#516 <odbcsql.html#516>`_ - - `SQL_NULL_HDESC`:idx: - `odbcsql.html#518 <odbcsql.html#518>`_ - - `SQL_NULL_HENV`:idx: - `odbcsql.html#515 <odbcsql.html#515>`_ - - `SQL_NULL_HSTMT`:idx: - `odbcsql.html#517 <odbcsql.html#517>`_ - - `SQL_NUMERIC`:idx: - `odbcsql.html#137 <odbcsql.html#137>`_ - - `SQLNumResultCols`:idx: - `odbcsql.html#642 <odbcsql.html#642>`_ - - `SQL_ODBC_CURSORS`:idx: - `odbcsql.html#340 <odbcsql.html#340>`_ - - `SQL_OJ_CAPABILITIES`:idx: - `odbcsql.html#540 <odbcsql.html#540>`_ - - `SQL_OPT_TRACE`:idx: - `odbcsql.html#408 <odbcsql.html#408>`_ - - `SQL_OPT_TRACEFILE`:idx: - `odbcsql.html#409 <odbcsql.html#409>`_ - - `SQL_OUTER_JOIN_CAPABILITIES`:idx: - `odbcsql.html#541 <odbcsql.html#541>`_ - - `SQL_OV_ODBC2`:idx: - `odbcsql.html#239 <odbcsql.html#239>`_ - - `SQL_OV_ODBC3`:idx: - `odbcsql.html#238 <odbcsql.html#238>`_ - - `SQL_PACKET_SIZE`:idx: - `odbcsql.html#414 <odbcsql.html#414>`_ - - `SQL_PARAM_INPUT`:idx: - `odbcsql.html#347 <odbcsql.html#347>`_ - - `SQL_PARAM_INPUT_OUTPUT`:idx: - `odbcsql.html#348 <odbcsql.html#348>`_ - - `SQL_PARAM_OUTPUT`:idx: - `odbcsql.html#350 <odbcsql.html#350>`_ - - `SQL_PARAM_TYPE_UNKNOWN`:idx: - `odbcsql.html#346 <odbcsql.html#346>`_ - - `SQL_POSITION`:idx: - `odbcsql.html#322 <odbcsql.html#322>`_ - - `SQLPrepare`:idx: - `odbcsql.html#638 <odbcsql.html#638>`_ - - `SQLPrimaryKeys`:idx: - `odbcsql.html#668 <odbcsql.html#668>`_ - - `SQLProcedureColumns`:idx: - `odbcsql.html#669 <odbcsql.html#669>`_ - - `SQLProcedures`:idx: - `odbcsql.html#667 <odbcsql.html#667>`_ - - `SQLPutData`:idx: - `odbcsql.html#651 <odbcsql.html#651>`_ - - `SQL_QUERY_TIMEOUT`:idx: - `odbcsql.html#379 <odbcsql.html#379>`_ - - `SQL_QUICK`:idx: - `odbcsql.html#528 <odbcsql.html#528>`_ - - `SQL_QUIET_MODE`:idx: - `odbcsql.html#413 <odbcsql.html#413>`_ - - `SQL_REAL`:idx: - `odbcsql.html#142 <odbcsql.html#142>`_ - - `SQL_REFRESH`:idx: - `odbcsql.html#323 <odbcsql.html#323>`_ - - `SQL_RESET_PARAMS`:idx: - `odbcsql.html#506 <odbcsql.html#506>`_ - - `SQL_RESULT_COL`:idx: - `odbcsql.html#349 <odbcsql.html#349>`_ - - `SQL_RETRIEVE_DATA`:idx: - `odbcsql.html#390 <odbcsql.html#390>`_ - - `SQL_RETURN_VALUE`:idx: - `odbcsql.html#351 <odbcsql.html#351>`_ - - `SQL_ROLLBACK`:idx: - `odbcsql.html#619 <odbcsql.html#619>`_ - - `SQL_ROW_ADDED`:idx: - `odbcsql.html#333 <odbcsql.html#333>`_ - - `SQLRowCount`:idx: - `odbcsql.html#659 <odbcsql.html#659>`_ - - `SQL_ROW_DELETED`:idx: - `odbcsql.html#330 <odbcsql.html#330>`_ - - `SQL_ROW_ERROR`:idx: - `odbcsql.html#334 <odbcsql.html#334>`_ - - `SQL_ROW_IDENTIFIER`:idx: - `odbcsql.html#525 <odbcsql.html#525>`_ - - `SQL_ROW_IGNORE`:idx: - `odbcsql.html#337 <odbcsql.html#337>`_ - - `SQL_ROW_NOROW`:idx: - `odbcsql.html#332 <odbcsql.html#332>`_ - - `SQL_ROW_NUMBER`:idx: - `odbcsql.html#393 <odbcsql.html#393>`_ - - `SQL_ROW_PROCEED`:idx: - `odbcsql.html#336 <odbcsql.html#336>`_ - - `SQL_ROWSET_SIZE`:idx: - `odbcsql.html#388 <odbcsql.html#388>`_ - - `SQL_ROW_SUCCESS`:idx: - `odbcsql.html#329 <odbcsql.html#329>`_ - - `SQL_ROW_SUCCESS_WITH_INFO`:idx: - `odbcsql.html#335 <odbcsql.html#335>`_ - - `SQL_ROW_UPDATED`:idx: - `odbcsql.html#331 <odbcsql.html#331>`_ - - `SQL_ROWVER`:idx: - `odbcsql.html#524 <odbcsql.html#524>`_ - - `SQL_SCCO_LOCK`:idx: - `odbcsql.html#550 <odbcsql.html#550>`_ - - `SQL_SCCO_OPT_ROWVER`:idx: - `odbcsql.html#551 <odbcsql.html#551>`_ - - `SQL_SCCO_OPT_VALUES`:idx: - `odbcsql.html#552 <odbcsql.html#552>`_ - - `SQL_SCCO_READ_ONLY`:idx: - `odbcsql.html#549 <odbcsql.html#549>`_ - - `SQL_SCOPE_CURROW`:idx: - `odbcsql.html#520 <odbcsql.html#520>`_ - - `SQL_SCOPE_SESSION`:idx: - `odbcsql.html#522 <odbcsql.html#522>`_ - - `SQL_SCOPE_TRANSACTION`:idx: - `odbcsql.html#521 <odbcsql.html#521>`_ - - `SQL_SCROLLABLE`:idx: - `odbcsql.html#436 <odbcsql.html#436>`_ - - `SQL_SCROLL_CONCURRENCY`:idx: - `odbcsql.html#534 <odbcsql.html#534>`_ - - `SQL_SCROLL_OPTIONS`:idx: - `odbcsql.html#251 <odbcsql.html#251>`_ - - `SQL_SENSITIVE`:idx: - `odbcsql.html#491 <odbcsql.html#491>`_ - - `SQLSetConnectAttr`:idx: - `odbcsql.html#656 <odbcsql.html#656>`_ - - `SQLSetCursorName`:idx: - `odbcsql.html#658 <odbcsql.html#658>`_ - - `SQLSetEnvAttr`:idx: - `odbcsql.html#628 <odbcsql.html#628>`_ - - `SQLSetPos`:idx: - `odbcsql.html#653 <odbcsql.html#653>`_ - - `SQL_SETPOS_MAX_OPTION_VALUE`:idx: - `odbcsql.html#318 <odbcsql.html#318>`_ - - `SQLSetStmtAttr`:idx: - `odbcsql.html#647 <odbcsql.html#647>`_ - - `SQL_SIGNED_OFFSET`:idx: - `odbcsql.html#191 <odbcsql.html#191>`_ - - `SQL_SIMULATE_CURSOR`:idx: - `odbcsql.html#389 <odbcsql.html#389>`_ - - `SQL_SMALLINT`:idx: - `odbcsql.html#140 <odbcsql.html#140>`_ - - `SQL_SO_DYNAMIC`:idx: - `odbcsql.html#259 <odbcsql.html#259>`_ - - `SQL_SO_FORWARD_ONLY`:idx: - `odbcsql.html#257 <odbcsql.html#257>`_ - - `SQL_SO_KEYSET_DRIVEN`:idx: - `odbcsql.html#258 <odbcsql.html#258>`_ - - `SQL_SO_MIXED`:idx: - `odbcsql.html#260 <odbcsql.html#260>`_ - - `SQL_SO_STATIC`:idx: - `odbcsql.html#261 <odbcsql.html#261>`_ - - `SQLSpecialColumns`:idx: - `odbcsql.html#666 <odbcsql.html#666>`_ - - `SQL_SS_ADDITIONS`:idx: - `odbcsql.html#566 <odbcsql.html#566>`_ - - `SQL_SS_DELETIONS`:idx: - `odbcsql.html#567 <odbcsql.html#567>`_ - - `SQL_SS_UPDATES`:idx: - `odbcsql.html#568 <odbcsql.html#568>`_ - - `SQL_STATIC_CURSOR_ATTRIBUTES1`:idx: - `odbcsql.html#279 <odbcsql.html#279>`_ - - `SQL_STATIC_CURSOR_ATTRIBUTES2`:idx: - `odbcsql.html#280 <odbcsql.html#280>`_ - - `SQL_STATIC_SENSITIVITY`:idx: - `odbcsql.html#263 <odbcsql.html#263>`_ - - `SQLStatistics`:idx: - `odbcsql.html#670 <odbcsql.html#670>`_ - - `SQL_STILL_EXECUTING`:idx: - `odbcsql.html#359 <odbcsql.html#359>`_ - - `SQL_SUCCESS`:idx: - `odbcsql.html#354 <odbcsql.html#354>`_ - - `SQL_SUCCESS_WITH_INFO`:idx: - `odbcsql.html#355 <odbcsql.html#355>`_ - - `SQLTables`:idx: - `odbcsql.html#664 <odbcsql.html#664>`_ - - `SQL_TABLE_STAT`:idx: - `odbcsql.html#530 <odbcsql.html#530>`_ - - `SQL_TC_ALL`:idx: - `odbcsql.html#555 <odbcsql.html#555>`_ - - `SQL_TC_DDL_COMMIT`:idx: - `odbcsql.html#556 <odbcsql.html#556>`_ - - `SQL_TC_DDL_IGNORE`:idx: - `odbcsql.html#557 <odbcsql.html#557>`_ - - `SQL_TC_DML`:idx: - `odbcsql.html#554 <odbcsql.html#554>`_ - - `SQL_TC_NONE`:idx: - `odbcsql.html#553 <odbcsql.html#553>`_ - - `SQL_TIME`:idx: - `odbcsql.html#150 <odbcsql.html#150>`_ - - `SQL_TIME_LEN`:idx: - `odbcsql.html#364 <odbcsql.html#364>`_ - - `SQL_TIMESTAMP`:idx: - `odbcsql.html#151 <odbcsql.html#151>`_ - - `SQL_TIMESTAMP_LEN`:idx: - `odbcsql.html#365 <odbcsql.html#365>`_ - - `SQL_TIMESTAMP_STRUCT`:idx: - `odbcsql.html#235 <odbcsql.html#235>`_ - - `SQL_TIME_STRUCT`:idx: - `odbcsql.html#233 <odbcsql.html#233>`_ - - `SQL_TINYINT`:idx: - `odbcsql.html#131 <odbcsql.html#131>`_ - - `SQL_TRANSACTION_CAPABLE`:idx: - `odbcsql.html#536 <odbcsql.html#536>`_ - - `SQL_TRANSACTION_ISOLATION_OPTION`:idx: - `odbcsql.html#539 <odbcsql.html#539>`_ - - `SQL_TRANSACTION_READ_COMMITTED`:idx: - `odbcsql.html#561 <odbcsql.html#561>`_ - - `SQL_TRANSACTION_READ_UNCOMMITTED`:idx: - `odbcsql.html#559 <odbcsql.html#559>`_ - - `SQL_TRANSACTION_REPEATABLE_READ`:idx: - `odbcsql.html#563 <odbcsql.html#563>`_ - - `SQL_TRANSACTION_SERIALIZABLE`:idx: - `odbcsql.html#565 <odbcsql.html#565>`_ - - `SQL_TRANSLATE_DLL`:idx: - `odbcsql.html#410 <odbcsql.html#410>`_ - - `SQL_TRANSLATE_OPTION`:idx: - `odbcsql.html#411 <odbcsql.html#411>`_ - - `SQL_TRUE`:idx: - `odbcsql.html#499 <odbcsql.html#499>`_ - - `SQL_TXN_CAPABLE`:idx: - `odbcsql.html#535 <odbcsql.html#535>`_ - - `SQL_TXN_ISOLATION`:idx: - `odbcsql.html#402 <odbcsql.html#402>`_ - - `SQL_TXN_ISOLATION_OPTION`:idx: - `odbcsql.html#538 <odbcsql.html#538>`_ - - `SQL_TXN_READ_COMMITTED`:idx: - `odbcsql.html#560 <odbcsql.html#560>`_ - - `SQL_TXN_READ_UNCOMMITTED`:idx: - `odbcsql.html#558 <odbcsql.html#558>`_ - - `SQL_TXN_REPEATABLE_READ`:idx: - `odbcsql.html#562 <odbcsql.html#562>`_ - - `SQL_TXN_SERIALIZABLE`:idx: - `odbcsql.html#564 <odbcsql.html#564>`_ - - `SQL_TYPE_DATE`:idx: - `odbcsql.html#146 <odbcsql.html#146>`_ - - `SQL_TYPE_MAX`:idx: - `odbcsql.html#227 <odbcsql.html#227>`_ - - `SQL_TYPE_MIN`:idx: - `odbcsql.html#226 <odbcsql.html#226>`_ - - `SQL_TYPE_NULL`:idx: - `odbcsql.html#225 <odbcsql.html#225>`_ - - `SQL_TYPE_TIME`:idx: - `odbcsql.html#147 <odbcsql.html#147>`_ - - `SQL_TYPE_TIMESTAMP`:idx: - `odbcsql.html#148 <odbcsql.html#148>`_ - - `SQL_UB_DEFAULT`:idx: - `odbcsql.html#254 <odbcsql.html#254>`_ - - `SQL_UB_FIXED`:idx: - `odbcsql.html#255 <odbcsql.html#255>`_ - - `SQL_UB_OFF`:idx: - `odbcsql.html#252 <odbcsql.html#252>`_ - - `SQL_UB_ON`:idx: - `odbcsql.html#253 <odbcsql.html#253>`_ - - `SQL_UB_VARIABLE`:idx: - `odbcsql.html#256 <odbcsql.html#256>`_ - - `SQL_UNBIND`:idx: - `odbcsql.html#505 <odbcsql.html#505>`_ - - `SQL_UNICODE`:idx: - `odbcsql.html#180 <odbcsql.html#180>`_ - - `SQL_UNICODE_CHAR`:idx: - `odbcsql.html#183 <odbcsql.html#183>`_ - - `SQL_UNICODE_LONGVARCHAR`:idx: - `odbcsql.html#182 <odbcsql.html#182>`_ - - `SQL_UNICODE_VARCHAR`:idx: - `odbcsql.html#181 <odbcsql.html#181>`_ - - `SQL_UNKNOWN_TYPE`:idx: - `odbcsql.html#125 <odbcsql.html#125>`_ - - `SQL_UNSIGNED_OFFSET`:idx: - `odbcsql.html#192 <odbcsql.html#192>`_ - - `SQL_UNSPECIFIED`:idx: - `odbcsql.html#489 <odbcsql.html#489>`_ - - `SQL_UPDATE`:idx: - `odbcsql.html#324 <odbcsql.html#324>`_ - - `SQL_UPDATE_BY_BOOKMARK`:idx: - `odbcsql.html#319 <odbcsql.html#319>`_ - - `SQL_USE_BOOKMARKS`:idx: - `odbcsql.html#391 <odbcsql.html#391>`_ - - `SQL_USER_NAME`:idx: - `odbcsql.html#537 <odbcsql.html#537>`_ - - `SQL_VARBINARY`:idx: - `odbcsql.html#128 <odbcsql.html#128>`_ - - `SQL_VARCHAR`:idx: - `odbcsql.html#145 <odbcsql.html#145>`_ - - `SQL_WCHAR`:idx: - `odbcsql.html#133 <odbcsql.html#133>`_ - - `SQL_WLONGVARCHAR`:idx: - `odbcsql.html#135 <odbcsql.html#135>`_ - - `SQL_WVARCHAR`:idx: - `odbcsql.html#134 <odbcsql.html#134>`_ - - `SQL_XOPEN_CLI_YEAR`:idx: - `odbcsql.html#542 <odbcsql.html#542>`_ - - `sqrt`:idx: - * `math.html#110 <math.html#110>`_ - * `complex.html#109 <complex.html#109>`_ - - `SS_DISABLE`:idx: - `posix.html#765 <posix.html#765>`_ - - `SS_ONSTACK`:idx: - `posix.html#764 <posix.html#764>`_ - - `stack_trace`:idx: - `nimrodc.html#108 <nimrodc.html#108>`_ - - `startsWith`:idx: - `strutils.html#137 <strutils.html#137>`_ - - `stat`:idx: - `posix.html#1065 <posix.html#1065>`_ - - `statement macros`:idx: - `tut2.html#114 <tut2.html#114>`_ - - `Statements`:idx: - `manual.html#173 <manual.html#173>`_ - - `static error`:idx: - `manual.html#109 <manual.html#109>`_ - - `static type`:idx: - `manual.html#103 <manual.html#103>`_ - - `statvfs`:idx: - `posix.html#1056 <posix.html#1056>`_ - - `stdcall`:idx: - `manual.html#164 <manual.html#164>`_ - - `stderr`:idx: - `system.html#485 <system.html#485>`_ - - `STDERR_FILENO`:idx: - `posix.html#127 <posix.html#127>`_ - - `stdin`:idx: - `system.html#483 <system.html#483>`_ - - `STDIN_FILENO`:idx: - `posix.html#128 <posix.html#128>`_ - - `stdout`:idx: - `system.html#484 <system.html#484>`_ - - `STDOUT_FILENO`:idx: - `posix.html#129 <posix.html#129>`_ - - `ST_NOSUID`:idx: - `posix.html#673 <posix.html#673>`_ - - `ST_RDONLY`:idx: - `posix.html#672 <posix.html#672>`_ - - `strerror`:idx: - `posix.html#1160 <posix.html#1160>`_ - - `strfmon`:idx: - `posix.html#848 <posix.html#848>`_ - - `strftime`:idx: - `posix.html#1110 <posix.html#1110>`_ - - `string`:idx: - * `manual.html#150 <manual.html#150>`_ - * `system.html#111 <system.html#111>`_ - - `strip`:idx: - `strutils.html#105 <strutils.html#105>`_ - - `strptime`:idx: - `posix.html#1111 <posix.html#1111>`_ - - `strStart`:idx: - `strutils.html#103 <strutils.html#103>`_ - - `structured type`:idx: - `manual.html#151 <manual.html#151>`_ - - `strutils`:idx: - `nimrodc.html#117 <nimrodc.html#117>`_ - - `style-insensitive`:idx: - `manual.html#118 <manual.html#118>`_ - - `S_TYPEISMQ`:idx: - `posix.html#1074 <posix.html#1074>`_ - - `S_TYPEISSEM`:idx: - `posix.html#1075 <posix.html#1075>`_ - - `S_TYPEISSHM`:idx: - `posix.html#1076 <posix.html#1076>`_ - - `S_TYPEISTMO`:idx: - `posix.html#1077 <posix.html#1077>`_ - - `subrange`:idx: - * `manual.html#149 <manual.html#149>`_ - * `tut1.html#115 <tut1.html#115>`_ - - `succ`:idx: - `system.html#157 <system.html#157>`_ - - `swab`:idx: - `posix.html#1031 <posix.html#1031>`_ - - `swap`:idx: - `system.html#419 <system.html#419>`_ - - `swapcontext`:idx: - `posix.html#1191 <posix.html#1191>`_ - - `symlink`:idx: - `posix.html#1032 <posix.html#1032>`_ - - `sync`:idx: - `posix.html#1033 <posix.html#1033>`_ - - `syscall`:idx: - `manual.html#171 <manual.html#171>`_ - - `sysconf`:idx: - `posix.html#1034 <posix.html#1034>`_ - - `system`:idx: - `manual.html#218 <manual.html#218>`_ - - `tabulator`:idx: - `manual.html#125 <manual.html#125>`_ - - `TAddress`:idx: - `system.html#372 <system.html#372>`_ - - `Taiocb`:idx: - `posix.html#204 <posix.html#204>`_ - - `TAllocfunc`:idx: - `zlib.html#108 <zlib.html#108>`_ - - `tan`:idx: - `math.html#125 <math.html#125>`_ - - `tanh`:idx: - `math.html#126 <math.html#126>`_ - - `TBaseLexer`:idx: - `lexbase.html#103 <lexbase.html#103>`_ - - `Tblkcnt`:idx: - `posix.html#143 <posix.html#143>`_ - - `Tblksize`:idx: - `posix.html#144 <posix.html#144>`_ - - `TCfgEvent`:idx: - `parsecfg.html#102 <parsecfg.html#102>`_ - - `TCfgEventKind`:idx: - `parsecfg.html#101 <parsecfg.html#101>`_ - - `TCfgParser`:idx: - `parsecfg.html#103 <parsecfg.html#103>`_ - - `tcgetpgrp`:idx: - `posix.html#1035 <posix.html#1035>`_ - - `TCharSet`:idx: - `strutils.html#101 <strutils.html#101>`_ - - `TClock`:idx: - `posix.html#145 <posix.html#145>`_ - - `TClockId`:idx: - `posix.html#146 <posix.html#146>`_ - - `TCmdLineKind`:idx: - `parseopt.html#101 <parseopt.html#101>`_ - - `TComplex`:idx: - `complex.html#101 <complex.html#101>`_ - - `tcsetpgrp`:idx: - `posix.html#1036 <posix.html#1036>`_ - - `TDev`:idx: - `posix.html#147 <posix.html#147>`_ - - `TDIR`:idx: - `posix.html#130 <posix.html#130>`_ - - `Tdirent`:idx: - `posix.html#131 <posix.html#131>`_ - - `telldir`:idx: - `posix.html#806 <posix.html#806>`_ - - `template`:idx: - `manual.html#209 <manual.html#209>`_ - - `TEndian`:idx: - `system.html#385 <system.html#385>`_ - - `Tfd_set`:idx: - `posix.html#201 <posix.html#201>`_ - - `Tfenv`:idx: - `posix.html#133 <posix.html#133>`_ - - `Tfexcept`:idx: - `posix.html#134 <posix.html#134>`_ - - `TFile`:idx: - `system.html#480 <system.html#480>`_ - - `TFileHandle`:idx: - `system.html#482 <system.html#482>`_ - - `TFileMode`:idx: - `system.html#481 <system.html#481>`_ - - `TFileStream`:idx: - `streams.html#119 <streams.html#119>`_ - - `TFloatClass`:idx: - `math.html#103 <math.html#103>`_ - - `Tflock`:idx: - `posix.html#132 <posix.html#132>`_ - - `T_FMT`:idx: - `posix.html#392 <posix.html#392>`_ - - `T_FMT_AMPM`:idx: - `posix.html#393 <posix.html#393>`_ - - `TFormatFlag`:idx: - `strtabs.html#111 <strtabs.html#111>`_ - - `TFreeFunc`:idx: - `zlib.html#109 <zlib.html#109>`_ - - `Tfsblkcnt`:idx: - `posix.html#148 <posix.html#148>`_ - - `Tfsfilcnt`:idx: - `posix.html#149 <posix.html#149>`_ - - `TFTW`:idx: - `posix.html#135 <posix.html#135>`_ - - `TGC_Strategy`:idx: - `system.html#463 <system.html#463>`_ - - `TGid`:idx: - `posix.html#150 <posix.html#150>`_ - - `TGlob`:idx: - `posix.html#136 <posix.html#136>`_ - - `TGroup`:idx: - `posix.html#137 <posix.html#137>`_ - - `THash`:idx: - `hashes.html#101 <hashes.html#101>`_ - - `THOUSEP`:idx: - `posix.html#440 <posix.html#440>`_ - - `Ticonv`:idx: - `posix.html#138 <posix.html#138>`_ - - `Tid`:idx: - `posix.html#151 <posix.html#151>`_ - - `time`:idx: - `posix.html#1112 <posix.html#1112>`_ - - `TimeInfoToTime`:idx: - `times.html#108 <times.html#108>`_ - - `TIMER_ABSTIME`:idx: - `posix.html#699 <posix.html#699>`_ - - `timer_create`:idx: - `posix.html#1113 <posix.html#1113>`_ - - `timer_delete`:idx: - `posix.html#1114 <posix.html#1114>`_ - - `timer_getoverrun`:idx: - `posix.html#1116 <posix.html#1116>`_ - - `timer_gettime`:idx: - `posix.html#1115 <posix.html#1115>`_ - - `timer_settime`:idx: - `posix.html#1117 <posix.html#1117>`_ - - `times`:idx: - `nimrodc.html#119 <nimrodc.html#119>`_ - - `timezone`:idx: - `posix.html#702 <posix.html#702>`_ - - `Tino`:idx: - `posix.html#152 <posix.html#152>`_ - - `TInternalState`:idx: - `zlib.html#110 <zlib.html#110>`_ - - `Tipc_perm`:idx: - `posix.html#182 <posix.html#182>`_ - - `titimerspec`:idx: - `posix.html#188 <posix.html#188>`_ - - `TKey`:idx: - `posix.html#153 <posix.html#153>`_ - - `Tlconv`:idx: - `posix.html#139 <posix.html#139>`_ - - `Tmcontext`:idx: - `posix.html#202 <posix.html#202>`_ - - `TMode`:idx: - `posix.html#154 <posix.html#154>`_ - - `TMonth`:idx: - `times.html#101 <times.html#101>`_ - - `TMqAttr`:idx: - `posix.html#141 <posix.html#141>`_ - - `TMqd`:idx: - `posix.html#140 <posix.html#140>`_ - - `Tnl_catd`:idx: - `posix.html#198 <posix.html#198>`_ - - `TNlink`:idx: - `posix.html#155 <posix.html#155>`_ - - `Tnl_item`:idx: - `posix.html#197 <posix.html#197>`_ - - `toBiggestFloat`:idx: - `system.html#401 <system.html#401>`_ - - `toBiggestInt`:idx: - `system.html#403 <system.html#403>`_ - - `toBin`:idx: - `strutils.html#142 <strutils.html#142>`_ - - `TObject`:idx: - `system.html#131 <system.html#131>`_ - - `TOff`:idx: - `posix.html#156 <posix.html#156>`_ - - `toFloat`:idx: - `system.html#400 <system.html#400>`_ - - `toHex`:idx: - `strutils.html#128 <strutils.html#128>`_ - - `toInt`:idx: - `system.html#402 <system.html#402>`_ - - `toLower`:idx: - * `strutils.html#106 <strutils.html#106>`_ - * `strutils.html#107 <strutils.html#107>`_ - - `toOct`:idx: - `strutils.html#141 <strutils.html#141>`_ - - `toOctal`:idx: - `strutils.html#118 <strutils.html#118>`_ - - `TOptParser`:idx: - `parseopt.html#102 <parseopt.html#102>`_ - - `toString`:idx: - `strutils.html#133 <strutils.html#133>`_ - - `toU16`:idx: - `system.html#179 <system.html#179>`_ - - `toU32`:idx: - `system.html#180 <system.html#180>`_ - - `toU8`:idx: - `system.html#178 <system.html#178>`_ - - `toUpper`:idx: - * `strutils.html#108 <strutils.html#108>`_ - * `strutils.html#109 <strutils.html#109>`_ - - `TPasswd`:idx: - `posix.html#142 <posix.html#142>`_ - - `TPathComponent`:idx: - `os.html#152 <os.html#152>`_ - - `TPid`:idx: - `posix.html#157 <posix.html#157>`_ - - `Tposix_spawnattr`:idx: - `posix.html#205 <posix.html#205>`_ - - `Tposix_spawn_file_actions`:idx: - `posix.html#206 <posix.html#206>`_ - - `Tposix_typed_mem_info`:idx: - `posix.html#185 <posix.html#185>`_ - - `Tpthread`:idx: - `posix.html#170 <posix.html#170>`_ - - `Tpthread_attr`:idx: - `posix.html#158 <posix.html#158>`_ - - `Tpthread_barrier`:idx: - `posix.html#159 <posix.html#159>`_ - - `Tpthread_barrierattr`:idx: - `posix.html#160 <posix.html#160>`_ - - `Tpthread_cond`:idx: - `posix.html#161 <posix.html#161>`_ - - `Tpthread_condattr`:idx: - `posix.html#162 <posix.html#162>`_ - - `Tpthread_key`:idx: - `posix.html#163 <posix.html#163>`_ - - `Tpthread_mutex`:idx: - `posix.html#164 <posix.html#164>`_ - - `Tpthread_mutexattr`:idx: - `posix.html#165 <posix.html#165>`_ - - `Tpthread_once`:idx: - `posix.html#166 <posix.html#166>`_ - - `Tpthread_rwlock`:idx: - `posix.html#167 <posix.html#167>`_ - - `Tpthread_rwlockattr`:idx: - `posix.html#168 <posix.html#168>`_ - - `Tpthread_spinlock`:idx: - `posix.html#169 <posix.html#169>`_ - - `traced`:idx: - * `manual.html#159 <manual.html#159>`_ - * `tut1.html#121 <tut1.html#121>`_ - - `TResult`:idx: - `system.html#155 <system.html#155>`_ - - `truncate`:idx: - `posix.html#1037 <posix.html#1037>`_ - - `try`:idx: - * `manual.html#185 <manual.html#185>`_ - * `tut2.html#108 <tut2.html#108>`_ - - `Tsched_param`:idx: - `posix.html#199 <posix.html#199>`_ - - `TSem`:idx: - `posix.html#181 <posix.html#181>`_ - - `TSigaction`:idx: - `posix.html#193 <posix.html#193>`_ - - `Tsig_atomic`:idx: - `posix.html#189 <posix.html#189>`_ - - `TsigEvent`:idx: - `posix.html#191 <posix.html#191>`_ - - `TsigInfo`:idx: - `posix.html#196 <posix.html#196>`_ - - `Tsigset`:idx: - `posix.html#190 <posix.html#190>`_ - - `TSigStack`:idx: - `posix.html#195 <posix.html#195>`_ - - `TsigVal`:idx: - `posix.html#192 <posix.html#192>`_ - - `TSqlChar`:idx: - `odbcsql.html#101 <odbcsql.html#101>`_ - - `TSqlDouble`:idx: - `odbcsql.html#113 <odbcsql.html#113>`_ - - `TSqlFloat`:idx: - `odbcsql.html#114 <odbcsql.html#114>`_ - - `TSqlHandle`:idx: - `odbcsql.html#104 <odbcsql.html#104>`_ - - `TSqlHDBC`:idx: - `odbcsql.html#106 <odbcsql.html#106>`_ - - `TSqlHDesc`:idx: - `odbcsql.html#108 <odbcsql.html#108>`_ - - `TSqlHEnv`:idx: - `odbcsql.html#105 <odbcsql.html#105>`_ - - `TSqlHStmt`:idx: - `odbcsql.html#107 <odbcsql.html#107>`_ - - `TSqlHWND`:idx: - `odbcsql.html#115 <odbcsql.html#115>`_ - - `TSqlInteger`:idx: - `odbcsql.html#109 <odbcsql.html#109>`_ - - `TSqlPointer`:idx: - `odbcsql.html#111 <odbcsql.html#111>`_ - - `TSqlReal`:idx: - `odbcsql.html#112 <odbcsql.html#112>`_ - - `TSqlSmallInt`:idx: - `odbcsql.html#102 <odbcsql.html#102>`_ - - `TSqlUInteger`:idx: - `odbcsql.html#110 <odbcsql.html#110>`_ - - `TSqlUSmallInt`:idx: - `odbcsql.html#103 <odbcsql.html#103>`_ - - `TStack`:idx: - `posix.html#194 <posix.html#194>`_ - - `TStat`:idx: - `posix.html#183 <posix.html#183>`_ - - `TStatvfs`:idx: - `posix.html#184 <posix.html#184>`_ - - `TStream`:idx: - `streams.html#102 <streams.html#102>`_ - - `TStringStream`:idx: - `streams.html#116 <streams.html#116>`_ - - `TStringTable`:idx: - `strtabs.html#102 <strtabs.html#102>`_ - - `TStringTableMode`:idx: - `strtabs.html#101 <strtabs.html#101>`_ - - `Tsuseconds`:idx: - `posix.html#171 <posix.html#171>`_ - - `Ttime`:idx: - `posix.html#172 <posix.html#172>`_ - - `TTime`:idx: - `times.html#103 <times.html#103>`_ - - `TTimeInfo`:idx: - `times.html#104 <times.html#104>`_ - - `Ttimer`:idx: - `posix.html#173 <posix.html#173>`_ - - `Ttimespec`:idx: - `posix.html#187 <posix.html#187>`_ - - `Ttimeval`:idx: - `posix.html#200 <posix.html#200>`_ - - `Ttm`:idx: - `posix.html#186 <posix.html#186>`_ - - `Ttrace_attr`:idx: - `posix.html#174 <posix.html#174>`_ - - `Ttrace_event_id`:idx: - `posix.html#175 <posix.html#175>`_ - - `Ttrace_event_set`:idx: - `posix.html#176 <posix.html#176>`_ - - `Ttrace_id`:idx: - `posix.html#177 <posix.html#177>`_ - - `ttyname`:idx: - `posix.html#1038 <posix.html#1038>`_ - - `ttyname_r`:idx: - `posix.html#1039 <posix.html#1039>`_ - - `Tucontext`:idx: - `posix.html#203 <posix.html#203>`_ - - `Tuid`:idx: - `posix.html#178 <posix.html#178>`_ - - `tuple`:idx: - `manual.html#154 <manual.html#154>`_ - - `Tuseconds`:idx: - `posix.html#179 <posix.html#179>`_ - - `Tutsname`:idx: - `posix.html#180 <posix.html#180>`_ - - `TWeekDay`:idx: - `times.html#102 <times.html#102>`_ - - `type`:idx: - * `manual.html#102 <manual.html#102>`_ - * `manual.html#140 <manual.html#140>`_ - * `manual.html#206 <manual.html#206>`_ - - `type casts`:idx: - `tut2.html#101 <tut2.html#101>`_ - - `type conversions`:idx: - `tut2.html#102 <tut2.html#102>`_ - - `type parameters`:idx: - * `manual.html#208 <manual.html#208>`_ - * `tut2.html#110 <tut2.html#110>`_ - - `type suffix`:idx: - `manual.html#137 <manual.html#137>`_ - - `TZipArchive`:idx: - `zipfiles.html#101 <zipfiles.html#101>`_ - - `Tzip_source_callback`:idx: - `libzip.html#102 <libzip.html#102>`_ - - `Tzip_source_cmd`:idx: - `libzip.html#101 <libzip.html#101>`_ - - `Tzip_stat`:idx: - `libzip.html#104 <libzip.html#104>`_ - - `tzset`:idx: - `posix.html#1118 <posix.html#1118>`_ - - `TZStream`:idx: - `zlib.html#112 <zlib.html#112>`_ - - `TZStreamRec`:idx: - `zlib.html#113 <zlib.html#113>`_ - - `ualarm`:idx: - `posix.html#1040 <posix.html#1040>`_ - - `Uint`:idx: - `zlib.html#101 <zlib.html#101>`_ - - `Ulong`:idx: - `zlib.html#102 <zlib.html#102>`_ - - `Ulongf`:idx: - `zlib.html#103 <zlib.html#103>`_ - - `umask`:idx: - `posix.html#1066 <posix.html#1066>`_ - - `uname`:idx: - `posix.html#866 <posix.html#866>`_ - - `unchecked runtime error`:idx: - `manual.html#111 <manual.html#111>`_ - - `uncompress`:idx: - `zlib.html#156 <zlib.html#156>`_ - - `undef`:idx: - `manual.html#223 <manual.html#223>`_ - - `UnixToNativePath`:idx: - `os.html#124 <os.html#124>`_ - - `unlink`:idx: - `posix.html#1041 <posix.html#1041>`_ - - `unsigned integer`:idx: - * `manual.html#142 <manual.html#142>`_ - * `tut1.html#108 <tut1.html#108>`_ - - `unsigned operations`:idx: - * `manual.html#143 <manual.html#143>`_ - * `tut1.html#109 <tut1.html#109>`_ - - `untraced`:idx: - * `manual.html#160 <manual.html#160>`_ - * `tut1.html#122 <tut1.html#122>`_ - - `usleep`:idx: - `posix.html#1042 <posix.html#1042>`_ - - `Var`:idx: - `manual.html#178 <manual.html#178>`_ - - `varargs`:idx: - `nimrodc.html#106 <nimrodc.html#106>`_ - - `variant`:idx: - * `manual.html#156 <manual.html#156>`_ - * `tut2.html#103 <tut2.html#103>`_ - - `vertical tabulator`:idx: - `manual.html#126 <manual.html#126>`_ - - `vfork`:idx: - `posix.html#1043 <posix.html#1043>`_ - - `volatile`:idx: - `nimrodc.html#111 <nimrodc.html#111>`_ - - `wait`:idx: - `posix.html#1119 <posix.html#1119>`_ - - `waitid`:idx: - `posix.html#1120 <posix.html#1120>`_ - - `waitpid`:idx: - `posix.html#1121 <posix.html#1121>`_ - - `walkDir`:idx: - `os.html#153 <os.html#153>`_ - - `walkFiles`:idx: - * `os.html#151 <os.html#151>`_ - * `zipfiles.html#110 <zipfiles.html#110>`_ - - `warning`:idx: - * `dialogs.html#103 <dialogs.html#103>`_ - * `manual.html#220 <manual.html#220>`_ - * `manual.html#226 <manual.html#226>`_ - - `WCONTINUED`:idx: - `posix.html#714 <posix.html#714>`_ - - `WEXITED`:idx: - `posix.html#712 <posix.html#712>`_ - - `WEXITSTATUS`:idx: - `posix.html#705 <posix.html#705>`_ - - `when`:idx: - * `manual.html#182 <manual.html#182>`_ - * `tut1.html#106 <tut1.html#106>`_ - - `while`:idx: - `manual.html#194 <manual.html#194>`_ - - `Whitespace`:idx: - `strutils.html#102 <strutils.html#102>`_ - - `WIFCONTINUED`:idx: - `posix.html#706 <posix.html#706>`_ - - `WIFEXITED`:idx: - `posix.html#707 <posix.html#707>`_ - - `WIFSIGNALED`:idx: - `posix.html#708 <posix.html#708>`_ - - `WIFSTOPPED`:idx: - `posix.html#709 <posix.html#709>`_ - - `WNOHANG`:idx: - `posix.html#703 <posix.html#703>`_ - - `WNOWAIT`:idx: - `posix.html#715 <posix.html#715>`_ - - `W_OK`:idx: - `posix.html#480 <posix.html#480>`_ - - `write`:idx: - * `posix.html#1044 <posix.html#1044>`_ - * `system.html#493 <system.html#493>`_ - * `system.html#494 <system.html#494>`_ - * `system.html#495 <system.html#495>`_ - * `system.html#496 <system.html#496>`_ - * `system.html#497 <system.html#497>`_ - * `system.html#498 <system.html#498>`_ - * `system.html#499 <system.html#499>`_ - * `streams.html#103 <streams.html#103>`_ - * `streams.html#104 <streams.html#104>`_ - - `writeBuffer`:idx: - `system.html#509 <system.html#509>`_ - - `writeBytes`:idx: - `system.html#507 <system.html#507>`_ - - `writeChars`:idx: - `system.html#508 <system.html#508>`_ - - `writeln`:idx: - * `system.html#501 <system.html#501>`_ - * `system.html#502 <system.html#502>`_ - - `WSTOPPED`:idx: - `posix.html#713 <posix.html#713>`_ - - `WSTOPSIG`:idx: - `posix.html#710 <posix.html#710>`_ - - `WTERMSIG`:idx: - `posix.html#711 <posix.html#711>`_ - - `WUNTRACED`:idx: - `posix.html#704 <posix.html#704>`_ - - `X_OK`:idx: - `posix.html#481 <posix.html#481>`_ - - `xor`:idx: - * `system.html#118 <system.html#118>`_ - * `system.html#241 <system.html#241>`_ - * `system.html#242 <system.html#242>`_ - * `system.html#243 <system.html#243>`_ - * `system.html#244 <system.html#244>`_ - * `system.html#245 <system.html#245>`_ - - `YESEXPR`:idx: - `posix.html#441 <posix.html#441>`_ - - `yield`:idx: - `manual.html#191 <manual.html#191>`_ - - `Z_ASCII`:idx: - `zlib.html#138 <zlib.html#138>`_ - - `Z_BEST_COMPRESSION`:idx: - `zlib.html#132 <zlib.html#132>`_ - - `Z_BEST_SPEED`:idx: - `zlib.html#131 <zlib.html#131>`_ - - `Z_BINARY`:idx: - `zlib.html#137 <zlib.html#137>`_ - - `Z_BUF_ERROR`:idx: - `zlib.html#128 <zlib.html#128>`_ - - `Z_DATA_ERROR`:idx: - `zlib.html#126 <zlib.html#126>`_ - - `Z_DEFAULT_COMPRESSION`:idx: - `zlib.html#133 <zlib.html#133>`_ - - `Z_DEFAULT_STRATEGY`:idx: - `zlib.html#136 <zlib.html#136>`_ - - `Z_DEFLATED`:idx: - `zlib.html#140 <zlib.html#140>`_ - - `ze`:idx: - * `system.html#172 <system.html#172>`_ - * `system.html#173 <system.html#173>`_ - - `ze64`:idx: - * `system.html#174 <system.html#174>`_ - * `system.html#175 <system.html#175>`_ - * `system.html#176 <system.html#176>`_ - * `system.html#177 <system.html#177>`_ - - `zeroMem`:idx: - `system.html#409 <system.html#409>`_ - - `Z_ERRNO`:idx: - `zlib.html#124 <zlib.html#124>`_ - - `zError`:idx: - `zlib.html#184 <zlib.html#184>`_ - - `Z_FILTERED`:idx: - `zlib.html#134 <zlib.html#134>`_ - - `Z_FINISH`:idx: - `zlib.html#120 <zlib.html#120>`_ - - `Z_FULL_FLUSH`:idx: - `zlib.html#119 <zlib.html#119>`_ - - `Z_HUFFMAN_ONLY`:idx: - `zlib.html#135 <zlib.html#135>`_ - - `zip_add`:idx: - `libzip.html#170 <libzip.html#170>`_ - - `zip_add_dir`:idx: - `libzip.html#171 <libzip.html#171>`_ - - `ZIP_AFL_TORRENT`:idx: - `libzip.html#116 <libzip.html#116>`_ - - `ZIP_CHECKCONS`:idx: - `libzip.html#110 <libzip.html#110>`_ - - `zip_close`:idx: - `libzip.html#172 <libzip.html#172>`_ - - `ZIP_CM_BZIP2`:idx: - `libzip.html#155 <libzip.html#155>`_ - - `ZIP_CM_DEFAULT`:idx: - `libzip.html#144 <libzip.html#144>`_ - - `ZIP_CM_DEFLATE`:idx: - `libzip.html#152 <libzip.html#152>`_ - - `ZIP_CM_DEFLATE64`:idx: - `libzip.html#153 <libzip.html#153>`_ - - `ZIP_CM_IMPLODE`:idx: - `libzip.html#151 <libzip.html#151>`_ - - `ZIP_CM_LZ77`:idx: - `libzip.html#158 <libzip.html#158>`_ - - `ZIP_CM_LZMA`:idx: - `libzip.html#156 <libzip.html#156>`_ - - `ZIP_CM_PKWARE_IMPLODE`:idx: - `libzip.html#154 <libzip.html#154>`_ - - `ZIP_CM_PPMD`:idx: - `libzip.html#160 <libzip.html#160>`_ - - `ZIP_CM_REDUCE_1`:idx: - `libzip.html#147 <libzip.html#147>`_ - - `ZIP_CM_REDUCE_2`:idx: - `libzip.html#148 <libzip.html#148>`_ - - `ZIP_CM_REDUCE_3`:idx: - `libzip.html#149 <libzip.html#149>`_ - - `ZIP_CM_REDUCE_4`:idx: - `libzip.html#150 <libzip.html#150>`_ - - `ZIP_CM_SHRINK`:idx: - `libzip.html#146 <libzip.html#146>`_ - - `ZIP_CM_STORE`:idx: - `libzip.html#145 <libzip.html#145>`_ - - `ZIP_CM_TERSE`:idx: - `libzip.html#157 <libzip.html#157>`_ - - `ZIP_CM_WAVPACK`:idx: - `libzip.html#159 <libzip.html#159>`_ - - `ZIP_CREATE`:idx: - `libzip.html#108 <libzip.html#108>`_ - - `zip_delete`:idx: - `libzip.html#173 <libzip.html#173>`_ - - `ZIP_EM_NONE`:idx: - `libzip.html#161 <libzip.html#161>`_ - - `ZIP_EM_TRAD_PKWARE`:idx: - `libzip.html#162 <libzip.html#162>`_ - - `ZIP_EM_UNKNOWN`:idx: - `libzip.html#163 <libzip.html#163>`_ - - `ZIP_ER_CHANGED`:idx: - `libzip.html#132 <libzip.html#132>`_ - - `ZIP_ER_CLOSE`:idx: - `libzip.html#120 <libzip.html#120>`_ - - `ZIP_ER_COMPNOTSUPP`:idx: - `libzip.html#133 <libzip.html#133>`_ - - `ZIP_ER_CRC`:idx: - `libzip.html#124 <libzip.html#124>`_ - - `ZIP_ER_DELETED`:idx: - `libzip.html#140 <libzip.html#140>`_ - - `ZIP_ER_EOF`:idx: - `libzip.html#134 <libzip.html#134>`_ - - `ZIP_ER_EXISTS`:idx: - `libzip.html#127 <libzip.html#127>`_ - - `ZIP_ER_INCONS`:idx: - `libzip.html#138 <libzip.html#138>`_ - - `ZIP_ER_INTERNAL`:idx: - `libzip.html#137 <libzip.html#137>`_ - - `ZIP_ER_INVAL`:idx: - `libzip.html#135 <libzip.html#135>`_ - - `ZIP_ER_MEMORY`:idx: - `libzip.html#131 <libzip.html#131>`_ - - `ZIP_ER_MULTIDISK`:idx: - `libzip.html#118 <libzip.html#118>`_ - - `ZIP_ER_NOENT`:idx: - `libzip.html#126 <libzip.html#126>`_ - - `ZIP_ER_NOZIP`:idx: - `libzip.html#136 <libzip.html#136>`_ - - `ZIP_ER_OK`:idx: - `libzip.html#117 <libzip.html#117>`_ - - `ZIP_ER_OPEN`:idx: - `libzip.html#128 <libzip.html#128>`_ - - `ZIP_ER_READ`:idx: - `libzip.html#122 <libzip.html#122>`_ - - `ZIP_ER_REMOVE`:idx: - `libzip.html#139 <libzip.html#139>`_ - - `ZIP_ER_RENAME`:idx: - `libzip.html#119 <libzip.html#119>`_ - - `zip_error_clear`:idx: - `libzip.html#174 <libzip.html#174>`_ - - `zip_error_get`:idx: - `libzip.html#175 <libzip.html#175>`_ - - `zip_error_get_sys_type`:idx: - `libzip.html#176 <libzip.html#176>`_ - - `zip_error_to_str`:idx: - `libzip.html#177 <libzip.html#177>`_ - - `ZIP_ER_SEEK`:idx: - `libzip.html#121 <libzip.html#121>`_ - - `ZIP_ER_TMPOPEN`:idx: - `libzip.html#129 <libzip.html#129>`_ - - `ZIP_ER_WRITE`:idx: - `libzip.html#123 <libzip.html#123>`_ - - `ZIP_ER_ZIPCLOSED`:idx: - `libzip.html#125 <libzip.html#125>`_ - - `ZIP_ER_ZLIB`:idx: - `libzip.html#130 <libzip.html#130>`_ - - `ZIP_ET_NONE`:idx: - `libzip.html#141 <libzip.html#141>`_ - - `ZIP_ET_SYS`:idx: - `libzip.html#142 <libzip.html#142>`_ - - `ZIP_ET_ZLIB`:idx: - `libzip.html#143 <libzip.html#143>`_ - - `ZIP_EXCL`:idx: - `libzip.html#109 <libzip.html#109>`_ - - `zip_fclose`:idx: - `libzip.html#178 <libzip.html#178>`_ - - `zip_file_error_clear`:idx: - `libzip.html#179 <libzip.html#179>`_ - - `zip_file_error_get`:idx: - `libzip.html#180 <libzip.html#180>`_ - - `zip_file_strerror`:idx: - `libzip.html#181 <libzip.html#181>`_ - - `ZIP_FL_COMPRESSED`:idx: - `libzip.html#113 <libzip.html#113>`_ - - `ZIP_FL_NOCASE`:idx: - `libzip.html#111 <libzip.html#111>`_ - - `ZIP_FL_NODIR`:idx: - `libzip.html#112 <libzip.html#112>`_ - - `ZIP_FL_RECOMPRESS`:idx: - `libzip.html#115 <libzip.html#115>`_ - - `ZIP_FL_UNCHANGED`:idx: - `libzip.html#114 <libzip.html#114>`_ - - `zip_fopen`:idx: - `libzip.html#182 <libzip.html#182>`_ - - `zip_fopen_index`:idx: - `libzip.html#183 <libzip.html#183>`_ - - `zip_fread`:idx: - `libzip.html#184 <libzip.html#184>`_ - - `zip_get_archive_comment`:idx: - `libzip.html#185 <libzip.html#185>`_ - - `zip_get_archive_flag`:idx: - `libzip.html#186 <libzip.html#186>`_ - - `zip_get_file_comment`:idx: - `libzip.html#187 <libzip.html#187>`_ - - `zip_get_name`:idx: - `libzip.html#188 <libzip.html#188>`_ - - `zip_get_num_files`:idx: - `libzip.html#189 <libzip.html#189>`_ - - `zip_name_locate`:idx: - `libzip.html#190 <libzip.html#190>`_ - - `zip_open`:idx: - `libzip.html#191 <libzip.html#191>`_ - - `zip_rename`:idx: - `libzip.html#192 <libzip.html#192>`_ - - `zip_replace`:idx: - `libzip.html#193 <libzip.html#193>`_ - - `zip_set_archive_comment`:idx: - `libzip.html#194 <libzip.html#194>`_ - - `zip_set_archive_flag`:idx: - `libzip.html#195 <libzip.html#195>`_ - - `zip_set_file_comment`:idx: - `libzip.html#196 <libzip.html#196>`_ - - `zip_source_buffer`:idx: - `libzip.html#197 <libzip.html#197>`_ - - `ZIP_SOURCE_CLOSE`:idx: - `libzip.html#166 <libzip.html#166>`_ - - `ZIP_SOURCE_ERROR`:idx: - `libzip.html#168 <libzip.html#168>`_ - - `zip_source_file`:idx: - `libzip.html#198 <libzip.html#198>`_ - - `zip_source_filep`:idx: - `libzip.html#199 <libzip.html#199>`_ - - `zip_source_free`:idx: - `libzip.html#200 <libzip.html#200>`_ - - `zip_source_function`:idx: - `libzip.html#201 <libzip.html#201>`_ - - `ZIP_SOURCE_OPEN`:idx: - `libzip.html#164 <libzip.html#164>`_ - - `ZIP_SOURCE_READ`:idx: - `libzip.html#165 <libzip.html#165>`_ - - `ZIP_SOURCE_STAT`:idx: - `libzip.html#167 <libzip.html#167>`_ - - `zip_source_zip`:idx: - `libzip.html#202 <libzip.html#202>`_ - - `zip_stat`:idx: - `libzip.html#203 <libzip.html#203>`_ - - `zip_stat_index`:idx: - `libzip.html#204 <libzip.html#204>`_ - - `zip_stat_init`:idx: - `libzip.html#205 <libzip.html#205>`_ - - `zip_strerror`:idx: - `libzip.html#206 <libzip.html#206>`_ - - `zip_unchange`:idx: - `libzip.html#207 <libzip.html#207>`_ - - `zip_unchange_all`:idx: - `libzip.html#208 <libzip.html#208>`_ - - `zip_unchange_archive`:idx: - `libzip.html#209 <libzip.html#209>`_ - - `zlibAllocMem`:idx: - `zlib.html#187 <zlib.html#187>`_ - - `zlibFreeMem`:idx: - `zlib.html#188 <zlib.html#188>`_ - - `zlibVersion`:idx: - `zlib.html#142 <zlib.html#142>`_ - - `Z_MEM_ERROR`:idx: - `zlib.html#127 <zlib.html#127>`_ - - `Z_NEED_DICT`:idx: - `zlib.html#123 <zlib.html#123>`_ - - `Z_NO_COMPRESSION`:idx: - `zlib.html#130 <zlib.html#130>`_ - - `Z_NO_FLUSH`:idx: - `zlib.html#116 <zlib.html#116>`_ - - `Z_NULL`:idx: - `zlib.html#141 <zlib.html#141>`_ - - `z_off_t`:idx: - `zlib.html#105 <zlib.html#105>`_ - - `Z_OK`:idx: - `zlib.html#121 <zlib.html#121>`_ - - `Z_PARTIAL_FLUSH`:idx: - `zlib.html#117 <zlib.html#117>`_ - - `Z_STREAM_END`:idx: - `zlib.html#122 <zlib.html#122>`_ - - `Z_STREAM_ERROR`:idx: - `zlib.html#125 <zlib.html#125>`_ - - `Z_SYNC_FLUSH`:idx: - `zlib.html#118 <zlib.html#118>`_ - - `Z_UNKNOWN`:idx: - `zlib.html#139 <zlib.html#139>`_ - - `Z_VERSION_ERROR`:idx: - `zlib.html#129 <zlib.html#129>`_ \ No newline at end of file + +===== +Index +===== + +.. index:: + + + `!=`:idx: + `system.html#351 <system.html#351>`_ + + `$`:idx: + * `system.html#422 <system.html#422>`_ + * `system.html#423 <system.html#423>`_ + * `system.html#424 <system.html#424>`_ + * `system.html#425 <system.html#425>`_ + * `system.html#426 <system.html#426>`_ + * `system.html#427 <system.html#427>`_ + * `system.html#428 <system.html#428>`_ + * `system.html#429 <system.html#429>`_ + * `times.html#109 <times.html#109>`_ + * `times.html#110 <times.html#110>`_ + + `%`:idx: + * `strutils.html#111 <strutils.html#111>`_ + * `strutils.html#112 <strutils.html#112>`_ + * `strtabs.html#112 <strtabs.html#112>`_ + + `%%`:idx: + * `system.html#296 <system.html#296>`_ + * `system.html#297 <system.html#297>`_ + * `system.html#298 <system.html#298>`_ + * `system.html#299 <system.html#299>`_ + * `system.html#300 <system.html#300>`_ + + `&`:idx: + * `system.html#362 <system.html#362>`_ + * `system.html#363 <system.html#363>`_ + * `system.html#364 <system.html#364>`_ + * `system.html#365 <system.html#365>`_ + * `system.html#453 <system.html#453>`_ + * `system.html#454 <system.html#454>`_ + * `system.html#455 <system.html#455>`_ + * `system.html#456 <system.html#456>`_ + + `*`:idx: + * `system.html#206 <system.html#206>`_ + * `system.html#207 <system.html#207>`_ + * `system.html#208 <system.html#208>`_ + * `system.html#209 <system.html#209>`_ + * `system.html#210 <system.html#210>`_ + * `system.html#315 <system.html#315>`_ + * `system.html#323 <system.html#323>`_ + * `complex.html#107 <complex.html#107>`_ + + `*%`:idx: + * `system.html#286 <system.html#286>`_ + * `system.html#287 <system.html#287>`_ + * `system.html#288 <system.html#288>`_ + * `system.html#289 <system.html#289>`_ + * `system.html#290 <system.html#290>`_ + + `+`:idx: + * `system.html#181 <system.html#181>`_ + * `system.html#182 <system.html#182>`_ + * `system.html#183 <system.html#183>`_ + * `system.html#184 <system.html#184>`_ + * `system.html#185 <system.html#185>`_ + * `system.html#196 <system.html#196>`_ + * `system.html#197 <system.html#197>`_ + * `system.html#198 <system.html#198>`_ + * `system.html#199 <system.html#199>`_ + * `system.html#200 <system.html#200>`_ + * `system.html#311 <system.html#311>`_ + * `system.html#313 <system.html#313>`_ + * `system.html#324 <system.html#324>`_ + * `complex.html#103 <complex.html#103>`_ + + `+%`:idx: + * `system.html#276 <system.html#276>`_ + * `system.html#277 <system.html#277>`_ + * `system.html#278 <system.html#278>`_ + * `system.html#279 <system.html#279>`_ + * `system.html#280 <system.html#280>`_ + + `-`:idx: + * `system.html#186 <system.html#186>`_ + * `system.html#187 <system.html#187>`_ + * `system.html#188 <system.html#188>`_ + * `system.html#189 <system.html#189>`_ + * `system.html#190 <system.html#190>`_ + * `system.html#201 <system.html#201>`_ + * `system.html#202 <system.html#202>`_ + * `system.html#203 <system.html#203>`_ + * `system.html#204 <system.html#204>`_ + * `system.html#205 <system.html#205>`_ + * `system.html#312 <system.html#312>`_ + * `system.html#314 <system.html#314>`_ + * `system.html#325 <system.html#325>`_ + * `complex.html#104 <complex.html#104>`_ + * `complex.html#105 <complex.html#105>`_ + * `times.html#113 <times.html#113>`_ + + `-%`:idx: + * `system.html#281 <system.html#281>`_ + * `system.html#282 <system.html#282>`_ + * `system.html#283 <system.html#283>`_ + * `system.html#284 <system.html#284>`_ + * `system.html#285 <system.html#285>`_ + + `-+-`:idx: + `system.html#326 <system.html#326>`_ + + `/`:idx: + * `system.html#316 <system.html#316>`_ + * `os.html#119 <os.html#119>`_ + * `complex.html#106 <complex.html#106>`_ + + `/%`:idx: + * `system.html#291 <system.html#291>`_ + * `system.html#292 <system.html#292>`_ + * `system.html#293 <system.html#293>`_ + * `system.html#294 <system.html#294>`_ + * `system.html#295 <system.html#295>`_ + + `/../`:idx: + `os.html#123 <os.html#123>`_ + + `<`:idx: + * `system.html#256 <system.html#256>`_ + * `system.html#257 <system.html#257>`_ + * `system.html#258 <system.html#258>`_ + * `system.html#259 <system.html#259>`_ + * `system.html#260 <system.html#260>`_ + * `system.html#319 <system.html#319>`_ + * `system.html#343 <system.html#343>`_ + * `system.html#344 <system.html#344>`_ + * `system.html#345 <system.html#345>`_ + * `system.html#346 <system.html#346>`_ + * `system.html#347 <system.html#347>`_ + * `system.html#348 <system.html#348>`_ + * `system.html#349 <system.html#349>`_ + * `system.html#350 <system.html#350>`_ + * `times.html#114 <times.html#114>`_ + + `<%`:idx: + * `system.html#306 <system.html#306>`_ + * `system.html#307 <system.html#307>`_ + * `system.html#308 <system.html#308>`_ + * `system.html#309 <system.html#309>`_ + * `system.html#310 <system.html#310>`_ + + `<=`:idx: + * `system.html#251 <system.html#251>`_ + * `system.html#252 <system.html#252>`_ + * `system.html#253 <system.html#253>`_ + * `system.html#254 <system.html#254>`_ + * `system.html#255 <system.html#255>`_ + * `system.html#318 <system.html#318>`_ + * `system.html#336 <system.html#336>`_ + * `system.html#337 <system.html#337>`_ + * `system.html#338 <system.html#338>`_ + * `system.html#339 <system.html#339>`_ + * `system.html#340 <system.html#340>`_ + * `system.html#341 <system.html#341>`_ + * `system.html#342 <system.html#342>`_ + + `<=`:idx: + `times.html#115 <times.html#115>`_ + + `<=%`:idx: + * `system.html#301 <system.html#301>`_ + * `system.html#302 <system.html#302>`_ + * `system.html#303 <system.html#303>`_ + * `system.html#304 <system.html#304>`_ + * `system.html#305 <system.html#305>`_ + + `==`:idx: + * `system.html#246 <system.html#246>`_ + * `system.html#247 <system.html#247>`_ + * `system.html#248 <system.html#248>`_ + * `system.html#249 <system.html#249>`_ + * `system.html#250 <system.html#250>`_ + * `system.html#317 <system.html#317>`_ + * `system.html#327 <system.html#327>`_ + * `system.html#328 <system.html#328>`_ + * `system.html#329 <system.html#329>`_ + * `system.html#330 <system.html#330>`_ + * `system.html#331 <system.html#331>`_ + * `system.html#332 <system.html#332>`_ + * `system.html#333 <system.html#333>`_ + * `system.html#334 <system.html#334>`_ + * `system.html#335 <system.html#335>`_ + * `system.html#458 <system.html#458>`_ + * `complex.html#102 <complex.html#102>`_ + * `md5.html#107 <md5.html#107>`_ + + `=~`:idx: + `regexprs.html#111 <regexprs.html#111>`_ + + `>`:idx: + `system.html#353 <system.html#353>`_ + + `>%`:idx: + `system.html#421 <system.html#421>`_ + + `>=`:idx: + `system.html#352 <system.html#352>`_ + + `>=%`:idx: + `system.html#420 <system.html#420>`_ + + `@`:idx: + `system.html#361 <system.html#361>`_ + + `[]`:idx: + `strtabs.html#107 <strtabs.html#107>`_ + + `[]=`:idx: + `strtabs.html#106 <strtabs.html#106>`_ + + `[ESC]`:idx: + `manual.html#134 <manual.html#134>`_ + + `abs`:idx: + * `system.html#261 <system.html#261>`_ + * `system.html#262 <system.html#262>`_ + * `system.html#263 <system.html#263>`_ + * `system.html#264 <system.html#264>`_ + * `system.html#265 <system.html#265>`_ + * `system.html#320 <system.html#320>`_ + * `complex.html#108 <complex.html#108>`_ + + `acyclic`:idx: + `nimrodc.html#113 <nimrodc.html#113>`_ + + `add`:idx: + * `system.html#366 <system.html#366>`_ + * `system.html#367 <system.html#367>`_ + * `system.html#368 <system.html#368>`_ + * `system.html#369 <system.html#369>`_ + * `system.html#370 <system.html#370>`_ + + `addf`:idx: + `strutils.html#113 <strutils.html#113>`_ + + `addFile`:idx: + * `zipfiles.html#105 <zipfiles.html#105>`_ + * `zipfiles.html#106 <zipfiles.html#106>`_ + * `zipfiles.html#107 <zipfiles.html#107>`_ + + `addQuitProc`:idx: + `system.html#404 <system.html#404>`_ + + `addSep`:idx: + `strutils.html#151 <strutils.html#151>`_ + + `alert`:idx: + `manual.html#131 <manual.html#131>`_ + + `allCharsInSet`:idx: + `strutils.html#152 <strutils.html#152>`_ + + `alloc`:idx: + `system.html#413 <system.html#413>`_ + + `alloc0`:idx: + `system.html#414 <system.html#414>`_ + + `ALLOC_MAX_BLOCK_TO_DROP`:idx: + `mysql.html#317 <mysql.html#317>`_ + + `ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP`:idx: + `mysql.html#318 <mysql.html#318>`_ + + `AltSep`:idx: + `os.html#104 <os.html#104>`_ + + `and`:idx: + * `system.html#116 <system.html#116>`_ + * `system.html#231 <system.html#231>`_ + * `system.html#232 <system.html#232>`_ + * `system.html#233 <system.html#233>`_ + * `system.html#234 <system.html#234>`_ + * `system.html#235 <system.html#235>`_ + + `apostrophe`:idx: + `manual.html#129 <manual.html#129>`_ + + `AppendFileExt`:idx: + `os.html#131 <os.html#131>`_ + + `arccos`:idx: + `math.html#122 <math.html#122>`_ + + `arcsin`:idx: + `math.html#123 <math.html#123>`_ + + `arctan`:idx: + `math.html#124 <math.html#124>`_ + + `arctan2`:idx: + `math.html#125 <math.html#125>`_ + + `arithmetic bit shifts`:idx: + `tut1.html#110 <tut1.html#110>`_ + + `array`:idx: + * `tut1.html#117 <tut1.html#117>`_ + * `system.html#124 <system.html#124>`_ + + `array properties`:idx: + `tut2.html#105 <tut2.html#105>`_ + + `Arrays`:idx: + `manual.html#152 <manual.html#152>`_ + + `assembler`:idx: + `manual.html#196 <manual.html#196>`_ + + `assert`:idx: + `system.html#418 <system.html#418>`_ + + `attrKey`:idx: + `parsexml.html#113 <parsexml.html#113>`_ + + `attrValue`:idx: + `parsexml.html#114 <parsexml.html#114>`_ + + `AUTO_INCREMENT_FLAG`:idx: + `mysql.html#133 <mysql.html#133>`_ + + `Automatic type conversion`:idx: + * `manual.html#144 <manual.html#144>`_ + * `tut1.html#111 <tut1.html#111>`_ + + `backslash`:idx: + * `manual.html#127 <manual.html#127>`_ + * `regexprs.html#101 <regexprs.html#101>`_ + + `backspace`:idx: + `manual.html#132 <manual.html#132>`_ + + `BiggestFloat`:idx: + `system.html#374 <system.html#374>`_ + + `BiggestInt`:idx: + `system.html#373 <system.html#373>`_ + + `BINARY_FLAG`:idx: + `mysql.html#131 <mysql.html#131>`_ + + `BINCMP_FLAG`:idx: + `mysql.html#141 <mysql.html#141>`_ + + `binom`:idx: + `math.html#105 <math.html#105>`_ + + `BLOB_FLAG`:idx: + `mysql.html#128 <mysql.html#128>`_ + + `block`:idx: + `manual.html#192 <manual.html#192>`_ + + `bool`:idx: + `system.html#109 <system.html#109>`_ + + `boolean`:idx: + * `manual.html#146 <manual.html#146>`_ + * `tut1.html#107 <tut1.html#107>`_ + + `break`:idx: + `manual.html#193 <manual.html#193>`_ + + `breakpoint`:idx: + `endb.html#103 <endb.html#103>`_ + + `Byte`:idx: + `system.html#128 <system.html#128>`_ + + `calling conventions`:idx: + `manual.html#163 <manual.html#163>`_ + + `capitalize`:idx: + `strutils.html#119 <strutils.html#119>`_ + + `card`:idx: + `system.html#169 <system.html#169>`_ + + `carriage return`:idx: + `manual.html#122 <manual.html#122>`_ + + `case`:idx: + `manual.html#181 <manual.html#181>`_ + + `cchar`:idx: + `system.html#375 <system.html#375>`_ + + `cdecl`:idx: + `manual.html#165 <manual.html#165>`_ + + `cdouble`:idx: + `system.html#382 <system.html#382>`_ + + `cfloat`:idx: + `system.html#381 <system.html#381>`_ + + `cgiError`:idx: + `cgi.html#106 <cgi.html#106>`_ + + `ChangeFileExt`:idx: + `os.html#132 <os.html#132>`_ + + `char`:idx: + `system.html#110 <system.html#110>`_ + + `character type`:idx: + `manual.html#147 <manual.html#147>`_ + + `character with decimal value d`:idx: + `manual.html#130 <manual.html#130>`_ + + `character with hex value HH`:idx: + `manual.html#135 <manual.html#135>`_ + + `character_set`:idx: + `mysql.html#351 <mysql.html#351>`_ + + `charData`:idx: + `parsexml.html#109 <parsexml.html#109>`_ + + `CHARSET_INFO`:idx: + `mysql.html#348 <mysql.html#348>`_ + + `charset_info_st`:idx: + `mysql.html#347 <mysql.html#347>`_ + + `checked runtime error`:idx: + `manual.html#110 <manual.html#110>`_ + + `check_scramble`:idx: + `mysql.html#279 <mysql.html#279>`_ + + `check_scramble_323`:idx: + `mysql.html#273 <mysql.html#273>`_ + + `chr`:idx: + `system.html#171 <system.html#171>`_ + + `cint`:idx: + `system.html#378 <system.html#378>`_ + + `classify`:idx: + `math.html#104 <math.html#104>`_ + + `CLIENT_COMPRESS`:idx: + `mysql.html#161 <mysql.html#161>`_ + + `CLIENT_CONNECT_WITH_DB`:idx: + `mysql.html#159 <mysql.html#159>`_ + + `CLIENT_FOUND_ROWS`:idx: + `mysql.html#157 <mysql.html#157>`_ + + `CLIENT_IGNORE_SIGPIPE`:idx: + `mysql.html#168 <mysql.html#168>`_ + + `CLIENT_IGNORE_SPACE`:idx: + `mysql.html#164 <mysql.html#164>`_ + + `CLIENT_INTERACTIVE`:idx: + `mysql.html#166 <mysql.html#166>`_ + + `CLIENT_LOCAL_FILES`:idx: + `mysql.html#163 <mysql.html#163>`_ + + `CLIENT_LONG_FLAG`:idx: + `mysql.html#158 <mysql.html#158>`_ + + `CLIENT_LONG_PASSWORD`:idx: + `mysql.html#156 <mysql.html#156>`_ + + `CLIENT_MULTI_QUERIES`:idx: + `mysql.html#203 <mysql.html#203>`_ + + `CLIENT_MULTI_RESULTS`:idx: + `mysql.html#173 <mysql.html#173>`_ + + `CLIENT_MULTI_STATEMENTS`:idx: + `mysql.html#172 <mysql.html#172>`_ + + `CLIENT_NET_READ_TIMEOUT`:idx: + `mysql.html#292 <mysql.html#292>`_ + + `CLIENT_NET_WRITE_TIMEOUT`:idx: + `mysql.html#293 <mysql.html#293>`_ + + `CLIENT_NO_SCHEMA`:idx: + `mysql.html#160 <mysql.html#160>`_ + + `CLIENT_ODBC`:idx: + `mysql.html#162 <mysql.html#162>`_ + + `CLIENT_PROTOCOL_41`:idx: + `mysql.html#165 <mysql.html#165>`_ + + `CLIENT_REMEMBER_OPTIONS`:idx: + `mysql.html#174 <mysql.html#174>`_ + + `CLIENT_RESERVED`:idx: + `mysql.html#170 <mysql.html#170>`_ + + `CLIENT_SECURE_CONNECTION`:idx: + `mysql.html#171 <mysql.html#171>`_ + + `CLIENT_SSL`:idx: + `mysql.html#167 <mysql.html#167>`_ + + `CLIENT_TRANSACTIONS`:idx: + `mysql.html#169 <mysql.html#169>`_ + + `clong`:idx: + `system.html#379 <system.html#379>`_ + + `clongdouble`:idx: + `system.html#383 <system.html#383>`_ + + `clonglong`:idx: + `system.html#380 <system.html#380>`_ + + `close`:idx: + * `lexbase.html#105 <lexbase.html#105>`_ + * `parsecfg.html#105 <parsecfg.html#105>`_ + * `parsexml.html#108 <parsexml.html#108>`_ + * `zipfiles.html#103 <zipfiles.html#103>`_ + + `CloseFile`:idx: + `system.html#489 <system.html#489>`_ + + `closure`:idx: + `manual.html#170 <manual.html#170>`_ + + `cmp`:idx: + * `system.html#359 <system.html#359>`_ + * `system.html#360 <system.html#360>`_ + + `cmpIgnoreCase`:idx: + `strutils.html#137 <strutils.html#137>`_ + + `cmpIgnoreStyle`:idx: + `strutils.html#138 <strutils.html#138>`_ + + `cmpPaths`:idx: + `os.html#130 <os.html#130>`_ + + `cmpRunesIgnoreCase`:idx: + `unicode.html#115 <unicode.html#115>`_ + + `comment pieces`:idx: + * `manual.html#115 <manual.html#115>`_ + * `tut1.html#103 <tut1.html#103>`_ + + `Comments`:idx: + * `manual.html#114 <manual.html#114>`_ + * `tut1.html#102 <tut1.html#102>`_ + + `COMP_HEADER_SIZE`:idx: + `mysql.html#266 <mysql.html#266>`_ + + `CompileDate`:idx: + `system.html#391 <system.html#391>`_ + + `CompileTime`:idx: + `system.html#392 <system.html#392>`_ + + `complex statements`:idx: + `manual.html#175 <manual.html#175>`_ + + `const`:idx: + `manual.html#179 <manual.html#179>`_ + + `constant expressions`:idx: + `manual.html#108 <manual.html#108>`_ + + `Constants`:idx: + * `manual.html#139 <manual.html#139>`_ + * `tut1.html#104 <tut1.html#104>`_ + + `contains`:idx: + * `system.html#354 <system.html#354>`_ + * `strutils.html#139 <strutils.html#139>`_ + * `strutils.html#140 <strutils.html#140>`_ + * `strutils.html#141 <strutils.html#141>`_ + + `continue`:idx: + `manual.html#195 <manual.html#195>`_ + + `copy`:idx: + * `system.html#405 <system.html#405>`_ + * `system.html#406 <system.html#406>`_ + + `copyFile`:idx: + `os.html#134 <os.html#134>`_ + + `copyMem`:idx: + `system.html#410 <system.html#410>`_ + + `cos`:idx: + `math.html#126 <math.html#126>`_ + + `cosh`:idx: + `math.html#127 <math.html#127>`_ + + `countBits`:idx: + `math.html#109 <math.html#109>`_ + + `countdown`:idx: + `system.html#439 <system.html#439>`_ + + `countup`:idx: + `system.html#440 <system.html#440>`_ + + `cpuEndian`:idx: + `system.html#397 <system.html#397>`_ + + `createDir`:idx: + * `os.html#138 <os.html#138>`_ + * `zipfiles.html#104 <zipfiles.html#104>`_ + + `create_random_string`:idx: + `mysql.html#269 <mysql.html#269>`_ + + `cschar`:idx: + `system.html#376 <system.html#376>`_ + + `cshort`:idx: + `system.html#377 <system.html#377>`_ + + `cstring`:idx: + `system.html#112 <system.html#112>`_ + + `cstringArray`:idx: + `system.html#384 <system.html#384>`_ + + `cuint`:idx: + `mysql.html#109 <mysql.html#109>`_ + + `CurDir`:idx: + `os.html#101 <os.html#101>`_ + + `CURLAUTH_ANY`:idx: + `libcurl.html#192 <libcurl.html#192>`_ + + `CURLAUTH_ANYSAFE`:idx: + `libcurl.html#194 <libcurl.html#194>`_ + + `CURLAUTH_BASIC`:idx: + `libcurl.html#193 <libcurl.html#193>`_ + + `CURLAUTH_DIGEST`:idx: + `libcurl.html#195 <libcurl.html#195>`_ + + `CURLAUTH_GSSNEGOTIATE`:idx: + `libcurl.html#196 <libcurl.html#196>`_ + + `CURLAUTH_NONE`:idx: + `libcurl.html#197 <libcurl.html#197>`_ + + `CURLAUTH_NTLM`:idx: + `libcurl.html#198 <libcurl.html#198>`_ + + `CURLE_ALREADY_COMPLETE`:idx: + `libcurl.html#199 <libcurl.html#199>`_ + + `curl_easy_cleanup`:idx: + `libcurl.html#304 <libcurl.html#304>`_ + + `curl_easy_duphandle`:idx: + `libcurl.html#306 <libcurl.html#306>`_ + + `curl_easy_escape`:idx: + `libcurl.html#284 <libcurl.html#284>`_ + + `curl_easy_getinfo`:idx: + `libcurl.html#305 <libcurl.html#305>`_ + + `curl_easy_init`:idx: + `libcurl.html#301 <libcurl.html#301>`_ + + `curl_easy_perform`:idx: + `libcurl.html#303 <libcurl.html#303>`_ + + `curl_easy_reset`:idx: + `libcurl.html#307 <libcurl.html#307>`_ + + `curl_easy_setopt`:idx: + `libcurl.html#302 <libcurl.html#302>`_ + + `curl_easy_strerror`:idx: + `libcurl.html#299 <libcurl.html#299>`_ + + `curl_easy_unescape`:idx: + `libcurl.html#286 <libcurl.html#286>`_ + + `CURLE_FTP_BAD_DOWNLOAD_RESUME`:idx: + `libcurl.html#200 <libcurl.html#200>`_ + + `CURLE_FTP_PARTIAL_FILE`:idx: + `libcurl.html#201 <libcurl.html#201>`_ + + `CURLE_HTTP_NOT_FOUND`:idx: + `libcurl.html#202 <libcurl.html#202>`_ + + `CURLE_HTTP_PORT_FAILED`:idx: + `libcurl.html#203 <libcurl.html#203>`_ + + `CURLE_OPERATION_TIMEDOUT`:idx: + `libcurl.html#204 <libcurl.html#204>`_ + + `CURL_ERROR_SIZE`:idx: + `libcurl.html#205 <libcurl.html#205>`_ + + `curl_escape`:idx: + `libcurl.html#285 <libcurl.html#285>`_ + + `curl_formadd`:idx: + `libcurl.html#279 <libcurl.html#279>`_ + + `CURL_FORMAT_OFF_T`:idx: + `libcurl.html#206 <libcurl.html#206>`_ + + `curl_formfree`:idx: + `libcurl.html#281 <libcurl.html#281>`_ + + `curl_formget`:idx: + `libcurl.html#280 <libcurl.html#280>`_ + + `curl_free`:idx: + `libcurl.html#288 <libcurl.html#288>`_ + + `curl_getdate`:idx: + `libcurl.html#294 <libcurl.html#294>`_ + + `curl_getenv`:idx: + `libcurl.html#282 <libcurl.html#282>`_ + + `CURL_GLOBAL_ALL`:idx: + `libcurl.html#210 <libcurl.html#210>`_ + + `curl_global_cleanup`:idx: + `libcurl.html#291 <libcurl.html#291>`_ + + `CURL_GLOBAL_DEFAULT`:idx: + `libcurl.html#211 <libcurl.html#211>`_ + + `curl_global_init`:idx: + `libcurl.html#289 <libcurl.html#289>`_ + + `curl_global_init_mem`:idx: + `libcurl.html#290 <libcurl.html#290>`_ + + `CURL_GLOBAL_NOTHING`:idx: + `libcurl.html#207 <libcurl.html#207>`_ + + `CURL_GLOBAL_SSL`:idx: + `libcurl.html#208 <libcurl.html#208>`_ + + `CURL_GLOBAL_WIN32`:idx: + `libcurl.html#209 <libcurl.html#209>`_ + + `CURLINFO_DOUBLE`:idx: + `libcurl.html#212 <libcurl.html#212>`_ + + `CURLINFO_HTTP_CODE`:idx: + `libcurl.html#213 <libcurl.html#213>`_ + + `CURLINFO_LONG`:idx: + `libcurl.html#214 <libcurl.html#214>`_ + + `CURLINFO_MASK`:idx: + `libcurl.html#215 <libcurl.html#215>`_ + + `CURLINFO_SLIST`:idx: + `libcurl.html#216 <libcurl.html#216>`_ + + `CURLINFO_STRING`:idx: + `libcurl.html#217 <libcurl.html#217>`_ + + `CURLINFO_TYPEMASK`:idx: + `libcurl.html#218 <libcurl.html#218>`_ + + `CURL_IPRESOLVE_V4`:idx: + `libcurl.html#219 <libcurl.html#219>`_ + + `CURL_IPRESOLVE_V6`:idx: + `libcurl.html#220 <libcurl.html#220>`_ + + `CURL_IPRESOLVE_WHATEVER`:idx: + `libcurl.html#221 <libcurl.html#221>`_ + + `CURL_MAX_WRITE_SIZE`:idx: + `libcurl.html#222 <libcurl.html#222>`_ + + `CURLM_CALL_MULTI_SOCKET`:idx: + `libcurl.html#223 <libcurl.html#223>`_ + + `curl_multi_add_handle`:idx: + `libcurl.html#309 <libcurl.html#309>`_ + + `curl_multi_assign`:idx: + `libcurl.html#320 <libcurl.html#320>`_ + + `curl_multi_cleanup`:idx: + `libcurl.html#313 <libcurl.html#313>`_ + + `curl_multi_fdset`:idx: + `libcurl.html#311 <libcurl.html#311>`_ + + `curl_multi_info_read`:idx: + `libcurl.html#314 <libcurl.html#314>`_ + + `curl_multi_init`:idx: + `libcurl.html#308 <libcurl.html#308>`_ + + `curl_multi_perform`:idx: + `libcurl.html#312 <libcurl.html#312>`_ + + `curl_multi_remove_handle`:idx: + `libcurl.html#310 <libcurl.html#310>`_ + + `curl_multi_setopt`:idx: + `libcurl.html#319 <libcurl.html#319>`_ + + `curl_multi_socket`:idx: + `libcurl.html#316 <libcurl.html#316>`_ + + `curl_multi_socket_all`:idx: + `libcurl.html#317 <libcurl.html#317>`_ + + `curl_multi_strerror`:idx: + `libcurl.html#315 <libcurl.html#315>`_ + + `curl_multi_timeout`:idx: + `libcurl.html#318 <libcurl.html#318>`_ + + `CURLOPT_CLOSEFUNCTION`:idx: + `libcurl.html#224 <libcurl.html#224>`_ + + `CURLOPT_FTPASCII`:idx: + `libcurl.html#225 <libcurl.html#225>`_ + + `CURLOPT_HEADERDATA`:idx: + `libcurl.html#226 <libcurl.html#226>`_ + + `CURLOPT_HTTPREQUEST`:idx: + `libcurl.html#227 <libcurl.html#227>`_ + + `CURLOPT_MUTE`:idx: + `libcurl.html#228 <libcurl.html#228>`_ + + `CURLOPT_PASSWDDATA`:idx: + `libcurl.html#229 <libcurl.html#229>`_ + + `CURLOPT_PASSWDFUNCTION`:idx: + `libcurl.html#230 <libcurl.html#230>`_ + + `CURLOPT_PASV_HOST`:idx: + `libcurl.html#231 <libcurl.html#231>`_ + + `CURLOPT_READDATA`:idx: + `libcurl.html#232 <libcurl.html#232>`_ + + `CURLOPT_SOURCE_HOST`:idx: + `libcurl.html#233 <libcurl.html#233>`_ + + `CURLOPT_SOURCE_PATH`:idx: + `libcurl.html#234 <libcurl.html#234>`_ + + `CURLOPT_SOURCE_PORT`:idx: + `libcurl.html#235 <libcurl.html#235>`_ + + `CURLOPT_SSLKEYPASSWD`:idx: + `libcurl.html#191 <libcurl.html#191>`_ + + `CURLOPTTYPE_FUNCTIONPOINT`:idx: + `libcurl.html#236 <libcurl.html#236>`_ + + `CURLOPTTYPE_LONG`:idx: + `libcurl.html#237 <libcurl.html#237>`_ + + `CURLOPTTYPE_OBJECTPOINT`:idx: + `libcurl.html#238 <libcurl.html#238>`_ + + `CURLOPTTYPE_OFF_T`:idx: + `libcurl.html#239 <libcurl.html#239>`_ + + `CURLOPT_WRITEDATA`:idx: + `libcurl.html#240 <libcurl.html#240>`_ + + `CURL_POLL_IN`:idx: + `libcurl.html#241 <libcurl.html#241>`_ + + `CURL_POLL_INOUT`:idx: + `libcurl.html#242 <libcurl.html#242>`_ + + `CURL_POLL_NONE`:idx: + `libcurl.html#243 <libcurl.html#243>`_ + + `CURL_POLL_OUT`:idx: + `libcurl.html#244 <libcurl.html#244>`_ + + `CURL_POLL_REMOVE`:idx: + `libcurl.html#245 <libcurl.html#245>`_ + + `CURL_READFUNC_ABORT`:idx: + `libcurl.html#246 <libcurl.html#246>`_ + + `curl_share_cleanup`:idx: + `libcurl.html#297 <libcurl.html#297>`_ + + `curl_share_init`:idx: + `libcurl.html#295 <libcurl.html#295>`_ + + `curl_share_setopt`:idx: + `libcurl.html#296 <libcurl.html#296>`_ + + `curl_share_strerror`:idx: + `libcurl.html#300 <libcurl.html#300>`_ + + `curl_slist_append`:idx: + `libcurl.html#292 <libcurl.html#292>`_ + + `curl_slist_free_all`:idx: + `libcurl.html#293 <libcurl.html#293>`_ + + `CURL_SOCKET_BAD`:idx: + `libcurl.html#247 <libcurl.html#247>`_ + + `CURL_SOCKET_TIMEOUT`:idx: + `libcurl.html#248 <libcurl.html#248>`_ + + `curl_strequal`:idx: + `libcurl.html#277 <libcurl.html#277>`_ + + `curl_strnequal`:idx: + `libcurl.html#278 <libcurl.html#278>`_ + + `curl_unescape`:idx: + `libcurl.html#287 <libcurl.html#287>`_ + + `curl_version`:idx: + `libcurl.html#283 <libcurl.html#283>`_ + + `CURL_VERSION_ASYNCHDNS`:idx: + `libcurl.html#249 <libcurl.html#249>`_ + + `CURL_VERSION_CONV`:idx: + `libcurl.html#250 <libcurl.html#250>`_ + + `CURL_VERSION_DEBUG`:idx: + `libcurl.html#251 <libcurl.html#251>`_ + + `CURL_VERSION_GSSNEGOTIATE`:idx: + `libcurl.html#252 <libcurl.html#252>`_ + + `CURL_VERSION_IDN`:idx: + `libcurl.html#253 <libcurl.html#253>`_ + + `curl_version_info`:idx: + `libcurl.html#298 <libcurl.html#298>`_ + + `CURL_VERSION_IPV6`:idx: + `libcurl.html#254 <libcurl.html#254>`_ + + `CURL_VERSION_KERBEROS4`:idx: + `libcurl.html#255 <libcurl.html#255>`_ + + `CURL_VERSION_LARGEFILE`:idx: + `libcurl.html#256 <libcurl.html#256>`_ + + `CURL_VERSION_LIBZ`:idx: + `libcurl.html#257 <libcurl.html#257>`_ + + `CURLVERSION_NOW`:idx: + `libcurl.html#258 <libcurl.html#258>`_ + + `CURL_VERSION_NTLM`:idx: + `libcurl.html#259 <libcurl.html#259>`_ + + `CURL_VERSION_SPNEGO`:idx: + `libcurl.html#260 <libcurl.html#260>`_ + + `CURL_VERSION_SSL`:idx: + `libcurl.html#261 <libcurl.html#261>`_ + + `CURL_VERSION_SSPI`:idx: + `libcurl.html#262 <libcurl.html#262>`_ + + `CursorBackward`:idx: + `terminal.html#107 <terminal.html#107>`_ + + `CursorDown`:idx: + `terminal.html#105 <terminal.html#105>`_ + + `CursorForward`:idx: + `terminal.html#106 <terminal.html#106>`_ + + `CursorUp`:idx: + `terminal.html#104 <terminal.html#104>`_ + + `dangling else problem`:idx: + `manual.html#176 <manual.html#176>`_ + + `dbgLineHook`:idx: + `system.html#435 <system.html#435>`_ + + `dead_code_elim`:idx: + `nimrodc.html#114 <nimrodc.html#114>`_ + + `dealloc`:idx: + `system.html#416 <system.html#416>`_ + + `debugger`:idx: + `nimrodc.html#110 <nimrodc.html#110>`_ + + `dec`:idx: + `system.html#160 <system.html#160>`_ + + `define`:idx: + `manual.html#222 <manual.html#222>`_ + + `defined`:idx: + `system.html#114 <system.html#114>`_ + + `deleteStr`:idx: + `strutils.html#129 <strutils.html#129>`_ + + `Digits`:idx: + `strutils.html#104 <strutils.html#104>`_ + + `DirSep`:idx: + `os.html#103 <os.html#103>`_ + + `discard`:idx: + `manual.html#177 <manual.html#177>`_ + + `div`:idx: + * `system.html#211 <system.html#211>`_ + * `system.html#212 <system.html#212>`_ + * `system.html#213 <system.html#213>`_ + * `system.html#214 <system.html#214>`_ + * `system.html#215 <system.html#215>`_ + + `dom`:idx: + `nimrodc.html#120 <nimrodc.html#120>`_ + + `domain specific languages`:idx: + * `manual.html#211 <manual.html#211>`_ + * `tut2.html#111 <tut2.html#111>`_ + + `dynamic type`:idx: + `manual.html#104 <manual.html#104>`_ + + `DYNAMIC_ARRAY`:idx: + `mysql.html#340 <mysql.html#340>`_ + + `dynlib`:idx: + `nimrodc.html#103 <nimrodc.html#103>`_ + + `E`:idx: + `math.html#102 <math.html#102>`_ + + `EAccessViolation`:idx: + `system.html#143 <system.html#143>`_ + + `EArithmetic`:idx: + `system.html#140 <system.html#140>`_ + + `EAssertionFailed`:idx: + `system.html#144 <system.html#144>`_ + + `EAsynch`:idx: + `system.html#134 <system.html#134>`_ + + `E_Base`:idx: + `system.html#133 <system.html#133>`_ + + `ECgi`:idx: + `cgi.html#104 <cgi.html#104>`_ + + `echo`:idx: + * `system.html#475 <system.html#475>`_ + * `system.html#476 <system.html#476>`_ + + `ECMAScript`:idx: + `nimrodc.html#115 <nimrodc.html#115>`_ + + `EControlC`:idx: + `system.html#145 <system.html#145>`_ + + `editDistance`:idx: + `strutils.html#158 <strutils.html#158>`_ + + `EDivByZero`:idx: + `system.html#141 <system.html#141>`_ + + `EInvalidField`:idx: + `system.html#149 <system.html#149>`_ + + `EInvalidIndex`:idx: + `system.html#148 <system.html#148>`_ + + `EInvalidObjectAssignment`:idx: + `system.html#153 <system.html#153>`_ + + `EInvalidObjectConversion`:idx: + `system.html#154 <system.html#154>`_ + + `EInvalidRegEx`:idx: + `regexprs.html#104 <regexprs.html#104>`_ + + `EInvalidValue`:idx: + `system.html#146 <system.html#146>`_ + + `EIO`:idx: + `system.html#137 <system.html#137>`_ + + `elementName`:idx: + `parsexml.html#111 <parsexml.html#111>`_ + + `Embedded Nimrod Debugger`:idx: + `endb.html#101 <endb.html#101>`_ + + `ENDB`:idx: + `endb.html#102 <endb.html#102>`_ + + `EndOfFile`:idx: + * `system.html#490 <system.html#490>`_ + * `lexbase.html#101 <lexbase.html#101>`_ + + `endsWith`:idx: + `strutils.html#150 <strutils.html#150>`_ + + `ENoExceptionToReraise`:idx: + * `manual.html#184 <manual.html#184>`_ + * `system.html#152 <system.html#152>`_ + + `entityName`:idx: + `parsexml.html#112 <parsexml.html#112>`_ + + `enum_cursor_type`:idx: + `mysql.html#237 <mysql.html#237>`_ + + `Enumeration`:idx: + `manual.html#148 <manual.html#148>`_ + + `enumeration`:idx: + `tut1.html#113 <tut1.html#113>`_ + + `enum_field_types`:idx: + `mysql.html#202 <mysql.html#202>`_ + + `ENUM_FLAG`:idx: + `mysql.html#132 <mysql.html#132>`_ + + `enum_mysql_set_option`:idx: + `mysql.html#238 <mysql.html#238>`_ + + `enum_mysql_stmt_state`:idx: + `mysql.html#376 <mysql.html#376>`_ + + `enum_server_command`:idx: + `mysql.html#119 <mysql.html#119>`_ + + `enum_stmt_attr_type`:idx: + `mysql.html#383 <mysql.html#383>`_ + + `EOS`:idx: + `system.html#138 <system.html#138>`_ + + `EOutOfMemory`:idx: + `system.html#147 <system.html#147>`_ + + `EOutOfRange`:idx: + * `manual.html#145 <manual.html#145>`_ + * `tut1.html#112 <tut1.html#112>`_ + * `system.html#150 <system.html#150>`_ + + `EOverflow`:idx: + `system.html#142 <system.html#142>`_ + + `equalMem`:idx: + `system.html#412 <system.html#412>`_ + + `EraseLine`:idx: + `terminal.html#108 <terminal.html#108>`_ + + `EraseScreen`:idx: + `terminal.html#109 <terminal.html#109>`_ + + `ERessourceExhausted`:idx: + `system.html#139 <system.html#139>`_ + + `error`:idx: + * `manual.html#221 <manual.html#221>`_ + * `manual.html#224 <manual.html#224>`_ + + `errorMsg`:idx: + `parsexml.html#120 <parsexml.html#120>`_ + + `errorMsgExpected`:idx: + `parsexml.html#121 <parsexml.html#121>`_ + + `errorStr`:idx: + `parsecfg.html#110 <parsecfg.html#110>`_ + + `escape`:idx: + * `manual.html#133 <manual.html#133>`_ + * `strutils.html#156 <strutils.html#156>`_ + + `escape sequences`:idx: + `manual.html#120 <manual.html#120>`_ + + `EStackOverflow`:idx: + `system.html#151 <system.html#151>`_ + + `ESynch`:idx: + `system.html#135 <system.html#135>`_ + + `ESystem`:idx: + `system.html#136 <system.html#136>`_ + + `except`:idx: + `manual.html#187 <manual.html#187>`_ + + `exception handlers`:idx: + `manual.html#186 <manual.html#186>`_ + + `exceptions`:idx: + `tut2.html#106 <tut2.html#106>`_ + + `excl`:idx: + `system.html#168 <system.html#168>`_ + + `executeShellCommand`:idx: + `os.html#133 <os.html#133>`_ + + `ExeExt`:idx: + `os.html#107 <os.html#107>`_ + + `existsDir`:idx: + `os.html#139 <os.html#139>`_ + + `existsEnv`:idx: + `os.html#144 <os.html#144>`_ + + `ExistsFile`:idx: + `os.html#117 <os.html#117>`_ + + `exp`:idx: + `math.html#119 <math.html#119>`_ + + `expandFilename`:idx: + `os.html#116 <os.html#116>`_ + + `exportc`:idx: + `nimrodc.html#102 <nimrodc.html#102>`_ + + `expression macros`:idx: + `tut2.html#112 <tut2.html#112>`_ + + `extractDir`:idx: + `os.html#126 <os.html#126>`_ + + `extractFileExt`:idx: + `os.html#128 <os.html#128>`_ + + `extractFilename`:idx: + `os.html#127 <os.html#127>`_ + + `extractFileTrunk`:idx: + `os.html#129 <os.html#129>`_ + + `ExtSep`:idx: + `os.html#109 <os.html#109>`_ + + `fac`:idx: + `math.html#106 <math.html#106>`_ + + `fastcall`:idx: + `manual.html#168 <manual.html#168>`_ + + `fatal`:idx: + `manual.html#225 <manual.html#225>`_ + + `FIELD_TYPE_BIT`:idx: + `mysql.html#231 <mysql.html#231>`_ + + `FIELD_TYPE_BLOB`:idx: + `mysql.html#225 <mysql.html#225>`_ + + `FIELD_TYPE_CHAR`:idx: + `mysql.html#228 <mysql.html#228>`_ + + `FIELD_TYPE_DATE`:idx: + `mysql.html#215 <mysql.html#215>`_ + + `FIELD_TYPE_DATETIME`:idx: + `mysql.html#217 <mysql.html#217>`_ + + `FIELD_TYPE_DECIMAL`:idx: + `mysql.html#204 <mysql.html#204>`_ + + `FIELD_TYPE_DOUBLE`:idx: + `mysql.html#210 <mysql.html#210>`_ + + `FIELD_TYPE_ENUM`:idx: + `mysql.html#220 <mysql.html#220>`_ + + `FIELD_TYPE_FLOAT`:idx: + `mysql.html#209 <mysql.html#209>`_ + + `FIELD_TYPE_GEOMETRY`:idx: + `mysql.html#230 <mysql.html#230>`_ + + `FIELD_TYPE_INT24`:idx: + `mysql.html#214 <mysql.html#214>`_ + + `FIELD_TYPE_INTERVAL`:idx: + `mysql.html#229 <mysql.html#229>`_ + + `FIELD_TYPE_LONG`:idx: + `mysql.html#208 <mysql.html#208>`_ + + `FIELD_TYPE_LONG_BLOB`:idx: + `mysql.html#224 <mysql.html#224>`_ + + `FIELD_TYPE_LONGLONG`:idx: + `mysql.html#213 <mysql.html#213>`_ + + `FIELD_TYPE_MEDIUM_BLOB`:idx: + `mysql.html#223 <mysql.html#223>`_ + + `FIELD_TYPE_NEWDATE`:idx: + `mysql.html#219 <mysql.html#219>`_ + + `FIELD_TYPE_NEWDECIMAL`:idx: + `mysql.html#205 <mysql.html#205>`_ + + `FIELD_TYPE_NULL`:idx: + `mysql.html#211 <mysql.html#211>`_ + + `FIELD_TYPE_SET`:idx: + `mysql.html#221 <mysql.html#221>`_ + + `FIELD_TYPE_SHORT`:idx: + `mysql.html#207 <mysql.html#207>`_ + + `FIELD_TYPE_STRING`:idx: + `mysql.html#227 <mysql.html#227>`_ + + `FIELD_TYPE_TIME`:idx: + `mysql.html#216 <mysql.html#216>`_ + + `FIELD_TYPE_TIMESTAMP`:idx: + `mysql.html#212 <mysql.html#212>`_ + + `FIELD_TYPE_TINY`:idx: + `mysql.html#206 <mysql.html#206>`_ + + `FIELD_TYPE_TINY_BLOB`:idx: + `mysql.html#222 <mysql.html#222>`_ + + `FIELD_TYPE_VAR_STRING`:idx: + `mysql.html#226 <mysql.html#226>`_ + + `FIELD_TYPE_YEAR`:idx: + `mysql.html#218 <mysql.html#218>`_ + + `fileHandle`:idx: + `system.html#514 <system.html#514>`_ + + `fileNewer`:idx: + `os.html#141 <os.html#141>`_ + + `FILE_OFFSET_BITS`:idx: + `libcurl.html#263 <libcurl.html#263>`_ + + `FILESIZEBITS`:idx: + `libcurl.html#264 <libcurl.html#264>`_ + + `FileSystemCaseSensitive`:idx: + `os.html#106 <os.html#106>`_ + + `finally`:idx: + `manual.html#188 <manual.html#188>`_ + + `find`:idx: + * `system.html#459 <system.html#459>`_ + * `strutils.html#124 <strutils.html#124>`_ + * `strutils.html#125 <strutils.html#125>`_ + * `strutils.html#126 <strutils.html#126>`_ + * `regexprs.html#109 <regexprs.html#109>`_ + * `regexprs.html#110 <regexprs.html#110>`_ + + `findChars`:idx: + `strutils.html#123 <strutils.html#123>`_ + + `findSubStr`:idx: + * `strutils.html#121 <strutils.html#121>`_ + * `strutils.html#122 <strutils.html#122>`_ + + `float`:idx: + `system.html#106 <system.html#106>`_ + + `float32`:idx: + `system.html#107 <system.html#107>`_ + + `float64`:idx: + `system.html#108 <system.html#108>`_ + + `FlushFile`:idx: + `system.html#492 <system.html#492>`_ + + `for`:idx: + * `manual.html#203 <manual.html#203>`_ + * `tut1.html#105 <tut1.html#105>`_ + + `form feed`:idx: + `manual.html#124 <manual.html#124>`_ + + `forward`:idx: + `manual.html#200 <manual.html#200>`_ + + `frexp`:idx: + `math.html#120 <math.html#120>`_ + + `functional`:idx: + * `manual.html#162 <manual.html#162>`_ + * `tut1.html#124 <tut1.html#124>`_ + + `FUNCTIONPOINT`:idx: + `libcurl.html#265 <libcurl.html#265>`_ + + `funtions`:idx: + `manual.html#198 <manual.html#198>`_ + + `GC_disable`:idx: + `system.html#461 <system.html#461>`_ + + `GC_disableMarkAndSweep`:idx: + `system.html#467 <system.html#467>`_ + + `GC_enable`:idx: + `system.html#462 <system.html#462>`_ + + `GC_enableMarkAndSweep`:idx: + `system.html#466 <system.html#466>`_ + + `GC_fullCollect`:idx: + `system.html#463 <system.html#463>`_ + + `GC_getStatistics`:idx: + `system.html#468 <system.html#468>`_ + + `GC_ref`:idx: + * `system.html#469 <system.html#469>`_ + * `system.html#470 <system.html#470>`_ + * `system.html#471 <system.html#471>`_ + + `GC_setStrategy`:idx: + `system.html#465 <system.html#465>`_ + + `GC_unref`:idx: + * `system.html#472 <system.html#472>`_ + * `system.html#473 <system.html#473>`_ + * `system.html#474 <system.html#474>`_ + + `generic character types`:idx: + `regexprs.html#102 <regexprs.html#102>`_ + + `Generics`:idx: + * `manual.html#207 <manual.html#207>`_ + * `tut2.html#108 <tut2.html#108>`_ + + `getApplicationDir`:idx: + `os.html#110 <os.html#110>`_ + + `getApplicationFilename`:idx: + `os.html#111 <os.html#111>`_ + + `getClockStr`:idx: + `times.html#112 <times.html#112>`_ + + `getColNumber`:idx: + `lexbase.html#107 <lexbase.html#107>`_ + + `getColumn`:idx: + * `parsecfg.html#107 <parsecfg.html#107>`_ + * `parsexml.html#117 <parsexml.html#117>`_ + + `getConfigDir`:idx: + `os.html#115 <os.html#115>`_ + + `getContentLength`:idx: + `cgi.html#109 <cgi.html#109>`_ + + `getContentType`:idx: + `cgi.html#110 <cgi.html#110>`_ + + `getCurrentDir`:idx: + `os.html#112 <os.html#112>`_ + + `getCurrentExceptionMsg`:idx: + `system.html#431 <system.html#431>`_ + + `getCurrentLine`:idx: + `lexbase.html#106 <lexbase.html#106>`_ + + `getDateStr`:idx: + `times.html#111 <times.html#111>`_ + + `getDocumentRoot`:idx: + `cgi.html#111 <cgi.html#111>`_ + + `getEnv`:idx: + `os.html#143 <os.html#143>`_ + + `getFilename`:idx: + * `parsecfg.html#109 <parsecfg.html#109>`_ + * `parsexml.html#119 <parsexml.html#119>`_ + + `getFilePos`:idx: + `system.html#512 <system.html#512>`_ + + `getFileSize`:idx: + `system.html#504 <system.html#504>`_ + + `getFreeMem`:idx: + `system.html#437 <system.html#437>`_ + + `getGatewayInterface`:idx: + `cgi.html#112 <cgi.html#112>`_ + + `getGMTime`:idx: + `times.html#107 <times.html#107>`_ + + `getHomeDir`:idx: + `os.html#114 <os.html#114>`_ + + `getHttpAccept`:idx: + `cgi.html#113 <cgi.html#113>`_ + + `getHttpAcceptCharset`:idx: + `cgi.html#114 <cgi.html#114>`_ + + `getHttpAcceptEncoding`:idx: + `cgi.html#115 <cgi.html#115>`_ + + `getHttpAcceptLanguage`:idx: + `cgi.html#116 <cgi.html#116>`_ + + `getHttpConnection`:idx: + `cgi.html#117 <cgi.html#117>`_ + + `getHttpCookie`:idx: + `cgi.html#118 <cgi.html#118>`_ + + `getHttpHost`:idx: + `cgi.html#119 <cgi.html#119>`_ + + `getHttpReferer`:idx: + `cgi.html#120 <cgi.html#120>`_ + + `getHttpUserAgent`:idx: + `cgi.html#121 <cgi.html#121>`_ + + `getLastModificationTime`:idx: + `os.html#140 <os.html#140>`_ + + `getLine`:idx: + * `parsecfg.html#108 <parsecfg.html#108>`_ + * `parsexml.html#118 <parsexml.html#118>`_ + + `getLocalTime`:idx: + `times.html#106 <times.html#106>`_ + + `getMD5`:idx: + `md5.html#106 <md5.html#106>`_ + + `getOccupiedMem`:idx: + `system.html#436 <system.html#436>`_ + + `getopt`:idx: + `parseopt.html#106 <parseopt.html#106>`_ + + `getPathInfo`:idx: + `cgi.html#122 <cgi.html#122>`_ + + `getPathTranslated`:idx: + `cgi.html#123 <cgi.html#123>`_ + + `getQueryString`:idx: + `cgi.html#124 <cgi.html#124>`_ + + `getRefcount`:idx: + `system.html#430 <system.html#430>`_ + + `getRemoteAddr`:idx: + `cgi.html#125 <cgi.html#125>`_ + + `getRemoteHost`:idx: + `cgi.html#126 <cgi.html#126>`_ + + `getRemoteIdent`:idx: + `cgi.html#127 <cgi.html#127>`_ + + `getRemotePort`:idx: + `cgi.html#128 <cgi.html#128>`_ + + `getRemoteUser`:idx: + `cgi.html#129 <cgi.html#129>`_ + + `getRequestMethod`:idx: + `cgi.html#130 <cgi.html#130>`_ + + `getRequestURI`:idx: + `cgi.html#131 <cgi.html#131>`_ + + `getRestOfCommandLine`:idx: + `parseopt.html#105 <parseopt.html#105>`_ + + `get_salt_from_password`:idx: + `mysql.html#280 <mysql.html#280>`_ + + `get_salt_from_password_323`:idx: + `mysql.html#274 <mysql.html#274>`_ + + `getScriptFilename`:idx: + `cgi.html#132 <cgi.html#132>`_ + + `getScriptName`:idx: + `cgi.html#133 <cgi.html#133>`_ + + `getServerAddr`:idx: + `cgi.html#134 <cgi.html#134>`_ + + `getServerAdmin`:idx: + `cgi.html#135 <cgi.html#135>`_ + + `getServerName`:idx: + `cgi.html#136 <cgi.html#136>`_ + + `getServerPort`:idx: + `cgi.html#137 <cgi.html#137>`_ + + `getServerProtocol`:idx: + `cgi.html#138 <cgi.html#138>`_ + + `getServerSignature`:idx: + `cgi.html#139 <cgi.html#139>`_ + + `getServerSoftware`:idx: + `cgi.html#140 <cgi.html#140>`_ + + `getStartMilsecs`:idx: + `times.html#116 <times.html#116>`_ + + `getStream`:idx: + `zipfiles.html#109 <zipfiles.html#109>`_ + + `getTime`:idx: + `times.html#105 <times.html#105>`_ + + `getTotalMem`:idx: + `system.html#438 <system.html#438>`_ + + `get_tty_password`:idx: + `mysql.html#282 <mysql.html#282>`_ + + `gptr`:idx: + `mysql.html#105 <mysql.html#105>`_ + + `GROUP_FLAG`:idx: + `mysql.html#139 <mysql.html#139>`_ + + `HandleCR`:idx: + `lexbase.html#108 <lexbase.html#108>`_ + + `HandleLF`:idx: + `lexbase.html#109 <lexbase.html#109>`_ + + `hash`:idx: + * `hashes.html#103 <hashes.html#103>`_ + * `hashes.html#104 <hashes.html#104>`_ + * `hashes.html#105 <hashes.html#105>`_ + * `hashes.html#106 <hashes.html#106>`_ + * `hashes.html#107 <hashes.html#107>`_ + + `hashData`:idx: + `hashes.html#102 <hashes.html#102>`_ + + `hashIgnoreCase`:idx: + `hashes.html#109 <hashes.html#109>`_ + + `hashIgnoreStyle`:idx: + `hashes.html#108 <hashes.html#108>`_ + + `hash_password`:idx: + `mysql.html#270 <mysql.html#270>`_ + + `hasKey`:idx: + `strtabs.html#108 <strtabs.html#108>`_ + + `header`:idx: + `nimrodc.html#105 <nimrodc.html#105>`_ + + `high`:idx: + `system.html#121 <system.html#121>`_ + + `hint`:idx: + * `manual.html#219 <manual.html#219>`_ + * `manual.html#227 <manual.html#227>`_ + + `hostCPU`:idx: + `system.html#399 <system.html#399>`_ + + `HOSTNAME_LENGTH`:idx: + `mysql.html#111 <mysql.html#111>`_ + + `hostOS`:idx: + `system.html#398 <system.html#398>`_ + + `HTML`:idx: + `parsexml.html#102 <parsexml.html#102>`_ + + `HTTPPOST_BUFFER`:idx: + `libcurl.html#266 <libcurl.html#266>`_ + + `HTTPPOST_FILENAME`:idx: + `libcurl.html#267 <libcurl.html#267>`_ + + `HTTPPOST_PTRBUFFER`:idx: + `libcurl.html#268 <libcurl.html#268>`_ + + `HTTPPOST_PTRCONTENTS`:idx: + `libcurl.html#269 <libcurl.html#269>`_ + + `HTTPPOST_PTRNAME`:idx: + `libcurl.html#270 <libcurl.html#270>`_ + + `HTTPPOST_READFILE`:idx: + `libcurl.html#271 <libcurl.html#271>`_ + + `hypot`:idx: + `math.html#128 <math.html#128>`_ + + `IdentChars`:idx: + `strutils.html#105 <strutils.html#105>`_ + + `identifier`:idx: + `manual.html#105 <manual.html#105>`_ + + `Identifiers`:idx: + `manual.html#116 <manual.html#116>`_ + + `IdentStartChars`:idx: + `strutils.html#106 <strutils.html#106>`_ + + `if`:idx: + `manual.html#180 <manual.html#180>`_ + + `implicit block`:idx: + `manual.html#205 <manual.html#205>`_ + + `import`:idx: + * `manual.html#215 <manual.html#215>`_ + * `tut1.html#128 <tut1.html#128>`_ + + `importc`:idx: + `nimrodc.html#101 <nimrodc.html#101>`_ + + `in`:idx: + `system.html#355 <system.html#355>`_ + + `inc`:idx: + `system.html#159 <system.html#159>`_ + + `incl`:idx: + `system.html#167 <system.html#167>`_ + + `include`:idx: + `tut1.html#129 <tut1.html#129>`_ + + `indentation sensitive`:idx: + `manual.html#113 <manual.html#113>`_ + + `inf`:idx: + `system.html#432 <system.html#432>`_ + + `information hiding`:idx: + * `manual.html#213 <manual.html#213>`_ + * `tut1.html#126 <tut1.html#126>`_ + + `init`:idx: + `parseopt.html#103 <parseopt.html#103>`_ + + `inline`:idx: + `manual.html#167 <manual.html#167>`_ + + `int`:idx: + `system.html#101 <system.html#101>`_ + + `int16`:idx: + `system.html#103 <system.html#103>`_ + + `int32`:idx: + `system.html#104 <system.html#104>`_ + + `int64`:idx: + `system.html#105 <system.html#105>`_ + + `int8`:idx: + `system.html#102 <system.html#102>`_ + + `INTERNAL_NUM_FIELD`:idx: + `mysql.html#306 <mysql.html#306>`_ + + `intToStr`:idx: + `strutils.html#143 <strutils.html#143>`_ + + `is`:idx: + `system.html#357 <system.html#357>`_ + + `isAlpha`:idx: + `unicode.html#111 <unicode.html#111>`_ + + `IS_BLOB`:idx: + `mysql.html#304 <mysql.html#304>`_ + + `isLower`:idx: + `unicode.html#109 <unicode.html#109>`_ + + `isMainModule`:idx: + `system.html#390 <system.html#390>`_ + + `isNil`:idx: + * `system.html#447 <system.html#447>`_ + * `system.html#448 <system.html#448>`_ + * `system.html#449 <system.html#449>`_ + * `system.html#450 <system.html#450>`_ + * `system.html#451 <system.html#451>`_ + * `system.html#452 <system.html#452>`_ + + `is_not`:idx: + `system.html#358 <system.html#358>`_ + + `IS_NOT_NULL`:idx: + `mysql.html#303 <mysql.html#303>`_ + + `IS_NUM`:idx: + `mysql.html#305 <mysql.html#305>`_ + + `IS_NUM_FIELD`:idx: + `mysql.html#307 <mysql.html#307>`_ + + `isPowerOfTwo`:idx: + `math.html#107 <math.html#107>`_ + + `IS_PRI_KEY`:idx: + `mysql.html#302 <mysql.html#302>`_ + + `isTitle`:idx: + `unicode.html#112 <unicode.html#112>`_ + + `isUpper`:idx: + `unicode.html#110 <unicode.html#110>`_ + + `isWhiteSpace`:idx: + `unicode.html#113 <unicode.html#113>`_ + + `Item_result`:idx: + `mysql.html#255 <mysql.html#255>`_ + + `items`:idx: + * `system.html#441 <system.html#441>`_ + * `system.html#442 <system.html#442>`_ + * `system.html#443 <system.html#443>`_ + * `system.html#444 <system.html#444>`_ + * `system.html#445 <system.html#445>`_ + * `system.html#446 <system.html#446>`_ + + `iterator`:idx: + `manual.html#204 <manual.html#204>`_ + + `iterOverEnvironment`:idx: + `os.html#150 <os.html#150>`_ + + `JavaScript`:idx: + `nimrodc.html#116 <nimrodc.html#116>`_ + + `JoinPath`:idx: + * `os.html#118 <os.html#118>`_ + * `os.html#120 <os.html#120>`_ + + `keywords`:idx: + `manual.html#117 <manual.html#117>`_ + + `kind`:idx: + `parsexml.html#110 <parsexml.html#110>`_ + + `l-values`:idx: + `manual.html#107 <manual.html#107>`_ + + `len`:idx: + * `system.html#162 <system.html#162>`_ + * `system.html#163 <system.html#163>`_ + * `system.html#164 <system.html#164>`_ + * `system.html#165 <system.html#165>`_ + * `system.html#166 <system.html#166>`_ + * `strtabs.html#109 <strtabs.html#109>`_ + + `Letters`:idx: + `strutils.html#103 <strutils.html#103>`_ + + `LIBCURL_VERSION`:idx: + `libcurl.html#272 <libcurl.html#272>`_ + + `LIBCURL_VERSION_MAJOR`:idx: + `libcurl.html#273 <libcurl.html#273>`_ + + `LIBCURL_VERSION_MINOR`:idx: + `libcurl.html#274 <libcurl.html#274>`_ + + `LIBCURL_VERSION_NUM`:idx: + `libcurl.html#275 <libcurl.html#275>`_ + + `LIBCURL_VERSION_PATCH`:idx: + `libcurl.html#276 <libcurl.html#276>`_ + + `line feed`:idx: + `manual.html#123 <manual.html#123>`_ + + `line_dir`:idx: + `nimrodc.html#107 <nimrodc.html#107>`_ + + `lines`:idx: + `system.html#513 <system.html#513>`_ + + `line_trace`:idx: + `nimrodc.html#109 <nimrodc.html#109>`_ + + `Literal strings`:idx: + `manual.html#119 <manual.html#119>`_ + + `ln`:idx: + `math.html#116 <math.html#116>`_ + + `load_defaults`:idx: + `mysql.html#285 <mysql.html#285>`_ + + `local type inference`:idx: + `tut1.html#101 <tut1.html#101>`_ + + `LOCAL_HOST`:idx: + `mysql.html#115 <mysql.html#115>`_ + + `LOCAL_HOST_NAMEDPIPE`:idx: + `mysql.html#116 <mysql.html#116>`_ + + `LOCAL_INFILE_ERROR_LEN`:idx: + `mysql.html#424 <mysql.html#424>`_ + + `locations`:idx: + `manual.html#101 <manual.html#101>`_ + + `log10`:idx: + `math.html#117 <math.html#117>`_ + + `log2`:idx: + `math.html#118 <math.html#118>`_ + + `low`:idx: + `system.html#122 <system.html#122>`_ + + `Macros`:idx: + * `manual.html#210 <manual.html#210>`_ + * `tut2.html#110 <tut2.html#110>`_ + + `make_password_from_salt`:idx: + `mysql.html#281 <mysql.html#281>`_ + + `make_password_from_salt_323`:idx: + `mysql.html#275 <mysql.html#275>`_ + + `make_scrambled_password`:idx: + `mysql.html#277 <mysql.html#277>`_ + + `make_scrambled_password_323`:idx: + `mysql.html#271 <mysql.html#271>`_ + + `MANAGER_ACCESS`:idx: + `mysql.html#336 <mysql.html#336>`_ + + `MANAGER_CLIENT_ERR`:idx: + `mysql.html#337 <mysql.html#337>`_ + + `MANAGER_INFO`:idx: + `mysql.html#335 <mysql.html#335>`_ + + `MANAGER_INTERNAL_ERR`:idx: + `mysql.html#338 <mysql.html#338>`_ + + `MANAGER_OK`:idx: + `mysql.html#334 <mysql.html#334>`_ + + `match`:idx: + * `regexprs.html#106 <regexprs.html#106>`_ + * `regexprs.html#107 <regexprs.html#107>`_ + + `matchLen`:idx: + `regexprs.html#108 <regexprs.html#108>`_ + + `math`:idx: + `nimrodc.html#118 <nimrodc.html#118>`_ + + `max`:idx: + * `system.html#271 <system.html#271>`_ + * `system.html#272 <system.html#272>`_ + * `system.html#273 <system.html#273>`_ + * `system.html#274 <system.html#274>`_ + * `system.html#275 <system.html#275>`_ + * `system.html#322 <system.html#322>`_ + + `MAX_BIGINT_WIDTH`:idx: + `mysql.html#194 <mysql.html#194>`_ + + `MAX_BLOB_WIDTH`:idx: + `mysql.html#196 <mysql.html#196>`_ + + `MAX_CHAR_WIDTH`:idx: + `mysql.html#195 <mysql.html#195>`_ + + `MAX_INT_WIDTH`:idx: + `mysql.html#193 <mysql.html#193>`_ + + `MAX_MEDIUMINT_WIDTH`:idx: + `mysql.html#192 <mysql.html#192>`_ + + `MAX_MYSQL_MANAGER_ERR`:idx: + `mysql.html#332 <mysql.html#332>`_ + + `MAX_MYSQL_MANAGER_MSG`:idx: + `mysql.html#333 <mysql.html#333>`_ + + `MAX_SMALLINT_WIDTH`:idx: + `mysql.html#191 <mysql.html#191>`_ + + `MaxSubpatterns`:idx: + `regexprs.html#105 <regexprs.html#105>`_ + + `MAX_TINYINT_WIDTH`:idx: + `mysql.html#190 <mysql.html#190>`_ + + `MD5Context`:idx: + `md5.html#102 <md5.html#102>`_ + + `MD5Digest`:idx: + `md5.html#101 <md5.html#101>`_ + + `MD5Final`:idx: + `md5.html#105 <md5.html#105>`_ + + `MD5Init`:idx: + `md5.html#103 <md5.html#103>`_ + + `MD5Update`:idx: + `md5.html#104 <md5.html#104>`_ + + `mean`:idx: + `math.html#111 <math.html#111>`_ + + `MEM_ROOT`:idx: + `mysql.html#325 <mysql.html#325>`_ + + `method call syntax`:idx: + `tut2.html#104 <tut2.html#104>`_ + + `methods`:idx: + `manual.html#197 <manual.html#197>`_ + + `min`:idx: + * `system.html#266 <system.html#266>`_ + * `system.html#267 <system.html#267>`_ + * `system.html#268 <system.html#268>`_ + * `system.html#269 <system.html#269>`_ + * `system.html#270 <system.html#270>`_ + * `system.html#321 <system.html#321>`_ + + `mod`:idx: + * `system.html#216 <system.html#216>`_ + * `system.html#217 <system.html#217>`_ + * `system.html#218 <system.html#218>`_ + * `system.html#219 <system.html#219>`_ + * `system.html#220 <system.html#220>`_ + + `modify_defaults_file`:idx: + `mysql.html#284 <mysql.html#284>`_ + + `module`:idx: + * `manual.html#212 <manual.html#212>`_ + * `tut1.html#125 <tut1.html#125>`_ + + `moveFile`:idx: + `os.html#135 <os.html#135>`_ + + `moveMem`:idx: + `system.html#411 <system.html#411>`_ + + `MULTIPLE_KEY_FLAG`:idx: + `mysql.html#127 <mysql.html#127>`_ + + `my_bool`:idx: + `mysql.html#101 <mysql.html#101>`_ + + `MY_CHARSET_INFO`:idx: + `mysql.html#352 <mysql.html#352>`_ + + `my_connect`:idx: + `mysql.html#252 <mysql.html#252>`_ + + `my_init`:idx: + `mysql.html#286 <mysql.html#286>`_ + + `my_net_init`:idx: + `mysql.html#240 <mysql.html#240>`_ + + `my_net_local_init`:idx: + `mysql.html#241 <mysql.html#241>`_ + + `my_net_read`:idx: + `mysql.html#249 <mysql.html#249>`_ + + `my_net_write`:idx: + `mysql.html#246 <mysql.html#246>`_ + + `myodbc_remove_escape`:idx: + `mysql.html#465 <mysql.html#465>`_ + + `my_rnd`:idx: + `mysql.html#268 <mysql.html#268>`_ + + `my_socket`:idx: + `mysql.html#107 <mysql.html#107>`_ + + `MYSQL`:idx: + `mysql.html#357 <mysql.html#357>`_ + + `mysql_add_slave`:idx: + `mysql.html#435 <mysql.html#435>`_ + + `mysql_affected_rows`:idx: + `mysql.html#399 <mysql.html#399>`_ + + `mysql_autocommit`:idx: + `mysql.html#503 <mysql.html#503>`_ + + `MYSQL_BIND`:idx: + `mysql.html#379 <mysql.html#379>`_ + + `mysql_change_user`:idx: + `mysql.html#411 <mysql.html#411>`_ + + `mysql_character_set_name`:idx: + `mysql.html#407 <mysql.html#407>`_ + + `mysql_close`:idx: + `mysql.html#506 <mysql.html#506>`_ + + `mysql_commit`:idx: + `mysql.html#501 <mysql.html#501>`_ + + `mysql_connect`:idx: + `mysql.html#510 <mysql.html#510>`_ + + `MYSQL_COUNT_ERROR`:idx: + `mysql.html#310 <mysql.html#310>`_ + + `mysql_create_db`:idx: + `mysql.html#511 <mysql.html#511>`_ + + `MYSQL_DATA`:idx: + `mysql.html#329 <mysql.html#329>`_ + + `mysql_data_seek`:idx: + `mysql.html#454 <mysql.html#454>`_ + + `MYSQL_DATA_TRUNCATED`:idx: + `mysql.html#508 <mysql.html#508>`_ + + `mysql_debug`:idx: + `mysql.html#464 <mysql.html#464>`_ + + `mysql_disable_reads_from_master`:idx: + `mysql.html#430 <mysql.html#430>`_ + + `mysql_disable_rpl_parse`:idx: + `mysql.html#427 <mysql.html#427>`_ + + `mysql_drop_db`:idx: + `mysql.html#512 <mysql.html#512>`_ + + `mysql_dump_debug_info`:idx: + `mysql.html#437 <mysql.html#437>`_ + + `mysql_embedded`:idx: + `mysql.html#467 <mysql.html#467>`_ + + `mysql_enable_reads_from_master`:idx: + `mysql.html#429 <mysql.html#429>`_ + + `mysql_enable_rpl_parse`:idx: + `mysql.html#426 <mysql.html#426>`_ + + `mysql_enum_shutdown_level`:idx: + `mysql.html#236 <mysql.html#236>`_ + + `mysql_eof`:idx: + `mysql.html#393 <mysql.html#393>`_ + + `MYSQL_ERRMSG_SIZE`:idx: + `mysql.html#185 <mysql.html#185>`_ + + `mysql_errno`:idx: + `mysql.html#401 <mysql.html#401>`_ + + `mysql_errno_to_sqlstate`:idx: + `mysql.html#283 <mysql.html#283>`_ + + `mysql_error`:idx: + `mysql.html#402 <mysql.html#402>`_ + + `mysql_escape_string`:idx: + `mysql.html#461 <mysql.html#461>`_ + + `mysql_fetch_field`:idx: + `mysql.html#459 <mysql.html#459>`_ + + `mysql_fetch_field_direct`:idx: + `mysql.html#394 <mysql.html#394>`_ + + `mysql_fetch_fields`:idx: + `mysql.html#395 <mysql.html#395>`_ + + `mysql_fetch_lengths`:idx: + `mysql.html#458 <mysql.html#458>`_ + + `mysql_fetch_row`:idx: + `mysql.html#457 <mysql.html#457>`_ + + `MYSQL_FIELD`:idx: + `mysql.html#296 <mysql.html#296>`_ + + `mysql_field_count`:idx: + `mysql.html#398 <mysql.html#398>`_ + + `MYSQL_FIELD_OFFSET`:idx: + `mysql.html#301 <mysql.html#301>`_ + + `mysql_field_seek`:idx: + `mysql.html#456 <mysql.html#456>`_ + + `mysql_field_tell`:idx: + `mysql.html#397 <mysql.html#397>`_ + + `mysql_free_result`:idx: + `mysql.html#453 <mysql.html#453>`_ + + `mysql_get_character_set_info`:idx: + `mysql.html#423 <mysql.html#423>`_ + + `mysql_get_client_info`:idx: + `mysql.html#444 <mysql.html#444>`_ + + `mysql_get_client_version`:idx: + `mysql.html#445 <mysql.html#445>`_ + + `mysql_get_host_info`:idx: + `mysql.html#446 <mysql.html#446>`_ + + `mysql_get_parameters`:idx: + `mysql.html#388 <mysql.html#388>`_ + + `mysql_get_proto_info`:idx: + `mysql.html#448 <mysql.html#448>`_ + + `mysql_get_server_info`:idx: + `mysql.html#443 <mysql.html#443>`_ + + `mysql_get_server_version`:idx: + `mysql.html#447 <mysql.html#447>`_ + + `mysql_hex_string`:idx: + `mysql.html#462 <mysql.html#462>`_ + + `mysql_info`:idx: + `mysql.html#405 <mysql.html#405>`_ + + `mysql_init`:idx: + `mysql.html#409 <mysql.html#409>`_ + + `mysql_insert_id`:idx: + `mysql.html#400 <mysql.html#400>`_ + + `mysql_kill`:idx: + `mysql.html#439 <mysql.html#439>`_ + + `mysql_library_end`:idx: + `mysql.html#387 <mysql.html#387>`_ + + `mysql_library_init`:idx: + `mysql.html#386 <mysql.html#386>`_ + + `mysql_list_dbs`:idx: + `mysql.html#449 <mysql.html#449>`_ + + `mysql_list_fields`:idx: + `mysql.html#460 <mysql.html#460>`_ + + `mysql_list_processes`:idx: + `mysql.html#451 <mysql.html#451>`_ + + `mysql_list_tables`:idx: + `mysql.html#450 <mysql.html#450>`_ + + `MYSQL_LONG_DATA_HEADER`:idx: + `mysql.html#291 <mysql.html#291>`_ + + `MYSQL_MANAGER`:idx: + `mysql.html#370 <mysql.html#370>`_ + + `mysql_manager_close`:idx: + `mysql.html#470 <mysql.html#470>`_ + + `mysql_manager_command`:idx: + `mysql.html#471 <mysql.html#471>`_ + + `mysql_manager_connect`:idx: + `mysql.html#469 <mysql.html#469>`_ + + `mysql_manager_fetch_line`:idx: + `mysql.html#472 <mysql.html#472>`_ + + `mysql_manager_init`:idx: + `mysql.html#468 <mysql.html#468>`_ + + `mysql_master_query`:idx: + `mysql.html#419 <mysql.html#419>`_ + + `mysql_master_send_query`:idx: + `mysql.html#420 <mysql.html#420>`_ + + `MYSQL_METHODS`:idx: + `mysql.html#366 <mysql.html#366>`_ + + `mysql_more_results`:idx: + `mysql.html#504 <mysql.html#504>`_ + + `MYSQL_NAMEDPIPE`:idx: + `mysql.html#117 <mysql.html#117>`_ + + `mysql_next_result`:idx: + `mysql.html#505 <mysql.html#505>`_ + + `MYSQL_NO_DATA`:idx: + `mysql.html#507 <mysql.html#507>`_ + + `mysql_num_fields`:idx: + `mysql.html#392 <mysql.html#392>`_ + + `mysql_num_rows`:idx: + `mysql.html#391 <mysql.html#391>`_ + + `mysql_option`:idx: + `mysql.html#331 <mysql.html#331>`_ + + `mysql_options`:idx: + `mysql.html#452 <mysql.html#452>`_ + + `MYSQL_PARAMETERS`:idx: + `mysql.html#374 <mysql.html#374>`_ + + `mysql_ping`:idx: + `mysql.html#441 <mysql.html#441>`_ + + `mysql_protocol_type`:idx: + `mysql.html#345 <mysql.html#345>`_ + + `mysql_query`:idx: + `mysql.html#414 <mysql.html#414>`_ + + `mysql_read_query_result`:idx: + `mysql.html#473 <mysql.html#473>`_ + + `mysql_reads_from_master_enabled`:idx: + `mysql.html#431 <mysql.html#431>`_ + + `mysql_real_connect`:idx: + `mysql.html#412 <mysql.html#412>`_ + + `mysql_real_escape_string`:idx: + `mysql.html#463 <mysql.html#463>`_ + + `mysql_real_query`:idx: + `mysql.html#416 <mysql.html#416>`_ + + `mysql_refresh`:idx: + `mysql.html#438 <mysql.html#438>`_ + + `mysql_reload`:idx: + * `mysql.html#509 <mysql.html#509>`_ + * `mysql.html#513 <mysql.html#513>`_ + + `MYSQL_RES`:idx: + `mysql.html#361 <mysql.html#361>`_ + + `mysql_rollback`:idx: + `mysql.html#502 <mysql.html#502>`_ + + `MYSQL_ROW`:idx: + `mysql.html#299 <mysql.html#299>`_ + + `MYSQL_ROW_OFFSET`:idx: + `mysql.html#316 <mysql.html#316>`_ + + `MYSQL_ROWS`:idx: + `mysql.html#313 <mysql.html#313>`_ + + `mysql_row_seek`:idx: + `mysql.html#455 <mysql.html#455>`_ + + `mysql_row_tell`:idx: + `mysql.html#396 <mysql.html#396>`_ + + `mysql_rpl_parse_enabled`:idx: + `mysql.html#428 <mysql.html#428>`_ + + `mysql_rpl_probe`:idx: + `mysql.html#433 <mysql.html#433>`_ + + `mysql_rpl_query_type`:idx: + `mysql.html#432 <mysql.html#432>`_ + + `mysql_rpl_type`:idx: + `mysql.html#346 <mysql.html#346>`_ + + `mysql_select_db`:idx: + `mysql.html#413 <mysql.html#413>`_ + + `mysql_send_query`:idx: + `mysql.html#415 <mysql.html#415>`_ + + `mysql_server_end`:idx: + `mysql.html#385 <mysql.html#385>`_ + + `mysql_server_init`:idx: + `mysql.html#384 <mysql.html#384>`_ + + `MYSQL_SERVICENAME`:idx: + `mysql.html#118 <mysql.html#118>`_ + + `mysql_set_character_set`:idx: + `mysql.html#408 <mysql.html#408>`_ + + `mysql_set_local_infile_default`:idx: + `mysql.html#425 <mysql.html#425>`_ + + `mysql_set_master`:idx: + `mysql.html#434 <mysql.html#434>`_ + + `mysql_set_server_option`:idx: + `mysql.html#440 <mysql.html#440>`_ + + `mysql_shutdown`:idx: + `mysql.html#436 <mysql.html#436>`_ + + `MYSQL_SHUTDOWN_KILLABLE_CONNECT`:idx: + `mysql.html#232 <mysql.html#232>`_ + + `MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE`:idx: + `mysql.html#234 <mysql.html#234>`_ + + `MYSQL_SHUTDOWN_KILLABLE_TRANS`:idx: + `mysql.html#233 <mysql.html#233>`_ + + `MYSQL_SHUTDOWN_KILLABLE_UPDATE`:idx: + `mysql.html#235 <mysql.html#235>`_ + + `mysql_slave_query`:idx: + `mysql.html#421 <mysql.html#421>`_ + + `mysql_slave_send_query`:idx: + `mysql.html#422 <mysql.html#422>`_ + + `mysql_sqlstate`:idx: + `mysql.html#403 <mysql.html#403>`_ + + `mysql_ssl_set`:idx: + `mysql.html#410 <mysql.html#410>`_ + + `mysql_stat`:idx: + `mysql.html#442 <mysql.html#442>`_ + + `mysql_status`:idx: + `mysql.html#344 <mysql.html#344>`_ + + `MYSQL_STMT`:idx: + `mysql.html#382 <mysql.html#382>`_ + + `mysql_stmt_affected_rows`:idx: + `mysql.html#498 <mysql.html#498>`_ + + `mysql_stmt_attr_get`:idx: + `mysql.html#482 <mysql.html#482>`_ + + `mysql_stmt_attr_set`:idx: + `mysql.html#481 <mysql.html#481>`_ + + `mysql_stmt_bind_param`:idx: + `mysql.html#483 <mysql.html#483>`_ + + `mysql_stmt_bind_result`:idx: + `mysql.html#484 <mysql.html#484>`_ + + `mysql_stmt_close`:idx: + `mysql.html#485 <mysql.html#485>`_ + + `mysql_stmt_data_seek`:idx: + `mysql.html#496 <mysql.html#496>`_ + + `mysql_stmt_errno`:idx: + `mysql.html#491 <mysql.html#491>`_ + + `mysql_stmt_error`:idx: + `mysql.html#492 <mysql.html#492>`_ + + `mysql_stmt_execute`:idx: + `mysql.html#476 <mysql.html#476>`_ + + `mysql_stmt_fetch`:idx: + `mysql.html#477 <mysql.html#477>`_ + + `mysql_stmt_fetch_column`:idx: + `mysql.html#478 <mysql.html#478>`_ + + `mysql_stmt_field_count`:idx: + `mysql.html#500 <mysql.html#500>`_ + + `mysql_stmt_free_result`:idx: + `mysql.html#487 <mysql.html#487>`_ + + `MYSQL_STMT_HEADER`:idx: + `mysql.html#290 <mysql.html#290>`_ + + `mysql_stmt_init`:idx: + `mysql.html#474 <mysql.html#474>`_ + + `mysql_stmt_insert_id`:idx: + `mysql.html#499 <mysql.html#499>`_ + + `mysql_stmt_num_rows`:idx: + `mysql.html#497 <mysql.html#497>`_ + + `mysql_stmt_param_count`:idx: + `mysql.html#480 <mysql.html#480>`_ + + `mysql_stmt_param_metadata`:idx: + `mysql.html#490 <mysql.html#490>`_ + + `mysql_stmt_prepare`:idx: + `mysql.html#475 <mysql.html#475>`_ + + `mysql_stmt_reset`:idx: + `mysql.html#486 <mysql.html#486>`_ + + `mysql_stmt_result_metadata`:idx: + `mysql.html#489 <mysql.html#489>`_ + + `mysql_stmt_row_seek`:idx: + `mysql.html#494 <mysql.html#494>`_ + + `mysql_stmt_row_tell`:idx: + `mysql.html#495 <mysql.html#495>`_ + + `mysql_stmt_send_long_data`:idx: + `mysql.html#488 <mysql.html#488>`_ + + `mysql_stmt_sqlstate`:idx: + `mysql.html#493 <mysql.html#493>`_ + + `mysql_stmt_store_result`:idx: + `mysql.html#479 <mysql.html#479>`_ + + `mysql_store_result`:idx: + `mysql.html#417 <mysql.html#417>`_ + + `mysql_thread_end`:idx: + `mysql.html#390 <mysql.html#390>`_ + + `mysql_thread_id`:idx: + `mysql.html#406 <mysql.html#406>`_ + + `mysql_thread_init`:idx: + `mysql.html#389 <mysql.html#389>`_ + + `mysql_thread_safe`:idx: + `mysql.html#466 <mysql.html#466>`_ + + `mysql_use_result`:idx: + `mysql.html#418 <mysql.html#418>`_ + + `mysql_warning_count`:idx: + `mysql.html#404 <mysql.html#404>`_ + + `my_thread_end`:idx: + `mysql.html#288 <mysql.html#288>`_ + + `my_thread_init`:idx: + `mysql.html#287 <mysql.html#287>`_ + + `my_ulonglong`:idx: + `mysql.html#308 <mysql.html#308>`_ + + `NAME_LEN`:idx: + `mysql.html#110 <mysql.html#110>`_ + + `nan`:idx: + `system.html#434 <system.html#434>`_ + + `Natural`:idx: + `system.html#129 <system.html#129>`_ + + `neginf`:idx: + `system.html#433 <system.html#433>`_ + + `NET`:idx: + `mysql.html#199 <mysql.html#199>`_ + + `net_clear`:idx: + `mysql.html#243 <mysql.html#243>`_ + + `net_end`:idx: + `mysql.html#242 <mysql.html#242>`_ + + `net_flush`:idx: + `mysql.html#245 <mysql.html#245>`_ + + `NET_HEADER_SIZE`:idx: + `mysql.html#265 <mysql.html#265>`_ + + `net_new_transaction`:idx: + `mysql.html#239 <mysql.html#239>`_ + + `NET_READ_TIMEOUT`:idx: + `mysql.html#186 <mysql.html#186>`_ + + `net_realloc`:idx: + `mysql.html#244 <mysql.html#244>`_ + + `net_real_write`:idx: + `mysql.html#248 <mysql.html#248>`_ + + `net_safe_read`:idx: + `mysql.html#514 <mysql.html#514>`_ + + `NET_WAIT_TIMEOUT`:idx: + `mysql.html#188 <mysql.html#188>`_ + + `net_write_command`:idx: + `mysql.html#247 <mysql.html#247>`_ + + `NET_WRITE_TIMEOUT`:idx: + `mysql.html#187 <mysql.html#187>`_ + + `new`:idx: + * `system.html#119 <system.html#119>`_ + * `system.html#120 <system.html#120>`_ + + `newFileStream`:idx: + * `streams.html#120 <streams.html#120>`_ + * `streams.html#121 <streams.html#121>`_ + + `newline`:idx: + `manual.html#121 <manual.html#121>`_ + + `NewLines`:idx: + `lexbase.html#102 <lexbase.html#102>`_ + + `newSeq`:idx: + `system.html#161 <system.html#161>`_ + + `newString`:idx: + `system.html#408 <system.html#408>`_ + + `newStringStream`:idx: + `streams.html#117 <streams.html#117>`_ + + `newStringTable`:idx: + * `strtabs.html#104 <strtabs.html#104>`_ + * `strtabs.html#105 <strtabs.html#105>`_ + + `next`:idx: + * `parseopt.html#104 <parseopt.html#104>`_ + * `parsecfg.html#106 <parsecfg.html#106>`_ + * `parsexml.html#122 <parsexml.html#122>`_ + + `nextPowerOfTwo`:idx: + `math.html#108 <math.html#108>`_ + + `nimcall`:idx: + `manual.html#169 <manual.html#169>`_ + + `NimrodMajor`:idx: + `system.html#394 <system.html#394>`_ + + `NimrodMinor`:idx: + `system.html#395 <system.html#395>`_ + + `NimrodPatch`:idx: + `system.html#396 <system.html#396>`_ + + `NimrodVersion`:idx: + `system.html#393 <system.html#393>`_ + + `nl`:idx: + `strutils.html#108 <strutils.html#108>`_ + + `noconv`:idx: + `manual.html#172 <manual.html#172>`_ + + `no_decl`:idx: + `nimrodc.html#104 <nimrodc.html#104>`_ + + `NO_DEFAULT_VALUE_FLAG`:idx: + `mysql.html#136 <mysql.html#136>`_ + + `normalize`:idx: + `strutils.html#120 <strutils.html#120>`_ + + `not`:idx: + * `system.html#115 <system.html#115>`_ + * `system.html#191 <system.html#191>`_ + * `system.html#192 <system.html#192>`_ + * `system.html#193 <system.html#193>`_ + * `system.html#194 <system.html#194>`_ + * `system.html#195 <system.html#195>`_ + + `not_in`:idx: + `system.html#356 <system.html#356>`_ + + `NOT_NULL_FLAG`:idx: + `mysql.html#124 <mysql.html#124>`_ + + `NULL_LENGTH`:idx: + `mysql.html#289 <mysql.html#289>`_ + + `Numerical constants`:idx: + `manual.html#136 <manual.html#136>`_ + + `NUM_FLAG`:idx: + `mysql.html#137 <mysql.html#137>`_ + + `object`:idx: + `manual.html#155 <manual.html#155>`_ + + `octet2hex`:idx: + `mysql.html#276 <mysql.html#276>`_ + + `ONLY_KILL_QUERY`:idx: + `mysql.html#189 <mysql.html#189>`_ + + `open`:idx: + * `lexbase.html#104 <lexbase.html#104>`_ + * `parsecfg.html#104 <parsecfg.html#104>`_ + * `parsexml.html#107 <parsexml.html#107>`_ + * `zipfiles.html#102 <zipfiles.html#102>`_ + + `openarray`:idx: + * `tut1.html#119 <tut1.html#119>`_ + * `system.html#125 <system.html#125>`_ + + `OpenFile`:idx: + * `system.html#487 <system.html#487>`_ + * `system.html#488 <system.html#488>`_ + + `operator`:idx: + `manual.html#138 <manual.html#138>`_ + + `Operators`:idx: + `manual.html#202 <manual.html#202>`_ + + `or`:idx: + * `system.html#117 <system.html#117>`_ + * `system.html#236 <system.html#236>`_ + * `system.html#237 <system.html#237>`_ + * `system.html#238 <system.html#238>`_ + * `system.html#239 <system.html#239>`_ + * `system.html#240 <system.html#240>`_ + + `ord`:idx: + `system.html#170 <system.html#170>`_ + + `ordinal`:idx: + `tut1.html#114 <tut1.html#114>`_ + + `Ordinal types`:idx: + `manual.html#141 <manual.html#141>`_ + + `OSError`:idx: + `os.html#147 <os.html#147>`_ + + `packet_error`:idx: + `mysql.html#201 <mysql.html#201>`_ + + `pairs`:idx: + `strtabs.html#110 <strtabs.html#110>`_ + + `paramCount`:idx: + `os.html#145 <os.html#145>`_ + + `paramStr`:idx: + `os.html#146 <os.html#146>`_ + + `ParDir`:idx: + `os.html#102 <os.html#102>`_ + + `parentDir`:idx: + `os.html#122 <os.html#122>`_ + + `ParseBiggestInt`:idx: + `strutils.html#145 <strutils.html#145>`_ + + `parseCmdLine`:idx: + `os.html#154 <os.html#154>`_ + + `ParseFloat`:idx: + `strutils.html#146 <strutils.html#146>`_ + + `ParseInt`:idx: + `strutils.html#144 <strutils.html#144>`_ + + `PART_KEY_FLAG`:idx: + `mysql.html#138 <mysql.html#138>`_ + + `PathSep`:idx: + `os.html#105 <os.html#105>`_ + + `Pcharacter_set`:idx: + `mysql.html#350 <mysql.html#350>`_ + + `Pcharset_info_st`:idx: + `mysql.html#349 <mysql.html#349>`_ + + `PCURL`:idx: + `libcurl.html#139 <libcurl.html#139>`_ + + `Pcurl_calloc_callback`:idx: + `libcurl.html#101 <libcurl.html#101>`_ + + `Pcurl_closepolicy`:idx: + `libcurl.html#102 <libcurl.html#102>`_ + + `PCURLcode`:idx: + `libcurl.html#123 <libcurl.html#123>`_ + + `PCURLFORMcode`:idx: + `libcurl.html#124 <libcurl.html#124>`_ + + `PCURLformoption`:idx: + `libcurl.html#125 <libcurl.html#125>`_ + + `Pcurl_forms`:idx: + `libcurl.html#103 <libcurl.html#103>`_ + + `Pcurl_ftpauth`:idx: + `libcurl.html#104 <libcurl.html#104>`_ + + `Pcurl_ftpmethod`:idx: + `libcurl.html#105 <libcurl.html#105>`_ + + `Pcurl_ftpssl`:idx: + `libcurl.html#106 <libcurl.html#106>`_ + + `Pcurl_httppost`:idx: + `libcurl.html#108 <libcurl.html#108>`_ + + `PCURL_HTTP_VERSION`:idx: + `libcurl.html#107 <libcurl.html#107>`_ + + `PCURLINFO`:idx: + `libcurl.html#126 <libcurl.html#126>`_ + + `Pcurl_infotype`:idx: + `libcurl.html#110 <libcurl.html#110>`_ + + `Pcurliocmd`:idx: + `libcurl.html#127 <libcurl.html#127>`_ + + `Pcurlioerr`:idx: + `libcurl.html#128 <libcurl.html#128>`_ + + `Pcurl_lock_access`:idx: + `libcurl.html#111 <libcurl.html#111>`_ + + `Pcurl_lock_data`:idx: + `libcurl.html#112 <libcurl.html#112>`_ + + `PCURLM`:idx: + `libcurl.html#129 <libcurl.html#129>`_ + + `Pcurl_malloc_callback`:idx: + `libcurl.html#113 <libcurl.html#113>`_ + + `PCURLMcode`:idx: + `libcurl.html#130 <libcurl.html#130>`_ + + `PCURLMoption`:idx: + `libcurl.html#131 <libcurl.html#131>`_ + + `PCURLMSG`:idx: + `libcurl.html#132 <libcurl.html#132>`_ + + `PCURL_NETRC_OPTION`:idx: + `libcurl.html#114 <libcurl.html#114>`_ + + `PCURLoption`:idx: + `libcurl.html#133 <libcurl.html#133>`_ + + `Pcurl_proxytype`:idx: + `libcurl.html#115 <libcurl.html#115>`_ + + `Pcurl_realloc_callback`:idx: + `libcurl.html#116 <libcurl.html#116>`_ + + `PCURLSH`:idx: + `libcurl.html#134 <libcurl.html#134>`_ + + `PCURLSHcode`:idx: + `libcurl.html#135 <libcurl.html#135>`_ + + `PCURLSHoption`:idx: + `libcurl.html#136 <libcurl.html#136>`_ + + `Pcurl_slist`:idx: + `libcurl.html#117 <libcurl.html#117>`_ + + `Pcurl_socket`:idx: + `libcurl.html#118 <libcurl.html#118>`_ + + `PCURL_SSL_VERSION`:idx: + `libcurl.html#119 <libcurl.html#119>`_ + + `Pcurl_strdup_callback`:idx: + `libcurl.html#120 <libcurl.html#120>`_ + + `PCURL_TIMECOND`:idx: + `libcurl.html#121 <libcurl.html#121>`_ + + `PCURLversion`:idx: + `libcurl.html#137 <libcurl.html#137>`_ + + `Pcurl_version_info_data`:idx: + `libcurl.html#122 <libcurl.html#122>`_ + + `Pfd_set`:idx: + `libcurl.html#138 <libcurl.html#138>`_ + + `PFileStream`:idx: + `streams.html#118 <streams.html#118>`_ + + `PFloat32`:idx: + `system.html#386 <system.html#386>`_ + + `PFloat64`:idx: + `system.html#387 <system.html#387>`_ + + `Pgptr`:idx: + `mysql.html#104 <mysql.html#104>`_ + + `PI`:idx: + `math.html#101 <math.html#101>`_ + + `PIName`:idx: + `parsexml.html#115 <parsexml.html#115>`_ + + `PInt32`:idx: + `system.html#389 <system.html#389>`_ + + `PInt64`:idx: + `system.html#388 <system.html#388>`_ + + `PIRest`:idx: + `parsexml.html#116 <parsexml.html#116>`_ + + `PItem_result`:idx: + `mysql.html#256 <mysql.html#256>`_ + + `PMEM_ROOT`:idx: + `mysql.html#326 <mysql.html#326>`_ + + `Pmy_bool`:idx: + `mysql.html#102 <mysql.html#102>`_ + + `PMY_CHARSET_INFO`:idx: + `mysql.html#353 <mysql.html#353>`_ + + `Pmy_socket`:idx: + `mysql.html#106 <mysql.html#106>`_ + + `PMYSQL`:idx: + `mysql.html#358 <mysql.html#358>`_ + + `PMYSQL_BIND`:idx: + `mysql.html#380 <mysql.html#380>`_ + + `PMYSQL_DATA`:idx: + `mysql.html#330 <mysql.html#330>`_ + + `PMYSQL_FIELD`:idx: + `mysql.html#297 <mysql.html#297>`_ + + `PMYSQL_FIELD_OFFSET`:idx: + `mysql.html#300 <mysql.html#300>`_ + + `PMYSQL_MANAGER`:idx: + `mysql.html#371 <mysql.html#371>`_ + + `PMYSQL_METHODS`:idx: + `mysql.html#367 <mysql.html#367>`_ + + `PMYSQL_PARAMETERS`:idx: + `mysql.html#375 <mysql.html#375>`_ + + `PMYSQL_RES`:idx: + `mysql.html#362 <mysql.html#362>`_ + + `PMYSQL_ROW`:idx: + `mysql.html#298 <mysql.html#298>`_ + + `PMYSQL_ROW_OFFSET`:idx: + `mysql.html#315 <mysql.html#315>`_ + + `PMYSQL_ROWS`:idx: + `mysql.html#314 <mysql.html#314>`_ + + `PMYSQL_STMT`:idx: + `mysql.html#364 <mysql.html#364>`_ + + `Pmy_ulonglong`:idx: + `mysql.html#309 <mysql.html#309>`_ + + `PNET`:idx: + `mysql.html#200 <mysql.html#200>`_ + + `PObject`:idx: + `system.html#132 <system.html#132>`_ + + `pointer`:idx: + `system.html#113 <system.html#113>`_ + + `pointers`:idx: + * `manual.html#158 <manual.html#158>`_ + * `tut1.html#120 <tut1.html#120>`_ + + `pop`:idx: + `system.html#460 <system.html#460>`_ + + `Positive`:idx: + `system.html#130 <system.html#130>`_ + + `pow`:idx: + `math.html#132 <math.html#132>`_ + + `PPByte`:idx: + `mysql.html#108 <mysql.html#108>`_ + + `PPcurl_httppost`:idx: + `libcurl.html#109 <libcurl.html#109>`_ + + `PPPChar`:idx: + `sqlite3.html#174 <sqlite3.html#174>`_ + + `PPSqlite3`:idx: + `sqlite3.html#176 <sqlite3.html#176>`_ + + `PPsqlite3_stmt`:idx: + `sqlite3.html#179 <sqlite3.html#179>`_ + + `PPsqlite3_value`:idx: + `sqlite3.html#181 <sqlite3.html#181>`_ + + `Prand_struct`:idx: + `mysql.html#253 <mysql.html#253>`_ + + `pred`:idx: + `system.html#158 <system.html#158>`_ + + `PRI_KEY_FLAG`:idx: + `mysql.html#125 <mysql.html#125>`_ + + `procedural type`:idx: + * `manual.html#161 <manual.html#161>`_ + * `tut1.html#123 <tut1.html#123>`_ + + `procedures`:idx: + `manual.html#199 <manual.html#199>`_ + + `Psockaddr`:idx: + `mysql.html#250 <mysql.html#250>`_ + + `Psqlite3`:idx: + `sqlite3.html#175 <sqlite3.html#175>`_ + + `Psqlite3_context`:idx: + `sqlite3.html#177 <sqlite3.html#177>`_ + + `Psqlite3_stmt`:idx: + `sqlite3.html#178 <sqlite3.html#178>`_ + + `Psqlite3_value`:idx: + `sqlite3.html#180 <sqlite3.html#180>`_ + + `Pst_dynamic_array`:idx: + `mysql.html#341 <mysql.html#341>`_ + + `Pst_mem_root`:idx: + `mysql.html#323 <mysql.html#323>`_ + + `Pst_mysql`:idx: + `mysql.html#355 <mysql.html#355>`_ + + `Pst_mysql_bind`:idx: + `mysql.html#377 <mysql.html#377>`_ + + `Pst_mysql_data`:idx: + `mysql.html#327 <mysql.html#327>`_ + + `Pst_mysql_field`:idx: + `mysql.html#294 <mysql.html#294>`_ + + `Pst_mysql_manager`:idx: + `mysql.html#368 <mysql.html#368>`_ + + `Pst_mysql_methods`:idx: + `mysql.html#354 <mysql.html#354>`_ + + `Pst_mysql_options`:idx: + `mysql.html#342 <mysql.html#342>`_ + + `Pst_mysql_parameters`:idx: + `mysql.html#372 <mysql.html#372>`_ + + `Pst_mysql_res`:idx: + `mysql.html#359 <mysql.html#359>`_ + + `Pst_mysql_rows`:idx: + `mysql.html#311 <mysql.html#311>`_ + + `Pst_mysql_stmt`:idx: + `mysql.html#363 <mysql.html#363>`_ + + `Pst_net`:idx: + `mysql.html#197 <mysql.html#197>`_ + + `PStream`:idx: + `streams.html#101 <streams.html#101>`_ + + `PStringStream`:idx: + `streams.html#115 <streams.html#115>`_ + + `PStringTable`:idx: + `strtabs.html#103 <strtabs.html#103>`_ + + `Pst_udf_args`:idx: + `mysql.html#257 <mysql.html#257>`_ + + `Pst_udf_init`:idx: + `mysql.html#261 <mysql.html#261>`_ + + `Pst_used_mem`:idx: + `mysql.html#319 <mysql.html#319>`_ + + `PUDF_ARGS`:idx: + `mysql.html#260 <mysql.html#260>`_ + + `PUDF_INIT`:idx: + `mysql.html#264 <mysql.html#264>`_ + + `PUSED_MEM`:idx: + `mysql.html#322 <mysql.html#322>`_ + + `push/pop`:idx: + `manual.html#228 <manual.html#228>`_ + + `putEnv`:idx: + `os.html#142 <os.html#142>`_ + + `PVIO`:idx: + `mysql.html#103 <mysql.html#103>`_ + + `PZipFileStream`:idx: + `zipfiles.html#108 <zipfiles.html#108>`_ + + `quit`:idx: + * `system.html#479 <system.html#479>`_ + * `system.html#480 <system.html#480>`_ + + `QuitFailure`:idx: + `system.html#478 <system.html#478>`_ + + `QuitSuccess`:idx: + `system.html#477 <system.html#477>`_ + + `quotation mark`:idx: + `manual.html#128 <manual.html#128>`_ + + `quoteIfContainsWhite`:idx: + `strutils.html#153 <strutils.html#153>`_ + + `random`:idx: + `math.html#113 <math.html#113>`_ + + `randominit`:idx: + `mysql.html#267 <mysql.html#267>`_ + + `randomize`:idx: + `math.html#114 <math.html#114>`_ + + `rand_struct`:idx: + `mysql.html#254 <mysql.html#254>`_ + + `range`:idx: + `system.html#123 <system.html#123>`_ + + `re-raised`:idx: + `manual.html#183 <manual.html#183>`_ + + `readBool`:idx: + `streams.html#106 <streams.html#106>`_ + + `readBuffer`:idx: + `system.html#507 <system.html#507>`_ + + `ReadBytes`:idx: + `system.html#505 <system.html#505>`_ + + `readChar`:idx: + * `system.html#491 <system.html#491>`_ + * `streams.html#105 <streams.html#105>`_ + + `ReadChars`:idx: + `system.html#506 <system.html#506>`_ + + `readData`:idx: + `cgi.html#107 <cgi.html#107>`_ + + `readFile`:idx: + `system.html#493 <system.html#493>`_ + + `readFloat32`:idx: + `streams.html#111 <streams.html#111>`_ + + `readFloat64`:idx: + `streams.html#112 <streams.html#112>`_ + + `readInt16`:idx: + `streams.html#108 <streams.html#108>`_ + + `readInt32`:idx: + `streams.html#109 <streams.html#109>`_ + + `readInt64`:idx: + `streams.html#110 <streams.html#110>`_ + + `readInt8`:idx: + `streams.html#107 <streams.html#107>`_ + + `readLine`:idx: + * `system.html#501 <system.html#501>`_ + * `streams.html#114 <streams.html#114>`_ + + `readStr`:idx: + `streams.html#113 <streams.html#113>`_ + + `realloc`:idx: + `system.html#415 <system.html#415>`_ + + `reBinary`:idx: + `regexprs.html#116 <regexprs.html#116>`_ + + `Recursive module dependancies`:idx: + `manual.html#216 <manual.html#216>`_ + + `reEmail`:idx: + `regexprs.html#119 <regexprs.html#119>`_ + + `reFloat`:idx: + `regexprs.html#118 <regexprs.html#118>`_ + + `REFRESH_DES_KEY_FILE`:idx: + `mysql.html#154 <mysql.html#154>`_ + + `REFRESH_FAST`:idx: + `mysql.html#151 <mysql.html#151>`_ + + `REFRESH_GRANT`:idx: + `mysql.html#142 <mysql.html#142>`_ + + `REFRESH_HOSTS`:idx: + `mysql.html#145 <mysql.html#145>`_ + + `REFRESH_LOG`:idx: + `mysql.html#143 <mysql.html#143>`_ + + `REFRESH_MASTER`:idx: + `mysql.html#149 <mysql.html#149>`_ + + `REFRESH_QUERY_CACHE`:idx: + `mysql.html#152 <mysql.html#152>`_ + + `REFRESH_QUERY_CACHE_FREE`:idx: + `mysql.html#153 <mysql.html#153>`_ + + `REFRESH_READ_LOCK`:idx: + `mysql.html#150 <mysql.html#150>`_ + + `REFRESH_SLAVE`:idx: + `mysql.html#148 <mysql.html#148>`_ + + `REFRESH_STATUS`:idx: + `mysql.html#146 <mysql.html#146>`_ + + `REFRESH_TABLES`:idx: + `mysql.html#144 <mysql.html#144>`_ + + `REFRESH_THREADS`:idx: + `mysql.html#147 <mysql.html#147>`_ + + `REFRESH_USER_RESOURCES`:idx: + `mysql.html#155 <mysql.html#155>`_ + + `register`:idx: + `nimrodc.html#112 <nimrodc.html#112>`_ + + `reHex`:idx: + `regexprs.html#115 <regexprs.html#115>`_ + + `reIdentifier`:idx: + `regexprs.html#112 <regexprs.html#112>`_ + + `reInteger`:idx: + `regexprs.html#114 <regexprs.html#114>`_ + + `removeDir`:idx: + `os.html#137 <os.html#137>`_ + + `removeFile`:idx: + `os.html#136 <os.html#136>`_ + + `reNatural`:idx: + `regexprs.html#113 <regexprs.html#113>`_ + + `reOctal`:idx: + `regexprs.html#117 <regexprs.html#117>`_ + + `repeatChar`:idx: + `strutils.html#148 <strutils.html#148>`_ + + `replaceStr`:idx: + * `strutils.html#127 <strutils.html#127>`_ + * `strutils.html#128 <strutils.html#128>`_ + + `repr`:idx: + `system.html#371 <system.html#371>`_ + + `ResetAttributes`:idx: + `terminal.html#110 <terminal.html#110>`_ + + `result`:idx: + * `manual.html#190 <manual.html#190>`_ + * `manual.html#201 <manual.html#201>`_ + + `return`:idx: + `manual.html#189 <manual.html#189>`_ + + `reURL`:idx: + `regexprs.html#120 <regexprs.html#120>`_ + + `round`:idx: + `math.html#121 <math.html#121>`_ + + `runeAt`:idx: + `unicode.html#104 <unicode.html#104>`_ + + `runeLen`:idx: + `unicode.html#103 <unicode.html#103>`_ + + `runes`:idx: + `unicode.html#114 <unicode.html#114>`_ + + `safe`:idx: + `manual.html#112 <manual.html#112>`_ + + `safecall`:idx: + `manual.html#166 <manual.html#166>`_ + + `sameFile`:idx: + `os.html#148 <os.html#148>`_ + + `sameFileContent`:idx: + `os.html#149 <os.html#149>`_ + + `scope`:idx: + * `manual.html#106 <manual.html#106>`_ + * `manual.html#217 <manual.html#217>`_ + + `scramble`:idx: + `mysql.html#278 <mysql.html#278>`_ + + `scramble_323`:idx: + `mysql.html#272 <mysql.html#272>`_ + + `SCRAMBLED_PASSWORD_CHAR_LENGTH`:idx: + `mysql.html#122 <mysql.html#122>`_ + + `SCRAMBLED_PASSWORD_CHAR_LENGTH_323`:idx: + `mysql.html#123 <mysql.html#123>`_ + + `SCRAMBLE_LENGTH`:idx: + `mysql.html#120 <mysql.html#120>`_ + + `SCRAMBLE_LENGTH_323`:idx: + `mysql.html#121 <mysql.html#121>`_ + + `ScriptExt`:idx: + `os.html#108 <os.html#108>`_ + + `separate compilation`:idx: + * `manual.html#214 <manual.html#214>`_ + * `tut1.html#127 <tut1.html#127>`_ + + `seq`:idx: + `system.html#126 <system.html#126>`_ + + `seqToPtr`:idx: + `system.html#457 <system.html#457>`_ + + `Sequences`:idx: + * `manual.html#153 <manual.html#153>`_ + * `tut1.html#118 <tut1.html#118>`_ + + `SERVER_MORE_RESULTS_EXISTS`:idx: + `mysql.html#178 <mysql.html#178>`_ + + `SERVER_QUERY_NO_GOOD_INDEX_USED`:idx: + `mysql.html#179 <mysql.html#179>`_ + + `SERVER_QUERY_NO_INDEX_USED`:idx: + `mysql.html#180 <mysql.html#180>`_ + + `SERVER_STATUS_AUTOCOMMIT`:idx: + `mysql.html#176 <mysql.html#176>`_ + + `SERVER_STATUS_CURSOR_EXISTS`:idx: + `mysql.html#181 <mysql.html#181>`_ + + `SERVER_STATUS_DB_DROPPED`:idx: + `mysql.html#183 <mysql.html#183>`_ + + `SERVER_STATUS_IN_TRANS`:idx: + `mysql.html#175 <mysql.html#175>`_ + + `SERVER_STATUS_LAST_ROW_SENT`:idx: + `mysql.html#182 <mysql.html#182>`_ + + `SERVER_STATUS_MORE_RESULTS`:idx: + `mysql.html#177 <mysql.html#177>`_ + + `SERVER_STATUS_NO_BACKSLASH_ESCAPES`:idx: + `mysql.html#184 <mysql.html#184>`_ + + `SERVER_VERSION_LENGTH`:idx: + `mysql.html#113 <mysql.html#113>`_ + + `set`:idx: + `system.html#127 <system.html#127>`_ + + `set type`:idx: + * `manual.html#157 <manual.html#157>`_ + * `tut1.html#116 <tut1.html#116>`_ + + `setBackgroundColor`:idx: + `terminal.html#116 <terminal.html#116>`_ + + `setCurrentDir`:idx: + `os.html#113 <os.html#113>`_ + + `setCursorPos`:idx: + `terminal.html#101 <terminal.html#101>`_ + + `setCursorXPos`:idx: + `terminal.html#102 <terminal.html#102>`_ + + `setCursorYPos`:idx: + `terminal.html#103 <terminal.html#103>`_ + + `setFilePos`:idx: + `system.html#511 <system.html#511>`_ + + `SET_FLAG`:idx: + `mysql.html#135 <mysql.html#135>`_ + + `setForegroundColor`:idx: + `terminal.html#115 <terminal.html#115>`_ + + `setLen`:idx: + * `system.html#407 <system.html#407>`_ + * `system.html#417 <system.html#417>`_ + + `setTestData`:idx: + `cgi.html#141 <cgi.html#141>`_ + + `shl`:idx: + * `system.html#226 <system.html#226>`_ + * `system.html#227 <system.html#227>`_ + * `system.html#228 <system.html#228>`_ + * `system.html#229 <system.html#229>`_ + * `system.html#230 <system.html#230>`_ + + `shr`:idx: + * `system.html#221 <system.html#221>`_ + * `system.html#222 <system.html#222>`_ + * `system.html#223 <system.html#223>`_ + * `system.html#224 <system.html#224>`_ + * `system.html#225 <system.html#225>`_ + + `simple assertions`:idx: + `regexprs.html#103 <regexprs.html#103>`_ + + `simple statements`:idx: + `manual.html#174 <manual.html#174>`_ + + `sinh`:idx: + `math.html#129 <math.html#129>`_ + + `sizeof`:idx: + `system.html#156 <system.html#156>`_ + + `sockaddr`:idx: + `mysql.html#251 <mysql.html#251>`_ + + `split`:idx: + * `strutils.html#131 <strutils.html#131>`_ + * `strutils.html#132 <strutils.html#132>`_ + + `SplitFilename`:idx: + `os.html#125 <os.html#125>`_ + + `splitLines`:idx: + `strutils.html#133 <strutils.html#133>`_ + + `splitLinesSeq`:idx: + `strutils.html#134 <strutils.html#134>`_ + + `SplitPath`:idx: + `os.html#121 <os.html#121>`_ + + `splitSeq`:idx: + * `strutils.html#135 <strutils.html#135>`_ + * `strutils.html#136 <strutils.html#136>`_ + + `sqlite3_aggregate_context`:idx: + `sqlite3.html#261 <sqlite3.html#261>`_ + + `sqlite3_aggregate_count`:idx: + `sqlite3.html#249 <sqlite3.html#249>`_ + + `sqlite3_bind_blob`:idx: + * `sqlite3.html#216 <sqlite3.html#216>`_ + * `sqlite3.html#223 <sqlite3.html#223>`_ + + `sqlite3_bind_double`:idx: + `sqlite3.html#217 <sqlite3.html#217>`_ + + `sqlite3_bind_int`:idx: + `sqlite3.html#218 <sqlite3.html#218>`_ + + `sqlite3_bind_int64`:idx: + `sqlite3.html#219 <sqlite3.html#219>`_ + + `sqlite3_bind_null`:idx: + `sqlite3.html#220 <sqlite3.html#220>`_ + + `sqlite3_bind_parameter_count`:idx: + `sqlite3.html#226 <sqlite3.html#226>`_ + + `sqlite3_bind_parameter_index`:idx: + `sqlite3.html#228 <sqlite3.html#228>`_ + + `sqlite3_bind_parameter_name`:idx: + `sqlite3.html#227 <sqlite3.html#227>`_ + + `sqlite3_bind_text`:idx: + * `sqlite3.html#221 <sqlite3.html#221>`_ + * `sqlite3.html#224 <sqlite3.html#224>`_ + + `sqlite3_bind_text16`:idx: + * `sqlite3.html#222 <sqlite3.html#222>`_ + * `sqlite3.html#225 <sqlite3.html#225>`_ + + `sqlite3_busy_handler`:idx: + `sqlite3.html#198 <sqlite3.html#198>`_ + + `sqlite3_busy_timeout`:idx: + `sqlite3.html#199 <sqlite3.html#199>`_ + + `sqlite3_changes`:idx: + `sqlite3.html#193 <sqlite3.html#193>`_ + + `sqlite3_close`:idx: + `sqlite3.html#190 <sqlite3.html#190>`_ + + `sqlite3_collation_needed`:idx: + `sqlite3.html#279 <sqlite3.html#279>`_ + + `sqlite3_collation_needed16`:idx: + `sqlite3.html#280 <sqlite3.html#280>`_ + + `sqlite3_column_blob`:idx: + `sqlite3.html#236 <sqlite3.html#236>`_ + + `sqlite3_column_bytes`:idx: + `sqlite3.html#237 <sqlite3.html#237>`_ + + `sqlite3_column_bytes16`:idx: + `sqlite3.html#238 <sqlite3.html#238>`_ + + `sqlite3_column_count`:idx: + `sqlite3.html#229 <sqlite3.html#229>`_ + + `sqlite3_column_decltype`:idx: + `sqlite3.html#232 <sqlite3.html#232>`_ + + `sqlite3_column_decltype16`:idx: + `sqlite3.html#233 <sqlite3.html#233>`_ + + `sqlite3_column_double`:idx: + `sqlite3.html#239 <sqlite3.html#239>`_ + + `sqlite3_column_int`:idx: + `sqlite3.html#240 <sqlite3.html#240>`_ + + `sqlite3_column_int64`:idx: + `sqlite3.html#241 <sqlite3.html#241>`_ + + `sqlite3_column_name`:idx: + `sqlite3.html#230 <sqlite3.html#230>`_ + + `sqlite3_column_name16`:idx: + `sqlite3.html#231 <sqlite3.html#231>`_ + + `sqlite3_column_text`:idx: + `sqlite3.html#242 <sqlite3.html#242>`_ + + `sqlite3_column_text16`:idx: + `sqlite3.html#243 <sqlite3.html#243>`_ + + `sqlite3_column_type`:idx: + `sqlite3.html#244 <sqlite3.html#244>`_ + + `sqlite3_commit_hook`:idx: + `sqlite3.html#208 <sqlite3.html#208>`_ + + `sqlite3_complete`:idx: + `sqlite3.html#196 <sqlite3.html#196>`_ + + `sqlite3_complete16`:idx: + `sqlite3.html#197 <sqlite3.html#197>`_ + + `sqlite3_create_collation`:idx: + `sqlite3.html#277 <sqlite3.html#277>`_ + + `sqlite3_create_collation16`:idx: + `sqlite3.html#278 <sqlite3.html#278>`_ + + `sqlite3_create_function`:idx: + `sqlite3.html#247 <sqlite3.html#247>`_ + + `sqlite3_create_function16`:idx: + `sqlite3.html#248 <sqlite3.html#248>`_ + + `sqlite3_data_count`:idx: + `sqlite3.html#235 <sqlite3.html#235>`_ + + `sqlite3_errcode`:idx: + `sqlite3.html#211 <sqlite3.html#211>`_ + + `sqlite3_errmsg`:idx: + `sqlite3.html#212 <sqlite3.html#212>`_ + + `sqlite3_errmsg16`:idx: + `sqlite3.html#213 <sqlite3.html#213>`_ + + `sqlite3_exec`:idx: + `sqlite3.html#191 <sqlite3.html#191>`_ + + `sqlite3_finalize`:idx: + `sqlite3.html#245 <sqlite3.html#245>`_ + + `sqlite3_free`:idx: + `sqlite3.html#203 <sqlite3.html#203>`_ + + `sqlite3_free_table`:idx: + `sqlite3.html#201 <sqlite3.html#201>`_ + + `sqlite3_get_auxdata`:idx: + `sqlite3.html#263 <sqlite3.html#263>`_ + + `sqlite3_get_table`:idx: + `sqlite3.html#200 <sqlite3.html#200>`_ + + `sqlite3_interrupt`:idx: + `sqlite3.html#195 <sqlite3.html#195>`_ + + `sqlite3_last_insert_rowid`:idx: + `sqlite3.html#192 <sqlite3.html#192>`_ + + `sqlite3_libversion`:idx: + `sqlite3.html#281 <sqlite3.html#281>`_ + + `sqlite3_libversion_number`:idx: + `sqlite3.html#283 <sqlite3.html#283>`_ + + `sqlite3_mprintf`:idx: + `sqlite3.html#202 <sqlite3.html#202>`_ + + `sqlite3_open`:idx: + `sqlite3.html#209 <sqlite3.html#209>`_ + + `sqlite3_open16`:idx: + `sqlite3.html#210 <sqlite3.html#210>`_ + + `sqlite3_prepare`:idx: + `sqlite3.html#214 <sqlite3.html#214>`_ + + `sqlite3_prepare16`:idx: + `sqlite3.html#215 <sqlite3.html#215>`_ + + `sqlite3_progress_handler`:idx: + `sqlite3.html#207 <sqlite3.html#207>`_ + + `sqlite3_reset`:idx: + `sqlite3.html#246 <sqlite3.html#246>`_ + + `sqlite3_result_blob`:idx: + `sqlite3.html#265 <sqlite3.html#265>`_ + + `sqlite3_result_double`:idx: + `sqlite3.html#266 <sqlite3.html#266>`_ + + `sqlite3_result_error`:idx: + `sqlite3.html#267 <sqlite3.html#267>`_ + + `sqlite3_result_error16`:idx: + `sqlite3.html#268 <sqlite3.html#268>`_ + + `sqlite3_result_int`:idx: + `sqlite3.html#269 <sqlite3.html#269>`_ + + `sqlite3_result_int64`:idx: + `sqlite3.html#270 <sqlite3.html#270>`_ + + `sqlite3_result_null`:idx: + `sqlite3.html#271 <sqlite3.html#271>`_ + + `sqlite3_result_text`:idx: + `sqlite3.html#272 <sqlite3.html#272>`_ + + `sqlite3_result_text16`:idx: + `sqlite3.html#273 <sqlite3.html#273>`_ + + `sqlite3_result_text16be`:idx: + `sqlite3.html#275 <sqlite3.html#275>`_ + + `sqlite3_result_text16le`:idx: + `sqlite3.html#274 <sqlite3.html#274>`_ + + `sqlite3_result_value`:idx: + `sqlite3.html#276 <sqlite3.html#276>`_ + + `sqlite3_set_authorizer`:idx: + `sqlite3.html#205 <sqlite3.html#205>`_ + + `sqlite3_set_auxdata`:idx: + `sqlite3.html#264 <sqlite3.html#264>`_ + + `sqlite3_snprintf`:idx: + `sqlite3.html#204 <sqlite3.html#204>`_ + + `sqlite3_step`:idx: + `sqlite3.html#234 <sqlite3.html#234>`_ + + `SQLITE3_TEXT`:idx: + `sqlite3.html#106 <sqlite3.html#106>`_ + + `sqlite3_total_changes`:idx: + `sqlite3.html#194 <sqlite3.html#194>`_ + + `sqlite3_trace`:idx: + `sqlite3.html#206 <sqlite3.html#206>`_ + + `sqlite3_user_data`:idx: + `sqlite3.html#262 <sqlite3.html#262>`_ + + `sqlite3_value_blob`:idx: + `sqlite3.html#250 <sqlite3.html#250>`_ + + `sqlite3_value_bytes`:idx: + `sqlite3.html#251 <sqlite3.html#251>`_ + + `sqlite3_value_bytes16`:idx: + `sqlite3.html#252 <sqlite3.html#252>`_ + + `sqlite3_value_double`:idx: + `sqlite3.html#253 <sqlite3.html#253>`_ + + `sqlite3_value_int`:idx: + `sqlite3.html#254 <sqlite3.html#254>`_ + + `sqlite3_value_int64`:idx: + `sqlite3.html#255 <sqlite3.html#255>`_ + + `sqlite3_value_text`:idx: + `sqlite3.html#256 <sqlite3.html#256>`_ + + `sqlite3_value_text16`:idx: + `sqlite3.html#257 <sqlite3.html#257>`_ + + `sqlite3_value_text16be`:idx: + `sqlite3.html#259 <sqlite3.html#259>`_ + + `sqlite3_value_text16le`:idx: + `sqlite3.html#258 <sqlite3.html#258>`_ + + `sqlite3_value_type`:idx: + `sqlite3.html#260 <sqlite3.html#260>`_ + + `sqlite3_version`:idx: + `sqlite3.html#282 <sqlite3.html#282>`_ + + `SQLITE_ABORT`:idx: + `sqlite3.html#116 <sqlite3.html#116>`_ + + `SQLITE_ALTER_TABLE`:idx: + `sqlite3.html#167 <sqlite3.html#167>`_ + + `SQLITE_ANY`:idx: + `sqlite3.html#111 <sqlite3.html#111>`_ + + `SQLITE_ATTACH`:idx: + `sqlite3.html#165 <sqlite3.html#165>`_ + + `SQLITE_AUTH`:idx: + `sqlite3.html#135 <sqlite3.html#135>`_ + + `SQLITE_BLOB`:idx: + `sqlite3.html#103 <sqlite3.html#103>`_ + + `SQLITE_BUSY`:idx: + `sqlite3.html#117 <sqlite3.html#117>`_ + + `SQLITE_CANTOPEN`:idx: + `sqlite3.html#126 <sqlite3.html#126>`_ + + `SQLITE_CONSTRAINT`:idx: + `sqlite3.html#131 <sqlite3.html#131>`_ + + `SQLITE_COPY`:idx: + `sqlite3.html#141 <sqlite3.html#141>`_ + + `SQLITE_CORRUPT`:idx: + `sqlite3.html#123 <sqlite3.html#123>`_ + + `SQLITE_CREATE_INDEX`:idx: + `sqlite3.html#142 <sqlite3.html#142>`_ + + `SQLITE_CREATE_TABLE`:idx: + `sqlite3.html#143 <sqlite3.html#143>`_ + + `SQLITE_CREATE_TEMP_INDEX`:idx: + `sqlite3.html#144 <sqlite3.html#144>`_ + + `SQLITE_CREATE_TEMP_TABLE`:idx: + `sqlite3.html#145 <sqlite3.html#145>`_ + + `SQLITE_CREATE_TEMP_TRIGGER`:idx: + `sqlite3.html#146 <sqlite3.html#146>`_ + + `SQLITE_CREATE_TEMP_VIEW`:idx: + `sqlite3.html#147 <sqlite3.html#147>`_ + + `SQLITE_CREATE_TRIGGER`:idx: + `sqlite3.html#148 <sqlite3.html#148>`_ + + `SQLITE_CREATE_VIEW`:idx: + `sqlite3.html#149 <sqlite3.html#149>`_ + + `SQLITE_DELETE`:idx: + `sqlite3.html#150 <sqlite3.html#150>`_ + + `SQLITE_DENY`:idx: + `sqlite3.html#169 <sqlite3.html#169>`_ + + `SQLITE_DETACH`:idx: + `sqlite3.html#166 <sqlite3.html#166>`_ + + `SQLITE_DONE`:idx: + `sqlite3.html#140 <sqlite3.html#140>`_ + + `SQLITE_DROP_INDEX`:idx: + `sqlite3.html#151 <sqlite3.html#151>`_ + + `SQLITE_DROP_TABLE`:idx: + `sqlite3.html#152 <sqlite3.html#152>`_ + + `SQLITE_DROP_TEMP_INDEX`:idx: + `sqlite3.html#153 <sqlite3.html#153>`_ + + `SQLITE_DROP_TEMP_TABLE`:idx: + `sqlite3.html#154 <sqlite3.html#154>`_ + + `SQLITE_DROP_TEMP_TRIGGER`:idx: + `sqlite3.html#155 <sqlite3.html#155>`_ + + `SQLITE_DROP_TEMP_VIEW`:idx: + `sqlite3.html#156 <sqlite3.html#156>`_ + + `SQLITE_DROP_TRIGGER`:idx: + `sqlite3.html#157 <sqlite3.html#157>`_ + + `SQLITE_DROP_VIEW`:idx: + `sqlite3.html#158 <sqlite3.html#158>`_ + + `SQLITE_EMPTY`:idx: + `sqlite3.html#128 <sqlite3.html#128>`_ + + `SQLITE_ERROR`:idx: + `sqlite3.html#113 <sqlite3.html#113>`_ + + `SQLITE_FLOAT`:idx: + `sqlite3.html#102 <sqlite3.html#102>`_ + + `SQLITE_FORMAT`:idx: + `sqlite3.html#136 <sqlite3.html#136>`_ + + `SQLITE_FULL`:idx: + `sqlite3.html#125 <sqlite3.html#125>`_ + + `SQLITE_IGNORE`:idx: + `sqlite3.html#170 <sqlite3.html#170>`_ + + `SQLITE_INSERT`:idx: + `sqlite3.html#159 <sqlite3.html#159>`_ + + `sqlite_int64`:idx: + `sqlite3.html#173 <sqlite3.html#173>`_ + + `SQLITE_INTEGER`:idx: + `sqlite3.html#101 <sqlite3.html#101>`_ + + `SQLITE_INTERNAL`:idx: + `sqlite3.html#114 <sqlite3.html#114>`_ + + `SQLITE_INTERRUPT`:idx: + `sqlite3.html#121 <sqlite3.html#121>`_ + + `SQLITE_IOERR`:idx: + `sqlite3.html#122 <sqlite3.html#122>`_ + + `SQLITE_LOCKED`:idx: + `sqlite3.html#118 <sqlite3.html#118>`_ + + `SQLITE_MISMATCH`:idx: + `sqlite3.html#132 <sqlite3.html#132>`_ + + `SQLITE_MISUSE`:idx: + `sqlite3.html#133 <sqlite3.html#133>`_ + + `SQLITE_NOLFS`:idx: + `sqlite3.html#134 <sqlite3.html#134>`_ + + `SQLITE_NOMEM`:idx: + `sqlite3.html#119 <sqlite3.html#119>`_ + + `SQLITE_NOTADB`:idx: + `sqlite3.html#138 <sqlite3.html#138>`_ + + `SQLITE_NOTFOUND`:idx: + `sqlite3.html#124 <sqlite3.html#124>`_ + + `SQLITE_NULL`:idx: + `sqlite3.html#104 <sqlite3.html#104>`_ + + `SQLITE_OK`:idx: + `sqlite3.html#112 <sqlite3.html#112>`_ + + `SQLITE_PERM`:idx: + `sqlite3.html#115 <sqlite3.html#115>`_ + + `SQLITE_PRAGMA`:idx: + `sqlite3.html#160 <sqlite3.html#160>`_ + + `SQLITE_PROTOCOL`:idx: + `sqlite3.html#127 <sqlite3.html#127>`_ + + `SQLITE_RANGE`:idx: + `sqlite3.html#137 <sqlite3.html#137>`_ + + `SQLITE_READ`:idx: + `sqlite3.html#161 <sqlite3.html#161>`_ + + `SQLITE_READONLY`:idx: + `sqlite3.html#120 <sqlite3.html#120>`_ + + `SQLITE_REINDEX`:idx: + `sqlite3.html#168 <sqlite3.html#168>`_ + + `SQLITE_ROW`:idx: + `sqlite3.html#139 <sqlite3.html#139>`_ + + `SQLITE_SCHEMA`:idx: + `sqlite3.html#129 <sqlite3.html#129>`_ + + `SQLITE_SELECT`:idx: + `sqlite3.html#162 <sqlite3.html#162>`_ + + `SQLITE_STATIC`:idx: + `sqlite3.html#171 <sqlite3.html#171>`_ + + `SQLITE_TEXT`:idx: + `sqlite3.html#105 <sqlite3.html#105>`_ + + `SQLITE_TOOBIG`:idx: + `sqlite3.html#130 <sqlite3.html#130>`_ + + `SQLITE_TRANSACTION`:idx: + `sqlite3.html#163 <sqlite3.html#163>`_ + + `SQLITE_TRANSIENT`:idx: + `sqlite3.html#172 <sqlite3.html#172>`_ + + `SQLITE_UPDATE`:idx: + `sqlite3.html#164 <sqlite3.html#164>`_ + + `SQLITE_UTF16`:idx: + `sqlite3.html#110 <sqlite3.html#110>`_ + + `SQLITE_UTF16BE`:idx: + `sqlite3.html#109 <sqlite3.html#109>`_ + + `SQLITE_UTF16LE`:idx: + `sqlite3.html#108 <sqlite3.html#108>`_ + + `SQLITE_UTF8`:idx: + `sqlite3.html#107 <sqlite3.html#107>`_ + + `SQLSTATE_LENGTH`:idx: + `mysql.html#114 <mysql.html#114>`_ + + `sqrt`:idx: + * `math.html#115 <math.html#115>`_ + * `complex.html#109 <complex.html#109>`_ + + `stack_trace`:idx: + `nimrodc.html#108 <nimrodc.html#108>`_ + + `startsWith`:idx: + `strutils.html#149 <strutils.html#149>`_ + + `statement macros`:idx: + `tut2.html#113 <tut2.html#113>`_ + + `Statements`:idx: + `manual.html#173 <manual.html#173>`_ + + `static error`:idx: + `manual.html#109 <manual.html#109>`_ + + `static type`:idx: + `manual.html#103 <manual.html#103>`_ + + `stdcall`:idx: + `manual.html#164 <manual.html#164>`_ + + `stderr`:idx: + `system.html#486 <system.html#486>`_ + + `stdin`:idx: + `system.html#484 <system.html#484>`_ + + `stdout`:idx: + `system.html#485 <system.html#485>`_ + + `st_dynamic_array`:idx: + `mysql.html#339 <mysql.html#339>`_ + + `st_mem_root`:idx: + `mysql.html#324 <mysql.html#324>`_ + + `st_mysql`:idx: + `mysql.html#356 <mysql.html#356>`_ + + `st_mysql_bind`:idx: + `mysql.html#378 <mysql.html#378>`_ + + `st_mysql_data`:idx: + `mysql.html#328 <mysql.html#328>`_ + + `st_mysql_field`:idx: + `mysql.html#295 <mysql.html#295>`_ + + `st_mysql_manager`:idx: + `mysql.html#369 <mysql.html#369>`_ + + `st_mysql_methods`:idx: + `mysql.html#365 <mysql.html#365>`_ + + `st_mysql_options`:idx: + `mysql.html#343 <mysql.html#343>`_ + + `st_mysql_parameters`:idx: + `mysql.html#373 <mysql.html#373>`_ + + `st_mysql_res`:idx: + `mysql.html#360 <mysql.html#360>`_ + + `st_mysql_rows`:idx: + `mysql.html#312 <mysql.html#312>`_ + + `st_mysql_stmt`:idx: + `mysql.html#381 <mysql.html#381>`_ + + `st_net`:idx: + `mysql.html#198 <mysql.html#198>`_ + + `string`:idx: + * `manual.html#150 <manual.html#150>`_ + * `system.html#111 <system.html#111>`_ + + `string interpolation`:idx: + `strutils.html#110 <strutils.html#110>`_ + + `strip`:idx: + `strutils.html#114 <strutils.html#114>`_ + + `strStart`:idx: + `strutils.html#107 <strutils.html#107>`_ + + `structured type`:idx: + `manual.html#151 <manual.html#151>`_ + + `strutils`:idx: + `nimrodc.html#117 <nimrodc.html#117>`_ + + `st_udf_args`:idx: + `mysql.html#258 <mysql.html#258>`_ + + `st_udf_init`:idx: + `mysql.html#262 <mysql.html#262>`_ + + `st_used_mem`:idx: + `mysql.html#320 <mysql.html#320>`_ + + `style-insensitive`:idx: + `manual.html#118 <manual.html#118>`_ + + `subrange`:idx: + * `manual.html#149 <manual.html#149>`_ + * `tut1.html#115 <tut1.html#115>`_ + + `substitution`:idx: + `strutils.html#109 <strutils.html#109>`_ + + `succ`:idx: + `system.html#157 <system.html#157>`_ + + `sum`:idx: + `math.html#110 <math.html#110>`_ + + `swap`:idx: + `system.html#419 <system.html#419>`_ + + `syscall`:idx: + `manual.html#171 <manual.html#171>`_ + + `system`:idx: + `manual.html#218 <manual.html#218>`_ + + `tabulator`:idx: + `manual.html#125 <manual.html#125>`_ + + `TAddress`:idx: + `system.html#372 <system.html#372>`_ + + `tan`:idx: + `math.html#130 <math.html#130>`_ + + `tanh`:idx: + `math.html#131 <math.html#131>`_ + + `TBackgroundColor`:idx: + `terminal.html#114 <terminal.html#114>`_ + + `TBaseLexer`:idx: + `lexbase.html#103 <lexbase.html#103>`_ + + `Tbind_destructor_func`:idx: + `sqlite3.html#183 <sqlite3.html#183>`_ + + `TCfgEvent`:idx: + `parsecfg.html#102 <parsecfg.html#102>`_ + + `TCfgEventKind`:idx: + `parsecfg.html#101 <parsecfg.html#101>`_ + + `TCfgParser`:idx: + `parsecfg.html#103 <parsecfg.html#103>`_ + + `TCharSet`:idx: + `strutils.html#101 <strutils.html#101>`_ + + `TCmdLineKind`:idx: + `parseopt.html#101 <parseopt.html#101>`_ + + `TComplex`:idx: + `complex.html#101 <complex.html#101>`_ + + `Tcreate_function_final_func`:idx: + `sqlite3.html#186 <sqlite3.html#186>`_ + + `Tcreate_function_func_func`:idx: + `sqlite3.html#185 <sqlite3.html#185>`_ + + `Tcreate_function_step_func`:idx: + `sqlite3.html#184 <sqlite3.html#184>`_ + + `TCurl`:idx: + `libcurl.html#140 <libcurl.html#140>`_ + + `Tcurl_calloc_callback`:idx: + `libcurl.html#153 <libcurl.html#153>`_ + + `Tcurl_closepolicy`:idx: + `libcurl.html#174 <libcurl.html#174>`_ + + `TCURLcode`:idx: + `libcurl.html#156 <libcurl.html#156>`_ + + `Tcurl_conv_callback`:idx: + `libcurl.html#157 <libcurl.html#157>`_ + + `Tcurl_debug_callback`:idx: + `libcurl.html#155 <libcurl.html#155>`_ + + `TCURLFORMcode`:idx: + `libcurl.html#170 <libcurl.html#170>`_ + + `Tcurl_formget_callback`:idx: + `libcurl.html#171 <libcurl.html#171>`_ + + `TCURLformoption`:idx: + `libcurl.html#168 <libcurl.html#168>`_ + + `Tcurl_forms`:idx: + `libcurl.html#169 <libcurl.html#169>`_ + + `Tcurl_free_callback`:idx: + `libcurl.html#150 <libcurl.html#150>`_ + + `Tcurl_ftpauth`:idx: + `libcurl.html#161 <libcurl.html#161>`_ + + `Tcurl_ftpmethod`:idx: + `libcurl.html#162 <libcurl.html#162>`_ + + `Tcurl_ftpssl`:idx: + `libcurl.html#160 <libcurl.html#160>`_ + + `Tcurl_httppost`:idx: + `libcurl.html#141 <libcurl.html#141>`_ + + `TCURL_HTTP_VERSION`:idx: + `libcurl.html#164 <libcurl.html#164>`_ + + `TCURLINFO`:idx: + `libcurl.html#173 <libcurl.html#173>`_ + + `Tcurl_infotype`:idx: + `libcurl.html#154 <libcurl.html#154>`_ + + `Tcurliocmd`:idx: + `libcurl.html#147 <libcurl.html#147>`_ + + `Tcurl_ioctl_callback`:idx: + `libcurl.html#148 <libcurl.html#148>`_ + + `Tcurlioerr`:idx: + `libcurl.html#146 <libcurl.html#146>`_ + + `Tcurl_lock_access`:idx: + `libcurl.html#176 <libcurl.html#176>`_ + + `Tcurl_lock_data`:idx: + `libcurl.html#175 <libcurl.html#175>`_ + + `Tcurl_lock_function`:idx: + `libcurl.html#177 <libcurl.html#177>`_ + + `TCURLM`:idx: + `libcurl.html#184 <libcurl.html#184>`_ + + `Tcurl_malloc_callback`:idx: + `libcurl.html#149 <libcurl.html#149>`_ + + `TCURLMcode`:idx: + `libcurl.html#186 <libcurl.html#186>`_ + + `TCURLMoption`:idx: + `libcurl.html#190 <libcurl.html#190>`_ + + `TCURLMsg`:idx: + `libcurl.html#188 <libcurl.html#188>`_ + + `TCURLMSGEnum`:idx: + `libcurl.html#187 <libcurl.html#187>`_ + + `TCURL_NETRC_OPTION`:idx: + `libcurl.html#165 <libcurl.html#165>`_ + + `TCURLoption`:idx: + `libcurl.html#163 <libcurl.html#163>`_ + + `Tcurl_passwd_callback`:idx: + `libcurl.html#145 <libcurl.html#145>`_ + + `Tcurl_progress_callback`:idx: + `libcurl.html#142 <libcurl.html#142>`_ + + `Tcurl_proxytype`:idx: + `libcurl.html#159 <libcurl.html#159>`_ + + `Tcurl_read_callback`:idx: + `libcurl.html#144 <libcurl.html#144>`_ + + `Tcurl_realloc_callback`:idx: + `libcurl.html#151 <libcurl.html#151>`_ + + `TCURLSH`:idx: + `libcurl.html#179 <libcurl.html#179>`_ + + `TCURLSHcode`:idx: + `libcurl.html#180 <libcurl.html#180>`_ + + `TCURLSHoption`:idx: + `libcurl.html#181 <libcurl.html#181>`_ + + `Tcurl_slist`:idx: + `libcurl.html#172 <libcurl.html#172>`_ + + `Tcurl_socket`:idx: + `libcurl.html#185 <libcurl.html#185>`_ + + `Tcurl_socket_callback`:idx: + `libcurl.html#189 <libcurl.html#189>`_ + + `Tcurl_ssl_ctx_callback`:idx: + `libcurl.html#158 <libcurl.html#158>`_ + + `TCURL_SSL_VERSION`:idx: + `libcurl.html#166 <libcurl.html#166>`_ + + `Tcurl_strdup_callback`:idx: + `libcurl.html#152 <libcurl.html#152>`_ + + `TCURL_TIMECOND`:idx: + `libcurl.html#167 <libcurl.html#167>`_ + + `Tcurl_unlock_function`:idx: + `libcurl.html#178 <libcurl.html#178>`_ + + `TCURLversion`:idx: + `libcurl.html#182 <libcurl.html#182>`_ + + `Tcurl_version_info_data`:idx: + `libcurl.html#183 <libcurl.html#183>`_ + + `Tcurl_write_callback`:idx: + `libcurl.html#143 <libcurl.html#143>`_ + + `template`:idx: + `manual.html#209 <manual.html#209>`_ + + `TEndian`:idx: + `system.html#385 <system.html#385>`_ + + `TFile`:idx: + `system.html#481 <system.html#481>`_ + + `TFileHandle`:idx: + `system.html#483 <system.html#483>`_ + + `TFileMode`:idx: + `system.html#482 <system.html#482>`_ + + `TFileStream`:idx: + `streams.html#119 <streams.html#119>`_ + + `TFloatClass`:idx: + `math.html#103 <math.html#103>`_ + + `TForegroundColor`:idx: + `terminal.html#113 <terminal.html#113>`_ + + `TFormatFlag`:idx: + `strtabs.html#111 <strtabs.html#111>`_ + + `TGC_Strategy`:idx: + `system.html#464 <system.html#464>`_ + + `THash`:idx: + `hashes.html#101 <hashes.html#101>`_ + + `TimeInfoToTime`:idx: + `times.html#108 <times.html#108>`_ + + `times`:idx: + `nimrodc.html#119 <nimrodc.html#119>`_ + + `TIMESTAMP_FLAG`:idx: + `mysql.html#134 <mysql.html#134>`_ + + `TMonth`:idx: + `times.html#101 <times.html#101>`_ + + `toBiggestFloat`:idx: + `system.html#401 <system.html#401>`_ + + `toBiggestInt`:idx: + `system.html#403 <system.html#403>`_ + + `toBin`:idx: + `strutils.html#155 <strutils.html#155>`_ + + `TObject`:idx: + `system.html#131 <system.html#131>`_ + + `toFloat`:idx: + `system.html#400 <system.html#400>`_ + + `toHex`:idx: + `strutils.html#142 <strutils.html#142>`_ + + `toInt`:idx: + `system.html#402 <system.html#402>`_ + + `toLower`:idx: + * `strutils.html#115 <strutils.html#115>`_ + * `strutils.html#116 <strutils.html#116>`_ + * `unicode.html#106 <unicode.html#106>`_ + + `toOct`:idx: + `strutils.html#154 <strutils.html#154>`_ + + `toOctal`:idx: + `strutils.html#130 <strutils.html#130>`_ + + `TOptParser`:idx: + `parseopt.html#102 <parseopt.html#102>`_ + + `toString`:idx: + `strutils.html#147 <strutils.html#147>`_ + + `toTitle`:idx: + `unicode.html#108 <unicode.html#108>`_ + + `toU16`:idx: + `system.html#179 <system.html#179>`_ + + `toU32`:idx: + `system.html#180 <system.html#180>`_ + + `toU8`:idx: + `system.html#178 <system.html#178>`_ + + `toUpper`:idx: + * `strutils.html#117 <strutils.html#117>`_ + * `strutils.html#118 <strutils.html#118>`_ + * `unicode.html#107 <unicode.html#107>`_ + + `toUTF8`:idx: + `unicode.html#105 <unicode.html#105>`_ + + `TPathComponent`:idx: + `os.html#152 <os.html#152>`_ + + `traced`:idx: + * `manual.html#159 <manual.html#159>`_ + * `tut1.html#121 <tut1.html#121>`_ + + `TRequestMethod`:idx: + `cgi.html#105 <cgi.html#105>`_ + + `TResult`:idx: + `system.html#155 <system.html#155>`_ + + `TRune`:idx: + `unicode.html#101 <unicode.html#101>`_ + + `TRune16`:idx: + `unicode.html#102 <unicode.html#102>`_ + + `try`:idx: + * `manual.html#185 <manual.html#185>`_ + * `tut2.html#107 <tut2.html#107>`_ + + `Tsqlite3_callback`:idx: + `sqlite3.html#182 <sqlite3.html#182>`_ + + `Tsqlite3_collation_needed_func`:idx: + `sqlite3.html#189 <sqlite3.html#189>`_ + + `Tsqlite3_create_collation_func`:idx: + `sqlite3.html#188 <sqlite3.html#188>`_ + + `Tsqlite3_result_func`:idx: + `sqlite3.html#187 <sqlite3.html#187>`_ + + `TStream`:idx: + `streams.html#102 <streams.html#102>`_ + + `TStringStream`:idx: + `streams.html#116 <streams.html#116>`_ + + `TStringTable`:idx: + `strtabs.html#102 <strtabs.html#102>`_ + + `TStringTableMode`:idx: + `strtabs.html#101 <strtabs.html#101>`_ + + `TStyle`:idx: + `terminal.html#111 <terminal.html#111>`_ + + `TTime`:idx: + `times.html#103 <times.html#103>`_ + + `TTimeInfo`:idx: + `times.html#104 <times.html#104>`_ + + `tuple`:idx: + `manual.html#154 <manual.html#154>`_ + + `TWeekDay`:idx: + `times.html#102 <times.html#102>`_ + + `TXmlError`:idx: + `parsexml.html#104 <parsexml.html#104>`_ + + `TXmlEventKind`:idx: + `parsexml.html#103 <parsexml.html#103>`_ + + `TXmlParseOption`:idx: + `parsexml.html#105 <parsexml.html#105>`_ + + `TXmlParser`:idx: + `parsexml.html#106 <parsexml.html#106>`_ + + `type`:idx: + * `manual.html#102 <manual.html#102>`_ + * `manual.html#140 <manual.html#140>`_ + * `manual.html#206 <manual.html#206>`_ + + `type casts`:idx: + `tut2.html#101 <tut2.html#101>`_ + + `type conversions`:idx: + `tut2.html#102 <tut2.html#102>`_ + + `type parameters`:idx: + * `manual.html#208 <manual.html#208>`_ + * `tut2.html#109 <tut2.html#109>`_ + + `type suffix`:idx: + `manual.html#137 <manual.html#137>`_ + + `TZipArchive`:idx: + `zipfiles.html#101 <zipfiles.html#101>`_ + + `UDF_ARGS`:idx: + `mysql.html#259 <mysql.html#259>`_ + + `UDF_INIT`:idx: + `mysql.html#263 <mysql.html#263>`_ + + `unchecked runtime error`:idx: + `manual.html#111 <manual.html#111>`_ + + `undef`:idx: + `manual.html#223 <manual.html#223>`_ + + `UNIQUE_FLAG`:idx: + `mysql.html#140 <mysql.html#140>`_ + + `UNIQUE_KEY_FLAG`:idx: + `mysql.html#126 <mysql.html#126>`_ + + `UnixToNativePath`:idx: + `os.html#124 <os.html#124>`_ + + `unsigned integer`:idx: + * `manual.html#142 <manual.html#142>`_ + * `tut1.html#108 <tut1.html#108>`_ + + `unsigned operations`:idx: + * `manual.html#143 <manual.html#143>`_ + * `tut1.html#109 <tut1.html#109>`_ + + `UNSIGNED_FLAG`:idx: + `mysql.html#129 <mysql.html#129>`_ + + `untraced`:idx: + * `manual.html#160 <manual.html#160>`_ + * `tut1.html#122 <tut1.html#122>`_ + + `URLdecode`:idx: + `cgi.html#102 <cgi.html#102>`_ + + `URLencode`:idx: + `cgi.html#101 <cgi.html#101>`_ + + `URLretrieveStream`:idx: + `web.html#101 <web.html#101>`_ + + `URLretrieveString`:idx: + `web.html#102 <web.html#102>`_ + + `USED_MEM`:idx: + `mysql.html#321 <mysql.html#321>`_ + + `USERNAME_LENGTH`:idx: + `mysql.html#112 <mysql.html#112>`_ + + `validateData`:idx: + `cgi.html#108 <cgi.html#108>`_ + + `validEmailAddress`:idx: + `strutils.html#157 <strutils.html#157>`_ + + `Var`:idx: + `manual.html#178 <manual.html#178>`_ + + `varargs`:idx: + `nimrodc.html#106 <nimrodc.html#106>`_ + + `variance`:idx: + `math.html#112 <math.html#112>`_ + + `variant`:idx: + * `manual.html#156 <manual.html#156>`_ + * `tut2.html#103 <tut2.html#103>`_ + + `vertical tabulator`:idx: + `manual.html#126 <manual.html#126>`_ + + `volatile`:idx: + `nimrodc.html#111 <nimrodc.html#111>`_ + + `walkDir`:idx: + `os.html#153 <os.html#153>`_ + + `walkFiles`:idx: + * `os.html#151 <os.html#151>`_ + * `zipfiles.html#110 <zipfiles.html#110>`_ + + `warning`:idx: + * `manual.html#220 <manual.html#220>`_ + * `manual.html#226 <manual.html#226>`_ + + `when`:idx: + * `manual.html#182 <manual.html#182>`_ + * `tut1.html#106 <tut1.html#106>`_ + + `while`:idx: + `manual.html#194 <manual.html#194>`_ + + `Whitespace`:idx: + `strutils.html#102 <strutils.html#102>`_ + + `write`:idx: + * `system.html#494 <system.html#494>`_ + * `system.html#495 <system.html#495>`_ + * `system.html#496 <system.html#496>`_ + * `system.html#497 <system.html#497>`_ + * `system.html#498 <system.html#498>`_ + * `system.html#499 <system.html#499>`_ + * `system.html#500 <system.html#500>`_ + * `streams.html#103 <streams.html#103>`_ + * `streams.html#104 <streams.html#104>`_ + + `writeBuffer`:idx: + `system.html#510 <system.html#510>`_ + + `writeBytes`:idx: + `system.html#508 <system.html#508>`_ + + `writeChars`:idx: + `system.html#509 <system.html#509>`_ + + `writeContentType`:idx: + `cgi.html#142 <cgi.html#142>`_ + + `writeln`:idx: + * `system.html#502 <system.html#502>`_ + * `system.html#503 <system.html#503>`_ + + `WriteStyled`:idx: + `terminal.html#112 <terminal.html#112>`_ + + `XML`:idx: + `parsexml.html#101 <parsexml.html#101>`_ + + `XMLencode`:idx: + `cgi.html#103 <cgi.html#103>`_ + + `xor`:idx: + * `system.html#118 <system.html#118>`_ + * `system.html#241 <system.html#241>`_ + * `system.html#242 <system.html#242>`_ + * `system.html#243 <system.html#243>`_ + * `system.html#244 <system.html#244>`_ + * `system.html#245 <system.html#245>`_ + + `yield`:idx: + `manual.html#191 <manual.html#191>`_ + + `ze`:idx: + * `system.html#172 <system.html#172>`_ + * `system.html#173 <system.html#173>`_ + + `ze64`:idx: + * `system.html#174 <system.html#174>`_ + * `system.html#175 <system.html#175>`_ + * `system.html#176 <system.html#176>`_ + * `system.html#177 <system.html#177>`_ + + `ZEROFILL_FLAG`:idx: + `mysql.html#130 <mysql.html#130>`_ + + `zeroMem`:idx: + `system.html#409 <system.html#409>`_ \ No newline at end of file diff --git a/doc/tut1.txt b/doc/tut1.txt index ef56c2caa..58a56e8f1 100644 --- a/doc/tut1.txt +++ b/doc/tut1.txt @@ -46,12 +46,14 @@ The most used commands and switches have abbreviations, so you can also use:: Though it should be pretty obvious what the program does, I will explain the syntax: Statements which are not indented are executed when the program -starts. Indentation is Nimrod's way of grouping statements. String literals -are enclosed in double quotes. The ``var`` statement declares a new variable -named ``name`` of type ``string`` with the value that is returned by the -``readline`` procedure. Since the compiler knows that ``readline`` returns -a string, you can leave out the type in the declaration (this is called -`local type inference`:idx:). So this will work too: +starts. Indentation is Nimrod's way of grouping statements. Indentation is +done with spaces only, tabulators are not allowed. + +String literals are enclosed in double quotes. The ``var`` statement declares +a new variable named ``name`` of type ``string`` with the value that is +returned by the ``readline`` procedure. Since the compiler knows that +``readline`` returns a string, you can leave out the type in the declaration +(this is called `local type inference`:idx:). So this will work too: .. code-block:: Nimrod var name = readline(stdin) @@ -73,7 +75,7 @@ keywords, comments, operators, and other punctation marks. Case is *insignificant* in Nimrod and even underscores are ignored: ``This_is_an_identifier`` and this is the same identifier ``ThisIsAnIdentifier``. This feature enables you to use other -peoples code without bothering about a naming convention that conflicts with +people's code without bothering about a naming convention that conflicts with yours. It also frees you from remembering the exact spelling of an identifier (was it ``parseURL`` or ``parseUrl`` or ``parse_URL``?). @@ -129,6 +131,9 @@ the syntax, watch their indentation: Echo("Hi!") # comment has not the right indentation -> syntax error! +**Note**: To comment out a large piece of code, it is often better to use a +``when false:`` statement. + Numbers ------- @@ -137,7 +142,7 @@ Numerical literals are written as in most other languages. As a special twist, underscores are allowed for better readability: ``1_000_000`` (one million). A number that contains a dot (or 'e' or 'E') is a floating point literal: ``1.0e9`` (one million). Hexadecimal literals are prefixed with ``0x``, -binary literals with ``0b`` and octal literals with ``0c``. A leading zero +binary literals with ``0b`` and octal literals with ``0o``. A leading zero alone does not produce an octal. @@ -426,7 +431,11 @@ The ``when`` statement is useful for writing platform specific code, similar to the ``#ifdef`` construct in the C programming language. **Note**: The documentation generator currently always follows the first branch -of when statements. +of when statements. + +**Note**: To comment out a large piece of code, it is often better to use a +``when false:`` statement than to use real comments. This way nesting is +possible. Statements and indentation @@ -440,7 +449,7 @@ statements*. *Simple statements* cannot contain other statements: Assignment, procedure calls or the ``return`` statement belong to the simple statements. *Complex statements* like ``if``, ``when``, ``for``, ``while`` can contain other statements. To avoid ambiguities, complex statements always have -to be intended, but single simple statements do not: +to be indented, but single simple statements do not: .. code-block:: nimrod # no indentation needed for single assignment statement: @@ -518,9 +527,11 @@ shorthand for ``return result``. So all tree code snippets are equivalent: .. code-block:: nimrod return 42 +.. code-block:: nimrod result = 42 return +.. code-block:: nimrod result = 42 return result @@ -880,7 +891,7 @@ In Nimrod new types can be defined within a ``type`` statement: .. code-block:: nimrod type biggestInt = int64 # biggest integer type that is available - biggestFLoat = float64 # biggest float type that is available + biggestFloat = float64 # biggest float type that is available Enumeration and object types cannot be defined on the fly, but only within a ``type`` statement. @@ -980,7 +991,7 @@ basetype can only be an ordinal type. The reason is that sets are implemented as high performance bit vectors. Sets can be constructed via the set constructor: ``{}`` is the empty set. The -empty set is type combatible with any concrete set type. The constructor +empty set is type compatible with any concrete set type. The constructor can also be used to include elements (and ranges of elements): .. code-block:: nimrod @@ -1013,7 +1024,7 @@ operation meaning ================== ======================================================== Sets are often used to define a type for the *flags* of a procedure. This is -much cleaner (and type safe solution) solution than just defining integer +much cleaner (and type safe) solution than just defining integer constants that should be ``or``'ed together. @@ -1047,36 +1058,6 @@ The built-in ``len`` proc returns the array's length. ``low(a)`` returns the lowest valid index for the array `a` and ``high(a)`` the highest valid index. -Open arrays ------------ -Often fixed size arrays turn out to be too inflexible; procedures should -be able to deal with arrays of different sizes. The `openarray`:idx: type -allows this. Openarrays are always indexed with an ``int`` starting at -position 0. The ``len``, ``low`` and ``high`` operations are available -for open arrays too. Any array with a compatible base type can be passed to -an openarray parameter, the index type does not matter. - -The openarray type cannot be nested: Multidimensional openarrays are not -supported because this is seldom needed and cannot be done efficiently. - -An openarray is also a means to implement passing a variable number of -arguments to a procedure. The compiler converts the list of arguments -to an array automatically: - -.. code-block:: nimrod - proc myWriteln(f: TFile, a: openarray[string]) = - for s in items(a): - write(f, s) - write(f, "\n") - - myWriteln(stdout, "abc", "def", "xyz") - # is transformed by the compiler to: - myWriteln(stdout, ["abc", "def", "xyz"]) - -This transformation is only done if the openarray parameter is the -last parameter in the procedure header. - - Sequences --------- `Sequences`:idx: are similar to arrays but of dynamic length which may change @@ -1108,6 +1089,38 @@ rather than ``nil`` as the *empty* value. But ``@[]`` creates a sequence object on the heap, so there is a trade-off to be made here. +Open arrays +----------- +**Note**: Openarrays can only be used for parameters. + +Often fixed size arrays turn out to be too inflexible; procedures should +be able to deal with arrays of different sizes. The `openarray`:idx: type +allows this. Openarrays are always indexed with an ``int`` starting at +position 0. The ``len``, ``low`` and ``high`` operations are available +for open arrays too. Any array with a compatible base type can be passed to +an openarray parameter, the index type does not matter. + +The openarray type cannot be nested: Multidimensional openarrays are not +supported because this is seldom needed and cannot be done efficiently. + +An openarray is also a means to implement passing a variable number of +arguments to a procedure. The compiler converts the list of arguments +to an array automatically: + +.. code-block:: nimrod + proc myWriteln(f: TFile, a: openarray[string]) = + for s in items(a): + write(f, s) + write(f, "\n") + + myWriteln(stdout, "abc", "def", "xyz") + # is transformed by the compiler to: + myWriteln(stdout, ["abc", "def", "xyz"]) + +This transformation is only done if the openarray parameter is the +last parameter in the procedure header. + + Tuples ------ @@ -1271,8 +1284,19 @@ with an asterisk (``*``) are exported: # multiply two int sequences: for i in 0..len(a)-1: result[i] = a[i] * b[i] + when isMainModule: + # test the new ``*`` operator for sequences: + assert(@[1, 2, 3] * @[1, 2, 3] == @[1, 4, 9]) + The above module exports ``x`` and ``*``, but not ``y``. +The top-level statements of a module are executed at the start of the program. +This can be used to initalize complex data structures for example. + +Each module has a special magic constant ``isMainModule`` that is true if the +module is compiled as the main file. This is very useful to embed tests within +the module as shown by the above example. + Modules that depend on each other are possible, but strongly discouraged, because then one module cannot be reused without the other. diff --git a/doc/tut2.txt b/doc/tut2.txt index dc14aabc0..0bea28a8f 100644 --- a/doc/tut2.txt +++ b/doc/tut2.txt @@ -33,7 +33,8 @@ Object Oriented Programming While Nimrod's support for object oriented programming (OOP) is minimalistic, powerful OOP technics can be used. OOP is seen as *one* way to design a program, not *the only* way. Often a procedural approach leads to simpler -and more efficient code. +and more efficient code. In particular, prefering aggregation over inheritance +often yields to a better design. Objects @@ -196,8 +197,8 @@ for any type: stdout.writeln("Hallo") # the same as write(stdout, "Hallo") If it gives you warm fuzzy feelings, you can even write ``1.`+`(2)`` instead of -``1 + 2`` and claim that Nimrod is a pure object oriented language. (That -would not even be lying: *pure OO* has no meaning anyway. :-) +``1 + 2`` and claim that Nimrod is a pure object oriented language. (But +that's not true. :-) Properties @@ -237,15 +238,15 @@ The ``[]`` array access operator can be overloaded to provide type TVector* = object x, y, z: float - + proc `[]=`* (v: var TVector, i: int, value: float) = - # setter + # setter case i of 0: v.x = value of 1: v.y = value of 2: v.z = value else: assert(false) - + proc `[]`* (v: TVector, i: int): float = # getter case i @@ -253,25 +254,29 @@ The ``[]`` array access operator can be overloaded to provide of 1: result = v.y of 2: result = v.z else: assert(false) - + The example is silly, since a vector is better modelled by a tuple which already provides ``v[]`` access. -Dynamic binding ---------------- -In Nimrod procedural types are used to implement dynamic binding. The following -example also shows some more conventions: The ``self`` or ``this`` object -is named ``my`` (because it is shorter than the alternatives), each class -provides a constructor, etc. +Dynamic dispatch +---------------- +In Nimrod procedural types are used to implement dynamic dispatch. The +following example also shows some more conventions: The ``self`` or ``this`` +object is named ``my`` (because it is shorter than the alternatives), each +class provides a constructor, etc. .. code-block:: nimrod type - TFigure = object of TObject # abstract base class: - draw: proc (my: var TFigure) # concrete classes implement this proc + TFigure = object of TObject # abstract base class: + fDraw: proc (my: var TFigure) # concrete classes implement this proc proc init(f: var TFigure) = - f.draw = nil + f.fDraw = nil + + proc draw(f: var TFigure) = + # ``draw`` dispatches dynamically: + f.fDraw(f) type TCircle = object of TFigure @@ -282,7 +287,7 @@ provides a constructor, etc. proc init(my: var TCircle) = init(TFigure(my)) # call base constructor my.radius = 5 - my.draw = drawCircle + my.fdraw = drawCircle type TRectangle = object of TFigure @@ -294,50 +299,7 @@ provides a constructor, etc. init(TFigure(my)) # call base constructor my.width = 5 my.height = 10 - my.draw = drawRectangle - - # now use these classes: - var - r: TRectangle - c: TCircle - init(r) - init(c) - r.draw(r) - c.draw(c) - -The last line shows the syntactical difference between static and dynamic -binding: The ``r.draw(r)`` dynamic call refers to ``r`` twice. This difference -is not necessarily bad. But if you want to eliminate the somewhat redundant -``r``, it can be done by using *closures*: - -.. code-block:: nimrod - type - TFigure = object of TObject # abstract base class: - draw: proc () {.closure.} # concrete classes implement this proc - - proc init(f: var TFigure) = - f.draw = nil - - type - TCircle = object of TFigure - radius: int - - proc init(me: var TCircle) = - init(TFigure(me)) # call base constructor - me.radius = 5 - me.draw = lambda () = - echo("o " & $me.radius) - - type - TRectangle = object of TFigure - width, height: int - - proc init(me: var TRectangle) = - init(TFigure(me)) # call base constructor - me.width = 5 - me.height = 10 - me.draw = lambda () = - echo("[]") + my.fdraw = drawRectangle # now use these classes: var @@ -348,10 +310,12 @@ is not necessarily bad. But if you want to eliminate the somewhat redundant r.draw() c.draw() -The example also introduces `lambda`:idx: expressions: A ``lambda`` expression -defines a new proc with the ``closure`` calling convention on the fly. +The code uses a ``draw`` procedure that is bound statically, but inside it +the dynamic dispatch happens with the help of the ``fdraw`` field. This is +slightly more inconvienent than in traditional OOP-languages, but has the +advantage of being much more flexible (and somewhat faster). The above approach +also allows some form *monkey patching* by modifying the ``fdraw`` field. -`Version 0.7.4: Closures and lambda expressions are not implemented.`:red: Exceptions @@ -432,7 +396,7 @@ is not executed (if an exception occurs). Generics ======== -`Version 0.7.4: Complex generic types like in the example do not work.`:red: +`Version 0.7.6: Complex generic types like in the example do not work.`:red: `Generics`:idx: are Nimrod's means to parametrize procs, iterators or types with `type parameters`:idx:. They are most useful for efficient type safe @@ -458,8 +422,8 @@ containers: else: var it = root while it != nil: - # compare the data items; uses the generic ``cmd`` proc that works for - # any type that has a ``==`` and ``<`` operator + # compare the data items; uses the generic ``cmd`` proc + # that works for any type that has a ``==`` and ``<`` operator var c = cmp(it.data, n.data) if c < 0: if it.le == nil: @@ -491,7 +455,7 @@ containers: var root: PBinaryTree[string] # instantiate a PBinaryTree with ``string`` - add(root, newNode("hallo")) # instantiates generic procs ``newNode`` and ``add`` + add(root, newNode("hallo")) # instantiates ``newNode`` and ``add`` add(root, "world") # instantiates the second ``add`` proc for str in preorder(root): stdout.writeln(str) @@ -567,6 +531,7 @@ Turning the ``log`` proc into a template solves this problem in an elegant way: The "types" of templates can be the symbols ``expr`` (stands for *expression*), ``stmt`` (stands for *statement*) or ``typedesc`` (stands for *type description*). These are no real types, they just help the compiler parsing. +In later versions, real types will be supported too. The template body does not open a new scope. To open a new scope use a ``block`` statement: @@ -587,6 +552,35 @@ use a ``block`` statement: b = 42 # does not work, `b` is unknown +If there is a ``stmt`` parameter it should be the last in the template +declaration. The reason is that statements can be passed to a template +via a special ``:`` syntax: + +.. code-block:: nimrod + + template withFile(f, filename, mode: expr, actions: stmt): stmt = + block: + var fn = filename + var f: TFile + if openFile(f, fn, mode): + try: + actions + finally: + closeFile(f) + else: + quit("cannot open: " & fn) + + withFile(txt, "ttempl3.txt", fmWrite): + txt.writeln("line 1") + txt.writeln("line 2") + +In the example the two ``writeln`` statements are bound to the ``actions`` +parameter. The ``withFile`` template contains boilerplate code and helps to +avoid a common bug: To forget to close the file. Note how the +``var fn = filename`` statement ensures that ``filename`` is evaluated only +once. + + Macros ====== @@ -658,36 +652,6 @@ The macro call expands to: writeln(stdout, x) -Lets return to the dynamic binding ``r.draw(r)`` notational "problem". Apart -from closures, there is another "solution": Define an infix ``!`` macro -operator which hides it: - -.. code-block:: - - macro `!` (n: expr): expr = - result = newNimNode(nnkCall, n) - var dot = newNimNode(nnkDotExpr, n) - dot.add(n[1]) # obj - if n[2].kind == nnkCall: - # transforms ``obj!method(arg1, arg2, ...)`` to - # ``(obj.method)(obj, arg1, arg2, ...)`` - dot.add(n[2][0]) # method - result.add(dot) - result.add(n[1]) # obj - for i in 1..n[2].len-1: - result.add(n[2][i]) - else: - # transforms ``obj!method`` to - # ``(obj.method)(obj)`` - dot.add(n[2]) # method - result.add(dot) - result.add(n[1]) # obj - - r!draw(a, b, c) # will be transfomed into ``r.draw(r, a, b, c)`` - -Great! 20 lines of complex code to safe a few keystrokes! Obviously, this is -exactly you should not do! (But it makes a cool example.) - Statement Macros ---------------- diff --git a/ide/nimide.nim b/ide/nimide.nim index c5abc3bbf..671405bbc 100644 --- a/ide/nimide.nim +++ b/ide/nimide.nim @@ -22,6 +22,8 @@ type menu: PGtkMenuBar notebook: PGtkNotebook tabname: int # used for generating tab names + tabs: seq[PTab] + currTab: int PEditor = ptr TEditor proc on_window_destroy(obj: PGtkObject, event: PGdkEvent, @@ -46,9 +48,50 @@ proc getTabIndex(e: PEditor, tab: PTab): int = if tab.hbox == v: return i inc(i) +proc getActiveTab(e: PEditor): PTab = + nil + +type + TAnswer = enum + answerYes, answerNo, answerCancel + +proc askWhetherToSave(e: PEditor): TAnswer = + var dialog = gtk_dialog_new_with_buttons("Should the changes be saved?", + e.window, GTK_DIALOG_MODAL, GTK_STOCK_SAVE, 1, + "gtk-discard", 2, + GTK_STOCK_CANCEL, 3, nil) + result = TAnswer(gtk_dialog_run(dialog)+1) + gtk_widget_destroy(dialog) + +proc saveTab(tab: PTab) = + if tab.untitled: + tab.filename = ChooseFileToSave(tab.e.window, getRoot(tab)) + tab.untitled = false + XXX + proc OnCloseTab(button: PGtkButton, tab: PTab) {.cdecl.} = - var idx = getTabIndex(tab.e, tab) - if idx >= 0: gtk_notebook_remove_page(tab.e.notebook, idx) + var idx = -1 + for i in 0..high(tab.e.tabs): + if tab.e.tabs[i] == tab: + idx = i + break + if idx >= 0: + if gtk_text_buffer_get_modified(gtk_text_view_get_buffer(tab.textView)): + case askWhetherToSave(tab.e) + of answerCancel: return + of answerYes: saveTab(tab) + of answerNo: nil + + gtk_notebook_remove_page(tab.e.notebook, idx) + if idx < high(tab.e.tabs): + for i in idx..high(tab.e.tabs)-1: + tab.e.tabs[i] = tab.e.tabs[i+1] + else: + dec currTab + GC_unref(tab.filename) + dealloc(tab) + #var idx = getTabIndex(tab.e, tab) + #if idx >= 0: gtk_notebook_remove_page(tab.e.notebook, idx) proc createTab(e: PEditor, filename: string, untitled: bool) = var t = cast[PTab](alloc0(sizeof(TTab))) @@ -78,7 +121,21 @@ proc createTab(e: PEditor, filename: string, untitled: bool) = gtk_widget_show(lab) var idx = gtk_notebook_append_page(e.notebook, scroll, t.hbox) + e.currTab = idx + add(e.tabs, t) gtk_notebook_set_current_page(e.notebook, idx) + + +proc on_open_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + var files = ChooseFilesToOpen(e.window, getRoot(getActiveTab(e))) + for f in items(files): createTab(e, f, untitled=false) + +proc on_save_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + var cp = gtk_notebook_get_current_page(e.notebook) + + +proc on_save_as_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = + nil proc on_new_menu_item_activate(menuItem: PGtkMenuItem, e: PEditor) {.cdecl.} = inc(e.tabname) @@ -91,6 +148,8 @@ proc main(e: PEditor) = e.window = GTK_WINDOW(glade_xml_get_widget(builder, "window")) e.statusbar = GTK_STATUSBAR(glade_xml_get_widget(builder, "statusbar")) e.notebook = GTK_NOTEBOOK(glade_xml_get_widget(builder, "notebook")) + e.tabs = @[] + e.currTab = -1 setHomogeneous(e.notebook^, 1) # connect the signal handlers: @@ -108,6 +167,18 @@ proc main(e: PEditor) = discard g_signal_connect(quitItem, "activate", G_CALLBACK(on_window_destroy), e) + var openItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "open_menu_item")) + discard g_signal_connect(openItem, "activate", + G_CALLBACK(on_open_menu_item_activate), e) + + var saveItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "save_menu_item")) + discard g_signal_connect(saveItem, "activate", + G_CALLBACK(on_save_menu_item_activate), e) + + var saveAsItem = GTK_MENU_ITEM(glade_xml_get_widget(builder, "save_as_menu_item")) + discard g_signal_connect(saveAsItem, "activate", + G_CALLBACK(on_save_as_menu_item_activate), e) + gtk_window_set_default_icon_name(GTK_STOCK_EDIT) gtk_widget_show(e.window) gtk_main() diff --git a/koch.py b/koch.py index 974fdec04..5b6cf8cff 100644 --- a/koch.py +++ b/koch.py @@ -3,26 +3,19 @@ ########################################################################## ## ## ## Build script of the Nimrod Compiler ## -## (c) 2008 Andreas Rumpf ## +## (c) 2009 Andreas Rumpf ## ## ## ########################################################################## -import os, os.path, sys, re, shutil, cPickle, time, getopt, glob, zlib -from string import split, replace, lower, join, find, strip - -if sys.version[0] >= "3": # this script does not work with Python 3.0 - sys.exit("wrong python version: use Python 1.5.2 - 2.6") - -True = 0 == 0 # Python 1.5 does not have True and False :-( -False = 0 == 1 +import sys, os, os.path, re, shutil, time, getopt, glob, zlib, pickle +from pycompab import * # --------------------- constants ---------------------------------------- -NIMROD_VERSION = '0.7.4' +NIMROD_VERSION = '0.7.6' # This string contains Nimrod's version. It is the only place # where the version needs to be updated. The rest is done by -# the build process automatically. It is replaced **everywhere** -# automatically! +# the build process automatically. It is replaced **everywhere**! # Format is: Major.Minor.Patch # Major part: plan is to use number 1 for the first version that is stable; # higher versions may be incompatible with previous versions @@ -30,39 +23,39 @@ NIMROD_VERSION = '0.7.4' # backwards-compatible) # Patch level: is increased for every patch -EXPLAIN = True -force = False +EXPLAIN = true +force = false -GENERATE_DIFF = False +GENERATE_DIFF = false # if set, a diff.log file is generated when bootstrapping -USE_FPC = True +USE_FPC = true -BOOTCMD = "%s cc --compile:build/platdef.c %s rod/nimrod.nim" +BOOTCMD = "$1 cc --compile:build/platdef.c $2 rod/nimrod.nim" # the command used for bootstrapping # -------------------------------------------------------------------------- def Error(msg): sys.exit("[Koch] *** ERROR: " + msg) -def Warn(msg): print "[Koch] *** WARNING: " + msg -def Echo(msg): print "[Koch] " + msg -def _Info(msg): print "[Koch] " + msg +def Warn(msg): print("[Koch] *** WARNING: " + msg) +def Echo(msg): print("[Koch] " + msg) +def _Info(msg): print("[Koch] " + msg) _FINGERPRINTS_FILE = "koch.dat" # in this file all the fingerprints are kept to allow recognizing when a file # has changed. This works reliably, which cannot be said from just taking # filetime-stamps. -def FileCmp(filenameA, filenameB): +def SameFileContent(filenameA, filenameB): SIZE = 4096*2 - result = True + result = true a = open(filenameA, "rb") b = open(filenameB, "rb") - while True: + while true: x = a.read(SIZE) y = b.read(SIZE) if x != y: - result = False + result = false break elif len(x) < SIZE: # EOF? break @@ -70,41 +63,11 @@ def FileCmp(filenameA, filenameB): b.close() return result -def Subs(frmt, **substitution): - import string - chars = string.digits+string.letters+"_" - d = substitution - result = [] - i = 0 - while i < len(frmt): - if frmt[i] == '$': - i = i+1 - if frmt[i] == '$': - result.append('$') - i = i+1 - elif frmt[i] == '{': - i = i+1 - j = i - while frmt[i] != '}': i = i+1 - i = i+1 # skip } - result.append(d[frmt[j:i-1]]) - elif frmt[i] in string.letters+"_": - j = i - i = i+1 - while i < len(frmt) and frmt[i] in chars: i = i + 1 - result.append(d[frmt[j:i]]) - else: - assert(false) - else: - result.append(frmt[i]) - i = i+1 - return join(result, "") - def SplitArg(s): if ':' in s: c = ':' elif '=' in s: c = '=' else: return (s, '') - i = s.find(c) + i = find(s, c) return (s[:i], s[i+1:]) _baseDir = os.getcwd() @@ -150,7 +113,7 @@ def Remove(f): try: os.remove(Path(f)) except OSError: - Warn("could not remove: %s" % f) + Warn("could not remove: " + f) def Move(src, dest): try: @@ -164,22 +127,26 @@ def Move(src, dest): d = Path(dest) try: m(s, d) - except IOError, OSError: - Warn("could not move %s to %s" % (s, d)) + except IOError: + Warn(Subs("could not move $1 to $2", s, d)) + except OSError: + Warn(Subs("could not move $1 to $2", s, d)) def Copy(src, dest): s = Path(src) d = Path(dest) try: shutil.copyfile(s, d) - except IOError, OSError: - Warn("could not copy %s to %s" % (s, d)) + except IOError: + Warn(Subs("could not copy $1 to $2", s, d)) + except OSError: + Warn(Subs("could not copy $1 to $2", s, d)) def RemoveDir(f): try: shutil.rmtree(Path(f)) except OSError: - Warn("could not remove: %s" % f) + Warn("could not remove: " + f) def Exists(f): return os.path.exists(Path(f)) @@ -198,7 +165,7 @@ def Mkdir(dest): Warn("could not create directory: " + d) def Glob(pattern): # needed because glob.glob() is buggy on Windows 95: - # things like tests/t*.mor won't work + # things like tests/t*.nim won't work global _baseDir (head, tail) = os.path.split(Path(pattern)) result = [] @@ -250,14 +217,14 @@ class Changed: # a success: c.success() """ - def __init__(self, id, files, explain=False, + def __init__(self, id, files, explain=false, fingerprintsfile=_FINGERPRINTS_FILE): # load the fingerprints file: # fingerprints is a dict[target, files] where files is a dict[filename, hash] self.fingers = {} # default value if Exists(fingerprintsfile): try: - self.fingers = cPickle.load(open(fingerprintsfile)) + self.fingers = pickle.load(open(fingerprintsfile, "rb")) except OSError: Error("Cannot read from " + fingerprintsfile) self.filename = fingerprintsfile @@ -267,7 +234,7 @@ class Changed: self.explain = explain def _hashFile(self, f): - x = open(f) + x = open(f, "rb") result = self._hashStr(x.read()) x.close() # for other Python implementations return result @@ -275,29 +242,29 @@ class Changed: def check(self): if type(self.files) == type(""): self.files = split(self.files) - result = False + result = false target = self.id - if not self.fingers.has_key(target): + if not has_key(self.fingers, target): self.fingers[target] = {} - if self.explain: _Info("no entries for target '%s'" % target) - result = True + if self.explain: _Info(Subs("no entries for target '$1'", target)) + result = true for d in self.files: if Exists(d): n = self._hashFile(d) - if not self.fingers[target].has_key(d) or n != self.fingers[target][d]: - result = True - if self.explain: _Info("'%s' modified since last build" % d) + if not has_key(self.fingers[target], d) or n != self.fingers[target][d]: + result = true + if self.explain: _Info(Subs("'$1' modified since last build", d)) self.fingers[target][d] = n else: - Warn("'%s' does not exist!" % d) - result = True + Warn(Subs("'$1' does not exist!", d)) + result = true return result def update(self, filename): self.fingers[self.id][filename] = self._hashFile(filename) def success(self): - cPickle.dump(self.fingers, open(self.filename, "w+")) + pickle.dump(self.fingers, open(self.filename, "wb+")) # -------------------------------------------------------------------------- @@ -318,12 +285,12 @@ def CogRule(name, filename, dependson): _nim_exe = os.path.join(os.getcwd(), "bin", ExeExt("nim")) _output_obj = os.path.join(os.getcwd(), "obj") -FPC_CMD = (r"fpc -Cs16777216 -gl -bl -Crtoi -Sgidh -vw -Se1 -o%s " - r"-FU%s %s") % (_nim_exe, _output_obj, - os.path.join(os.getcwd(), "nim", "nimrod.pas")) +FPC_CMD = Subs(r"fpc -Cs16777216 -gl -bl -Crtoi -Sgidh -vw -Se1 -o$1 " + r"-FU$2 $3", _nim_exe, _output_obj, + os.path.join(os.getcwd(), "nim", "nimrod.pas")) def buildRod(options): - Exec("nim compile --compile:build/platdef.c %s rod/nimrod" % options) + Exec(Subs("nim compile --compile:build/platdef.c $1 rod/nimrod", options)) Move(ExeExt("rod/nimrod"), ExeExt("bin/nimrod")) def cmd_nim(): @@ -341,8 +308,8 @@ def cmd_nim(): Exec(FPC_CMD) if Exists(ExeExt("bin/nim")): c.success() - return True - return False + return true + return false def cmd_rod(options): prereqs = Glob("lib/*.nim") + Glob("rod/*.nim") + [ @@ -356,13 +323,13 @@ def cmd_rod(options): # ------------------- constants ----------------------------------------------- -HELP = """\ +HELP = Subs("""\ +-----------------------------------------------------------------+ | Maintenance script for Nimrod | -| Version %s| -| (c) 2008 Andreas Rumpf | +| Version $1| +| (c) 2009 Andreas Rumpf | +-----------------------------------------------------------------+ -Your Python version: %s +Your Python version: $2 Usage: koch.py [options] command [options for command] @@ -382,27 +349,27 @@ Possible Commands: csource build the C sources for installation zip build the installation ZIP package inno build the Inno Setup installer -""" % (NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)), sys.version) +""", NIMROD_VERSION + ' ' * (44-len(NIMROD_VERSION)), sys.version) def main(args): if len(args) == 0: - print HELP + print(HELP) else: i = 0 while args[i][:1] == "-": a = args[i] if a in ("--force", "-f", "-B", "-b"): global force - force = True + force = true elif a in ("-h", "--help", "-?"): - print HELP + print(HELP) return elif a == "--diff": global GENERATE_DIFF - GENERATE_DIFF = True + GENERATE_DIFF = true elif a == "--no_fpc": global USE_FPC - USE_FPC = False + USE_FPC = false else: Error("illegal option: " + a) i = i + 1 @@ -417,19 +384,23 @@ def main(args): elif cmd == "zip": cmd_zip() elif cmd == "inno": cmd_inno() elif cmd == "csource": cmd_csource() + elif cmd == "install": cmd_install() # for backwards compability else: Error("illegal command: " + cmd) def cmd_csource(): - Exec("nimrod cc -r tools/niminst --var:version=%s csource rod/nimrod" % - NIMROD_VERSION) + Exec(Subs("nimrod cc -r tools/niminst --var:version=$1 csource rod/nimrod", + NIMROD_VERSION)) def cmd_zip(): - Exec("nimrod cc -r tools/niminst --var:version=%s zip rod/nimrod" % - NIMROD_VERSION) + Exec(Subs("nimrod cc -r tools/niminst --var:version=$1 zip rod/nimrod", + NIMROD_VERSION)) def cmd_inno(): - Exec("nimrod cc -r tools/niminst --var:version=%s inno rod/nimrod" % - NIMROD_VERSION) + Exec(Subs("nimrod cc -r tools/niminst --var:version=$1 inno rod/nimrod", + NIMROD_VERSION)) + +def cmd_install(): + Exec("sh ./build.sh") # -------------------------- bootstrap ---------------------------------------- @@ -448,13 +419,13 @@ def genBootDiff(genA, genB): return a != b BOOTLOG = "bootdiff.log" - result = False + result = false for f in Glob("diff/*.c"): Remove(f) if Exists(BOOTLOG): Remove(BOOTLOG) if GENERATE_DIFF: lines = [] # lines of the generated logfile if len(genA) != len(genB): Warn("number of generated files differ!") - for filename, acontent in genA.iteritems(): + for filename, acontent in genA.items(): bcontent = genB[filename] if bcontent != acontent: lines.append("------------------------------------------------------") @@ -464,8 +435,8 @@ def genBootDiff(genA, genB): la = acontent[i][:-1] # without newline! lb = bcontent[i][:-1] if interestingDiff(la, lb): - lines.append("%6d - %s" % (i, la)) - lines.append("%6d + %s" % (i, lb)) + lines.append(Subs("$1 - $2", i, la)) + lines.append(Subs("$1 + $2", i, lb)) if len(acontent) > len(bcontent): cont = acontent marker = "-" @@ -473,10 +444,10 @@ def genBootDiff(genA, genB): cont = bcontent marker = "+" for i in range(min(len(acontent), len(bcontent)), len(cont)): - lines.append("%6d %s %s" % (i, marker, cont[i])) + lines.append(Subs("$1 $2 $3", i, marker, cont[i])) open(os.path.join("diff", "a_"+filename), "w+").write(join(acontent, "")) open(os.path.join("diff", "b_"+filename), "w+").write(join(bcontent, "")) - if lines: result = True + if lines: result = true open(BOOTLOG, "w+").write(join(lines, "\n")) return result @@ -488,17 +459,17 @@ def cmd_rodsrc(): compiler = "nim" else: compiler = "nimrod" - CMD = "%s boot --skip_proj_cfg -o:rod/%s.nim nim/%s" - result = False + CMD = "$1 boot --skip_proj_cfg -o:rod/$2.nim nim/$3" + result = false for fi in Glob("nim/*.pas"): f = FilenameNoExt(fi) if f in PAS_FILES_BLACKLIST: continue c = Changed(f+"__rodsrc", fi, EXPLAIN) if c.check() or force: - Exec(CMD % (compiler, f, f+".pas")) - Exec("%s parse rod/%s.nim" % (compiler, f)) + Exec(Subs(CMD, compiler, f, f+".pas")) + Exec(Subs("$1 parse rod/$2.nim", compiler, f)) c.success() - result = True + result = true return result def moveExes(): @@ -506,7 +477,7 @@ def moveExes(): def cmd_boot(args): def myExec(compiler, args=args): - Exec(BOOTCMD % (compiler, args)) + Exec(Subs(BOOTCMD, compiler, args)) # some C compilers (PellesC) output the executable to the # wrong directory. We work around this bug here: if Exists(ExeExt("rod/nimcache/nimrod")): @@ -515,7 +486,7 @@ def cmd_boot(args): writePlatdefC(getNimrodPath()) d = detect("fpc -h") if USE_FPC and d: - Echo("'%s' detected" % d) + Echo(Subs("'$1' detected", d)) cmd_nim() compiler = "nim" else: @@ -536,34 +507,34 @@ def cmd_boot(args): if diff: Warn("generated C files are not equal: cycle once again...") # check if the executables are the same (they should!): - if FileCmp(Path(ExeExt("rod/nimrod")), - Path(ExeExt("bin/nimrod"))): + if SameFileContent(Path(ExeExt("rod/nimrod")), + Path(ExeExt("bin/nimrod"))): Echo("executables are equal: SUCCESS!") else: Echo("executables are not equal: cycle once again...") - diff = True + diff = true if diff: # move the new executable to bin directory: moveExes() # use the new executable to compile Nimrod: myExec("nimrod") - if FileCmp(Path(ExeExt("rod/nimrod")), - Path(ExeExt("bin/nimrod"))): + if SameFileContent(Path(ExeExt("rod/nimrod")), + Path(ExeExt("bin/nimrod"))): Echo("executables are equal: SUCCESS!") else: Warn("executables are still not equal") # ------------------ profile -------------------------------------------------- def cmd_profile(): - Exec(BOOTCMD % ("nimrod", "-d:release --profiler:on")) + Exec(Subs(BOOTCMD, "nimrod", "-d:release --profiler:on")) moveExes() - Exec(BOOTCMD % ("nimrod", "--compile_only")) + Exec(Subs(BOOTCMD, "nimrod", "--compile_only")) # ------------------ web ------------------------------------------------------ def cmd_web(): - Exec("nimrod cc -r tools/nimweb.nim web/nimrod --putenv:nimrodversion=%s" - % NIMROD_VERSION) + Exec(Subs("nimrod cc -r tools/nimweb.nim web/nimrod " + "--putenv:nimrodversion=$1", NIMROD_VERSION)) # ----------------------------------------------------------------------------- @@ -587,7 +558,7 @@ def cmd_clean(dir = "."): for f in Glob("rod/*.nim"): Remove(f) # remove generated source code def visit(extRegEx, dirname, names): if os.path.split(dirname)[1] == "nimcache": - shutil.rmtree(path=dirname, ignore_errors=True) + shutil.rmtree(path=dirname, ignore_errors=true) del names else: for name in names: @@ -637,10 +608,10 @@ def writePlatdefC(nimrodpath): import os host, processor = getOSandProcessor() f = open(os.path.join(nimrodpath, "build/platdef.c"), "w+") - f.write('/* Generated by koch.py */\n' - 'char* nimOS(void) { return "%s"; }\n' - 'char* nimCPU(void) { return "%s"; }\n' - '\n' % (host, processor)) + f.write(Subs('/* Generated by koch.py */\n' + 'char* nimOS(void) { return "$1"; }\n' + 'char* nimCPU(void) { return "$2"; }\n' + '\n', host, processor)) f.close() def detect(cmd, lookFor="version"): diff --git a/lib/alloc.nim b/lib/alloc.nim index 504453699..8648b322a 100644 --- a/lib/alloc.nim +++ b/lib/alloc.nim @@ -1,13 +1,20 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. # # Low level allocator for Nimrod. +# TODO: +# - eliminate "used" field +# - make searching for block O(1) + +proc raiseOutOfMem {.noinline.} = + assert false + quit(1) # ------------ platform specific chunk allocation code ----------------------- @@ -15,20 +22,14 @@ when defined(posix): const # XXX: make these variables for portability? PROT_READ = 1 # page can be read PROT_WRITE = 2 # page can be written - PROT_EXEC = 4 # page can be executed - PROT_NONE = 0 # page can not be accessed - - MAP_SHARED = 1 # Share changes - MAP_PRIVATE = 2 # Changes are private - MAP_TYPE = 0xf # Mask for type of mapping - MAP_FIXED = 0x10 # Interpret addr exactly - MAP_ANONYMOUS = 0x20 # don't use a file - - MAP_GROWSDOWN = 0x100 # stack-like segment - MAP_DENYWRITE = 0x800 # ETXTBSY - MAP_EXECUTABLE = 0x1000 # mark it as an executable - MAP_LOCKED = 0x2000 # pages are locked - MAP_NORESERVE = 0x4000 # don't check for reservations + MAP_PRIVATE = 2 # Changes are private + + when defined(linux): + const MAP_ANONYMOUS = 0x20 # don't use a file + elif defined(macosx): + const MAP_ANONYMOUS = 0x1000 + else: + const MAP_ANONYMOUS = 0 # other operating systems may not know about this proc mmap(adr: pointer, len: int, prot, flags, fildes: cint, off: int): pointer {.header: "<sys/mman.h>".} @@ -42,7 +43,7 @@ when defined(posix): raiseOutOfMem() proc osDeallocPages(p: pointer, size: int) {.inline} = - munmap(p, len) + munmap(p, size) elif defined(windows): const @@ -51,20 +52,27 @@ elif defined(windows): MEM_TOP_DOWN = 0x100000 PAGE_READWRITE = 0x04 + MEM_DECOMMIT = 0x4000 + MEM_RELEASE = 0x8000 + proc VirtualAlloc(lpAddress: pointer, dwSize: int, flAllocationType, flProtect: int32): pointer {. header: "<windows.h>", stdcall.} + proc VirtualFree(lpAddress: pointer, dwSize: int, + dwFreeType: int32) {.header: "<windows.h>", stdcall.} + proc osAllocPages(size: int): pointer {.inline.} = result = VirtualAlloc(nil, size, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE) if result == nil: raiseOutOfMem() - proc osDeallocPages(p: pointer, size: int) {.inline.} = - nil + proc osDeallocPages(p: pointer, size: int) {.inline.} = + # according to Microsoft, 0 is the only correct value here: + VirtualFree(p, 0, MEM_RELEASE) else: - {.error: "Port GC to your platform".} + {.error: "Port memory manager to your platform".} # --------------------- end of non-portable code ----------------------------- @@ -78,59 +86,79 @@ else: # Guess the page size of the system; if it is the # wrong value, performance may be worse (this is not # for sure though), but GC still works; must be a power of two! +when defined(linux) or defined(windows) or defined(macosx): + const + PageShift = 12 + PageSize = 1 shl PageShift # on 32 bit systems 4096 +else: + {.error: "unkown page size".} + const - PageShift = if sizeof(pointer) == 4: 12 else: 13 - PageSize = 1 shl PageShift # on 32 bit systems 4096 - - MemAlignment = sizeof(pointer)*2 # minimal memory block that can be allocated - BitsPerUnit = sizeof(int)*8 - # a "unit" is a word, i.e. 4 bytes - # on a 32 bit system; I do not use the term "word" because under 32-bit - # Windows it is sometimes only 16 bits - - BitsPerPage = PageSize div MemAlignment - UnitsPerPage = BitsPerPage div BitsPerUnit - # how many units do we need to describe a page: + PageMask = PageSize-1 + + SmallChunkSize = PageSize # * 4 + + MemAlign = 8 # minimal memory block that can be allocated + + BitsPerPage = PageSize div MemAlign + UnitsPerPage = BitsPerPage div (sizeof(int)*8) + # how many ints do we need to describe a page: # on 32 bit systems this is only 16 (!) - smallRequest = PageSize div 4 - ChunkOsReturn = 1024 # in pages + ChunkOsReturn = 64 * PageSize InitialMemoryRequest = ChunkOsReturn div 2 # < ChunkOsReturn! - debugMemMan = true # we wish to debug the memory manager... + + # Compile time options: + coalescRight = true + coalescLeft = true -type - PChunkDesc = ptr TChunkDesc - TChunkDesc {.final, pure.} = object - key: TAddress # address at bit 0 - next: PChunkDesc - bits: array[0..127, int] # a bit vector - - PChunkDescArray = ptr array[0..1000_000, PChunkDesc] - TChunkSet {.final, pure.} = object - counter, max: int - head: PChunkDesc - data: PChunkDescArray +const + TrunkShift = 9 + BitsPerTrunk = 1 shl TrunkShift # needs to be a power of 2 and divisible by 64 + TrunkMask = BitsPerTrunk - 1 + IntsPerTrunk = BitsPerTrunk div (sizeof(int)*8) + IntShift = 5 + ord(sizeof(int) == 8) # 5 or 6, depending on int width + IntMask = 1 shl IntShift - 1 + +type + PTrunk = ptr TTrunk + TTrunk {.final.} = object + next: PTrunk # all nodes are connected with this pointer + key: int # start address at bit 0 + bits: array[0..IntsPerTrunk-1, int] # a bit vector -when sizeof(int) == 4: - type THalfWord = int16 -else: - type THalfWord = int32 + TTrunkBuckets = array[0..1023, PTrunk] + TIntSet {.final.} = object + data: TTrunkBuckets type + TAlignType = float TFreeCell {.final, pure.} = object - zeroField: pointer # type info nil means cell is not used - next: ptr TFreeCell # next free cell in chunk - - PChunk = ptr TChunk - TChunk {.final, pure.} = object - size: int # lowest two bits are used for merging: - # bit 0: chunk to the left is accessible and free - # bit 1: chunk to the right is accessible and free - len: int # for small object allocation - prev, next: PChunk # chunks of the same (or bigger) size - #len, used: THalfWord # index of next to allocate cell + next: ptr TFreeCell # next free cell in chunk (overlaid with refcount) + zeroField: pointer # nil means cell is not used (overlaid with typ field) + + PChunk = ptr TBaseChunk + PBigChunk = ptr TBigChunk + PSmallChunk = ptr TSmallChunk + TBaseChunk {.pure.} = object + prevSize: int # size of previous chunk; for coalescing + size: int # if < PageSize it is a small chunk + used: bool # later will be optimized into prevSize... + + TSmallChunk = object of TBaseChunk + next, prev: PSmallChunk # chunks of the same size freeList: ptr TFreeCell - data: float # a float for alignment purposes + free: int # how many bytes remain + acc: int # accumulator for small object allocation + data: TAlignType # start of usable memory + + TBigChunk = object of TBaseChunk # not necessarily > PageSize! + next: PBigChunk # chunks of the same (or bigger) size + prev: PBigChunk + data: TAlignType # start of usable memory + +template smallChunkOverhead(): expr = sizeof(TSmallChunk)-sizeof(TAlignType) +template bigChunkOverhead(): expr = sizeof(TBigChunk)-sizeof(TAlignType) proc roundup(x, v: int): int {.inline.} = return ((-x) and (v-1)) +% x @@ -147,240 +175,325 @@ assert(roundup(15, 8) == 16) type PLLChunk = ptr TLLChunk TLLChunk {.pure.} = object ## *low-level* chunk - size: int - when sizeof(int) == 4: - align: int + size: int # remaining size + acc: int # accumulator TAllocator {.final, pure.} = object llmem: PLLChunk - UsedPagesCount, FreePagesCount, maxPagesCount: int - freeSmallChunks: array[0..smallRequest div MemAlign-1, PChunk] - freeBigChunks: array[0..ChunkOsReturn-1, PChunk] + currMem, maxMem: int # currently and maximum used memory size (allocated from OS) + freeSmallChunks: array[0..SmallChunkSize div MemAlign-1, PSmallChunk] + freeChunksList: PBigChunk # XXX make this a datastructure with O(1) access + chunkStarts: TIntSet + +proc incCurrMem(a: var TAllocator, bytes: int) {.inline.} = + inc(a.currMem, bytes) + +proc decCurrMem(a: var TAllocator, bytes: int) {.inline.} = + a.maxMem = max(a.maxMem, a.currMem) + dec(a.currMem, bytes) + +proc getMaxMem(a: var TAllocator): int = + # Since we update maxPagesCount only when freeing pages, + # maxPagesCount may not be up to date. Thus we use the + # maximum of these both values here: + return max(a.currMem, a.maxMem) + +var + allocator: TAllocator - proc llAlloc(a: var TAllocator, size: int): pointer = # *low-level* alloc for the memory managers data structures. Deallocation # is never done. - assert(size <= PageSize-8) - if a.llmem.size + size > PageSize: - a.llmem = osGetPages(PageSize) - inc(a.gUsedPages) - a.llmem.size = 8 - result = cast[pointer](cast[TAddress](a.llmem) + a.llmem.size) - inc(llmem.size, size) + if a.llmem == nil or size > a.llmem.size: + var request = roundup(size+sizeof(TLLChunk), PageSize) + a.llmem = cast[PLLChunk](osAllocPages(request)) + incCurrMem(a, request) + a.llmem.size = request - sizeof(TLLChunk) + a.llmem.acc = sizeof(TLLChunk) + result = cast[pointer](cast[TAddress](a.llmem) + a.llmem.acc) + dec(a.llmem.size, size) + inc(a.llmem.acc, size) zeroMem(result, size) - - -const - InitChunkSetSize = 1024 # must be a power of two! - -proc ChunkSetInit(s: var TChunkSet) = - s.data = cast[PChunkDescArray](llAlloc(InitChunkSetSize * sizeof(PChunkDesc))) - s.max = InitChunkSetSize-1 - s.counter = 0 - s.head = nil - -proc ChunkSetGet(t: TChunkSet, key: TAddress): PChunkDesc = - var h = cast[int](key) and t.max - while t.data[h] != nil: - if t.data[h].key == key: return t.data[h] - h = nextTry(h, t.max) - return nil - -proc ChunkSetRawInsert(t: TChunkSet, data: PChunkDescArray, - desc: PChunkDesc) = - var h = cast[int](desc.key) and t.max - while data[h] != nil: - assert(data[h] != desc) - h = nextTry(h, t.max) - assert(data[h] == nil) - data[h] = desc - -proc ChunkSetEnlarge(t: var TChunkSet) = - var oldMax = t.max - t.max = ((t.max+1)*2)-1 - var n = cast[PChunkDescArray](llAlloc((t.max + 1) * sizeof(PChunkDescArray))) - for i in 0 .. oldmax: - if t.data[i] != nil: - ChunkSetRawInsert(t, n, t.data[i]) - tlsf_free(t.data) - t.data = n - -proc ChunkSetPut(t: var TChunkSet, key: TAddress): PChunkDesc = - var h = cast[int](key) and t.max - while true: - var x = t.data[h] - if x == nil: break - if x.key == key: return x - h = nextTry(h, t.max) - - if ((t.max+1)*2 < t.counter*3) or ((t.max+1)-t.counter < 4): - ChunkSetEnlarge(t) - inc(t.counter) - h = cast[int](key) and t.max - while t.data[h] != nil: h = nextTry(h, t.max) - assert(t.data[h] == nil) - # the new page descriptor goes into result - result = cast[PChunkDesc](llAlloc(sizeof(TChunkDesc))) - result.next = t.head - result.key = key - t.head = result - t.data[h] = result - -# ---------- slightly higher level procs -------------------------------------- - -proc in_Operator(s: TChunkSet, cell: PChunk): bool = - var u = cast[TAddress](cell) - var t = ChunkSetGet(s, u shr PageShift) - if t != nil: - u = (u %% PageSize) /% MemAlignment - result = (t.bits[u /% BitsPerUnit] and (1 shl (u %% BitsPerUnit))) != 0 - else: + +proc IntSetGet(t: TIntSet, key: int): PTrunk = + var it = t.data[key and high(t.data)] + while it != nil: + if it.key == key: return it + it = it.next + result = nil + +proc IntSetPut(t: var TIntSet, key: int): PTrunk = + result = IntSetGet(t, key) + if result == nil: + result = cast[PTrunk](llAlloc(allocator, sizeof(result^))) + result.next = t.data[key and high(t.data)] + t.data[key and high(t.data)] = result + result.key = key + +proc Contains(s: TIntSet, key: int): bool = + var t = IntSetGet(s, key shr TrunkShift) + if t != nil: + var u = key and TrunkMask + result = (t.bits[u shr IntShift] and (1 shl (u and IntMask))) != 0 + else: result = false + +proc Incl(s: var TIntSet, key: int) = + var t = IntSetPut(s, key shr TrunkShift) + var u = key and TrunkMask + t.bits[u shr IntShift] = t.bits[u shr IntShift] or (1 shl (u and IntMask)) -proc incl(s: var TCellSet, cell: PCell) = - var u = cast[TAddress](cell) - var t = ChunkSetPut(s, u shr PageShift) - u = (u %% PageSize) /% MemAlignment - t.bits[u /% BitsPerUnit] = t.bits[u /% BitsPerUnit] or - (1 shl (u %% BitsPerUnit)) - -proc excl(s: var TCellSet, cell: PCell) = - var u = cast[TAddress](cell) - var t = ChunkSetGet(s, u shr PageShift) +proc Excl(s: var TIntSet, key: int) = + var t = IntSetGet(s, key shr TrunkShift) if t != nil: - u = (u %% PageSize) /% MemAlignment - t.bits[u /% BitsPerUnit] = (t.bits[u /% BitsPerUnit] and - not (1 shl (u %% BitsPerUnit))) - -iterator elements(t: TChunkSet): PChunk {.inline.} = - # while traversing it is forbidden to add pointers to the tree! - var r = t.head - while r != nil: - var i = 0 - while i <= high(r.bits): - var w = r.bits[i] # taking a copy of r.bits[i] here is correct, because - # modifying operations are not allowed during traversation - var j = 0 - while w != 0: # test all remaining bits for zero - if (w and 1) != 0: # the bit is set! - yield cast[PCell]((r.key shl PageShift) or # +% - (i*%BitsPerUnit+%j) *% MemAlignment) - inc(j) - w = w shr 1 - inc(i) - r = r.next + var u = key and TrunkMask + t.bits[u shr IntShift] = t.bits[u shr IntShift] and not + (1 shl (u and IntMask)) + +proc ContainsOrIncl(s: var TIntSet, key: int): bool = + var t = IntSetGet(s, key shr TrunkShift) + if t != nil: + var u = key and TrunkMask + result = (t.bits[u shr IntShift] and (1 shl (u and IntMask))) != 0 + if not result: + t.bits[u shr IntShift] = t.bits[u shr IntShift] or + (1 shl (u and IntMask)) + else: + Incl(s, key) + result = false + +# ------------- chunk management ---------------------------------------------- +proc pageIndex(c: PChunk): int {.inline.} = + result = cast[TAddress](c) shr PageShift +proc pageIndex(p: pointer): int {.inline.} = + result = cast[TAddress](p) shr PageShift -# ------------- chunk management ---------------------------------------------- -proc removeChunk(a: var TAllocator, c: PChunk) {.inline.} = - if c.prev != nil: c.prev.next = c.next - if c.next != nil: c.next.prev = c.prev - if a.freeChunks[c.size div PageSize] == c: - a.freeChunks[c.size div PageSize] = c.next - -proc addChunk(a: var TAllocator, c: PChunk) {.inline.} = - var s = abs(c.size) div PageSize +proc pageAddr(p: pointer): PChunk {.inline.} = + result = cast[PChunk](cast[TAddress](p) and not PageMask) + assert(Contains(allocator.chunkStarts, pageIndex(result))) + +var lastSize = PageSize + +proc requestOsChunks(a: var TAllocator, size: int): PBigChunk = + incCurrMem(a, size) + result = cast[PBigChunk](osAllocPages(size)) + assert((cast[TAddress](result) and PageMask) == 0) + result.next = nil + result.prev = nil + result.used = false + result.size = size + # update next.prevSize: + var nxt = cast[TAddress](result) +% size + assert((nxt and PageMask) == 0) + var next = cast[PChunk](nxt) + if pageIndex(next) in a.chunkStarts: + #echo("Next already allocated!") + next.prevSize = size + # set result.prevSize: + var prv = cast[TAddress](result) -% lastSize + assert((nxt and PageMask) == 0) + var prev = cast[PChunk](prv) + if pageIndex(prev) in a.chunkStarts and prev.size == lastSize: + #echo("Prev already allocated!") + result.prevSize = lastSize + else: + result.prevSize = 0 # unknown + lastSize = size # for next request + +proc freeOsChunks(a: var TAllocator, p: pointer, size: int) = + # update next.prevSize: + var c = cast[PChunk](p) + var nxt = cast[TAddress](p) +% c.size + assert((nxt and PageMask) == 0) + var next = cast[PChunk](nxt) + if pageIndex(next) in a.chunkStarts: + next.prevSize = 0 # XXX used + excl(a.chunkStarts, pageIndex(p)) + osDeallocPages(p, size) + decCurrMem(a, size) + +proc isAccessible(p: pointer): bool {.inline.} = + result = Contains(allocator.chunkStarts, pageIndex(p)) + +proc ListAdd[T](head: var T, c: T) {.inline.} = + assert c.prev == nil + assert c.next == nil + c.next = head + if head != nil: + assert head.prev == nil + head.prev = c + head = c + +proc ListRemove[T](head: var T, c: T) {.inline.} = + if c == head: + head = c.next + assert c.prev == nil + if head != nil: head.prev = nil + else: + assert c.prev != nil + c.prev.next = c.next + if c.next != nil: c.next.prev = c.prev + c.next = nil c.prev = nil - c.next = a.freeChunks[s] - a.freeChunks[s] = c - -proc freeChunk(a: var TAllocator, c: PChunk) = - assert(c.size > 0) - if c.size < PageSize: c.size = PageSize - var le = cast[PChunk](cast[TAddress](p) and not PageMask -% PageSize) - var ri = cast[PChunk](cast[TAddress](p) and not PageMask +% - c.size +% PageSize) - if isStartOfAChunk(ri) and ri.size < 0: - removeChunk(a, ri) - inc(c.size, -ri.size) - if isEndOfAChunk(le): - le = cast[PChunk](cast[TAddress](p) and not PageMask -% - le.chunkStart+PageSize) - if le.size < 0: - removeChunk(a, le) - inc(le.size, c.size) - addChunk(a, le) - return - c.size = -c.size - addChunk(a, c) - -proc splitChunk(a: var TAllocator, c: PChunk, size: int) = - var rest = cast[PChunk](cast[TAddress](p) + size) - rest.size = size - c.size # results in negative number, because rest is free - addChunk(a, rest) - # mark pages as accessible: - ChunkTablePut(a, rest, bitAccessible) + +proc isSmallChunk(c: PChunk): bool {.inline.} = + return c.size <= SmallChunkSize-smallChunkOverhead() + #return c.size < SmallChunkSize + +proc chunkUnused(c: PChunk): bool {.inline.} = + result = not c.used + +proc freeBigChunk(a: var TAllocator, c: PBigChunk) = + var c = c + assert(c.size >= PageSize) + when coalescRight: + var ri = cast[PChunk](cast[TAddress](c) +% c.size) + assert((cast[TAddress](ri) and PageMask) == 0) + if isAccessible(ri) and chunkUnused(ri): + if not isSmallChunk(ri): + ListRemove(a.freeChunksList, cast[PBigChunk](ri)) + inc(c.size, ri.size) + excl(a.chunkStarts, pageIndex(ri)) + when coalescLeft: + if c.prevSize != 0: + var le = cast[PChunk](cast[TAddress](c) -% c.prevSize) + assert((cast[TAddress](le) and PageMask) == 0) + if isAccessible(le) and chunkUnused(le): + if not isSmallChunk(le): + ListRemove(a.freeChunksList, cast[PBigChunk](le)) + inc(le.size, c.size) + excl(a.chunkStarts, pageIndex(c)) + c = cast[PBigChunk](le) + + if c.size < ChunkOsReturn: + ListAdd(a.freeChunksList, c) + c.used = false + else: + freeOsChunks(a, c, c.size) + +proc splitChunk(a: var TAllocator, c: PBigChunk, size: int) = + var rest = cast[PBigChunk](cast[TAddress](c) +% size) + rest.size = c.size - size + rest.used = false + rest.next = nil # XXX + rest.prev = nil + rest.prevSize = size c.size = size + incl(a.chunkStarts, pageIndex(rest)) + ListAdd(a.freeChunksList, rest) + +proc getBigChunk(a: var TAllocator, size: int): PBigChunk = + # use first fit for now: + assert((size and PageMask) == 0) + result = a.freeChunksList + block search: + while result != nil: + assert chunkUnused(result) + if result.size == size: + ListRemove(a.freeChunksList, result) + break search + elif result.size > size: + splitChunk(a, result, size) + ListRemove(a.freeChunksList, result) + break search + result = result.next + if size < InitialMemoryRequest: + result = requestOsChunks(a, InitialMemoryRequest) + splitChunk(a, result, size) + else: + result = requestOsChunks(a, size) + result.prevSize = 0 + result.used = true + incl(a.chunkStarts, pageIndex(result)) -proc getChunkOfSize(a: var TAllocator, size: int): PChunk = - for i in size..high(a.freeChunks): - result = a.freeChunks[i] - if result != nil: - if i != size: splitChunk(a, result, size) - else: removeChunk(a, result) - result.prev = nil - result.next = nil - break +proc getSmallChunk(a: var TAllocator): PSmallChunk = + var res = getBigChunk(a, PageSize) + assert res.prev == nil + assert res.next == nil + result = cast[PSmallChunk](res) # ----------------------------------------------------------------------------- -proc getChunk(p: pointer): PChunk {.inline.} = - result = cast[PChunk](cast[TAddress](p) and not PageMask) - proc getCellSize(p: pointer): int {.inline.} = - var c = getChunk(p) - result = abs(c.size) + var c = pageAddr(p) + result = c.size -proc alloc(a: var TAllocator, size: int): pointer = - if size <= smallRequest: - # allocate a small block +proc alloc(a: var TAllocator, requestedSize: int): pointer = + var size = roundup(max(requestedSize, sizeof(TFreeCell)), MemAlign) + if size <= SmallChunkSize-smallChunkOverhead(): + # allocate a small block: for small chunks, we use only its next pointer var s = size div MemAlign var c = a.freeSmallChunks[s] if c == nil: - c = getChunkOfSize(0) + c = getSmallChunk(a) c.freeList = nil + assert c.size == PageSize c.size = size - a.freeSmallChunks[s] = c - c.len = 1 - c.used = 1 - c.chunkStart = 0 - result = addr(c.data[0]) - elif c.freeList != nil: - result = c.freeList - assert(c.freeList.zeroField == nil) - c.freeList = c.freeList.next - inc(c.used) - if c.freeList == nil: removeChunk(a, c) + c.acc = size + c.free = SmallChunkSize - smallChunkOverhead() - size + c.next = nil + c.prev = nil + ListAdd(a.freeSmallChunks[s], c) + result = addr(c.data) else: - assert(c.len*size <= high(c.data)) - result = addr(c.data[c.len*size]) - inc(c.len) - inc(c.used) - if c.len*size > high(c.data): removeChunk(a, c) + assert c.next != c + assert c.size == size + if c.freeList == nil: + assert(c.acc + smallChunkOverhead() + size <= SmallChunkSize) + result = cast[pointer](cast[TAddress](addr(c.data)) +% c.acc) + inc(c.acc, size) + else: + result = c.freeList + assert(c.freeList.zeroField == nil) + c.freeList = c.freeList.next + dec(c.free, size) + if c.free < size: + ListRemove(a.freeSmallChunks[s], c) else: + size = roundup(requestedSize+bigChunkOverhead(), PageSize) # allocate a large block - var c = getChunkOfSize(size shr PageShift) - result = addr(c.data[0]) - c.freeList = nil - c.size = size - c.len = 0 - c.used = 0 - c.chunkStart = 0 + var c = getBigChunk(a, size) + assert c.prev == nil + assert c.next == nil + assert c.size == size + result = addr(c.data) + cast[ptr TFreeCell](result).zeroField = cast[ptr TFreeCell](1) # make it != nil + #echo("setting to one: ", $cast[TAddress](addr(cast[ptr TFreeCell](result).zeroField))) + +proc contains(list, x: PSmallChunk): bool = + var it = list + while it != nil: + if it == x: return true + it = it.next proc dealloc(a: var TAllocator, p: pointer) = - var c = getChunk(p) - if c.size <= smallRequest: - # free small block: + var c = pageAddr(p) + if isSmallChunk(c): + # `p` is within a small chunk: + var c = cast[PSmallChunk](c) + var s = c.size var f = cast[ptr TFreeCell](p) + #echo("setting to nil: ", $cast[TAddress](addr(f.zeroField))) + assert(f.zeroField != nil) f.zeroField = nil f.next = c.freeList - c.freeList = p - dec(c.used) - if c.used == 0: freeChunk(c) + c.freeList = f + # check if it is not in the freeSmallChunks[s] list: + if c.free < s: + assert c notin a.freeSmallChunks[s div memAlign] + # add it to the freeSmallChunks[s] array: + ListAdd(a.freeSmallChunks[s div memAlign], c) + inc(c.free, s) + else: + inc(c.free, s) + if c.free == SmallChunkSize-smallChunkOverhead(): + ListRemove(a.freeSmallChunks[s div memAlign], c) + c.size = SmallChunkSize + freeBigChunk(a, cast[PBigChunk](c)) else: # free big chunk - freeChunk(c) + freeBigChunk(a, cast[PBigChunk](c)) proc realloc(a: var TAllocator, p: pointer, size: int): pointer = # could be made faster, but this is unnecessary, the GC does not use it anyway @@ -389,6 +502,34 @@ proc realloc(a: var TAllocator, p: pointer, size: int): pointer = dealloc(a, p) proc isAllocatedPtr(a: TAllocator, p: pointer): bool = - var c = getChunk(p) - if c in a.accessibleChunks and c.size > 0: - result = cast[ptr TFreeCell](p).zeroField != nil + if isAccessible(p): + var c = pageAddr(p) + if not chunkUnused(c): + if isSmallChunk(c): + result = (cast[TAddress](p) -% cast[TAddress](c) -% + smallChunkOverhead()) %% c.size == 0 and + cast[ptr TFreeCell](p).zeroField != nil + else: + var c = cast[PBigChunk](c) + result = p == addr(c.data) + +when isMainModule: + const iterations = 4000_000 + incl(allocator.chunkStarts, 11) + assert 11 in allocator.chunkStarts + excl(allocator.chunkStarts, 11) + assert 11 notin allocator.chunkStarts + var p: array [1..iterations, pointer] + for i in 7..7: + var x = i * 8 + for j in 1.. iterations: + p[j] = alloc(allocator, x) + for j in 1..iterations: + assert isAllocatedPtr(allocator, p[j]) + echo($i, " used memory: ", $(allocator.currMem)) + for j in countdown(iterations, 1): + #echo("j: ", $j) + dealloc(allocator, p[j]) + assert(not isAllocatedPtr(allocator, p[j])) + echo($i, " after freeing: ", $(allocator.currMem)) + diff --git a/lib/amd64.asm.in b/lib/amd64.asm.in index 2c14bf241..0fa66fa7d 100644 --- a/lib/amd64.asm.in +++ b/lib/amd64.asm.in @@ -5,7 +5,6 @@ ; that is the only convention any C compiler supports. \python{ -# as usual I use my own preprocessor :-) import os def c(name): diff --git a/lib/assign.nim b/lib/assign.nim index 3d4bf4d61..17b4f5949 100644 --- a/lib/assign.nim +++ b/lib/assign.nim @@ -43,8 +43,12 @@ proc genericAssign(dest, src: Pointer, mt: PNimType) = x^ = nil return assert(dest != nil) - unsureAsgnRef(cast[ppointer](dest), - newObj(mt, seq.len * mt.base.size + GenericSeqSize)) + when defined(boehmGC): + unsureAsgnRef(cast[ppointer](dest), + newObj(seq.len * mt.base.size + GenericSeqSize)) + else: + unsureAsgnRef(cast[ppointer](dest), + newObj(mt, seq.len * mt.base.size + GenericSeqSize)) var dst = cast[taddress](cast[ppointer](dest)^) for i in 0..seq.len-1: genericAssign( diff --git a/lib/base/cgi.html b/lib/base/cgi.html deleted file mode 100644 index dded002bc..000000000 --- a/lib/base/cgi.html +++ /dev/null @@ -1,486 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<!-- This file is generated by Nimrod. --> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<title>Module cgi</title> -<style type="text/css"> - -span.DecNumber {color: blue} -span.BinNumber {color: blue} -span.HexNumber {color: blue} -span.OctNumber {color: blue} -span.FloatNumber {color: blue} -span.Identifier {color: black} -span.Keyword {font-weight: bold} -span.StringLit {color: blue} -span.LongStringLit {color: blue} -span.CharLit {color: blue} -span.EscapeSequence {color: black} -span.Operator {color: black} -span.Punctation {color: black} -span.Comment, span.LongComment {font-style:italic; color: green} -span.RegularExpression {color: pink} -span.TagStart {color: yellow} -span.TagEnd {color: yellow} -span.Key {color: blue} -span.Value {color: black} -span.RawData {color: blue} -span.Assembler {color: blue} -span.Preprocessor {color: yellow} -span.Directive {color: yellow} -span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference, -span.Other {color: black} - -div.navigation { - float: left; - width: 27%; //25em; - margin: 0; padding: 0; /* - border: 1px dashed gold; */ - outline: 3px outset #7F7F7F; //#99ff99; //gold; - background-color: #7F7F7F; -} - -div.navigation ul {list-style-type: none;} -div.navigation ul li a, div.navigation ul li a:visited { - font-weight: bold; - color: #FFFFFF; // #CC0000; - text-decoration: none; -} -div.navigation ul li a:hover { - font-weight: bold; - text-decoration: none; - /*outline: 2px outset #7F7F7F;*/ - color: gold; - /* background-color: #FFFFFF; // #1A1A1A; // #779977;*/ -} - -div.content { - margin-left: 27%; // 25em; - padding: 0 1em; - /*border: 1px dashed #1A1A1A;*/ - min-width: 16em; -} - -dl.item dd, dl.item dd p { - margin-top:3px; -} -dl.item dd pre { - margin-left: 15pt; - border: 0px; -} -dl.item dt, dl.item dt pre { - margin: 20pt 0 0 0; -} - -pre, span.tok { - background-color:#F9F9F9; - border:1px dotted #2F6FAB; - color:black; -} - -/* -:Author: David Goodger -:Contact: goodger@python.org -:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006) -:Revision: Revision: 4564 -:Copyright: This stylesheet has been placed in the public domain. - -Default cascading style sheet for the HTML output of Docutils. - -See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to -customize this style sheet. -*/ -/* used to remove borders from tables and images */ -.borderless, table.borderless td, table.borderless th { border: 0 } - -table.borderless td, table.borderless th { - /* Override padding for "table.docutils td" with "! important". - The right padding separates the table cells. */ - padding: 0 0.5em 0 0 ! important } - -.first { margin-top: 0 ! important } -.last, .with-subtitle { margin-bottom: 0 ! important } -.hidden { display: none } -a.toc-backref { text-decoration: none ; color: black } -blockquote.epigraph { margin: 2em 5em ; } -dl.docutils dd { margin-bottom: 0.5em } -div.abstract { margin: 2em 5em } -div.abstract p.topic-title { font-weight: bold ; text-align: center } -div.admonition, div.attention, div.caution, div.danger, div.error, -div.hint, div.important, div.note, div.tip, div.warning { - margin: 2em ; border: medium outset ; padding: 1em } -div.admonition p.admonition-title, div.hint p.admonition-title, -div.important p.admonition-title, div.note p.admonition-title, -div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } - -div.attention p.admonition-title, div.caution p.admonition-title, -div.danger p.admonition-title, div.error p.admonition-title, -div.warning p.admonition-title { color: red ; font-weight: bold ; - font-family: sans-serif } - -/* Uncomment (and remove this text!) to get reduced vertical space in - compound paragraphs. -div.compound .compound-first, div.compound .compound-middle { - margin-bottom: 0.5em } - -div.compound .compound-last, div.compound .compound-middle { - margin-top: 0.5em } -*/ - -div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } -div.dedication p.topic-title { font-weight: bold ; font-style: normal } -div.figure { margin-left: 2em ; margin-right: 2em } -div.footer, div.header { clear: both; font-size: smaller } -div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } -div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; - margin-left: 1.5em } -div.sidebar { margin-left: 1em ; border: medium outset ; - padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; - clear: right } - -div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } -div.system-messages { margin: 5em } -div.system-messages h1 { color: red } -div.system-message { border: medium outset ; padding: 1em } -div.system-message p.system-message-title { color: red ; font-weight: bold } -div.topic { margin: 2em;} -h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, -h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { - margin-top: 0.4em } -h1.title { text-align: center } -h2.subtitle { text-align: center } -hr.docutils { width: 75% } -img.align-left { clear: left } -img.align-right { clear: right } -ol.simple, ul.simple { margin-bottom: 1em } -ol.arabic { list-style: decimal } -ol.loweralpha { list-style: lower-alpha } -ol.upperalpha { list-style: upper-alpha } -ol.lowerroman { list-style: lower-roman } -ol.upperroman { list-style: upper-roman } -p.attribution { text-align: right ; margin-left: 50% } -p.caption { font-style: italic } -p.credits { font-style: italic ; font-size: smaller } -p.label { white-space: nowrap } -p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center} -p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger } -p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold } -p.topic-title { font-weight: bold } -pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% } -pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em } -span.classifier {font-family: sans-serif;font-style: oblique } -span.classifier-delimiter {font-family: sans-serif;font-weight: bold } -span.interpreted {font-family: sans-serif } -span.option {white-space: nowrap } -span.pre {white-space: pre } -span.problematic {color: red } -span.section-subtitle { - /* font-size relative to parent (h1..h6 element) */ - font-size: 80% } - -table.citation { border-left: solid 1px gray; margin-left: 1px } -table.docinfo {margin: 2em 4em } -table.docutils {margin-top: 0.5em;margin-bottom: 0.5em } -table.footnote {border-left: solid 1px black;margin-left: 1px } - -table.docutils td, table.docutils th, -table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em; - vertical-align: top} - -table.docutils th.field-name, table.docinfo th.docinfo-name { - font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 } -h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, -h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% } -ul.auto-toc { list-style-type: none } -/*a.reference { color: #E00000; font-weight:bold;} -a.reference:hover {color: #E00000;background-color: #ffff00;display: margin; - font-weight:bold;}*/ - -</style> -<script type="text/javascript"> - //<![CDATA[ - function toggleElem(id) { - var e = document.getElementById(id); - e.style.display = e.style.display == 'none' ? 'block' : 'none'; - } - - var gOpen = 'none' - function toggleAll() { - gOpen = gOpen == 'none' ? 'block' : 'none'; - var i = 1 - while (1) { - var e = document.getElementById("m"+i) - if (!e) break; - e.style.display = gOpen - i++; - } - document.getElementById('toggleButton').value = - gOpen == 'none' ? 'Show Details' : 'Hide Details'; - } - //]]> -</script> - -</head> -<body> -<div class="document" id="documentId"> -<h1 class="title">Module cgi</h1> -<div class="navigation"> -<p class="topic-title first">Navigation</p> -<ul class="simple"> -<li> - <a class="reference" href="#6" id="56">Types</a> - <ul class="simple"> - <li><a class="reference" href="#103">ECgi</a></li> - <li><a class="reference" href="#104">TRequestMethod</a></li> - - </ul> -</li> -<li> - <a class="reference" href="#9" id="59">Procs</a> - <ul class="simple"> - <li><a class="reference" href="#101">URLencode</a></li> - <li><a class="reference" href="#102">URLdecode</a></li> - <li><a class="reference" href="#105">readData</a></li> - <li><a class="reference" href="#106">validateData</a></li> - <li><a class="reference" href="#107">getContentLength</a></li> - <li><a class="reference" href="#108">getContentType</a></li> - <li><a class="reference" href="#109">getDocumentRoot</a></li> - <li><a class="reference" href="#110">getGatewayInterface</a></li> - <li><a class="reference" href="#111">getHttpAccept</a></li> - <li><a class="reference" href="#112">getHttpAcceptCharset</a></li> - <li><a class="reference" href="#113">getHttpAccept Encoding</a></li> - <li><a class="reference" href="#114">getHttpAccept Language</a></li> - <li><a class="reference" href="#115">getHttpConnection</a></li> - <li><a class="reference" href="#116">getHttpCookie</a></li> - <li><a class="reference" href="#117">getHttpHost</a></li> - <li><a class="reference" href="#118">getHttpReferer</a></li> - <li><a class="reference" href="#119">getHttpUserAgent</a></li> - <li><a class="reference" href="#120">getPathInfo</a></li> - <li><a class="reference" href="#121">getPathTranslated</a></li> - <li><a class="reference" href="#122">getQueryString</a></li> - <li><a class="reference" href="#123">getRemoteAddr</a></li> - <li><a class="reference" href="#124">getRemoteHost</a></li> - <li><a class="reference" href="#125">getRemoteIdent</a></li> - <li><a class="reference" href="#126">getRemotePort</a></li> - <li><a class="reference" href="#127">getRemoteUser</a></li> - <li><a class="reference" href="#128">getRequestMethod</a></li> - <li><a class="reference" href="#129">getRequestURI</a></li> - <li><a class="reference" href="#130">getScriptFilename</a></li> - <li><a class="reference" href="#131">getScriptName</a></li> - <li><a class="reference" href="#132">getServerAddr</a></li> - <li><a class="reference" href="#133">getServerAdmin</a></li> - <li><a class="reference" href="#134">getServerName</a></li> - <li><a class="reference" href="#135">getServerPort</a></li> - <li><a class="reference" href="#136">getServerProtocol</a></li> - <li><a class="reference" href="#137">getServerSignature</a></li> - <li><a class="reference" href="#138">getServerSoftware</a></li> - <li><a class="reference" href="#139">setTestData</a></li> - <li><a class="reference" href="#140">writeContentType</a></li> - - </ul> -</li> - -</ul> -</div> -<div class="content"> -This module implements helper procs for CGI applictions. Example:<pre> -<span class="Keyword">import</span> <span class="Identifier">strtabs</span><span class="Punctation">,</span> <span class="Identifier">cgi</span> - -<span class="Comment"># Fill the values when debugging:</span> -<span class="Keyword">when</span> <span class="Identifier">debug</span><span class="Punctation">:</span> - <span class="Identifier">setTestData</span><span class="Punctation">(</span><span class="StringLit">"name"</span><span class="Punctation">,</span> <span class="StringLit">"Klaus"</span><span class="Punctation">,</span> <span class="StringLit">"password"</span><span class="Punctation">,</span> <span class="StringLit">"123456"</span><span class="Punctation">)</span> -<span class="Comment"># read the data into `myData`</span> -<span class="Keyword">var</span> <span class="Identifier">myData</span> <span class="Operator">=</span> <span class="Identifier">readData</span><span class="Punctation">(</span><span class="Punctation">)</span> -<span class="Comment"># check that the data's variable names are "name" or "passwort"</span> -<span class="Identifier">validateData</span><span class="Punctation">(</span><span class="Identifier">myData</span><span class="Punctation">,</span> <span class="StringLit">"name"</span><span class="Punctation">,</span> <span class="StringLit">"password"</span><span class="Punctation">)</span> -<span class="Comment"># start generating content:</span> -<span class="Identifier">writeContentType</span><span class="Punctation">(</span><span class="Punctation">)</span> -<span class="Comment"># generate content:</span> -<span class="Identifier">write</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"<!DOCTYPE HTML PUBLIC </span><span class="EscapeSequence">\"</span>-//W3C//DTD HTML 4.01//EN<span class="EscapeSequence">\"</span><span class="EscapeSequence">>\n</span><span class="StringLit">"</span><span class="Punctation">)</span> -<span class="Identifier">write</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"<html><head><title>Test</title></head><body></span><span class="EscapeSequence">\n</span><span class="StringLit">"</span><span class="Punctation">)</span> -<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"your name: "</span> <span class="Operator">&</span> <span class="Identifier">myData</span><span class="Punctation">[</span><span class="StringLit">"name"</span><span class="Punctation">]</span><span class="Punctation">)</span> -<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"your password: "</span> <span class="Operator">&</span> <span class="Identifier">myData</span><span class="Punctation">[</span><span class="StringLit">"password"</span><span class="Punctation">]</span><span class="Punctation">)</span> -<span class="Identifier">writeln</span><span class="Punctation">(</span><span class="Identifier">stdout</span><span class="Punctation">,</span> <span class="StringLit">"</body></html>"</span><span class="Punctation">)</span></pre> -<div class="section" id="6"> -<h1><a class="toc-backref" href="#56">Types</a></h1> -<dl class="item"> -<dt id="103"><pre><span class="Identifier">ECgi</span><span class="Operator">*</span> <span class="Other">=</span> <span class="Keyword">object</span> <span class="Keyword">of</span> <span class="Identifier">EIO</span></pre></dt> -<dd> -the exception that is raised, if a CGI error occurs -</dd> -<dt id="104"><pre><span class="Identifier">TRequestMethod</span><span class="Operator">*</span> <span class="Other">=</span> <span class="Keyword">enum</span> - <span class="Identifier">methodPost</span><span class="Other">,</span> <span class="Comment">## query uses the POST method</span> - <span class="Identifier">methodGet</span> <span class="Comment">## query uses the GET method</span></pre></dt> -<dd> -the used request method -</dd> - -</dl></div> -<div class="section" id="9"> -<h1><a class="toc-backref" href="#59">Procs</a></h1> -<dl class="item"> -<dt id="101"><pre><span class="Keyword">proc</span> <span class="Identifier">URLencode</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -Encodes a value to be HTTP safe: This means that characters in the set <tt class="docutils literal"><span class="pre">{'A'..'Z', 'a'..'z', '0'..'9', '_'}</span></tt> are carried over to the result, a space is converted to <tt class="docutils literal"><span class="pre">'+'</span></tt> and every other character is encoded as <tt class="docutils literal"><span class="pre">'%xx'</span></tt> where <tt class="docutils literal"><span class="pre">xx</span></tt> denotes its hexadecimal value. -</dd> -<dt id="102"><pre><span class="Keyword">proc</span> <span class="Identifier">URLdecode</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">s</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -Decodes a value from its HTTP representation: This means that a <tt class="docutils literal"><span class="pre">'+'</span></tt> is converted to a space, <tt class="docutils literal"><span class="pre">'%xx'</span></tt> (where <tt class="docutils literal"><span class="pre">xx</span></tt> denotes a hexadecimal value) is converted to the character with ordinal number <tt class="docutils literal"><span class="pre">xx</span></tt>, and and every other character is carried over. -</dd> -<dt id="105"><pre><span class="Keyword">proc</span> <span class="Identifier">readData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">allowedMethods</span><span class="Other">:</span> <span class="Identifier">set</span><span class="Other">[</span><span class="Identifier">TRequestMethod</span><span class="Other">]</span> <span class="Other">=</span> <span class="Other">{</span><span class="Identifier">methodPost</span><span class="Other">,</span> <span class="Identifier">methodGet</span><span class="Other">}</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">PStringTable</span></pre></dt> -<dd> -Read CGI data. If the client does not use a method listed in the <cite>allowedMethods</cite> set, an <cite>ECgi</cite> exception is raised. -</dd> -<dt id="106"><pre><span class="Keyword">proc</span> <span class="Identifier">validateData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">data</span><span class="Other">:</span> <span class="Identifier">PStringTable</span><span class="Other">,</span> <span class="Identifier">validKeys</span><span class="Other">:</span> <span class="Identifier">openarray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span></pre></dt> -<dd> -validates data; raises <cite>ECgi</cite> if this fails. This checks that each variable name of the CGI <cite>data</cite> occurs in the <cite>validKeys</cite> array. -</dd> -<dt id="107"><pre><span class="Keyword">proc</span> <span class="Identifier">getContentLength</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">CONTENT_LENGTH</span></tt> environment variable -</dd> -<dt id="108"><pre><span class="Keyword">proc</span> <span class="Identifier">getContentType</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">CONTENT_TYPE</span></tt> environment variable -</dd> -<dt id="109"><pre><span class="Keyword">proc</span> <span class="Identifier">getDocumentRoot</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">DOCUMENT_ROOT</span></tt> environment variable -</dd> -<dt id="110"><pre><span class="Keyword">proc</span> <span class="Identifier">getGatewayInterface</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">GATEWAY_INTERFACE</span></tt> environment variable -</dd> -<dt id="111"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAccept</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT</span></tt> environment variable -</dd> -<dt id="112"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptCharset</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_CHARSET</span></tt> environment variable -</dd> -<dt id="113"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptEncoding</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_ENCODING</span></tt> environment variable -</dd> -<dt id="114"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpAcceptLanguage</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_ACCEPT_LANGUAGE</span></tt> environment variable -</dd> -<dt id="115"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpConnection</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_CONNECTION</span></tt> environment variable -</dd> -<dt id="116"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpCookie</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_COOKIE</span></tt> environment variable -</dd> -<dt id="117"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpHost</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_HOST</span></tt> environment variable -</dd> -<dt id="118"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpReferer</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_REFERER</span></tt> environment variable -</dd> -<dt id="119"><pre><span class="Keyword">proc</span> <span class="Identifier">getHttpUserAgent</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">HTTP_USER_AGENT</span></tt> environment variable -</dd> -<dt id="120"><pre><span class="Keyword">proc</span> <span class="Identifier">getPathInfo</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">PATH_INFO</span></tt> environment variable -</dd> -<dt id="121"><pre><span class="Keyword">proc</span> <span class="Identifier">getPathTranslated</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">PATH_TRANSLATED</span></tt> environment variable -</dd> -<dt id="122"><pre><span class="Keyword">proc</span> <span class="Identifier">getQueryString</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">QUERY_STRING</span></tt> environment variable -</dd> -<dt id="123"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteAddr</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_ADDR</span></tt> environment variable -</dd> -<dt id="124"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteHost</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_HOST</span></tt> environment variable -</dd> -<dt id="125"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteIdent</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_IDENT</span></tt> environment variable -</dd> -<dt id="126"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemotePort</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_PORT</span></tt> environment variable -</dd> -<dt id="127"><pre><span class="Keyword">proc</span> <span class="Identifier">getRemoteUser</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REMOTE_USER</span></tt> environment variable -</dd> -<dt id="128"><pre><span class="Keyword">proc</span> <span class="Identifier">getRequestMethod</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REQUEST_METHOD</span></tt> environment variable -</dd> -<dt id="129"><pre><span class="Keyword">proc</span> <span class="Identifier">getRequestURI</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">REQUEST_URI</span></tt> environment variable -</dd> -<dt id="130"><pre><span class="Keyword">proc</span> <span class="Identifier">getScriptFilename</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SCRIPT_FILENAME</span></tt> environment variable -</dd> -<dt id="131"><pre><span class="Keyword">proc</span> <span class="Identifier">getScriptName</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SCRIPT_NAME</span></tt> environment variable -</dd> -<dt id="132"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerAddr</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_ADDR</span></tt> environment variable -</dd> -<dt id="133"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerAdmin</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_ADMIN</span></tt> environment variable -</dd> -<dt id="134"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerName</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_NAME</span></tt> environment variable -</dd> -<dt id="135"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerPort</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_PORT</span></tt> environment variable -</dd> -<dt id="136"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerProtocol</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_PROTOCOL</span></tt> environment variable -</dd> -<dt id="137"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerSignature</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_SIGNATURE</span></tt> environment variable -</dd> -<dt id="138"><pre><span class="Keyword">proc</span> <span class="Identifier">getServerSoftware</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span></pre></dt> -<dd> -returns contents of the <tt class="docutils literal"><span class="pre">SERVER_SOFTWARE</span></tt> environment variable -</dd> -<dt id="139"><pre><span class="Keyword">proc</span> <span class="Identifier">setTestData</span><span class="Operator">*</span><span class="Other">(</span><span class="Identifier">keysvalues</span><span class="Other">:</span> <span class="Identifier">openarray</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">]</span><span class="Other">)</span></pre></dt> -<dd> -fills the appropriate environment variables to test your CGI application. This can only simulate the 'GET' 'REQUEST_METHOD'. <cite>keysvalues</cite> should provide embedded (name, value)-pairs. Example:<pre><span class="Identifier">setTestData</span><span class="Punctation">(</span><span class="StringLit">"name"</span><span class="Punctation">,</span> <span class="StringLit">"Hanz"</span><span class="Punctation">,</span> <span class="StringLit">"password"</span><span class="Punctation">,</span> <span class="StringLit">"12345"</span><span class="Punctation">)</span></pre> -</dd> -<dt id="140"><pre><span class="Keyword">proc</span> <span class="Identifier">writeContentType</span><span class="Operator">*</span><span class="Other">(</span><span class="Other">)</span></pre></dt> -<dd> -call this before starting to send your HTML data to <cite>stdout</cite>. This is just a shorthand for: .. code-block:: Nimrod<blockquote>write(stdout, "Content-type: text/htmlnn")</blockquote> - -</dd> - -</dl></div> - -</div> - -<small>Generated: 2008-12-08 20:29:49 UTC</small> -</div> -</body> -</html> diff --git a/lib/base/cgi.nim b/lib/base/cgi.nim index 59b7b9d09..0dc3a4394 100644 --- a/lib/base/cgi.nim +++ b/lib/base/cgi.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -71,20 +71,40 @@ proc URLdecode*(s: string): string = else: add(result, s[i]) inc(i) +proc addXmlChar(dest: var string, c: Char) {.inline.} = + case c + of '&': add(dest, "&") + of '<': add(dest, "<") + of '>': add(dest, ">") + of '\"': add(dest, """) + else: add(dest, c) + +proc XMLencode*(s: string): string = + ## Encodes a value to be XML safe: + ## * ``"`` is replaced by ``"`` + ## * ``<`` is replaced by ``<`` + ## * ``>`` is replaced by ``>`` + ## * ``&`` is replaced by ``&`` + ## * every other character is carried over. + result = "" + for i in 0..len(s)-1: addXmlChar(result, s[i]) + type ECgi* = object of EIO ## the exception that is raised, if a CGI error occurs TRequestMethod* = enum ## the used request method + methodNone, ## no REQUEST_METHOD environment variable methodPost, ## query uses the POST method methodGet ## query uses the GET method -proc cgiError(msg: string) {.noreturn.} = +proc cgiError*(msg: string) {.noreturn.} = + ## raises an ECgi exception with message `msg`. var e: ref ECgi new(e) e.msg = msg raise e proc readData*(allowedMethods: set[TRequestMethod] = - {methodPost, methodGet}): PStringTable = + {methodNone, methodPost, methodGet}): PStringTable = ## Read CGI data. If the client does not use a method listed in the ## `allowedMethods` set, an `ECgi` exception is raised. result = newStringTable() @@ -103,7 +123,11 @@ proc readData*(allowedMethods: set[TRequestMethod] = cgiError("'REQUEST_METHOD' 'GET' is not supported") # read from the QUERY_STRING environment variable: enc = getenv("QUERY_STRING") - else: cgiError("'REQUEST_METHOD' must be 'POST' or 'GET'") + else: + if methodNone in allowedMethods: + return result + else: + cgiError("'REQUEST_METHOD' must be 'POST' or 'GET'") # decode everything in one pass: var i = 0 @@ -129,7 +153,6 @@ proc readData*(allowedMethods: set[TRequestMethod] = setLen(value, 0) # reuse memory while true: case enc[i] - of '\0': return of '%': var x = 0 handleHexChar(enc[i+1], x) @@ -137,12 +160,13 @@ proc readData*(allowedMethods: set[TRequestMethod] = inc(i, 2) add(value, chr(x)) of '+': add(value, ' ') - of '=', '&': break + of '&', '\0': break else: add(value, enc[i]) inc(i) - if enc[i] != '&': cgiError("'&' expected") - inc(i) # skip '=' result[name] = value + if enc[i] == '&': inc(i) + elif enc[i] == '\0': break + else: cgiError("'&' expected") proc validateData*(data: PStringTable, validKeys: openarray[string]) = ## validates data; raises `ECgi` if this fails. This checks that each variable diff --git a/lib/base/dialogs.nim b/lib/base/dialogs.nim index 144283a69..cf81a3d29 100644 --- a/lib/base/dialogs.nim +++ b/lib/base/dialogs.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. diff --git a/lib/base/gtk/gtk2.nim b/lib/base/gtk/gtk2.nim index b20d5e635..d1e72e708 100644 --- a/lib/base/gtk/gtk2.nim +++ b/lib/base/gtk/gtk2.nim @@ -17267,5 +17267,5 @@ proc gtk_file_chooser_set_do_overwrite_confirmation*(chooser: PGtkFileChooser, proc gtk_nimrod_init*() = var cmdLine {.importc: "cmdLine".}: array [0..255, cstring] - cmdCount {.importc: "cmdCount".}: int + cmdCount {.importc: "cmdCount".}: cint gtk_init(addr(cmdLine), addr(cmdCount)) diff --git a/lib/base/odbcsql.nim b/lib/base/odbcsql.nim index e6eda0106..8f8804092 100644 --- a/lib/base/odbcsql.nim +++ b/lib/base/odbcsql.nim @@ -226,8 +226,8 @@ const SQL_DRIVER_NOPROMPT* = 0 SQL_DRIVER_COMPLETE* = 1 SQL_DRIVER_PROMPT* = 2 - SQL_DRIVER_COMPLETE_REQUIRED* = 3 # whether an attribute is a pointer or not - SQL_IS_POINTER* = (- 4) + SQL_DRIVER_COMPLETE_REQUIRED* = 3 + SQL_IS_POINTER* = (- 4) # whether an attribute is a pointer or not SQL_IS_UINTEGER* = (- 5) SQL_IS_INTEGER* = (- 6) SQL_IS_USMALLINT* = (- 7) @@ -737,7 +737,8 @@ proc SQLFreeStmt*(StatementHandle: TSqlHStmt, Option: TSqlUSmallInt): TSqlSmallI proc SQLColAttribute*(StatementHandle: TSqlHStmt, ColumnNumber: TSqlUSmallInt, FieldIdentifier: TSqlUSmallInt, CharacterAttribute: PSQLCHAR, BufferLength: TSqlSmallInt, - StringLength: PSQLSMALLINT, NumericAttribute: TSqlPointer): TSqlSmallInt{. + StringLength: PSQLSMALLINT, + NumericAttribute: TSqlPointer): TSqlSmallInt{. dynlib: odbclib, importc.} proc SQLEndTran*(HandleType: TSqlSmallInt, Handle: TSqlHandle, CompletionType: TSqlSmallInt): TSqlSmallInt{.dynlib: odbclib, @@ -756,7 +757,8 @@ proc SQLSpecialColumns*(StatementHandle: TSqlHStmt, IdentifierType: TSqlUSmallIn CatalogName: PSQLCHAR, NameLength1: TSqlSmallInt, SchemaName: PSQLCHAR, NameLength2: TSqlSmallInt, TableName: PSQLCHAR, NameLength3: TSqlSmallInt, - Scope: TSqlUSmallInt, Nullable: TSqlUSmallInt): TSqlSmallInt{. + Scope: TSqlUSmallInt, + Nullable: TSqlUSmallInt): TSqlSmallInt{. dynlib: odbclib, importc.} proc SQLProcedures*(hstmt: TSqlHStmt, szTableQualifier: PSQLCHAR, cbTableQualifier: TSqlSmallInt, szTableOwner: PSQLCHAR, @@ -778,6 +780,7 @@ proc SQLStatistics*(hstmt: TSqlHStmt, CatalogName: PSQLCHAR, NameLength1: TSqlSmallInt, SchemaName: PSQLCHAR, NameLength2: TSqlSmallInt, TableName: PSQLCHAR, NameLength3: TSqlSmallInt, Unique: TSqlUSmallInt, - Reserved: TSqlUSmallInt): TSqlSmallInt{.dynlib: odbclib, importc.} + Reserved: TSqlUSmallInt): TSqlSmallInt {. + dynlib: odbclib, importc.} -{.pop.} \ No newline at end of file +{.pop.} diff --git a/lib/base/opengl/gl.nim b/lib/base/opengl/gl.nim index 4cc84cba1..79f09b544 100644 --- a/lib/base/opengl/gl.nim +++ b/lib/base/opengl/gl.nim @@ -1397,34 +1397,34 @@ proc glVertexPointer*(size: TGLint, atype: TGLenum, stride: TGLsizei, pointer: Pointer){.dynlib: dllname, importc.} proc glViewport*(x, y: TGLint, width, height: TGLsizei){.dynlib: dllname, importc.} type - PFNGLARRAYELEMENTEXTPROC* = proc (i: TGLint) - PFNGLDRAWARRAYSEXTPROC* = proc (mode: TGLenum, first: TGLint, count: TGLsizei) - PFNGLVERTEXPOINTEREXTPROC* = proc (size: TGLint, atype: TGLenum, + PFN_GLARRAY_ELEMENT_EXTPROC* = proc (i: TGLint) + PFN_GLDRAW_ARRAYS_EXTPROC* = proc (mode: TGLenum, first: TGLint, count: TGLsizei) + PFN_GLVERTEX_POINTER_EXTPROC* = proc (size: TGLint, atype: TGLenum, stride, count: TGLsizei, pointer: Pointer) - PFNGLNORMALPOINTEREXTPROC* = proc (atype: TGLenum, stride, count: TGLsizei, + PFN_GLNORMAL_POINTER_EXTPROC* = proc (atype: TGLenum, stride, count: TGLsizei, pointer: Pointer) - PFNGLCOLORPOINTEREXTPROC* = proc (size: TGLint, atype: TGLenum, + PFN_GLCOLOR_POINTER_EXTPROC* = proc (size: TGLint, atype: TGLenum, stride, count: TGLsizei, pointer: Pointer) - PFNGLINDEXPOINTEREXTPROC* = proc (atype: TGLenum, stride, count: TGLsizei, + PFN_GLINDEX_POINTER_EXTPROC* = proc (atype: TGLenum, stride, count: TGLsizei, pointer: Pointer) - PFNGLTEXCOORDPOINTEREXTPROC* = proc (size: TGLint, atype: TGLenum, + PFN_GLTEXCOORD_POINTER_EXTPROC* = proc (size: TGLint, atype: TGLenum, stride, count: TGLsizei, pointer: Pointer) - PFNGLEDGEFLAGPOINTEREXTPROC* = proc (stride, count: TGLsizei, + PFN_GLEDGEFLAG_POINTER_EXTPROC* = proc (stride, count: TGLsizei, pointer: PGLboolean) - PFNGLGETPOINTERVEXTPROC* = proc (pname: TGLenum, params: Pointer) - PFNGLARRAYELEMENTARRAYEXTPROC* = proc (mode: TGLenum, count: TGLsizei, + PFN_GLGET_POINTER_VEXT_PROC* = proc (pname: TGLenum, params: Pointer) + PFN_GLARRAY_ELEMENT_ARRAY_EXTPROC* = proc (mode: TGLenum, count: TGLsizei, pi: Pointer) # WIN_swap_hint - PFNGLADDSWAPHINTRECTWINPROC* = proc (x, y: TGLint, width, height: TGLsizei) - PFNGLCOLORTABLEEXTPROC* = proc (target, internalFormat: TGLenum, + PFN_GLADDSWAPHINT_RECT_WINPROC* = proc (x, y: TGLint, width, height: TGLsizei) + PFN_GLCOLOR_TABLE_EXTPROC* = proc (target, internalFormat: TGLenum, width: TGLsizei, format, atype: TGLenum, data: Pointer) - PFNGLCOLORSUBTABLEEXTPROC* = proc (target: TGLenum, start, count: TGLsizei, + PFN_GLCOLOR_SUBTABLE_EXTPROC* = proc (target: TGLenum, start, count: TGLsizei, format, atype: TGLenum, data: Pointer) - PFNGLGETCOLORTABLEEXTPROC* = proc (target, format, atype: TGLenum, + PFN_GLGETCOLOR_TABLE_EXTPROC* = proc (target, format, atype: TGLenum, data: Pointer) - PFNGLGETCOLORTABLEPARAMETERIVEXTPROC* = proc (target, pname: TGLenum, + PFN_GLGETCOLOR_TABLE_PARAMETER_IVEXTPROC* = proc (target, pname: TGLenum, params: PGLint) - PFNGLGETCOLORTABLEPARAMETERFVEXTPROC* = proc (target, pname: TGLenum, + PFN_GLGETCOLOR_TABLE_PARAMETER_FVEXTPROC* = proc (target, pname: TGLenum, params: PGLfloat) {.pop.} diff --git a/lib/base/pcre.nim b/lib/base/pcre.nim index ebebd8bd7..4f4c27a09 100644 --- a/lib/base/pcre.nim +++ b/lib/base/pcre.nim @@ -7,18 +7,6 @@ # distribution, for details about the copyright. # -# This file was created by a complicated procedure which saved me a considerable -# amount of time: the pcre.h header was converted to modpcre.h by hand, so that -# h2pas could handle it. Then I used pas2mor to generate a Nimrod binding. -# Unfortunately, I had to fix some things later on; thus don't do all this -# again! My manual changes will be lost! - -# Converted by Pas2mor v1.37 -# -# Automatically converted by H2Pas 0.99.16 from modpcre.h -# The following command line parameters were used: -# -D -c -l pcre.lib -T modpcre.h - {.compile: "pcre_all.c" .} type diff --git a/lib/base/regexprs.nim b/lib/base/regexprs.nim index 9979035b8..e2aac3d17 100644 --- a/lib/base/regexprs.nim +++ b/lib/base/regexprs.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2006 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -35,7 +35,7 @@ const proc match*(s, pattern: string, matches: var openarray[string], start: int = 0): bool - ## returns ``true`` if ``s`` matches the ``pattern[start..]`` and + ## returns ``true`` if ``s[start..]`` matches the ``pattern`` and ## the captured substrings in the array ``matches``. If it does not ## match, nothing is written into ``matches`` and ``false`` is ## returned. @@ -113,3 +113,42 @@ proc match(s, pattern: string, start: int = 0): bool = proc find(s, pattern: string, start: int = 0): bool = return matchOrFind(s, rawCompile(pattern, PCRE_MULTILINE), start) >= 0'i32 + +template `=~` *(s, pattern: expr): expr = + ## This calls ``match`` with an implicit declared ``matches`` array that + ## can be used in the scope of the ``=~`` call: + ## + ## .. code-block:: nimrod + ## + ## if line =~ r"\s*(\w+)\s*\=\s*(\w+)": + ## # matches a key=value pair: + ## echo("Key: ", matches[1]) + ## echo("Value: ", matches[2]) + ## elif line =~ r"\s*(\#.*)": + ## # matches a comment + ## # note that the implicit ``matches`` array is different from the + ## # ``matches`` array of the first branch + ## echo("comment: ", matches[1]) + ## else: + ## echo("syntax error") + ## + var matches: array[0..maxSubPatterns-1, string] + match(s, pattern, matches) + + +const ## common regular expressions + reIdentifier* = r"\b[a-zA-Z_]+[a-zA-Z_0-9]*\b" ## describes an identifier + reNatural* = r"\b\d+\b" ## describes a natural number + reInteger* = r"\b[-+]?\d+\b" ## describes an integer + reHex* = r"\b0[xX][0-9a-fA-F]+\b" ## describes a hexadecimal number + reBinary* = r"\b0[bB][01]+\b" ## describes a binary number (example: 0b11101) + reOctal* = r"\b0[oO][0-7]+\b" ## describes an octal number (example: 0o777) + reFloat* = r"\b[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\b" + ## describes a floating point number + reEmail* = r"\b[a-zA-Z0-9!#$%&'*+/=?^_`{|}~\-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)" & + r"*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+(?:[a-zA-Z]{2}|com|org|" & + r"net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b" + ## describes a common email address + reURL* = r"\b(http(s)?|ftp|gopher|telnet|file|notes|ms\-help):" & + r"((//)|(\\\\))+[\w\d:#@%/;$()~_?\+\-\=\\\.\&]*\b" + ## describes an URL diff --git a/lib/copying.txt b/lib/copying.txt index 2657a09df..be182d65c 100644 --- a/lib/copying.txt +++ b/lib/copying.txt @@ -1,6 +1,6 @@ ======================================================= The Nimrod Runtime Library - Copyright (C) 2004-2007 Andreas Rumpf + Copyright (C) 2004-2009 Andreas Rumpf ======================================================= This is the file copying.txt, it applies to the Nimrod Run-Time Library diff --git a/lib/debugger.nim b/lib/debugger.nim index f5d526d70..73a1e4db2 100644 --- a/lib/debugger.nim +++ b/lib/debugger.nim @@ -348,9 +348,9 @@ proc dbgStackFrame(s: string, start: int, currFrame: PExtendedFrame) = proc CommandPrompt() = # if we return from this routine, user code executes again var - again: bool = True + again = True dbgFramePtr = framePtr # for going down and up the stack - dbgDown: int = 0 # how often we did go down + dbgDown = 0 # how often we did go down while again: write(stdout, "*** endb| >>") @@ -478,10 +478,10 @@ proc dbgRegisterGlobal(name: cstring, address: pointer, inc(dbgGlobalData.f.len) proc endb(line: int) {.compilerproc.} = - # This proc is called before any Nimrod code line! + # This proc is called before every Nimrod code line! # Thus, it must have as few parameters as possible to keep the # code size small! - # check if we are at an enabled breakpoint or "in the mood" + # Check if we are at an enabled breakpoint or "in the mood" framePtr.line = line # this is done here for smaller code size! if dbgLineHook != nil: dbgLineHook() case dbgState diff --git a/lib/dyncalls.nim b/lib/dyncalls.nim index 6e74a9698..c46b8a931 100644 --- a/lib/dyncalls.nim +++ b/lib/dyncalls.nim @@ -58,7 +58,10 @@ when defined(posix): proc nimLoadLibrary(path: string): TLibHandle = result = dlopen(path, RTLD_NOW) if result == nil: - raise newException(EInvalidLibrary, "could not load: " & path) + writeToStdErr("could not load: ") + writeToStdErr(path) + writeToStdErr("\n") + #raise newException(EInvalidLibrary, "could not load: " & path) proc nimGetProcAddr(lib: TLibHandle, name: cstring): TProcAddr = result = dlsym(lib, name) @@ -84,7 +87,10 @@ elif defined(windows) or defined(dos): proc nimLoadLibrary(path: string): TLibHandle = result = cast[TLibHandle](winLoadLibrary(path)) if result == nil: - raise newException(EInvalidLibrary, "could not load: " & path) + writeToStdErr("could not load: ") + writeToStdErr(path) + writeToStdErr("\n") + #raise newException(EInvalidLibrary, "could not load: " & path) proc nimGetProcAddr(lib: TLibHandle, name: cstring): TProcAddr = result = GetProcAddress(cast[THINSTANCE](lib), name) @@ -118,7 +124,10 @@ elif defined(mac): NSDestroyObjectFileImage(img) result = TLibHandle(modul) if result == nil: - raise newException(EInvalidLibrary, "could not load: " & path) + writeToStdErr("could not load: ") + writeToStdErr(path) + writeToStdErr("\n") + #raise newException(EInvalidLibrary, "could not load: " & path) proc nimGetProcAddr(lib: TLibHandle, cname: string): TProcAddr = var diff --git a/lib/excpt.nim b/lib/excpt.nim index be307af09..38d34f3f4 100644 --- a/lib/excpt.nim +++ b/lib/excpt.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. diff --git a/lib/gc.nim b/lib/gc.nim index e5e8072c5..aaef70c03 100644 --- a/lib/gc.nim +++ b/lib/gc.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -15,37 +15,10 @@ # * generational # Future Improvements: -# * Both dlmalloc and TLSF lack zero-overhead object allocation. Thus, for -# small objects we should use our own allocator. # * Support for multi-threading. However, locks for the reference counting # might turn out to be too slow. # --------------------------------------------------------------------------- -# Interface to TLSF: -const - useTLSF = false # benchmarking showed that *dlmalloc* is faster than *TLSF* - -when useTLSF: - {.compile: "tlsf.c".} - - proc tlsfUsed: int {.importc: "TLSF_GET_USED_SIZE", noconv.} - proc tlsfMax: int {.importc: "TLSF_GET_MAX_SIZE", noconv.} - - proc tlsf_malloc(size: int): pointer {.importc, noconv.} - proc tlsf_free(p: pointer) {.importc, noconv.} - proc tlsf_realloc(p: pointer, size: int): pointer {.importc, noconv.} -else: - # use DL malloc - {.compile: "dlmalloc.c".} - proc tlsfUsed: int {.importc: "dlmalloc_footprint", noconv.} - proc tlsfMax: int {.importc: "dlmalloc_max_footprint", noconv.} - - proc tlsf_malloc(size: int): pointer {.importc: "dlmalloc", noconv.} - proc tlsf_free(p: pointer) {.importc: "dlfree", noconv.} - proc tlsf_realloc(p: pointer, size: int): pointer {. - importc: "dlrealloc", noconv.} - -# --------------------------------------------------------------------------- proc getOccupiedMem(): int = return tlsfUsed() proc getFreeMem(): int = return tlsfMax() - tlsfUsed() @@ -54,38 +27,13 @@ proc getTotalMem(): int = return tlsfMax() # --------------------------------------------------------------------------- const - debugGC = false # we wish to debug the GC... - logGC = false - traceGC = false # extensive debugging - reallyDealloc = true # for debugging purposes this can be set to false - cycleGC = true # (de)activate the cycle GC - stressGC = debugGC - -# Guess the page size of the system; if it is the -# wrong value, performance may be worse (this is not -# for sure though), but GC still works; must be a power of two! -const - PageShift = if sizeof(pointer) == 4: 12 else: 13 - PageSize = 1 shl PageShift # on 32 bit systems 4096 CycleIncrease = 2 # is a multiplicative increase - InitialCycleThreshold = 4*1024*1024 # X MB because cycle checking is slow ZctThreshold = 256 # we collect garbage if the ZCT's size # reaches this threshold # this seems to be a good value const - MemAlignment = 8 # BUGFIX: on AMD64, dlmalloc aligns at 8 byte boundary - BitsPerUnit = sizeof(int)*8 - # a "unit" is a word, i.e. 4 bytes - # on a 32 bit system; I do not use the term "word" because under 32-bit - # Windows it is sometimes only 16 bits - - BitsPerPage = PageSize div MemAlignment - UnitsPerPage = BitsPerPage div BitsPerUnit - # how many units do we need to describe a page: - # on 32 bit systems this is only 16 (!) - rcIncrement = 0b1000 # so that lowest 3 bits are not touched # NOTE: Most colors are currently unused rcBlack = 0b000 # cell is colored black; in use or free @@ -101,40 +49,9 @@ type TWalkOp = enum waZctDecRef, waPush, waCycleDecRef - TCell {.pure.} = object - refcount: int # the refcount and some flags - typ: PNimType - when debugGC: - filename: cstring - line: int - - PCell = ptr TCell TFinalizer {.compilerproc.} = proc (self: pointer) # A ref type can have a finalizer that is called before the object's # storage is freed. - PPointer = ptr pointer - TByteArray = array[0..1000_0000, byte] - PByte = ptr TByteArray - PString = ptr string - - PPageDesc = ptr TPageDesc - TBitIndex = range[0..UnitsPerPage-1] - TPageDesc {.final, pure.} = object - next: PPageDesc # all nodes are connected with this pointer - key: TAddress # start address at bit 0 - bits: array[TBitIndex, int] # a bit vector - - PPageDescArray = ptr array[0..1000_000, PPageDesc] - TCellSet {.final, pure.} = object - counter, max: int - head: PPageDesc - data: PPageDescArray - - PCellArray = ptr array[0..100_000_000, PCell] - TCellSeq {.final, pure.} = object - len, cap: int - d: PCellArray - TGcHeap {.final, pure.} = object # this contains the zero count and # non-zero count table mask: TAddress # mask for fast pointer detection @@ -152,7 +69,6 @@ type tempStack: TCellSeq # temporary stack for recursion elimination var - gOutOfMem: ref EOutOfMemory stackBottom: pointer gch: TGcHeap cycleThreshold: int = InitialCycleThreshold @@ -171,12 +87,10 @@ proc unsureAsgnRef(dest: ppointer, src: pointer) {.compilerproc.} proc newObj(typ: PNimType, size: int): pointer {.compilerproc.} proc newSeq(typ: PNimType, len: int): pointer {.compilerproc.} -proc raiseOutOfMem() {.noreturn.} = - if gOutOfMem == nil: - writeToStdErr("out of memory; cannot even throw an exception") - quit(1) - gOutOfMem.msg = "out of memory" - raise gOutOfMem +proc addZCT(s: var TCellSeq, c: PCell) {.noinline.} = + if (c.refcount and colorMask) != rcZct: + c.refcount = c.refcount and not colorMask or rcZct + add(s, c) proc cellToUsr(cell: PCell): pointer {.inline.} = # convert object (=pointer to refcount) to pointer to userdata @@ -198,11 +112,6 @@ proc internRefcount(p: pointer): int {.exportc: "getRefcount".} = if result > 0: result = result shr rcShift else: result = 0 -proc gcAlloc(size: int): pointer = - result = tlsf_malloc(size) - if result == nil: raiseOutOfMem() - zeroMem(result, size) - proc GC_disable() = inc(recGcLock) proc GC_enable() = if recGcLock > 0: dec(recGcLock) @@ -221,160 +130,10 @@ proc GC_disableMarkAndSweep() = cycleThreshold = high(cycleThreshold)-1 # set to the max value to suppress the cycle detector -proc nextTry(h, maxHash: int): int {.inline.} = - result = ((5*h) + 1) and maxHash - # For any initial h in range(maxHash), repeating that maxHash times - # generates each int in range(maxHash) exactly once (see any text on - # random-number generation for proof). - # this that has to equals zero, otherwise we have to round up UnitsPerPage: when BitsPerPage mod BitsPerUnit != 0: {.error: "(BitsPerPage mod BitsPerUnit) should be zero!".} -# ------------------- cell set handling --------------------------------------- - -proc inOperator(s: TCellSeq, c: PCell): bool {.inline.} = - for i in 0 .. s.len-1: - if s.d[i] == c: return True - return False - -proc add(s: var TCellSeq, c: PCell) {.inline.} = - if s.len >= s.cap: - s.cap = s.cap * 3 div 2 - var d = cast[PCellArray](tlsf_malloc(s.cap * sizeof(PCell))) - if d == nil: raiseOutOfMem() - copyMem(d, s.d, s.len * sizeof(PCell)) - tlsf_free(s.d) - s.d = d - # BUGFIX: realloc failes on AMD64, sigh... - #s.d = cast[PCellArray](tlsf_realloc(s.d, s.cap * sizeof(PCell))) - #if s.d == nil: raiseOutOfMem() - s.d[s.len] = c - inc(s.len) - -proc addZCT(s: var TCellSeq, c: PCell) = - if (c.refcount and colorMask) != rcZct: - c.refcount = c.refcount and not colorMask or rcZct - add(s, c) - -proc init(s: var TCellSeq, cap: int = 1024) = - s.len = 0 - s.cap = cap - s.d = cast[PCellArray](gcAlloc(cap * sizeof(PCell))) - -const - InitCellSetSize = 1024 # must be a power of two! - -proc CellSetInit(s: var TCellSet) = - s.data = cast[PPageDescArray](gcAlloc(InitCellSetSize * sizeof(PPageDesc))) - s.max = InitCellSetSize-1 - s.counter = 0 - s.head = nil - -proc CellSetDeinit(s: var TCellSet) = - var it = s.head - while it != nil: - var n = it.next - tlsf_free(it) - it = n - s.head = nil # play it safe here - tlsf_free(s.data) - s.data = nil - s.counter = 0 - -proc CellSetGet(t: TCellSet, key: TAddress): PPageDesc = - var h = cast[int](key) and t.max - while t.data[h] != nil: - if t.data[h].key == key: return t.data[h] - h = nextTry(h, t.max) - return nil - -proc CellSetRawInsert(t: TCellSet, data: PPageDescArray, - desc: PPageDesc) = - var h = cast[int](desc.key) and t.max - while data[h] != nil: - assert(data[h] != desc) - h = nextTry(h, t.max) - assert(data[h] == nil) - data[h] = desc - -proc CellSetEnlarge(t: var TCellSet) = - var oldMax = t.max - t.max = ((t.max+1)*2)-1 - var n = cast[PPageDescArray](gcAlloc((t.max + 1) * sizeof(PPageDesc))) - for i in 0 .. oldmax: - if t.data[i] != nil: - CellSetRawInsert(t, n, t.data[i]) - tlsf_free(t.data) - t.data = n - -proc CellSetPut(t: var TCellSet, key: TAddress): PPageDesc = - var h = cast[int](key) and t.max - while true: - var x = t.data[h] - if x == nil: break - if x.key == key: return x - h = nextTry(h, t.max) - - if ((t.max+1)*2 < t.counter*3) or ((t.max+1)-t.counter < 4): - CellSetEnlarge(t) - inc(t.counter) - h = cast[int](key) and t.max - while t.data[h] != nil: h = nextTry(h, t.max) - assert(t.data[h] == nil) - # the new page descriptor goes into result - result = cast[PPageDesc](gcAlloc(sizeof(TPageDesc))) - result.next = t.head - result.key = key - t.head = result - t.data[h] = result - -# ---------- slightly higher level procs -------------------------------------- - -proc contains(s: TCellSet, cell: PCell): bool = - var u = cast[TAddress](cell) - var t = CellSetGet(s, u shr PageShift) - if t != nil: - u = (u %% PageSize) /% MemAlignment - result = (t.bits[u /% BitsPerUnit] and (1 shl (u %% BitsPerUnit))) != 0 - else: - result = false - -proc incl(s: var TCellSet, cell: PCell) = - var u = cast[TAddress](cell) - var t = CellSetPut(s, u shr PageShift) - u = (u %% PageSize) /% MemAlignment - t.bits[u /% BitsPerUnit] = t.bits[u /% BitsPerUnit] or - (1 shl (u %% BitsPerUnit)) - -proc excl(s: var TCellSet, cell: PCell) = - var u = cast[TAddress](cell) - var t = CellSetGet(s, u shr PageShift) - if t != nil: - u = (u %% PageSize) /% MemAlignment - t.bits[u /% BitsPerUnit] = (t.bits[u /% BitsPerUnit] and - not (1 shl (u %% BitsPerUnit))) - -iterator elements(t: TCellSet): PCell {.inline.} = - # while traversing it is forbidden to add pointers to the tree! - var r = t.head - while r != nil: - var i = 0 - while i <= high(r.bits): - var w = r.bits[i] # taking a copy of r.bits[i] here is correct, because - # modifying operations are not allowed during traversation - var j = 0 - while w != 0: # test all remaining bits for zero - if (w and 1) != 0: # the bit is set! - yield cast[PCell]((r.key shl PageShift) or # +% - (i*%BitsPerUnit+%j) *% MemAlignment) - inc(j) - w = w shr 1 - inc(i) - r = r.next - -# --------------- end of Cellset routines ------------------------------------- - when debugGC: proc writeCell(msg: CString, c: PCell) = var kind = -1 @@ -450,7 +209,6 @@ proc IsOnStack(p: pointer): bool {.noinline.} proc forAllChildren(cell: PCell, op: TWalkOp) proc doOperation(p: pointer, op: TWalkOp) proc forAllChildrenAux(dest: Pointer, mt: PNimType, op: TWalkOp) -proc reprAny(p: pointer, typ: PNimType): string {.compilerproc.} # we need the prototype here for debugging purposes proc prepareDealloc(cell: PCell) = @@ -479,13 +237,13 @@ proc decRef(c: PCell) {.inline.} = if c.refcount <% rcIncrement: addZCT(gch.zct, c) elif canBeCycleRoot(c): - possibleRoot(gch, c) + incl(gch.cycleRoots, c) proc incRef(c: PCell) {.inline.} = c.refcount = c.refcount +% rcIncrement if canBeCycleRoot(c): # OPT: the code generator should special case this - possibleRoot(gch, c) + incl(gch.cycleRoots, c) proc nimGCref(p: pointer) {.compilerproc, inline.} = incRef(usrToCell(p)) proc nimGCunref(p: pointer) {.compilerproc, inline.} = decRef(usrToCell(p)) @@ -534,26 +292,6 @@ proc initGC() = gch.mask = 0 new(gOutOfMem) # reserve space for the EOutOfMemory exception here! -proc getDiscriminant(aa: Pointer, n: ptr TNimNode): int = - assert(n.kind == nkCase) - var d: int - var a = cast[TAddress](aa) - case n.typ.size - of 1: d = ze(cast[ptr int8](a +% n.offset)^) - of 2: d = ze(cast[ptr int16](a +% n.offset)^) - of 4: d = int(cast[ptr int32](a +% n.offset)^) - else: assert(false) - return d - -proc selectBranch(aa: Pointer, n: ptr TNimNode): ptr TNimNode = - var discr = getDiscriminant(aa, n) - if discr <% n.len: - result = n.sons[discr] - if result == nil: result = n.sons[n.len] - # n.sons[n.len] contains the ``else`` part (but may be nil) - else: - result = n.sons[n.len] - proc forAllSlotsAux(dest: pointer, n: ptr TNimNode, op: TWalkOp) = var d = cast[TAddress](dest) case n.kind @@ -749,7 +487,7 @@ proc collectCycles(gch: var TGcHeap) = CellSetDeinit(gch.cycleRoots) gch.cycleRoots = newRoots -proc gcMark(p: pointer) = # {.fastcall.} = +proc gcMark(p: pointer) {.noinline.} = # the addresses are not as objects on the stack, so turn them to objects: var cell = usrToCell(p) var c = cast[TAddress](cell) @@ -759,7 +497,7 @@ proc gcMark(p: pointer) = # {.fastcall.} = incl(gch.stackCells, cell) # yes: mark it # ----------------- stack management -------------------------------------- -# inspired from Smart Eiffel (c) +# inspired from Smart Eiffel proc stackSize(): int {.noinline.} = var stackTop: array[0..1, pointer] @@ -885,7 +623,7 @@ else: # in a platform independant way proc markStackAndRegisters(gch: var TGcHeap) {.noinline, cdecl.} = - when true: + when false: # new version: several C compilers are too smart here var max = cast[TAddress](stackBottom) @@ -910,7 +648,7 @@ else: max = stackBottom registers: C_JmpBuf # The jmp_buf buffer is in the C stack. sp: PPointer # Used to traverse the stack and registers assuming - # that `setjmp' will save registers in the C stack. + # that 'setjmp' will save registers in the C stack. if c_setjmp(registers) == 0'i32: # To fill the C stack with registers. sp = cast[ppointer](addr(registers)) while sp <= max: @@ -937,7 +675,7 @@ proc updateZCT() = dec(L) d[j] = d[L] c.refcount = c.refcount and not colorMask - # we have a new cell at position i, so don't increment i + # we have a new cell at position j, so don't increment j else: inc(j) gch.zct.len = L diff --git a/lib/macros.nim b/lib/macros.nim index f2783b637..2c71f31c8 100644 --- a/lib/macros.nim +++ b/lib/macros.nim @@ -58,12 +58,12 @@ type nnkTypeDef, nnkYieldStmt, nnkTryStmt, nnkFinally, nnkRaiseStmt, nnkReturnStmt, nnkBreakStmt, nnkContinueStmt, nnkBlockStmt, nnkDiscardStmt, nnkStmtList, nnkImportStmt, - nnkFromStmt, nnkImportAs, nnkIncludeStmt, nnkAccessStmt, - nnkCommentStmt, nnkStmtListExpr, nnkBlockExpr, nnkStmtListType, - nnkBlockType, nnkVm, nnkTypeOfExpr, nnkObjectTy, - nnkTupleTy, nnkRecList, nnkRecCase, nnkRecWhen, - nnkRefTy, nnkPtrTy, nnkVarTy, nnkProcTy, - nnkEnumTy, nnkEnumFieldDef, nnkReturnToken + nnkFromStmt, nnkImportAs, nnkIncludeStmt, nnkCommentStmt, + nnkStmtListExpr, nnkBlockExpr, nnkStmtListType, nnkBlockType, + nnkVm, nnkTypeOfExpr, nnkObjectTy, nnkTupleTy, + nnkRecList, nnkRecCase, nnkRecWhen, nnkRefTy, + nnkPtrTy, nnkVarTy, nnkProcTy, nnkEnumTy, + nnkEnumFieldDef, nnkReturnToken TNimNodeKinds* = set[TNimrodNodeKind] TNimrodTypeKind* = enum ntyNone, ntyBool, ntyChar, ntyEmpty, @@ -86,12 +86,24 @@ type #[[[end]]] type + TNimrodIdent = object of TObject + ## represents a Nimrod identifier in the AST + TNimrodNode {.final.} = object # hidden TNimrodSymbol {.final.} = object # hidden TNimrodType {.final.} = object # hidden + PNimrodType* {.compilerproc.} = ref TNimrodType + ## represents a Nimrod type in the compiler; currently this is not very + ## useful as there is no API to deal with Nimrod types. + PNimrodSymbol* {.compilerproc.} = ref TNimrodSymbol + ## represents a Nimrod *symbol* in the compiler; a *symbol* is a looked-up + ## *ident*. + PNimrodNode* {.compilerproc.} = ref TNimrodNode + ## represents a Nimrod AST node. Macros operate on this type. + expr* = PNimrodNode stmt* = PNimrodNode @@ -100,23 +112,35 @@ type # its father. How to do this without back references? proc `[]`* (n: PNimrodNode, i: int): PNimrodNode {.magic: "NChild".} + ## get `n`'s `i`'th child. + proc `[]=`* (n: PNimrodNode, i: int, child: PNimrodNode) {.magic: "NSetChild".} - ## provide access to `n`'s children + ## set `n`'s `i`'th child to `child`. -type - TNimrodIdent = object of TObject +proc `!` *(s: string): TNimrodIdent {.magic: "StrToIdent".} + ## constructs an identifier from the string `s` -converter StrToIdent*(s: string): TNimrodIdent {.magic: "StrToIdent".} proc `$`*(i: TNimrodIdent): string {.magic: "IdentToStr".} + ## converts a Nimrod identifier to a string + proc `==`* (a, b: TNimrodIdent): bool {.magic: "EqIdent".} + ## compares two Nimrod identifiers proc len*(n: PNimrodNode): int {.magic: "NLen".} + ## returns the number of children of `n`. -## returns the number of children that a node has proc add*(father, child: PNimrodNode) {.magic: "NAdd".} -proc add*(father: PNimrodNode, child: openArray[PNimrodNode]) {.magic: "NAddMultiple".} + ## adds the `child` to the `father` node + +proc add*(father: PNimrodNode, children: openArray[PNimrodNode]) {. + magic: "NAddMultiple".} + ## adds each `children` to the `father` node + proc del*(father: PNimrodNode, idx = 0, n = 1) {.magic: "NDel".} + ## deletes `n` children of `father` starting at index `idx`. + proc kind*(n: PNimrodNode): TNimrodNodeKind {.magic: "NKind".} + ## returns the `kind` of the node `n`. proc intVal*(n: PNimrodNode): biggestInt {.magic: "NIntVal".} proc floatVal*(n: PNimrodNode): biggestFloat {.magic: "NFloatVal".} @@ -133,43 +157,81 @@ proc `typ=`*(n: PNimrodNode, typ: PNimrodType) {.magic: "NSetType".} proc `strVal=`*(n: PNimrodNode, val: string) {.magic: "NSetStrVal".} proc newNimNode*(kind: TNimrodNodeKind, - n: PNimrodNode=nil): PNimrodNode {.magic: "NNewNimNode".} + n: PNimrodNode=nil): PNimrodNode {.magic: "NNewNimNode".} + proc copyNimNode*(n: PNimrodNode): PNimrodNode {.magic: "NCopyNimNode".} proc copyNimTree*(n: PNimrodNode): PNimrodNode {.magic: "NCopyNimTree".} proc error*(msg: string) {.magic: "NError".} + ## writes an error message at compile time + proc warning*(msg: string) {.magic: "NWarning".} + ## writes a warning message at compile time + proc hint*(msg: string) {.magic: "NHint".} + ## writes a hint message at compile time proc newStrLitNode*(s: string): PNimrodNode {.compileTime.} = + ## creates a string literal node from `s` result = newNimNode(nnkStrLit) result.strVal = s proc newIntLitNode*(i: biggestInt): PNimrodNode {.compileTime.} = + ## creates a int literal node from `i` result = newNimNode(nnkIntLit) result.intVal = i -proc newIntLitNode*(f: biggestFloat): PNimrodNode {.compileTime.} = +proc newFloatLitNode*(f: biggestFloat): PNimrodNode {.compileTime.} = + ## creates a float literal node from `f` result = newNimNode(nnkFloatLit) result.floatVal = f proc newIdentNode*(i: TNimrodIdent): PNimrodNode {.compileTime.} = + ## creates an identifier node from `i` result = newNimNode(nnkIdent) result.ident = i + +proc newIdentNode*(i: string): PNimrodNode {.compileTime.} = + ## creates an identifier node from `i` + result = newNimNode(nnkIdent) + result.ident = !i proc toStrLit*(n: PNimrodNode): PNimrodNode {.compileTime.} = + ## converts the AST `n` to the concrete Nimrod code and wraps that + ## in a string literal node return newStrLitNode(repr(n)) proc expectKind*(n: PNimrodNode, k: TNimrodNodeKind) {.compileTime.} = + ## checks that `n` is of kind `k`. If this is not the case, + ## compilation aborts with an error message. This is useful for writing + ## macros that check the AST that is passed to them. if n.kind != k: error("macro expects a node of kind: " & repr(k)) proc expectMinLen*(n: PNimrodNode, min: int) {.compileTime.} = + ## checks that `n` has at least `min` children. If this is not the case, + ## compilation aborts with an error message. This is useful for writing + ## macros that check its number of arguments. if n.len < min: error("macro expects a node with " & $min & " children") +proc expectLen*(n: PNimrodNode, len: int) {.compileTime.} = + ## checks that `n` has exactly `len` children. If this is not the case, + ## compilation aborts with an error message. This is useful for writing + ## macros that check its number of arguments. + if n.len != len: error("macro expects a node with " & $len & " children") + proc newCall*(theProc: TNimrodIdent, args: openArray[PNimrodNode]): PNimrodNode {.compileTime.} = ## produces a new call node. `theProc` is the proc that is called with ## the arguments ``args[0..]``. result = newNimNode(nnkCall) result.add(newIdentNode(theProc)) + result.add(args) + +proc newCall*(theProc: string, + args: openArray[PNimrodNode]): PNimrodNode {.compileTime.} = + ## produces a new call node. `theProc` is the proc that is called with + ## the arguments ``args[0..]``. + result = newNimNode(nnkCall) + result.add(newIdentNode(theProc)) result.add(args) + diff --git a/lib/math.nim b/lib/math.nim index 57c1c7e3d..31783efce 100644 --- a/lib/math.nim +++ b/lib/math.nim @@ -51,6 +51,20 @@ proc classify*(x: float): TFloatClass = # XXX: fcSubnormal is not detected! +proc binom*(n, k: int): int {.noSideEffect.} = + ## computes the binomial coefficient + if k <= 0: return 1 + if 2*k > n: return binom(n, n-k) + result = n + for i in countup(2, k): + result = (result * (n + 1 - i)) div i + +proc fac*(n: int): int {.noSideEffect.} = + ## computes the faculty function + result = 1 + for i in countup(2, n): + result = result * i + proc isPowerOfTwo*(x: int): bool {.noSideEffect.} = ## returns true, if x is a power of two, false otherwise. ## Negative numbers are not a power of two. @@ -74,6 +88,25 @@ proc countBits*(n: int32): int {.noSideEffect.} include cntbits +proc sum*[T](x: openarray[T]): T {.noSideEffect.} = + ## computes the sum of the elements in `x`. + ## If `x` is empty, 0 is returned. + for i in items(x): result = result + i + +proc mean*(x: openarray[float]): float {.noSideEffect.} = + ## computes the mean of the elements in `x`. + ## If `x` is empty, NaN is returned. + result = sum(x) / toFloat(len(x)) + +proc variance*(x: openarray[float]): float {.noSideEffect.} = + ## computes the mean of the elements in `x`. + ## If `x` is empty, NaN is returned. + result = 0.0 + var m = mean(x) + for i in 0 .. high(x): + var diff = x[i] - m + result = result + diff*diff + result = result / toFloat(len(x)) when not defined(ECMAScript): proc random*(max: int): int diff --git a/lib/memman.nim b/lib/memman.nim index e8ebcd61c..249607e2d 100644 --- a/lib/memman.nim +++ b/lib/memman.nim @@ -360,7 +360,7 @@ proc findSuitableBlock(t: var TLSF, fl, sl: var int): Pbhdr = proc extractBlockHdr(b: Pbhdr, t: var TLSF, fl, sl: int) {.inline.} = t.matrix[fl][sl] = b.freePtr.next - if t.matrix[fl][sl] != 0: + if t.matrix[fl][sl] != nil: t.matrix[fl][sl].freePtr.prev = nil else: clear_bit(sl, t.slBitmap[fl]) diff --git a/lib/nimbase.h b/lib/nimbase.h index 378b66278..5041edf63 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -1,12 +1,24 @@ /* Nimrod's Runtime Library - (c) Copyright 2008 Andreas Rumpf + (c) Copyright 2009 Andreas Rumpf See the file "copying.txt", included in this distribution, for details about the copyright. */ +/* compiler symbols: +__BORLANDC__ +_MSC_VER +__WATCOMC__ +__LCC__ +__GNUC__ +__DMC__ +__POCC__ +__TINYC__ +*/ + + #ifndef NIMBASE_H #define NIMBASE_H @@ -239,17 +251,6 @@ static unsigned long nimInf[2]={0xffffffff, 0x7fffffff}; # define INF (*(double*) nimInf) #endif */ -/* compiler symbols: -__BORLANDC__ -_MSC_VER -__WATCOMC__ -__LCC__ -__GNUC__ -__DMC__ -__POCC__ -__TINYC__ -*/ - /* C99 compiler? */ #if (defined(__STD_VERSION__) && (__STD_VERSION__ >= 199901)) # define HAVE_STDINT_H diff --git a/lib/os.nim b/lib/os.nim index bffc6014c..b69002715 100644 --- a/lib/os.nim +++ b/lib/os.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -178,12 +178,14 @@ proc ExistsFile*(filename: string): bool proc JoinPath*(head, tail: string): string {.noSideEffect.} ## Joins two directory names to one. ## - ## For example on Unix:: + ## For example on Unix: ## + ## ..code-block:: nimrod ## JoinPath("usr", "lib") ## - ## results in:: + ## results in: ## + ## ..code-block:: nimrod ## "usr/lib" ## ## If head is the empty string, tail is returned. @@ -312,7 +314,7 @@ proc createDir*(dir: string) ## ## The directory may contain several ## subdirectories that do not exist yet. The full path is created. If this - ## fails, `EOS` is raised. It does NOT fail if the path already exists + ## fails, `EOS` is raised. It does **not** fail if the path already exists ## because for most usages this does not indicate an error. proc existsDir*(dir: string): bool @@ -650,8 +652,7 @@ proc searchExtPos(s: string): int = break # do not skip over path proc SplitFilename(filename: string, name, extension: var string) = - var - extPos = searchExtPos(filename) + var extPos = searchExtPos(filename) if extPos >= 0: name = copy(filename, 0, extPos-1) extension = copy(filename, extPos) @@ -664,14 +665,12 @@ proc normExt(ext: string): string = else: result = extSep & ext proc ChangeFileExt(filename, ext: string): string = - var - extPos = searchExtPos(filename) + var extPos = searchExtPos(filename) if extPos < 0: result = filename & normExt(ext) else: result = copy(filename, 0, extPos-1) & normExt(ext) proc AppendFileExt(filename, ext: string): string = - var - extPos = searchExtPos(filename) + var extPos = searchExtPos(filename) if extPos < 0: result = filename & normExt(ext) else: result = filename #make a string copy here @@ -850,12 +849,12 @@ proc rawCreateDir(dir: string) = OSError() proc createDir(dir: string) = - for i in 0.. dir.len-1: + for i in 1.. dir.len-1: if dir[i] in {dirsep, altsep}: rawCreateDir(copy(dir, 0, i-1)) rawCreateDir(dir) proc executeShellCommand(command: string): int = - return csystem(command) + result = csystem(command) var envComputed: bool = false @@ -892,8 +891,7 @@ else: proc getEnvVarsC() = # retrieves the variables of char** env of C's main proc if not envComputed: - var - i: int = 0 + var i = 0 while True: if gEnv[i] == nil: break add environment, $gEnv[i] @@ -904,13 +902,13 @@ proc findEnvVar(key: string): int = getEnvVarsC() var temp = key & '=' for i in 0..high(environment): - if findSubStr(temp, environment[i]) == 0: return i + if startsWith(environment[i], temp): return i return -1 proc getEnv(key: string): string = var i = findEnvVar(key) if i >= 0: - return copy(environment[i], findSubStr("=", environment[i])+1) + return copy(environment[i], find(environment[i], '=')+1) else: var env = cgetenv(key) if env == nil: return "" @@ -925,7 +923,7 @@ iterator iterOverEnvironment*(): tuple[key, value: string] = ## tuple is the name of the current variable stored, in the second its value. getEnvVarsC() for i in 0..high(environment): - var p = findSubStr("=", environment[i]) + var p = find(environment[i], '=') yield (copy(environment[i], 0, p-1), copy(environment[i], p+1)) proc putEnv(key, val: string) = @@ -1140,7 +1138,7 @@ else: proc GetConfigDir(): string = return getEnv("HOME") & "/.config/" var - cmdCount {.importc: "cmdCount".}: int + cmdCount {.importc: "cmdCount".}: cint cmdLine {.importc: "cmdLine".}: cstringArray proc paramStr(i: int): string = diff --git a/lib/parsecfg.nim b/lib/parsecfg.nim index 2508c8bd6..29ba8b4ad 100644 --- a/lib/parsecfg.nim +++ b/lib/parsecfg.nim @@ -10,7 +10,7 @@ ## The ``parsecfg`` module implements a high performance configuration file ## parser. The configuration file's syntax is similar to the Windows ``.ini`` ## format, but much more powerful, as it is not a line based parser. String -## literals, raw string literals and triple quote string literals are supported +## literals, raw string literals and triple quoted string literals are supported ## as in the Nimrod programming language. ## This is an example of how a configuration file may look like: @@ -135,7 +135,6 @@ proc handleDecChars(c: var TCfgParser, xi: var int) = inc(c.bufpos) proc getEscapedChar(c: var TCfgParser, tok: var TToken) = - var xi: int inc(c.bufpos) # skip '\' case c.buf[c.bufpos] of 'n', 'N': @@ -173,12 +172,12 @@ proc getEscapedChar(c: var TCfgParser, tok: var TToken) = Inc(c.bufpos) of 'x', 'X': inc(c.bufpos) - xi = 0 + var xi = 0 handleHexChar(c, xi) handleHexChar(c, xi) add(tok.literal, Chr(xi)) of '0'..'9': - xi = 0 + var xi = 0 handleDecChars(c, xi) if (xi <= 255): add(tok.literal, Chr(xi)) else: tok.kind = tkInvalid @@ -191,12 +190,8 @@ proc HandleCRLF(c: var TCfgParser, pos: int): int = else: result = pos proc getString(c: var TCfgParser, tok: var TToken, rawMode: bool) = - var - pos: int - ch: Char - buf: cstring - pos = c.bufPos + 1 # skip " - buf = c.buf # put `buf` in a register + var pos = c.bufPos + 1 # skip " + var buf = c.buf # put `buf` in a register tok.kind = tkSymbol if (buf[pos] == '\"') and (buf[pos + 1] == '\"'): # long string literal: @@ -211,19 +206,18 @@ proc getString(c: var TCfgParser, tok: var TToken, rawMode: bool) = Inc(pos) of '\c', '\L': pos = HandleCRLF(c, pos) - tok.literal = tok.literal & nl + add(tok.literal, nl) of lexbase.EndOfFile: tok.kind = tkInvalid break else: add(tok.literal, buf[pos]) Inc(pos) - c.bufpos = pos + - 3 # skip the three """ + c.bufpos = pos + 3 # skip the three """ else: # ordinary string literal while true: - ch = buf[pos] + var ch = buf[pos] if ch == '\"': inc(pos) # skip '"' break @@ -240,11 +234,8 @@ proc getString(c: var TCfgParser, tok: var TToken, rawMode: bool) = c.bufpos = pos proc getSymbol(c: var TCfgParser, tok: var TToken) = - var - pos: int - buf: cstring - pos = c.bufpos - buf = c.buf + var pos = c.bufpos + var buf = c.buf while true: add(tok.literal, buf[pos]) Inc(pos) @@ -253,11 +244,8 @@ proc getSymbol(c: var TCfgParser, tok: var TToken) = tok.kind = tkSymbol proc skip(c: var TCfgParser) = - var - buf: cstring - pos: int - pos = c.bufpos - buf = c.buf + var pos = c.bufpos + var buf = c.buf while true: case buf[pos] of ' ', '\t': diff --git a/lib/parseopt.nim b/lib/parseopt.nim index 1cce0a11e..12060ba70 100644 --- a/lib/parseopt.nim +++ b/lib/parseopt.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -73,8 +73,7 @@ proc parseWord(s: string, i: int, w: var string, inc(result) proc handleShortOption(p: var TOptParser) = - var i: int - i = p.pos + var i = p.pos p.kind = cmdShortOption add(p.key, p.cmd[i]) inc(i) @@ -91,8 +90,7 @@ proc handleShortOption(p: var TOptParser) = p.pos = i proc next(p: var TOptParser) = - var i: int - i = p.pos + var i = p.pos while p.cmd[i] in {'\x09', ' '}: inc(i) p.pos = i setlen(p.key, 0) diff --git a/lib/posix/posix.nim b/lib/posix/posix.nim index 38677420d..570c24980 100644 --- a/lib/posix/posix.nim +++ b/lib/posix/posix.nim @@ -1,15 +1,16 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. # -# Until ndbm!! +# Until std_arg!! # done: ipc, pwd, stat, semaphore, sys/types, sys/utsname, pthread, unistd, -# statvfs, mman, time, wait, signal, nl_types, sched, spawn, select, ucontext +# statvfs, mman, time, wait, signal, nl_types, sched, spawn, select, ucontext, +# net/if, sys/socket, sys/uio, netinet/in, netinet/tcp, netdb ## This is a raw POSIX interface module. It does not not provide any ## convenience: cstrings are used instead of proper Nimrod strings and @@ -60,24 +61,26 @@ const MM_NULLTAG* = nil STDERR_FILENO* = 2 ## File number of stderr; - STDIN_FILENO* = 0 ## File number of stdin; + STDIN_FILENO* = 0 ## File number of stdin; STDOUT_FILENO* = 1 ## File number of stdout; type TDIR* {.importc: "DIR", header: "<dirent.h>", final, pure.} = object ## A type representing a directory stream. - Tdirent* {.importc: "struct dirent", header: "<dirent.h>", final, pure.} = object + Tdirent* {.importc: "struct dirent", + header: "<dirent.h>", final, pure.} = object ## dirent_t struct d_ino*: TIno ## File serial number. d_name*: array [0..255, char] ## Name of entry. - Tflock* {.importc: "flock", header: "<fcntl.h>", final, pure.} = object - l_type*: cshort ## Type of lock; F_RDLCK, F_WRLCK, F_UNLCK. + Tflock* {.importc: "flock", final, pure, + header: "<fcntl.h>".} = object ## flock type + l_type*: cshort ## Type of lock; F_RDLCK, F_WRLCK, F_UNLCK. l_whence*: cshort ## Flag for starting offset. - l_start*: Toff ## Relative offset in bytes. - l_len*: Toff ## Size; if 0 then until EOF. - l_pid*: TPid ## Process ID of the process holding the lock; - ## returned with F_GETLK. + l_start*: Toff ## Relative offset in bytes. + l_len*: Toff ## Size; if 0 then until EOF. + l_pid*: TPid ## Process ID of the process holding the lock; + ## returned with F_GETLK. Tfenv* {.importc: "fenv_t", header: "<fenv.h>", final, pure.} = object ## Represents the entire floating-point environment. The @@ -99,14 +102,16 @@ type base*: cint level*: cint - TGlob* {.importc: "glob_t", header: "<glob.h>", final, pure.} = object - gl_pathc*: int ## Count of paths matched by pattern. + TGlob* {.importc: "glob_t", header: "<glob.h>", + final, pure.} = object ## glob_t + gl_pathc*: int ## Count of paths matched by pattern. gl_pathv*: ptr cstring ## Pointer to a list of matched pathnames. - gl_offs*: int ## Slots to reserve at the beginning of gl_pathv. + gl_offs*: int ## Slots to reserve at the beginning of gl_pathv. - TGroup* {.importc: "struct group", header: "<grp.h>", final, pure.} = object - gr_name*: cstring ## The name of the group. - gr_gid*: TGid ## Numerical group ID. + TGroup* {.importc: "struct group", header: "<grp.h>", + final, pure.} = object ## struct group + gr_name*: cstring ## The name of the group. + gr_gid*: TGid ## Numerical group ID. gr_mem*: cstringArray ## Pointer to a null-terminated array of character ## pointers to member names. @@ -140,18 +145,21 @@ type thousands_sep*: cstring TMqd* {.importc: "mqd_t", header: "<mqueue.h>", final, pure.} = object - TMqAttr* {.importc: "struct mq_attr", header: "<mqueue.h>", final, pure.} = object - mq_flags*: int ## Message queue flags. - mq_maxmsg*: int ## Maximum number of messages. - mq_msgsize*: int ## Maximum message size. - mq_curmsgs*: int ## Number of messages currently queued. - - TPasswd* {.importc: "struct passwd", header: "<pwd.h>", final, pure.} = object - pw_name*: cstring ## User's login name. - pw_uid*: TUid ## Numerical user ID. - pw_gid*: TGid ## Numerical group ID. - pw_dir*: cstring ## Initial working directory. - pw_shell*: cstring ## Program to use as shell. + TMqAttr* {.importc: "struct mq_attr", + header: "<mqueue.h>", + final, pure.} = object ## message queue attribute + mq_flags*: int ## Message queue flags. + mq_maxmsg*: int ## Maximum number of messages. + mq_msgsize*: int ## Maximum message size. + mq_curmsgs*: int ## Number of messages currently queued. + + TPasswd* {.importc: "struct passwd", header: "<pwd.h>", + final, pure.} = object ## struct passwd + pw_name*: cstring ## User's login name. + pw_uid*: TUid ## Numerical user ID. + pw_gid*: TGid ## Numerical group ID. + pw_dir*: cstring ## Initial working directory. + pw_shell*: cstring ## Program to use as shell. Tblkcnt* {.importc: "blkcnt_t", header: "<sys/types.h>".} = int ## used for file block counts @@ -171,30 +179,40 @@ type TOff* {.importc: "off_t", header: "<sys/types.h>".} = int64 TPid* {.importc: "pid_t", header: "<sys/types.h>".} = int Tpthread_attr* {.importc: "pthread_attr_t", header: "<sys/types.h>".} = int - Tpthread_barrier* {.importc: "pthread_barrier_t", header: "<sys/types.h>".} = int - Tpthread_barrierattr* {.importc: "pthread_barrierattr_t", header: "<sys/types.h>".} = int + Tpthread_barrier* {.importc: "pthread_barrier_t", + header: "<sys/types.h>".} = int + Tpthread_barrierattr* {.importc: "pthread_barrierattr_t", + header: "<sys/types.h>".} = int Tpthread_cond* {.importc: "pthread_cond_t", header: "<sys/types.h>".} = int - Tpthread_condattr* {.importc: "pthread_condattr_t", header: "<sys/types.h>".} = int + Tpthread_condattr* {.importc: "pthread_condattr_t", + header: "<sys/types.h>".} = int Tpthread_key* {.importc: "pthread_key_t", header: "<sys/types.h>".} = int Tpthread_mutex* {.importc: "pthread_mutex_t", header: "<sys/types.h>".} = int - Tpthread_mutexattr* {.importc: "pthread_mutexattr_t", header: "<sys/types.h>".} = int + Tpthread_mutexattr* {.importc: "pthread_mutexattr_t", + header: "<sys/types.h>".} = int Tpthread_once* {.importc: "pthread_once_t", header: "<sys/types.h>".} = int Tpthread_rwlock* {.importc: "pthread_rwlock_t", header: "<sys/types.h>".} = int - Tpthread_rwlockattr* {.importc: "pthread_rwlockattr_t", header: "<sys/types.h>".} = int - Tpthread_spinlock* {.importc: "pthread_spinlock_t", header: "<sys/types.h>".} = int + Tpthread_rwlockattr* {.importc: "pthread_rwlockattr_t", + header: "<sys/types.h>".} = int + Tpthread_spinlock* {.importc: "pthread_spinlock_t", + header: "<sys/types.h>".} = int Tpthread* {.importc: "pthread_t", header: "<sys/types.h>".} = int Tsuseconds* {.importc: "suseconds_t", header: "<sys/types.h>".} = int Ttime* {.importc: "time_t", header: "<sys/types.h>".} = int Ttimer* {.importc: "timer_t", header: "<sys/types.h>".} = int Ttrace_attr* {.importc: "trace_attr_t", header: "<sys/types.h>".} = int - Ttrace_event_id* {.importc: "trace_event_id_t", header: "<sys/types.h>".} = int - Ttrace_event_set* {.importc: "trace_event_set_t", header: "<sys/types.h>".} = int + Ttrace_event_id* {.importc: "trace_event_id_t", + header: "<sys/types.h>".} = int + Ttrace_event_set* {.importc: "trace_event_set_t", + header: "<sys/types.h>".} = int Ttrace_id* {.importc: "trace_id_t", header: "<sys/types.h>".} = int Tuid* {.importc: "uid_t", header: "<sys/types.h>".} = int Tuseconds* {.importc: "useconds_t", header: "<sys/types.h>".} = int - Tutsname* {.importc: "struct utsname", header: "<sys/utsname.h>", final, pure.} = object - sysname*, ## Name of this implementation of the operating system. + Tutsname* {.importc: "struct utsname", + header: "<sys/utsname.h>", + final, pure.} = object ## struct utsname + sysname*, ## Name of this implementation of the operating system. nodename*, ## Name of this node within the communications ## network to which this node is attached, if any. release*, ## Current release level of this implementation. @@ -203,58 +221,63 @@ type ## system is running. TSem* {.importc: "sem_t", header: "<semaphore.h>", final, pure.} = object - Tipc_perm* {.importc: "struct ipc_perm", header: "<sys/ipc.h>", final, pure.} = object + Tipc_perm* {.importc: "struct ipc_perm", + header: "<sys/ipc.h>", final, pure.} = object ## struct ipc_perm uid*: tuid ## Owner's user ID. gid*: tgid ## Owner's group ID. cuid*: Tuid ## Creator's user ID. cgid*: Tgid ## Creator's group ID. - mode*: TMode ## Read/write permission. + mode*: TMode ## Read/write permission. - TStat* {.importc: "struct stat", header: "<sys/stat.h>", final, pure.} = object - st_dev*: TDev ## Device ID of device containing file. - st_ino*: TIno ## File serial number. - st_mode*: TMode ## Mode of file (see below). - st_nlink*: tnlink ## Number of hard links to the file. - st_uid*: tuid ## User ID of file. - st_gid*: Tgid ## Group ID of file. - st_rdev*: TDev ## Device ID (if file is character or block special). - st_size*: TOff ## For regular files, the file size in bytes. - ## For symbolic links, the length in bytes of the - ## pathname contained in the symbolic link. - ## For a shared memory object, the length in bytes. - ## For a typed memory object, the length in bytes. - ## For other file types, the use of this field is - ## unspecified. - st_atime*: ttime ## Time of last access. - st_mtime*: ttime ## Time of last data modification. - st_ctime*: ttime ## Time of last status change. - st_blksize*: Tblksize ## A file system-specific preferred I/O block size - ## for this object. In some file system types, this - ## may vary from file to file. - st_blocks*: Tblkcnt ## Number of blocks allocated for this object. + TStat* {.importc: "struct stat", + header: "<sys/stat.h>", final, pure.} = object ## struct stat + st_dev*: TDev ## Device ID of device containing file. + st_ino*: TIno ## File serial number. + st_mode*: TMode ## Mode of file (see below). + st_nlink*: tnlink ## Number of hard links to the file. + st_uid*: tuid ## User ID of file. + st_gid*: Tgid ## Group ID of file. + st_rdev*: TDev ## Device ID (if file is character or block special). + st_size*: TOff ## For regular files, the file size in bytes. + ## For symbolic links, the length in bytes of the + ## pathname contained in the symbolic link. + ## For a shared memory object, the length in bytes. + ## For a typed memory object, the length in bytes. + ## For other file types, the use of this field is + ## unspecified. + st_atime*: ttime ## Time of last access. + st_mtime*: ttime ## Time of last data modification. + st_ctime*: ttime ## Time of last status change. + st_blksize*: Tblksize ## A file system-specific preferred I/O block size + ## for this object. In some file system types, this + ## may vary from file to file. + st_blocks*: Tblkcnt ## Number of blocks allocated for this object. - TStatvfs* {.importc: "struct statvfs", header: "<sys/statvfs.h>", final, pure.} = object - f_bsize*: int ## File system block size. - f_frsize*: int ## Fundamental file system block size. - f_blocks*: Tfsblkcnt ## Total number of blocks on file system in units of f_frsize. + TStatvfs* {.importc: "struct statvfs", header: "<sys/statvfs.h>", + final, pure.} = object ## struct statvfs + f_bsize*: int ## File system block size. + f_frsize*: int ## Fundamental file system block size. + f_blocks*: Tfsblkcnt ## Total number of blocks on file system + ## in units of f_frsize. f_bfree*: Tfsblkcnt ## Total number of free blocks. f_bavail*: Tfsblkcnt ## Number of free blocks available to ## non-privileged process. f_files*: Tfsfilcnt ## Total number of file serial numbers. - f_ffree*: Tfsfilcnt ## Total number of free file serial numbers. - f_favail*: Tfsfilcnt ## Number of file serial numbers available to - ## non-privileged process. - f_fsid*: int ## File system ID. - f_flag*: int ## Bit mask of f_flag values. - f_namemax*: int ## Maximum filename length. + f_ffree*: Tfsfilcnt ## Total number of free file serial numbers. + f_favail*: Tfsfilcnt ## Number of file serial numbers available to + ## non-privileged process. + f_fsid*: int ## File system ID. + f_flag*: int ## Bit mask of f_flag values. + f_namemax*: int ## Maximum filename length. Tposix_typed_mem_info* {.importc: "struct posix_typed_mem_info", header: "<sys/mman.h>", final, pure.} = object posix_tmi_length*: int - Ttm* {.importc: "struct tm", header: "<time.h>", final, pure.} = object - tm_sec*: cint ## Seconds [0,60]. + Ttm* {.importc: "struct tm", header: "<time.h>", + final, pure.} = object ## struct tm + tm_sec*: cint ## Seconds [0,60]. tm_min*: cint ## Minutes [0,59]. tm_hour*: cint ## Hour [0,23]. tm_mday*: cint ## Day of month [1,31]. @@ -263,10 +286,12 @@ type tm_wday*: cint ## Day of week [0,6] (Sunday =0). tm_yday*: cint ## Day of year [0,365]. tm_isdst*: cint ## Daylight Savings flag. - Ttimespec* {.importc: "struct timespec", header: "<time.h>", final, pure.} = object + Ttimespec* {.importc: "struct timespec", + header: "<time.h>", final, pure.} = object ## struct timespec tv_sec*: Ttime ## Seconds. - tv_nsec*: int ## Nanoseconds. - titimerspec* {.importc: "struct itimerspec", header: "<time.h>", final, pure.} = object + tv_nsec*: int ## Nanoseconds. + titimerspec* {.importc: "struct itimerspec", header: "<time.h>", + final, pure.} = object ## struct itimerspec it_interval*: ttimespec ## Timer period. it_value*: ttimespec ## Timer expiration. @@ -276,17 +301,20 @@ type ## interrupts. Tsigset* {.importc: "sigset_t", header: "<signal.h>", final, pure.} = object - TsigEvent* {.importc: "struct sigevent", header: "<signal.h>", final, pure.} = object + TsigEvent* {.importc: "struct sigevent", + header: "<signal.h>", final, pure.} = object ## struct sigevent sigev_notify*: cint ## Notification type. sigev_signo*: cint ## Signal number. - sigev_value*: Tsigval ## Signal value. - sigev_notify_function*: proc (x: TSigval) {.noconv.} ## Notification function. + sigev_value*: Tsigval ## Signal value. + sigev_notify_function*: proc (x: TSigval) {.noconv.} ## Notification function. sigev_notify_attributes*: ptr Tpthreadattr ## Notification attributes. - TsigVal* {.importc: "union sigval", header: "<signal.h>", final, pure.} = object + TsigVal* {.importc: "union sigval", + header: "<signal.h>", final, pure.} = object ## struct sigval sival_ptr*: pointer ## pointer signal value; ## integer signal value not defined! - TSigaction* {.importc: "struct sigaction", header: "<signal.h>", final, pure.} = object + TSigaction* {.importc: "struct sigaction", + header: "<signal.h>", final, pure.} = object ## struct sigaction sa_handler*: proc (x: cint) {.noconv.} ## Pointer to a signal-catching ## function or one of the macros ## SIG_IGN or SIG_DFL. @@ -295,70 +323,222 @@ type sa_flags*: cint ## Special flags. sa_sigaction*: proc (x: cint, y: var TSigInfo, z: pointer) {.noconv.} - TStack* {.importc: "stack_t", header: "<signal.h>", final, pure.} = object - ss_sp*: pointer ## Stack base or pointer. - ss_size*: int ## Stack size. - ss_flags*: cint ## Flags. - - TSigStack* {.importc: "struct sigstack", header: "<signal.h>", final, pure.} = object - ss_onstack*: cint ## Non-zero when signal stack is in use. - ss_sp*: pointer ## Signal stack pointer. - - TsigInfo* {.importc: "siginfo_t", header: "<signal.h>", final, pure.} = object - si_signo*: cint ## Signal number. - si_code*: cint ## Signal code. - si_errno*: cint ## If non-zero, an errno value associated with - ## this signal, as defined in <errno.h>. - si_pid*: tpid ## Sending process ID. - si_uid*: tuid ## Real user ID of sending process. - si_addr*: pointer ## Address of faulting instruction. - si_status*: cint ## Exit value or signal. - si_band*: int ## Band event for SIGPOLL. + TStack* {.importc: "stack_t", + header: "<signal.h>", final, pure.} = object ## stack_t + ss_sp*: pointer ## Stack base or pointer. + ss_size*: int ## Stack size. + ss_flags*: cint ## Flags. + + TSigStack* {.importc: "struct sigstack", + header: "<signal.h>", final, pure.} = object ## struct sigstack + ss_onstack*: cint ## Non-zero when signal stack is in use. + ss_sp*: pointer ## Signal stack pointer. + + TsigInfo* {.importc: "siginfo_t", + header: "<signal.h>", final, pure.} = object ## siginfo_t + si_signo*: cint ## Signal number. + si_code*: cint ## Signal code. + si_errno*: cint ## If non-zero, an errno value associated with + ## this signal, as defined in <errno.h>. + si_pid*: tpid ## Sending process ID. + si_uid*: tuid ## Real user ID of sending process. + si_addr*: pointer ## Address of faulting instruction. + si_status*: cint ## Exit value or signal. + si_band*: int ## Band event for SIGPOLL. si_value*: TSigval ## Signal value. Tnl_item* {.importc: "nl_item", header: "<nl_types.h>".} = cint Tnl_catd* {.importc: "nl_catd", header: "<nl_types.h>".} = cint - Tsched_param* {.importc: "struct sched_param", header: "<sched.h>", final, pure.} = object + Tsched_param* {.importc: "struct sched_param", + header: "<sched.h>", + final, pure.} = object ## struct sched_param sched_priority*: cint - sched_ss_low_priority*: cint ## Low scheduling priority for - ## sporadic server. + sched_ss_low_priority*: cint ## Low scheduling priority for + ## sporadic server. sched_ss_repl_period*: ttimespec ## Replenishment period for ## sporadic server. - sched_ss_init_budget*: ttimespec ## Initial budget for sporadic server. - sched_ss_max_repl*: cint ## Maximum pending replenishments for - ## sporadic server. - - Ttimeval* {.importc: "struct timeval", header: "<sys/select.h>", final, pure.} = object - tv_sec*: ttime ## Seconds. - tv_usec*: tsuseconds ## Microseconds. - Tfd_set* {.importc: "struct fd_set", header: "<sys/select.h>", final, pure.} = object - Tmcontext* {.importc: "mcontext_t", header: "<ucontext.h>", final, pure.} = object - Tucontext* {.importc: "ucontext_t", header: "<ucontext.h>", final, pure.} = object + sched_ss_init_budget*: ttimespec ## Initial budget for sporadic server. + sched_ss_max_repl*: cint ## Maximum pending replenishments for + ## sporadic server. + + Ttimeval* {.importc: "struct timeval", header: "<sys/select.h>", + final, pure.} = object ## struct timeval + tv_sec*: ttime ## Seconds. + tv_usec*: tsuseconds ## Microseconds. + Tfd_set* {.importc: "struct fd_set", header: "<sys/select.h>", + final, pure.} = object + Tmcontext* {.importc: "mcontext_t", header: "<ucontext.h>", + final, pure.} = object + Tucontext* {.importc: "ucontext_t", header: "<ucontext.h>", + final, pure.} = object ## ucontext_t uc_link*: ptr Tucontext ## Pointer to the context that is resumed ## when this context returns. - uc_sigmask*: Tsigset ## The set of signals that are blocked when this - ## context is active. - uc_stack*: TStack ## The stack used by this context. + uc_sigmask*: Tsigset ## The set of signals that are blocked when this + ## context is active. + uc_stack*: TStack ## The stack used by this context. uc_mcontext*: Tmcontext ## A machine-specific representation of the saved ## context. when hasAioH: type - Taiocb* {.importc: "struct aiocb", header: "<aio.h>", final, pure.} = object - aio_fildes*: cint ## File descriptor. - aio_offset*: TOff ## File offset. - aio_buf*: pointer ## Location of buffer. - aio_nbytes*: int ## Length of transfer. - aio_reqprio*: cint ## Request priority offset. + Taiocb* {.importc: "struct aiocb", header: "<aio.h>", + final, pure.} = object ## struct aiocb + aio_fildes*: cint ## File descriptor. + aio_offset*: TOff ## File offset. + aio_buf*: pointer ## Location of buffer. + aio_nbytes*: int ## Length of transfer. + aio_reqprio*: cint ## Request priority offset. aio_sigevent*: TSigEvent ## Signal number and value. - aio_lio_opcode: cint ## Operation to be performed. + aio_lio_opcode: cint ## Operation to be performed. when hasSpawnH: type - Tposix_spawnattr* {.importc: "posix_spawnattr_t", header: "<spawn.h>".} = cint - Tposix_spawn_file_actions* {.importc: "posix_spawn_file_actions_t", header: "<spawn.h>".} = cint - + Tposix_spawnattr* {.importc: "posix_spawnattr_t", + header: "<spawn.h>".} = cint + Tposix_spawn_file_actions* {.importc: "posix_spawn_file_actions_t", + header: "<spawn.h>".} = cint + +type + Tif_nameindex* {.importc: "struct if_nameindex", final, + pure, header: "<net/if.h>".} = object ## struct if_nameindex + if_index*: cint ## Numeric index of the interface. + if_name*: cstring ## Null-terminated name of the interface. + + TSocklen* {.importc: "socklen_t", header: "<sys/socket.h>".} = cint + TSa_Family* {.importc: "sa_family_t", header: "<sys/socket.h>".} = cint + + TSockAddr* {.importc: "struct sockaddr", header: "<sys/socket.h>", + pure, final.} = object ## struct sockaddr + sa_family*: Tsa_family ## Address family. + sa_data*: array [0..255, char] ## Socket address (variable-length data). + + Tsockaddr_storage* {.importc: "struct sockaddr_storage", + header: "<sys/socket.h>", + pure, final.} = object ## struct sockaddr_storage + ss_family*: Tsa_family ## Address family. + + TIOVec* {.importc: "struct iovec", pure, final, + header: "<sys/uio.h>".} = object ## struct iovec + iov_base*: pointer ## Base address of a memory region for input or output. + iov_len*: int ## The size of the memory pointed to by iov_base. + + Tmsghdr* {.importc: "struct msghdr", pure, final, + header: "<sys/socket.h>".} = object ## struct msghdr + msg_name*: pointer ## Optional address. + msg_namelen*: TSockLen ## Size of address. + msg_iov*: ptr TIOVec ## Scatter/gather array. + msg_iovlen*: cint ## Members in msg_iov. + msg_control*: pointer ## Ancillary data; see below. + msg_controllen*: TSockLen ## Ancillary data buffer len. + msg_flags*: cint ## Flags on received message. + + + Tcmsghdr* {.importc: "struct cmsghdr", pure, final, + header: "<sys/socket.h>".} = object ## struct cmsghdr + cmsg_len*: TSockLen ## Data byte count, including the cmsghdr. + cmsg_level*: cint ## Originating protocol. + cmsg_type*: cint ## Protocol-specific type. + + TLinger* {.importc: "struct linger", pure, final, + header: "<sys/socket.h>".} = object ## struct linger + l_onoff*: cint ## Indicates whether linger option is enabled. + l_linger*: cint ## Linger time, in seconds. + + TInPort* = int16 ## unsigned! + TInAddrScalar* = int32 ## unsigned! + + TInAddr* {.importc: "struct in_addr", pure, final, + header: "<netinet/in.h>".} = object ## struct in_addr + s_addr*: TInAddrScalar + + Tsockaddr_in* {.importc: "struct sockaddr_in", pure, final, + header: "<netinet/in.h>".} = object ## struct sockaddr_in + sin_family*: TSa_family ## AF_INET. + sin_port*: TInPort ## Port number. + sin_addr*: TInAddr ## IP address. + + TIn6Addr* {.importc: "struct in6_addr", pure, final, + header: "<netinet/in.h>".} = object ## struct in6_addr + s6_addr*: array [0..15, char] + + Tsockaddr_in6* {.importc: "struct sockaddr_in6", pure, final, + header: "<netinet/in.h>".} = object ## struct sockaddr_in6 + sin6_family*: TSa_family ## AF_INET6. + sin6_port*: TInPort ## Port number. + sin6_flowinfo*: int32 ## IPv6 traffic class and flow information. + sin6_addr*: Tin6Addr ## IPv6 address. + sin6_scope_id*: int32 ## Set of interfaces for a scope. + + Tipv6_mreq* {.importc: "struct ipv6_mreq", pure, final, + header: "<netinet/in.h>".} = object ## struct ipv6_mreq + ipv6mr_multiaddr*: TIn6Addr ## IPv6 multicast address. + ipv6mr_interface*: cint ## Interface index. + + Thostent* {.importc: "struct hostent", pure, final, + header: "<netdb.h>".} = object ## struct hostent + h_name*: cstring ## Official name of the host. + h_aliases*: cstringArray ## A pointer to an array of pointers to + ## alternative host names, terminated by a + ## null pointer. + h_addrtype*: cint ## Address type. + h_length*: cint ## The length, in bytes, of the address. + h_addr_list*: cstringArray ## A pointer to an array of pointers to network + ## addresses (in network byte order) for the + ## host, terminated by a null pointer. + + Tnetent* {.importc: "struct netent", pure, final, + header: "<netdb.h>".} = object ## struct netent + n_name*: cstring ## Official, fully-qualified (including the + ## domain) name of the host. + n_aliases*: cstringArray ## A pointer to an array of pointers to + ## alternative network names, terminated by a + ## null pointer. + n_addrtype*: cint ## The address type of the network. + n_net*: int32 ## The network number, in host byte order. + + TProtoent* {.importc: "struct protoent", pure, final, + header: "<netdb.h>".} = object ## struct protoent + p_name*: cstring ## Official name of the protocol. + p_aliases*: cstringArray ## A pointer to an array of pointers to + ## alternative protocol names, terminated by + ## a null pointer. + p_proto*: cint ## The protocol number. + + TServent* {.importc: "struct servent", pure, final, + header: "<netdb.h>".} = object ## struct servent + s_name*: cstring ## Official name of the service. + s_aliases*: cstringArray ## A pointer to an array of pointers to + ## alternative service names, terminated by + ## a null pointer. + s_port*: cint ## The port number at which the service + ## resides, in network byte order. + s_proto*: cstring ## The name of the protocol to use when + ## contacting the service. + + Taddrinfo* {.importc: "struct addrinfo", pure, final, + header: "<netdb.h>".} = object ## struct addrinfo + ai_flags*: cint ## Input flags. + ai_family*: cint ## Address family of socket. + ai_socktype*: cint ## Socket type. + ai_protocol*: cint ## Protocol of socket. + ai_addrlen*: TSockLen ## Length of socket address. + ai_addr*: ptr TSockAddr ## Socket address of socket. + ai_canonname*: cstring ## Canonical name of service location. + ai_next*: ptr TAddrInfo ## Pointer to next in list. + + TPollfd* {.importc: "struct pollfd", pure, final, + header: "<poll.h>".} = object ## struct pollfd + fd*: cint ## The following descriptor being polled. + events*: cshort ## The input event flags (see below). + revents*: cshort ## The output event flags (see below). + + Tnfds* {.importc: "nfds_t", header: "<poll.h>".} = cint + +var + errno* {.importc, header: "<errno.h>".}: cint ## error variable + daylight* {.importc, header: "<time.h>".}: cint + timezone* {.importc, header: "<time.h>".}: int # Constants as variables: when hasAioH: @@ -399,7 +579,6 @@ var ## All symbols are not made available for relocation processing by ## other modules. - errno* {.importc, header: "<errno.h>".}: cint ## error variable E2BIG* {.importc, header: "<errno.h>".}: cint ## Argument list too long. EACCES* {.importc, header: "<errno.h>".}: cint @@ -1026,18 +1205,20 @@ var SC_XBS5_ILP32_OFF32*{.importc: "_SC_XBS5_ILP32_OFF32", header: "<unistd.h>".}: cint SC_XBS5_ILP32_OFFBIG*{.importc: "_SC_XBS5_ILP32_OFFBIG", header: "<unistd.h>".}: cint SC_XBS5_LP64_OFF64*{.importc: "_SC_XBS5_LP64_OFF64", header: "<unistd.h>".}: cint - SC_XBS5_LPBIG_OFFBIG*{.importc: "_SC_XBS5_LPBIG_OFFBIG", header: "<unistd.h>".}: cint + SC_XBS5_LPBIG_OFFBIG*{.importc: "_SC_XBS5_LPBIG_OFFBIG", + header: "<unistd.h>".}: cint SC_XOPEN_CRYPT*{.importc: "_SC_XOPEN_CRYPT", header: "<unistd.h>".}: cint SC_XOPEN_ENH_I18N*{.importc: "_SC_XOPEN_ENH_I18N", header: "<unistd.h>".}: cint SC_XOPEN_LEGACY*{.importc: "_SC_XOPEN_LEGACY", header: "<unistd.h>".}: cint SC_XOPEN_REALTIME*{.importc: "_SC_XOPEN_REALTIME", header: "<unistd.h>".}: cint - SC_XOPEN_REALTIME_THREADS*{.importc: "_SC_XOPEN_REALTIME_THREADS", header: "<unistd.h>".}: cint + SC_XOPEN_REALTIME_THREADS*{.importc: "_SC_XOPEN_REALTIME_THREADS", + header: "<unistd.h>".}: cint SC_XOPEN_SHM*{.importc: "_SC_XOPEN_SHM", header: "<unistd.h>".}: cint SC_XOPEN_STREAMS*{.importc: "_SC_XOPEN_STREAMS", header: "<unistd.h>".}: cint SC_XOPEN_UNIX*{.importc: "_SC_XOPEN_UNIX", header: "<unistd.h>".}: cint SC_XOPEN_VERSION*{.importc: "_SC_XOPEN_VERSION", header: "<unistd.h>".}: cint - SEM_FAILED* {.importc, header: "<semaphore.h>".}: cint + SEM_FAILED* {.importc, header: "<semaphore.h>".}: pointer IPC_CREAT* {.importc, header: "<sys/ipc.h>".}: cint ## Create entry if key does not exist. IPC_EXCL* {.importc, header: "<sys/ipc.h>".}: cint @@ -1133,9 +1314,12 @@ var ## Lock pages that become mapped. MAP_FAILED* {.importc, header: "<sys/mman.h>".}: cint POSIX_MADV_NORMAL* {.importc, header: "<sys/mman.h>".}: cint - ## The application has no advice to give on its behavior with respect to the specified range. It is the default characteristic if no advice is given for a range of memory. + ## The application has no advice to give on its behavior with + ## respect to the specified range. It is the default characteristic + ## if no advice is given for a range of memory. POSIX_MADV_SEQUENTIAL* {.importc, header: "<sys/mman.h>".}: cint - ## The application expects to access the specified range sequentially from lower addresses to higher addresses. + ## The application expects to access the specified range sequentially + ## from lower addresses to higher addresses. POSIX_MADV_RANDOM* {.importc, header: "<sys/mman.h>".}: cint ## The application expects to access the specified range in a random order. POSIX_MADV_WILLNEED* {.importc, header: "<sys/mman.h>".}: cint @@ -1146,20 +1330,19 @@ var POSIX_TYPED_MEM_MAP_ALLOCATABLE* {.importc, header: "<sys/mman.h>".}: cint - CLOCKS_PER_SEC* {.importc, header: "<time.h>".}: cint + CLOCKS_PER_SEC* {.importc, header: "<time.h>".}: int ## A number used to convert the value returned by the clock() function ## into seconds. - CLOCK_PROCESS_CPUTIME_ID* {.importc, header: "<time.h>".}: cstring + CLOCK_PROCESS_CPUTIME_ID* {.importc, header: "<time.h>".}: cint ## The identifier of the CPU-time clock associated with the process ## making a clock() or timer*() function call. - CLOCK_THREAD_CPUTIME_ID* {.importc, header: "<time.h>".}: cstring - CLOCK_REALTIME* {.importc, header: "<time.h>".}: cstring + CLOCK_THREAD_CPUTIME_ID* {.importc, header: "<time.h>".}: cint + CLOCK_REALTIME* {.importc, header: "<time.h>".}: cint ## The identifier of the system-wide realtime clock. TIMER_ABSTIME* {.importc, header: "<time.h>".}: cint - ## Flag indicating time is absolute. For functions taking timer objects, this refers to the clock associated with the timer. [Option End] + ## Flag indicating time is absolute. For functions taking timer + ## objects, this refers to the clock associated with the timer. CLOCK_MONOTONIC* {.importc, header: "<time.h>".}: cint - daylight* {.importc, header: "<time.h>".}: cint - timezone* {.importc, header: "<time.h>".}: int WNOHANG* {.importc, header: "<sys/wait.h>".}: cint ## Do not hang if no status is available; return immediately. @@ -1258,6 +1441,213 @@ var SEEK_SET* {.importc, header: "<unistd.h>".}: cint SEEK_CUR* {.importc, header: "<unistd.h>".}: cint SEEK_END* {.importc, header: "<unistd.h>".}: cint + + IF_NAMESIZE* {.importc, header: "<net/if.h>".}: cint + + SCM_RIGHTS* {.importc, header: "<sys/socket.h>".}: cint + ## Indicates that the data array contains the access rights + ## to be sent or received. + + SOCK_DGRAM* {.importc, header: "<sys/socket.h>".}: cint ## Datagram socket. + SOCK_RAW* {.importc, header: "<sys/socket.h>".}: cint + ## Raw Protocol Interface. + SOCK_SEQPACKET* {.importc, header: "<sys/socket.h>".}: cint + ## Sequenced-packet socket. + SOCK_STREAM* {.importc, header: "<sys/socket.h>".}: cint + ## Byte-stream socket. + + SOL_SOCKET* {.importc, header: "<sys/socket.h>".}: cint + ## Options to be accessed at socket level, not protocol level. + + SO_ACCEPTCONN* {.importc, header: "<sys/socket.h>".}: cint + ## Socket is accepting connections. + SO_BROADCAST* {.importc, header: "<sys/socket.h>".}: cint + ## Transmission of broadcast messages is supported. + SO_DEBUG* {.importc, header: "<sys/socket.h>".}: cint + ## Debugging information is being recorded. + SO_DONTROUTE* {.importc, header: "<sys/socket.h>".}: cint + ## Bypass normal routing. + SO_ERROR* {.importc, header: "<sys/socket.h>".}: cint + ## Socket error status. + SO_KEEPALIVE* {.importc, header: "<sys/socket.h>".}: cint + ## Connections are kept alive with periodic messages. + SO_LINGER* {.importc, header: "<sys/socket.h>".}: cint + ## Socket lingers on close. + SO_OOBINLINE* {.importc, header: "<sys/socket.h>".}: cint + ## Out-of-band data is transmitted in line. + SO_RCVBUF* {.importc, header: "<sys/socket.h>".}: cint + ## Receive buffer size. + SO_RCVLOWAT* {.importc, header: "<sys/socket.h>".}: cint + ## Receive *low water mark*. + SO_RCVTIMEO* {.importc, header: "<sys/socket.h>".}: cint + ## Receive timeout. + SO_REUSEADDR* {.importc, header: "<sys/socket.h>".}: cint + ## Reuse of local addresses is supported. + SO_SNDBUF* {.importc, header: "<sys/socket.h>".}: cint + ## Send buffer size. + SO_SNDLOWAT* {.importc, header: "<sys/socket.h>".}: cint + ## Send *low water mark*. + SO_SNDTIMEO* {.importc, header: "<sys/socket.h>".}: cint + ## Send timeout. + SO_TYPE* {.importc, header: "<sys/socket.h>".}: cint + ## Socket type. + + SOMAXCONN* {.importc, header: "<sys/socket.h>".}: cint + ## The maximum backlog queue length. + + MSG_CTRUNC* {.importc, header: "<sys/socket.h>".}: cint + ## Control data truncated. + MSG_DONTROUTE* {.importc, header: "<sys/socket.h>".}: cint + ## Send without using routing tables. + MSG_EOR* {.importc, header: "<sys/socket.h>".}: cint + ## Terminates a record (if supported by the protocol). + MSG_OOB* {.importc, header: "<sys/socket.h>".}: cint + ## Out-of-band data. + MSG_PEEK* {.importc, header: "<sys/socket.h>".}: cint + ## Leave received data in queue. + MSG_TRUNC* {.importc, header: "<sys/socket.h>".}: cint + ## Normal data truncated. + MSG_WAITALL* {.importc, header: "<sys/socket.h>".}: cint + ## Attempt to fill the read buffer. + + AF_INET* {.importc, header: "<sys/socket.h>".}: cint + ## Internet domain sockets for use with IPv4 addresses. + AF_INET6* {.importc, header: "<sys/socket.h>".}: cint + ## Internet domain sockets for use with IPv6 addresses. + AF_UNIX* {.importc, header: "<sys/socket.h>".}: cint + ## UNIX domain sockets. + AF_UNSPEC* {.importc, header: "<sys/socket.h>".}: cint + ## Unspecified. + + SHUT_RD* {.importc, header: "<sys/socket.h>".}: cint + ## Disables further receive operations. + SHUT_RDWR* {.importc, header: "<sys/socket.h>".}: cint + ## Disables further send and receive operations. + SHUT_WR* {.importc, header: "<sys/socket.h>".}: cint + ## Disables further send operations. + + IPPROTO_IP* {.importc, header: "<netinet/in.h>".}: cint + ## Internet protocol. + IPPROTO_IPV6* {.importc, header: "<netinet/in.h>".}: cint + ## Internet Protocol Version 6. + IPPROTO_ICMP* {.importc, header: "<netinet/in.h>".}: cint + ## Control message protocol. + IPPROTO_RAW* {.importc, header: "<netinet/in.h>".}: cint + ## Raw IP Packets Protocol. + IPPROTO_TCP* {.importc, header: "<netinet/in.h>".}: cint + ## Transmission control protocol. + IPPROTO_UDP* {.importc, header: "<netinet/in.h>".}: cint + ## User datagram protocol. + + INADDR_ANY* {.importc, header: "<netinet/in.h>".}: TinAddrScalar + ## IPv4 local host address. + INADDR_BROADCAST* {.importc, header: "<netinet/in.h>".}: TinAddrScalar + ## IPv4 broadcast address. + + INET_ADDRSTRLEN* {.importc, header: "<netinet/in.h>".}: cint + ## 16. Length of the string form for IP. + + IPV6_JOIN_GROUP* {.importc, header: "<netinet/in.h>".}: cint + ## Join a multicast group. + IPV6_LEAVE_GROUP* {.importc, header: "<netinet/in.h>".}: cint + ## Quit a multicast group. + IPV6_MULTICAST_HOPS* {.importc, header: "<netinet/in.h>".}: cint + ## Multicast hop limit. + IPV6_MULTICAST_IF* {.importc, header: "<netinet/in.h>".}: cint + ## Interface to use for outgoing multicast packets. + IPV6_MULTICAST_LOOP* {.importc, header: "<netinet/in.h>".}: cint + ## Multicast packets are delivered back to the local application. + IPV6_UNICAST_HOPS* {.importc, header: "<netinet/in.h>".}: cint + ## Unicast hop limit. + IPV6_V6ONLY* {.importc, header: "<netinet/in.h>".}: cint + ## Restrict AF_INET6 socket to IPv6 communications only. + + TCP_NODELAY* {.importc, header: "<netinet/tcp.h>".}: cint + ## Avoid coalescing of small segments. + + IPPORT_RESERVED* {.importc, header: "<netdb.h>".}: cint + + HOST_NOT_FOUND* {.importc, header: "<netdb.h>".}: cint + NO_DATA* {.importc, header: "<netdb.h>".}: cint + NO_RECOVERY* {.importc, header: "<netdb.h>".}: cint + TRY_AGAIN* {.importc, header: "<netdb.h>".}: cint + + AI_PASSIVE* {.importc, header: "<netdb.h>".}: cint + ## Socket address is intended for bind(). + AI_CANONNAME* {.importc, header: "<netdb.h>".}: cint + ## Request for canonical name. + AI_NUMERICHOST* {.importc, header: "<netdb.h>".}: cint + ## Return numeric host address as name. + AI_NUMERICSERV* {.importc, header: "<netdb.h>".}: cint + ## Inhibit service name resolution. + AI_V4MAPPED* {.importc, header: "<netdb.h>".}: cint + ## If no IPv6 addresses are found, query for IPv4 addresses and + ## return them to the caller as IPv4-mapped IPv6 addresses. + AI_ALL* {.importc, header: "<netdb.h>".}: cint + ## Query for both IPv4 and IPv6 addresses. + AI_ADDRCONFIG* {.importc, header: "<netdb.h>".}: cint + ## Query for IPv4 addresses only when an IPv4 address is configured; + ## query for IPv6 addresses only when an IPv6 address is configured. + + NI_NOFQDN* {.importc, header: "<netdb.h>".}: cint + ## Only the nodename portion of the FQDN is returned for local hosts. + NI_NUMERICHOST* {.importc, header: "<netdb.h>".}: cint + ## The numeric form of the node's address is returned instead of its name. + NI_NAMEREQD* {.importc, header: "<netdb.h>".}: cint + ## Return an error if the node's name cannot be located in the database. + NI_NUMERICSERV* {.importc, header: "<netdb.h>".}: cint + ## The numeric form of the service address is returned instead of its name. + NI_NUMERICSCOPE* {.importc, header: "<netdb.h>".}: cint + ## For IPv6 addresses, the numeric form of the scope identifier is + ## returned instead of its name. + NI_DGRAM* {.importc, header: "<netdb.h>".}: cint + ## Indicates that the service is a datagram service (SOCK_DGRAM). + + EAI_AGAIN* {.importc, header: "<netdb.h>".}: cint + ## The name could not be resolved at this time. Future attempts may succeed. + EAI_BADFLAGS* {.importc, header: "<netdb.h>".}: cint + ## The flags had an invalid value. + EAI_FAIL* {.importc, header: "<netdb.h>".}: cint + ## A non-recoverable error occurred. + EAI_FAMILY* {.importc, header: "<netdb.h>".}: cint + ## The address family was not recognized or the address length + ## was invalid for the specified family. + EAI_MEMORY* {.importc, header: "<netdb.h>".}: cint + ## There was a memory allocation failure. + EAI_NONAME* {.importc, header: "<netdb.h>".}: cint + ## The name does not resolve for the supplied parameters. + ## NI_NAMEREQD is set and the host's name cannot be located, + ## or both nodename and servname were null. + EAI_SERVICE* {.importc, header: "<netdb.h>".}: cint + ## The service passed was not recognized for the specified socket type. + EAI_SOCKTYPE* {.importc, header: "<netdb.h>".}: cint + ## The intended socket type was not recognized. + EAI_SYSTEM* {.importc, header: "<netdb.h>".}: cint + ## A system error occurred. The error code can be found in errno. + EAI_OVERFLOW* {.importc, header: "<netdb.h>".}: cint + ## An argument buffer overflowed. + + POLLIN* {.importc, header: "<poll.h>".}: cshort + ## Data other than high-priority data may be read without blocking. + POLLRDNORM* {.importc, header: "<poll.h>".}: cshort + ## Normal data may be read without blocking. + POLLRDBAND* {.importc, header: "<poll.h>".}: cshort + ## Priority data may be read without blocking. + POLLPRI* {.importc, header: "<poll.h>".}: cshort + ## High priority data may be read without blocking. + POLLOUT* {.importc, header: "<poll.h>".}: cshort + ## Normal data may be written without blocking. + POLLWRNORM* {.importc, header: "<poll.h>".}: cshort + ## Equivalent to POLLOUT. + POLLWRBAND* {.importc, header: "<poll.h>".}: cshort + ## Priority data may be written. + POLLERR* {.importc, header: "<poll.h>".}: cshort + ## An error has occurred (revents only). + POLLHUP* {.importc, header: "<poll.h>".}: cshort + ## Device has been disconnected (revents only). + POLLNVAL* {.importc, header: "<poll.h>".}: cshort + ## Invalid fd member (revents only). + when hasSpawnh: var @@ -1290,6 +1680,13 @@ proc inet_addr*(a1: cstring): int32 {.importc, header: "<arpa/inet.h>".} proc inet_ntoa*(a1: int32): cstring {.importc, header: "<arpa/inet.h>".} proc inet_ntop*(a1: cint, a2: pointer, a3: cstring, a4: int32): cstring {.importc, header: "<arpa/inet.h>".} proc inet_pton*(a1: cint, a2: cstring, a3: pointer): cint {.importc, header: "<arpa/inet.h>".} + +var + in6addr_any* {.importc, header: "<netinet/in.h>".}: TIn6Addr + in6addr_loopback* {.importc, header: "<netinet/in.h>".}: TIn6Addr + +proc IN6ADDR_ANY_INIT* (): TIn6Addr {.importc, header: "<netinet/in.h>".} +proc IN6ADDR_LOOPBACK_INIT* (): TIn6Addr {.importc, header: "<netinet/in.h>".} # dirent.h proc closedir*(a1: ptr TDIR): cint {.importc, header: "<dirent.h>".} @@ -1529,13 +1926,20 @@ proc pthread_setconcurrency*(a1: cint): cint {.importc, header: "<pthread.h>".} proc pthread_setschedparam*(a1: Tpthread, a2: cint, a3: ptr Tsched_param): cint {.importc, header: "<pthread.h>".} -proc pthread_setschedprio*(a1: Tpthread, a2: cint): cint {.importc, header: "<pthread.h>".} -proc pthread_setspecific*(a1: Tpthread_key, a2: pointer): cint {.importc, header: "<pthread.h>".} -proc pthread_spin_destroy*(a1: ptr Tpthread_spinlock): cint {.importc, header: "<pthread.h>".} -proc pthread_spin_init*(a1: ptr Tpthread_spinlock, a2: cint): cint {.importc, header: "<pthread.h>".} -proc pthread_spin_lock*(a1: ptr Tpthread_spinlock): cint {.importc, header: "<pthread.h>".} -proc pthread_spin_trylock*(a1: ptr Tpthread_spinlock): cint{.importc, header: "<pthread.h>".} -proc pthread_spin_unlock*(a1: ptr Tpthread_spinlock): cint {.importc, header: "<pthread.h>".} +proc pthread_setschedprio*(a1: Tpthread, a2: cint): cint {. + importc, header: "<pthread.h>".} +proc pthread_setspecific*(a1: Tpthread_key, a2: pointer): cint {. + importc, header: "<pthread.h>".} +proc pthread_spin_destroy*(a1: ptr Tpthread_spinlock): cint {. + importc, header: "<pthread.h>".} +proc pthread_spin_init*(a1: ptr Tpthread_spinlock, a2: cint): cint {. + importc, header: "<pthread.h>".} +proc pthread_spin_lock*(a1: ptr Tpthread_spinlock): cint {. + importc, header: "<pthread.h>".} +proc pthread_spin_trylock*(a1: ptr Tpthread_spinlock): cint{. + importc, header: "<pthread.h>".} +proc pthread_spin_unlock*(a1: ptr Tpthread_spinlock): cint {. + importc, header: "<pthread.h>".} proc pthread_testcancel*() {.importc, header: "<pthread.h>".} @@ -1555,7 +1959,8 @@ proc execl*(a1, a2: cstring): cint {.varargs, importc, header: "<unistd.h>".} proc execle*(a1, a2: cstring): cint {.varargs, importc, header: "<unistd.h>".} proc execlp*(a1, a2: cstring): cint {.varargs, importc, header: "<unistd.h>".} proc execv*(a1: cstring, a2: cstringArray): cint {.importc, header: "<unistd.h>".} -proc execve*(a1: cstring, a2, a3: cstringArray): cint {.importc, header: "<unistd.h>".} +proc execve*(a1: cstring, a2, a3: cstringArray): cint {. + importc, header: "<unistd.h>".} proc execvp*(a1: cstring, a2: cstringArray): cint {.importc, header: "<unistd.h>".} proc fchown*(a1: cint, a2: Tuid, a3: Tgid): cint {.importc, header: "<unistd.h>".} proc fchdir*(a1: cint): cint {.importc, header: "<unistd.h>".} @@ -1569,13 +1974,15 @@ proc getegid*(): TGid {.importc, header: "<unistd.h>".} proc geteuid*(): TUid {.importc, header: "<unistd.h>".} proc getgid*(): TGid {.importc, header: "<unistd.h>".} -proc getgroups*(a1: cint, a2: ptr array[0..255, Tgid]): cint {.importc, header: "<unistd.h>".} +proc getgroups*(a1: cint, a2: ptr array[0..255, Tgid]): cint {. + importc, header: "<unistd.h>".} proc gethostid*(): int {.importc, header: "<unistd.h>".} proc gethostname*(a1: cstring, a2: int): cint {.importc, header: "<unistd.h>".} proc getlogin*(): cstring {.importc, header: "<unistd.h>".} proc getlogin_r*(a1: cstring, a2: int): cint {.importc, header: "<unistd.h>".} -proc getopt*(a1: cint, a2: cstringArray, a3: cstring): cint {.importc, header: "<unistd.h>".} +proc getopt*(a1: cint, a2: cstringArray, a3: cstring): cint {. + importc, header: "<unistd.h>".} proc getpgid*(a1: Tpid): Tpid {.importc, header: "<unistd.h>".} proc getpgrp*(): Tpid {.importc, header: "<unistd.h>".} proc getpid*(): Tpid {.importc, header: "<unistd.h>".} @@ -1594,8 +2001,10 @@ proc pathconf*(a1: cstring, a2: cint): int {.importc, header: "<unistd.h>".} proc pause*(): cint {.importc, header: "<unistd.h>".} proc pipe*(a: array[0..1, cint]): cint {.importc, header: "<unistd.h>".} -proc pread*(a1: cint, a2: pointer, a3: int, a4: Toff): int {.importc, header: "<unistd.h>".} -proc pwrite*(a1: cint, a2: pointer, a3: int, a4: Toff): int {.importc, header: "<unistd.h>".} +proc pread*(a1: cint, a2: pointer, a3: int, a4: Toff): int {. + importc, header: "<unistd.h>".} +proc pwrite*(a1: cint, a2: pointer, a3: int, a4: Toff): int {. + importc, header: "<unistd.h>".} proc read*(a1: cint, a2: pointer, a3: int): int {.importc, header: "<unistd.h>".} proc readlink*(a1, a2: cstring, a3: int): int {.importc, header: "<unistd.h>".} @@ -1619,7 +2028,8 @@ proc tcgetpgrp*(a1: cint): tpid {.importc, header: "<unistd.h>".} proc tcsetpgrp*(a1: cint, a2: Tpid): cint {.importc, header: "<unistd.h>".} proc truncate*(a1: cstring, a2: Toff): cint {.importc, header: "<unistd.h>".} proc ttyname*(a1: cint): cstring {.importc, header: "<unistd.h>".} -proc ttyname_r*(a1: cint, a2: cstring, a3: int): cint {.importc, header: "<unistd.h>".} +proc ttyname_r*(a1: cint, a2: cstring, a3: int): cint {. + importc, header: "<unistd.h>".} proc ualarm*(a1, a2: Tuseconds): Tuseconds {.importc, header: "<unistd.h>".} proc unlink*(a1: cstring): cint {.importc, header: "<unistd.h>".} proc usleep*(a1: Tuseconds): cint {.importc, header: "<unistd.h>".} @@ -1628,19 +2038,25 @@ proc write*(a1: cint, a2: pointer, a3: int): int {.importc, header: "<unistd.h>" proc sem_close*(a1: ptr Tsem): cint {.importc, header: "<semaphore.h>".} proc sem_destroy*(a1: ptr Tsem): cint {.importc, header: "<semaphore.h>".} -proc sem_getvalue*(a1: ptr Tsem, a2: var cint): cint {.importc, header: "<semaphore.h>".} -proc sem_init*(a1: ptr Tsem, a2: cint, a3: cint): cint {.importc, header: "<semaphore.h>".} -proc sem_open*(a1: cstring, a2: cint): ptr TSem {.varargs, importc, header: "<semaphore.h>".} +proc sem_getvalue*(a1: ptr Tsem, a2: var cint): cint {. + importc, header: "<semaphore.h>".} +proc sem_init*(a1: ptr Tsem, a2: cint, a3: cint): cint {. + importc, header: "<semaphore.h>".} +proc sem_open*(a1: cstring, a2: cint): ptr TSem {. + varargs, importc, header: "<semaphore.h>".} proc sem_post*(a1: ptr Tsem): cint {.importc, header: "<semaphore.h>".} -proc sem_timedwait*(a1: ptr Tsem, a2: ptr Ttimespec): cint {.importc, header: "<semaphore.h>".} +proc sem_timedwait*(a1: ptr Tsem, a2: ptr Ttimespec): cint {. + importc, header: "<semaphore.h>".} proc sem_trywait*(a1: ptr Tsem): cint {.importc, header: "<semaphore.h>".} proc sem_unlink*(a1: cstring): cint {.importc, header: "<semaphore.h>".} proc sem_wait*(a1: ptr Tsem): cint {.importc, header: "<semaphore.h>".} proc ftok*(a1: cstring, a2: cint): Tkey {.importc, header: "<sys/ipc.h>".} -proc statvfs*(a1: cstring, a2: var Tstatvfs): cint {.importc, header: "<sys/statvfs.h>".} -proc fstatvfs*(a1: cint, a2: var Tstatvfs): cint {.importc, header: "<sys/statvfs.h>".} +proc statvfs*(a1: cstring, a2: var Tstatvfs): cint {. + importc, header: "<sys/statvfs.h>".} +proc fstatvfs*(a1: cint, a2: var Tstatvfs): cint {. + importc, header: "<sys/statvfs.h>".} proc chmod*(a1: cstring, a2: TMode): cint {.importc, header: "<sys/stat.h>".} proc fchmod*(a1: cint, a2: TMode): cint {.importc, header: "<sys/stat.h>".} @@ -1648,7 +2064,8 @@ proc fstat*(a1: cint, a2: var Tstat): cint {.importc, header: "<sys/stat.h>".} proc lstat*(a1: cstring, a2: var Tstat): cint {.importc, header: "<sys/stat.h>".} proc mkdir*(a1: cstring, a2: TMode): cint {.importc, header: "<sys/stat.h>".} proc mkfifo*(a1: cstring, a2: TMode): cint {.importc, header: "<sys/stat.h>".} -proc mknod*(a1: cstring, a2: TMode, a3: Tdev): cint {.importc, header: "<sys/stat.h>".} +proc mknod*(a1: cstring, a2: TMode, a3: Tdev): cint {. + importc, header: "<sys/stat.h>".} proc stat*(a1: cstring, a2: var Tstat): cint {.importc, header: "<sys/stat.h>".} proc umask*(a1: Tmode): TMode {.importc, header: "<sys/stat.h>".} @@ -1679,30 +2096,40 @@ proc S_TYPEISTMO*(buf: var TStat): bool {.importc, header: "<sys/stat.h>".} proc mlock*(a1: pointer, a2: int): cint {.importc, header: "<sys/mman.h>".} proc mlockall*(a1: cint): cint {.importc, header: "<sys/mman.h>".} -proc mmap*(a1: pointer, a2: int, a3, a4, a5: cint, a6: Toff): pointer {.importc, header: "<sys/mman.h>".} -proc mprotect*(a1: pointer, a2: int, a3: cint): cint {.importc, header: "<sys/mman.h>".} +proc mmap*(a1: pointer, a2: int, a3, a4, a5: cint, a6: Toff): pointer {. + importc, header: "<sys/mman.h>".} +proc mprotect*(a1: pointer, a2: int, a3: cint): cint {. + importc, header: "<sys/mman.h>".} proc msync*(a1: pointer, a2: int, a3: cint): cint {.importc, header: "<sys/mman.h>".} proc munlock*(a1: pointer, a2: int): cint {.importc, header: "<sys/mman.h>".} proc munlockall*(): cint {.importc, header: "<sys/mman.h>".} proc munmap*(a1: pointer, a2: int): cint {.importc, header: "<sys/mman.h>".} -proc posix_madvise*(a1: pointer, a2: int, a3: cint): cint {.importc, header: "<sys/mman.h>".} +proc posix_madvise*(a1: pointer, a2: int, a3: cint): cint {. + importc, header: "<sys/mman.h>".} proc posix_mem_offset*(a1: pointer, a2: int, a3: var Toff, a4: var int, a5: var cint): cint {.importc, header: "<sys/mman.h>".} -proc posix_typed_mem_get_info*(a1: cint, a2: var Tposix_typed_mem_info): cint {.importc, header: "<sys/mman.h>".} -proc posix_typed_mem_open*(a1: cstring, a2, a3: cint): cint {.importc, header: "<sys/mman.h>".} -proc shm_open*(a1: cstring, a2: cint, a3: Tmode): cint {.importc, header: "<sys/mman.h>".} +proc posix_typed_mem_get_info*(a1: cint, + a2: var Tposix_typed_mem_info): cint {.importc, header: "<sys/mman.h>".} +proc posix_typed_mem_open*(a1: cstring, a2, a3: cint): cint {. + importc, header: "<sys/mman.h>".} +proc shm_open*(a1: cstring, a2: cint, a3: Tmode): cint {. + importc, header: "<sys/mman.h>".} proc shm_unlink*(a1: cstring): cint {.importc, header: "<sys/mman.h>".} proc asctime*(a1: var ttm): cstring{.importc, header: "<time.h>".} proc asctime_r*(a1: var ttm, a2: cstring): cstring {.importc, header: "<time.h>".} proc clock*(): Tclock {.importc, header: "<time.h>".} -proc clock_getcpuclockid*(a1: tpid, a2: var Tclockid): cint {.importc, header: "<time.h>".} -proc clock_getres*(a1: Tclockid, a2: var Ttimespec): cint {.importc, header: "<time.h>".} -proc clock_gettime*(a1: Tclockid, a2: var Ttimespec): cint {.importc, header: "<time.h>".} +proc clock_getcpuclockid*(a1: tpid, a2: var Tclockid): cint {. + importc, header: "<time.h>".} +proc clock_getres*(a1: Tclockid, a2: var Ttimespec): cint {. + importc, header: "<time.h>".} +proc clock_gettime*(a1: Tclockid, a2: var Ttimespec): cint {. + importc, header: "<time.h>".} proc clock_nanosleep*(a1: Tclockid, a2: cint, a3: var Ttimespec, a4: var Ttimespec): cint {.importc, header: "<time.h>".} -proc clock_settime*(a1: Tclockid, a2: var Ttimespec): cint {.importc, header: "<time.h>".} +proc clock_settime*(a1: Tclockid, a2: var Ttimespec): cint {. + importc, header: "<time.h>".} proc ctime*(a1: var Ttime): cstring {.importc, header: "<time.h>".} proc ctime_r*(a1: var Ttime, a2: cstring): cstring {.importc, header: "<time.h>".} @@ -1722,7 +2149,8 @@ proc time*(a1: var Ttime): ttime {.importc, header: "<time.h>".} proc timer_create*(a1: var Tclockid, a2: var Tsigevent, a3: var Ttimer): cint {.importc, header: "<time.h>".} proc timer_delete*(a1: var Ttimer): cint {.importc, header: "<time.h>".} -proc timer_gettime*(a1: Ttimer, a2: var Titimerspec): cint {.importc, header: "<time.h>".} +proc timer_gettime*(a1: Ttimer, a2: var Titimerspec): cint {. + importc, header: "<time.h>".} proc timer_getoverrun*(a1: Ttimer): cint {.importc, header: "<time.h>".} proc timer_settime*(a1: Ttimer, a2: cint, a3: var Titimerspec, a4: var titimerspec): cint {.importc, header: "<time.h>".} @@ -1730,16 +2158,21 @@ proc tzset*() {.importc, header: "<time.h>".} proc wait*(a1: var cint): tpid {.importc, header: "<sys/wait.h>".} -proc waitid*(a1: cint, a2: tid, a3: var Tsiginfo, a4: cint): cint {.importc, header: "<sys/wait.h>".} -proc waitpid*(a1: tpid, a2: var cint, a3: cint): tpid {.importc, header: "<sys/wait.h>".} +proc waitid*(a1: cint, a2: tid, a3: var Tsiginfo, a4: cint): cint {. + importc, header: "<sys/wait.h>".} +proc waitpid*(a1: tpid, a2: var cint, a3: cint): tpid {. + importc, header: "<sys/wait.h>".} -proc bsd_signal*(a1: cint, a2: proc (x: pointer) {.noconv.}) {.importc, header: "<signal.h>".} +proc bsd_signal*(a1: cint, a2: proc (x: pointer) {.noconv.}) {. + importc, header: "<signal.h>".} proc kill*(a1: Tpid, a2: cint): cint {.importc, header: "<signal.h>".} proc killpg*(a1: Tpid, a2: cint): cint {.importc, header: "<signal.h>".} proc pthread_kill*(a1: tpthread, a2: cint): cint {.importc, header: "<signal.h>".} -proc pthread_sigmask*(a1: cint, a2, a3: var Tsigset): cint {.importc, header: "<signal.h>".} +proc pthread_sigmask*(a1: cint, a2, a3: var Tsigset): cint {. + importc, header: "<signal.h>".} proc `raise`*(a1: cint): cint {.importc, header: "<signal.h>".} -proc sigaction*(a1: cint, a2, a3: var Tsigaction): cint {.importc, header: "<signal.h>".} +proc sigaction*(a1: cint, a2, a3: var Tsigaction): cint {. + importc, header: "<signal.h>".} proc sigaddset*(a1: var Tsigset, a2: cint): cint {.importc, header: "<signal.h>".} proc sigaltstack*(a1, a2: var Tstack): cint {.importc, header: "<signal.h>".} proc sigdelset*(a1: var Tsigset, a2: cint): cint {.importc, header: "<signal.h>".} @@ -1749,36 +2182,47 @@ proc sighold*(a1: cint): cint {.importc, header: "<signal.h>".} proc sigignore*(a1: cint): cint {.importc, header: "<signal.h>".} proc siginterrupt*(a1, a2: cint): cint {.importc, header: "<signal.h>".} proc sigismember*(a1: var Tsigset, a2: cint): cint {.importc, header: "<signal.h>".} -proc signal*(a1: cint, a2: proc (x: cint) {.noconv.}) {.importc, header: "<signal.h>".} +proc signal*(a1: cint, a2: proc (x: cint) {.noconv.}) {. + importc, header: "<signal.h>".} proc sigpause*(a1: cint): cint {.importc, header: "<signal.h>".} proc sigpending*(a1: var tsigset): cint {.importc, header: "<signal.h>".} -proc sigprocmask*(a1: cint, a2, a3: var tsigset): cint {.importc, header: "<signal.h>".} -proc sigqueue*(a1: tpid, a2: cint, a3: Tsigval): cint {.importc, header: "<signal.h>".} +proc sigprocmask*(a1: cint, a2, a3: var tsigset): cint {. + importc, header: "<signal.h>".} +proc sigqueue*(a1: tpid, a2: cint, a3: Tsigval): cint {. + importc, header: "<signal.h>".} proc sigrelse*(a1: cint): cint {.importc, header: "<signal.h>".} proc sigset*(a1: int, a2: proc (x: cint) {.noconv.}) {.importc, header: "<signal.h>".} proc sigsuspend*(a1: var Tsigset): cint {.importc, header: "<signal.h>".} -proc sigtimedwait*(a1: var Tsigset, a2: var tsiginfo, a3: var ttimespec): cint {.importc, header: "<signal.h>".} +proc sigtimedwait*(a1: var Tsigset, a2: var tsiginfo, + a3: var ttimespec): cint {.importc, header: "<signal.h>".} proc sigwait*(a1: var Tsigset, a2: var cint): cint {.importc, header: "<signal.h>".} -proc sigwaitinfo*(a1: var Tsigset, a2: var tsiginfo): cint {.importc, header: "<signal.h>".} +proc sigwaitinfo*(a1: var Tsigset, a2: var tsiginfo): cint {. + importc, header: "<signal.h>".} proc catclose*(a1: Tnl_catd): cint {.importc, header: "<nl_types.h>".} -proc catgets*(a1: Tnl_catd, a2, a3: cint, a4: cstring): cstring {.importc, header: "<nl_types.h>".} +proc catgets*(a1: Tnl_catd, a2, a3: cint, a4: cstring): cstring {. + importc, header: "<nl_types.h>".} proc catopen*(a1: cstring, a2: cint): Tnl_catd {.importc, header: "<nl_types.h>".} proc sched_get_priority_max*(a1: cint): cint {.importc, header: "<sched.h>".} proc sched_get_priority_min*(a1: cint): cint {.importc, header: "<sched.h>".} -proc sched_getparam*(a1: tpid, a2: var Tsched_param): cint {.importc, header: "<sched.h>".} +proc sched_getparam*(a1: tpid, a2: var Tsched_param): cint {. + importc, header: "<sched.h>".} proc sched_getscheduler*(a1: tpid): cint {.importc, header: "<sched.h>".} -proc sched_rr_get_interval*(a1: tpid, a2: var Ttimespec): cint {.importc, header: "<sched.h>".} -proc sched_setparam*(a1: tpid, a2: var Tsched_param): cint {.importc, header: "<sched.h>".} -proc sched_setscheduler*(a1: tpid, a2: cint, a3: var tsched_param): cint {.importc, header: "<sched.h>".} +proc sched_rr_get_interval*(a1: tpid, a2: var Ttimespec): cint {. + importc, header: "<sched.h>".} +proc sched_setparam*(a1: tpid, a2: var Tsched_param): cint {. + importc, header: "<sched.h>".} +proc sched_setscheduler*(a1: tpid, a2: cint, a3: var tsched_param): cint {. + importc, header: "<sched.h>".} proc sched_yield*(): cint {.importc, header: "<sched.h>".} proc strerror*(errnum: cint): cstring {.importc, header: "<string.h>".} proc FD_CLR*(a1: cint, a2: var Tfd_set) {.importc, header: "<sys/select.h>".} -proc FD_ISSET*(a1: cint, a2: var Tfd_set): cint {.importc, header: "<sys/select.h>".} +proc FD_ISSET*(a1: cint, a2: var Tfd_set): cint {. + importc, header: "<sys/select.h>".} proc FD_SET*(a1: cint, a2: var Tfd_set) {.importc, header: "<sys/select.h>".} proc FD_ZERO*(a1: var Tfd_set) {.importc, header: "<sys/select.h>".} @@ -1790,16 +2234,21 @@ proc select*(a1: cint, a2, a3, a4: var Tfd_set, a5: var ttimeval): cint {. when hasSpawnH: proc posix_spawn*(a1: var tpid, a2: cstring, a3: var Tposix_spawn_file_actions, - a4: var Tposix_spawnattr, a5, a6: cstringArray): cint {.importc, header: "<spawn.h>".} + a4: var Tposix_spawnattr, + a5, a6: cstringArray): cint {.importc, header: "<spawn.h>".} proc posix_spawn_file_actions_addclose*(a1: var tposix_spawn_file_actions, a2: cint): cint {.importc, header: "<spawn.h>".} proc posix_spawn_file_actions_adddup2*(a1: var tposix_spawn_file_actions, a2, a3: cint): cint {.importc, header: "<spawn.h>".} proc posix_spawn_file_actions_addopen*(a1: var tposix_spawn_file_actions, - a2: cint, a3: cstring, a4: cint, a5: tmode): cint {.importc, header: "<spawn.h>".} - proc posix_spawn_file_actions_destroy*(a1: var tposix_spawn_file_actions): cint {.importc, header: "<spawn.h>".} - proc posix_spawn_file_actions_init*(a1: var tposix_spawn_file_actions): cint {.importc, header: "<spawn.h>".} - proc posix_spawnattr_destroy*(a1: var tposix_spawnattr): cint {.importc, header: "<spawn.h>".} + a2: cint, a3: cstring, a4: cint, a5: tmode): cint {. + importc, header: "<spawn.h>".} + proc posix_spawn_file_actions_destroy*( + a1: var tposix_spawn_file_actions): cint {.importc, header: "<spawn.h>".} + proc posix_spawn_file_actions_init*( + a1: var tposix_spawn_file_actions): cint {.importc, header: "<spawn.h>".} + proc posix_spawnattr_destroy*(a1: var tposix_spawnattr): cint {. + importc, header: "<spawn.h>".} proc posix_spawnattr_getsigdefault*(a1: var tposix_spawnattr, a2: var Tsigset): cint {.importc, header: "<spawn.h>".} proc posix_spawnattr_getflags*(a1: var tposix_spawnattr, @@ -1813,15 +2262,20 @@ when hasSpawnH: proc posix_spawnattr_getsigmask*(a1: var tposix_spawnattr, a2: var tsigset): cint {.importc, header: "<spawn.h>".} - proc posix_spawnattr_init*(a1: var tposix_spawnattr): cint {.importc, header: "<spawn.h>".} + proc posix_spawnattr_init*(a1: var tposix_spawnattr): cint {. + importc, header: "<spawn.h>".} proc posix_spawnattr_setsigdefault*(a1: var tposix_spawnattr, a2: var tsigset): cint {.importc, header: "<spawn.h>".} - proc posix_spawnattr_setflags*(a1: var tposix_spawnattr, a2: cshort): cint {.importc, header: "<spawn.h>".} - proc posix_spawnattr_setpgroup*(a1: var tposix_spawnattr, a2: tpid): cint {.importc, header: "<spawn.h>".} + proc posix_spawnattr_setflags*(a1: var tposix_spawnattr, a2: cshort): cint {. + importc, header: "<spawn.h>".} + proc posix_spawnattr_setpgroup*(a1: var tposix_spawnattr, a2: tpid): cint {. + importc, header: "<spawn.h>".} proc posix_spawnattr_setschedparam*(a1: var tposix_spawnattr, a2: var tsched_param): cint {.importc, header: "<spawn.h>".} - proc posix_spawnattr_setschedpolicy*(a1: var tposix_spawnattr, a2: cint): cint {.importc, header: "<spawn.h>".} + proc posix_spawnattr_setschedpolicy*(a1: var tposix_spawnattr, + a2: cint): cint {. + importc, header: "<spawn.h>".} proc posix_spawnattr_setsigmask*(a1: var tposix_spawnattr, a2: var tsigset): cint {.importc, header: "<spawn.h>".} proc posix_spawnp*(a1: var tpid, a2: cstring, @@ -1830,6 +2284,149 @@ when hasSpawnH: a5, a6: cstringArray): cint {.importc, header: "<spawn.h>".} proc getcontext*(a1: var Tucontext): cint {.importc, header: "<ucontext.h>".} -proc makecontext*(a1: var Tucontext, a4: proc (){.noconv.}, a3: cint) {.varargs, importc, header: "<ucontext.h>".} +proc makecontext*(a1: var Tucontext, a4: proc (){.noconv.}, a3: cint) {. + varargs, importc, header: "<ucontext.h>".} proc setcontext*(a1: var Tucontext): cint {.importc, header: "<ucontext.h>".} proc swapcontext*(a1, a2: var Tucontext): cint {.importc, header: "<ucontext.h>".} +proc if_nametoindex*(a1: cstring): cint {.importc, header: "<net/if.h>".} +proc if_indextoname*(a1: cint, a2: cstring): cstring {. + importc, header: "<net/if.h>".} +proc if_nameindex*(): ptr Tif_nameindex {.importc, header: "<net/if.h>".} +proc if_freenameindex*(a1: ptr Tif_nameindex) {.importc, header: "<net/if.h>".} + +proc readv*(a1: cint, a2: ptr TIOVec, a3: cint): int {. + importc, header: "<sys/uio.h>".} +proc writev*(a1: cint, a2: ptr TIOVec, a3: cint): int {. + importc, header: "<sys/uio.h>".} + +proc CMSG_DATA*(cmsg: ptr Tcmsghdr): cstring {. + importc, header: "<sys/socket.h>".} + +proc CMSG_NXTHDR*(mhdr: ptr TMsgHdr, cmsg: ptr TCMsgHdr): ptr TCmsgHdr {. + importc, header: "<sys/socket.h>".} + +proc CMSG_FIRSTHDR*(mhdr: ptr TMsgHdr): ptr TCMsgHdr {. + importc, header: "<sys/socket.h>".} + +proc accept*(a1: cint, a2: ptr Tsockaddr, a3: ptr Tsocklen): cint {. + importc, header: "<sys/socket.h>".} + +proc bind*(a1: cint, a2: ptr Tsockaddr, a3: Tsocklen): cint {. + importc, header: "<sys/socket.h>".} + +proc connect*(a1: cint, a2: ptr Tsockaddr, a3: Tsocklen): cint {. + importc, header: "<sys/socket.h>".} +proc getpeername*(a1: cint, a2: ptr Tsockaddr, a3: ptr Tsocklen): cint {. + importc, header: "<sys/socket.h>".} +proc getsockname*(a1: cint, a2: ptr Tsockaddr, a3: ptr Tsocklen): cint {. + importc, header: "<sys/socket.h>".} + +proc getsockopt*(a1, a2, a3: cint, a4: pointer, a5: ptr Tsocklen): cint {. + importc, header: "<sys/socket.h>".} + +proc listen*(a1, a2: cint): cint {. + importc, header: "<sys/socket.h>".} +proc recv*(a1: cint, a2: pointer, a3: int, a4: cint): int {. + importc, header: "<sys/socket.h>".} +proc recvfrom*(a1: cint, a2: pointer, a3: int, a4: cint, + a5: ptr Tsockaddr, a6: ptr Tsocklen): int {. + importc, header: "<sys/socket.h>".} +proc recvmsg*(a1: cint, a2: ptr Tmsghdr, a3: cint): int {. + importc, header: "<sys/socket.h>".} +proc send*(a1: cint, a2: pointer, a3: int, a4: cint): int {. + importc, header: "<sys/socket.h>".} +proc sendmsg*(a1: cint, a2: ptr Tmsghdr, a3: cint): int {. + importc, header: "<sys/socket.h>".} +proc sendto*(a1: cint, a2: pointer, a3: int, a4: cint, a5: ptr Tsockaddr, + a6: Tsocklen): int {. + importc, header: "<sys/socket.h>".} +proc setsockopt*(a1, a2, a3: cint, a4: pointer, a5: Tsocklen): cint {. + importc, header: "<sys/socket.h>".} +proc shutdown*(a1, a2: cint): cint {. + importc, header: "<sys/socket.h>".} +proc socket*(a1, a2, a3: cint): cint {. + importc, header: "<sys/socket.h>".} +proc sockatmark*(a1: cint): cint {. + importc, header: "<sys/socket.h>".} +proc socketpair*(a1, a2, a3: cint, a4: var array[0..1, cint]): cint {. + importc, header: "<sys/socket.h>".} + +proc IN6_IS_ADDR_UNSPECIFIED* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Unspecified address. +proc IN6_IS_ADDR_LOOPBACK* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Loopback address. +proc IN6_IS_ADDR_MULTICAST* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Multicast address. +proc IN6_IS_ADDR_LINKLOCAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Unicast link-local address. +proc IN6_IS_ADDR_SITELOCAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Unicast site-local address. +proc IN6_IS_ADDR_V4MAPPED* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## IPv4 mapped address. +proc IN6_IS_ADDR_V4COMPAT* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## IPv4-compatible address. +proc IN6_IS_ADDR_MC_NODELOCAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Multicast node-local address. +proc IN6_IS_ADDR_MC_LINKLOCAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Multicast link-local address. +proc IN6_IS_ADDR_MC_SITELOCAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Multicast site-local address. +proc IN6_IS_ADDR_MC_ORGLOCAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Multicast organization-local address. +proc IN6_IS_ADDR_MC_GLOBAL* (a1: ptr TIn6Addr): cint {. + importc, header: "<netinet/in.h>".} + ## Multicast global address. + +proc endhostent*() {.importc, header: "<netdb.h>".} +proc endnetent*() {.importc, header: "<netdb.h>".} +proc endprotoent*() {.importc, header: "<netdb.h>".} +proc endservent*() {.importc, header: "<netdb.h>".} +proc freeaddrinfo*(a1: ptr Taddrinfo) {.importc, header: "<netdb.h>".} + +proc gai_strerror*(a1: cint): cstring {.importc, header: "<netdb.h>".} + +proc getaddrinfo*(a1, a2: cstring, a3: ptr TAddrInfo, + a4: var ptr TAddrInfo): cint {.importc, header: "<netdb.h>".} + +proc gethostbyaddr*(a1: pointer, a2: Tsocklen, a3: cint): ptr THostent {. + importc, header: "<netdb.h>".} +proc gethostbyname*(a1: cstring): ptr THostent {.importc, header: "<netdb.h>".} +proc gethostent*(): ptr THostent {.importc, header: "<netdb.h>".} + +proc getnameinfo*(a1: ptr Tsockaddr, a2: Tsocklen, + a3: cstring, a4: Tsocklen, a5: cstring, + a6: Tsocklen, a7: cint): cint {.importc, header: "<netdb.h>".} + +proc getnetbyaddr*(a1: int32, a2: cint): ptr TNetent {.importc, header: "<netdb.h>".} +proc getnetbyname*(a1: cstring): ptr TNetent {.importc, header: "<netdb.h>".} +proc getnetent*(): ptr TNetent {.importc, header: "<netdb.h>".} + +proc getprotobyname*(a1: cstring): ptr TProtoent {.importc, header: "<netdb.h>".} +proc getprotobynumber*(a1: cint): ptr TProtoent {.importc, header: "<netdb.h>".} +proc getprotoent*(): ptr TProtoent {.importc, header: "<netdb.h>".} + +proc getservbyname*(a1, a2: cstring): ptr TServent {.importc, header: "<netdb.h>".} +proc getservbyport*(a1: cint, a2: cstring): ptr TServent {. + importc, header: "<netdb.h>".} +proc getservent*(): ptr TServent {.importc, header: "<netdb.h>".} + +proc sethostent*(a1: cint) {.importc, header: "<netdb.h>".} +proc setnetent*(a1: cint) {.importc, header: "<netdb.h>".} +proc setprotoent*(a1: cint) {.importc, header: "<netdb.h>".} +proc setservent*(a1: cint) {.importc, header: "<netdb.h>".} + +proc poll*(a1: ptr Tpollfd, a2: Tnfds, a3: int): cint {. + importc, header: "<poll.h>".} + + diff --git a/lib/repr.nim b/lib/repr.nim index 7f5b0d33c..35c5f9f42 100644 --- a/lib/repr.nim +++ b/lib/repr.nim @@ -104,17 +104,17 @@ proc reprSet(p: pointer, typ: PNimType): string {.compilerproc.} = type TReprClosure {.final.} = object # we cannot use a global variable here # as this wouldn't be thread-safe - marked: TCellSet + marked: TCellSeq recdepth: int # do not recurse endless indent: int # indentation proc initReprClosure(cl: var TReprClosure) = - CellSetInit(cl.marked) + Init(cl.marked) cl.recdepth = -1 # default is to display everything! cl.indent = 0 proc deinitReprClosure(cl: var TReprClosure) = - CellSetDeinit(cl.marked) + Deinit(cl.marked) proc reprBreak(result: var string, cl: TReprClosure) = add result, "\n" @@ -145,7 +145,6 @@ proc reprSequence(result: var string, p: pointer, typ: PNimType, typ.Base, cl) add result, "]" - proc reprRecordAux(result: var string, p: pointer, n: ptr TNimNode, cl: var TReprClosure) = case n.kind @@ -172,11 +171,14 @@ proc reprRecord(result: var string, p: pointer, typ: PNimType, proc reprRef(result: var string, p: pointer, typ: PNimType, cl: var TReprClosure) = # we know that p is not nil here: - var cell = usrToCell(p) + when defined(boehmGC): + var cell = cast[PCell](p) + else: + var cell = usrToCell(p) add result, "ref " & reprPointer(p) if cell notin cl.marked: # only the address is shown: - incl(cl.marked, cell) + add(cl.marked, cell) add result, " --> " reprAux(result, p, typ.base, cl) diff --git a/lib/streams.nim b/lib/streams.nim index f09b91625..238cba4ec 100644 --- a/lib/streams.nim +++ b/lib/streams.nim @@ -100,7 +100,7 @@ proc readLine*(s: PStream): string = type PStringStream* = ref TStringStream ## a stream that encapsulates a string TStringStream* = object of TStream - data: string + data*: string pos: int proc ssAtEnd(s: PStringStream): bool = diff --git a/lib/strtabs.nim b/lib/strtabs.nim index e6abaee6f..10cd0b933 100644 --- a/lib/strtabs.nim +++ b/lib/strtabs.nim @@ -16,10 +16,10 @@ import os, hashes, strutils type - TStringTableMode* = enum # describes the tables operation mode - modeCaseSensitive, # the table is case sensitive - modeCaseInsensitive, # the table is case insensitive - modeStyleInsensitive # the table is style insensitive + TStringTableMode* = enum ## describes the tables operation mode + modeCaseSensitive, ## the table is case sensitive + modeCaseInsensitive, ## the table is case insensitive + modeStyleInsensitive ## the table is style insensitive TKeyValuePair = tuple[key, val: string] TKeyValuePairSeq = seq[TKeyValuePair] TStringTable* = object of TObject @@ -61,14 +61,14 @@ iterator pairs*(t: PStringTable): tuple[key, value: string] = yield (t.data[h].key, t.data[h].val) type - TFormatFlag* = enum # flags for the `%` operator - useEnvironment, # use environment variable if the ``$key`` - # is not found in the table - useEmpty, # use the empty string as a default, thus it - # won't throw an exception if ``$key`` is not - # in the table - useKey # do not replace ``$key`` if it is not found - # in the table (or in the environment) + TFormatFlag* = enum ## flags for the `%` operator + useEnvironment, ## use environment variable if the ``$key`` + ## is not found in the table + useEmpty, ## use the empty string as a default, thus it + ## won't throw an exception if ``$key`` is not + ## in the table + useKey ## do not replace ``$key`` if it is not found + ## in the table (or in the environment) proc `%`*(f: string, t: PStringTable, flags: set[TFormatFlag] = {}): string ## The `%` operator for string tables. @@ -110,9 +110,7 @@ proc mustRehash(length, counter: int): bool = result = (length * 2 < counter * 3) or (length - counter < 4) proc nextTry(h, maxHash: THash): THash = - result = ((5 * h) + 1) and maxHash # For any initial h in range(maxHash), repeating that maxHash times - # generates each int in range(maxHash) exactly once (see any text on - # random-number generation for proof). + result = ((5 * h) + 1) and maxHash proc RawGet(t: PStringTable, key: string): int = var h: THash @@ -166,35 +164,30 @@ proc getValue(t: PStringTable, flags: set[TFormatFlag], key: string): string = if hasKey(t, key): return t[key] if useEnvironment in flags: result = os.getEnv(key) else: result = "" - if (result == ""): + if result.len == 0: if useKey in flags: result = '$' & key elif not (useEmpty in flags): raiseFormatException(key) proc `%`(f: string, t: PStringTable, flags: set[TFormatFlag] = {}): string = const PatternChars = {'a'..'z', 'A'..'Z', '0'..'9', '_', '\x80'..'\xFF'} - var - i, j: int - key: string result = "" - i = strStart - while i <= len(f) + strStart - 1: + var i = 0 + while i < len(f): if f[i] == '$': - case f[i + 1] + case f[i+1] of '$': add(result, '$') inc(i, 2) of '{': - j = i + 1 - while (j <= len(f) + strStart - 1) and (f[j] != '}'): inc(j) - key = copy(f, i + 2, j - 1) - result = result & getValue(t, flags, key) + var j = i + 1 + while j < f.len and f[j] != '}': inc(j) + add(result, getValue(t, flags, copy(f, i+2, j-1))) i = j + 1 of 'a'..'z', 'A'..'Z', '\x80'..'\xFF', '_': - j = i + 1 - while (j <= len(f) + strStart - 1) and (f[j] in PatternChars): inc(j) - key = copy(f, i+1, j - 1) - result = result & getValue(t, flags, key) + var j = i + 1 + while j < f.len and f[j] in PatternChars: inc(j) + add(result, getValue(t, flags, copy(f, i+1, j-1))) i = j else: add(result, f[i]) diff --git a/lib/strutils.nim b/lib/strutils.nim index 6189c6a88..e3a412053 100644 --- a/lib/strutils.nim +++ b/lib/strutils.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2006 Andreas Rumpf +# (c) Copyright 2009 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -9,8 +9,7 @@ ## This module contains various string utility routines. ## See the module `regexprs` for regular expression support. -## All the routines here are avaiable for the EMCAScript target -## too! +## All the routines here are avaiable for the EMCAScript target too! {.deadCodeElim: on.} @@ -33,13 +32,66 @@ type const Whitespace* = {' ', '\t', '\v', '\r', '\l', '\f'} ## All the characters that count as whitespace. + + Letters* = {'A'..'Z', 'a'..'z'} + ## the set of letters + + Digits* = {'0'..'9'} + ## the set of digits + + IdentChars* = {'a'..'z', 'A'..'Z', '0'..'9', '_'} + ## the set of characters an identifier can consist of + + IdentStartChars* = {'a'..'z', 'A'..'Z', '_'} + ## the set of characters an identifier can start with strStart* = 0 # this is only for bootstraping # XXX: remove this someday nl* = "\n" # this is only for bootstraping XXX: remove this somehow -proc strip*(s: string): string {.noSideEffect.} - ## Strips leading and trailing whitespace from `s`. +proc `%` *(formatstr: string, a: openarray[string]): string {.noSideEffect.} + ## The `substitution`:idx: operator performs string substitutions in + ## `formatstr` and returns a modified `formatstr`. This is often called + ## `string interpolation`:idx:. + ## + ## This is best explained by an example: + ## + ## .. code-block:: nimrod + ## "$1 eats $2." % ["The cat", "fish"] + ## + ## Results in: + ## + ## .. code-block:: nimrod + ## "The cat eats fish." + ## + ## The substitution variables (the thing after the ``$``) + ## are enumerated from 1 to 9. + ## Substitution variables can also be words (that is + ## ``[A-Za-z_]+[A-Za-z0-9_]*``) in which case the arguments in `a` with even + ## indices are keys and with odd indices are the corresponding values. + ## An example: + ## + ## .. code-block:: nimrod + ## "$animal eats $food." % ["animal", "The cat", "food", "fish"] + ## + ## Results in: + ## + ## .. code-block:: nimrod + ## "The cat eats fish." + ## + ## The variables are compared with `cmpIgnoreStyle`. `EInvalidValue` is + ## raised if an ill-formed format string has been passed to the `%` operator. + +proc `%` *(formatstr, a: string): string {.noSideEffect.} + ## This is the same as ``formatstr % [a]``. + +proc addf*(s: var string, formatstr: string, a: openarray[string]) + ## The same as ``add(s, formatstr % a)``, but more efficient. + +proc strip*(s: string, leading = true, trailing = true): string {.noSideEffect.} + ## Strips whitespace from `s` and returns the resulting string. + ## If `leading` is true, leading whitespace is stripped. + ## If `trailing` is true, trailing whitespace is stripped. proc toLower*(s: string): string {.noSideEffect.} ## Converts `s` into lower case. This works only for the letters A-Z. @@ -65,15 +117,36 @@ proc normalize*(s: string): string {.noSideEffect.} ## Normalizes the string `s`. That means to convert it to lower case and ## remove any '_'. This is needed for Nimrod identifiers for example. -proc findSubStr*(sub, s: string, start: int = 0): int {.noSideEffect.} +proc findSubStr*(sub, s: string, start: int = 0): int {. + noSideEffect, deprecated.} + ## Searches for `sub` in `s` starting at position `start`. Searching is + ## case-sensitive. If `sub` is not in `s`, -1 is returned. + ## **Deprecated since version 0.7.6**: Use `find` instead, but beware that + ## this has a different parameter order. + +proc findSubStr*(sub: char, s: string, start: int = 0): int {. + noSideEffect, deprecated.} + ## Searches for `sub` in `s` starting at position `start`. Searching is + ## case-sensitive. If `sub` is not in `s`, -1 is returned. + ## **Deprecated since version 0.7.6**: Use `find` instead, but beware that + ## this has a different parameter order. + +proc findChars*(chars: set[char], s: string, start: int = 0): int {. + noSideEffect, deprecated.} + ## Searches for `chars` in `s` starting at position `start`. If `s` contains + ## none of the characters in `chars`, -1 is returned. + ## **Deprecated since version 0.7.6**: Use `find` instead, but beware that + ## this has a different parameter order. + +proc find*(s, sub: string, start: int = 0): int {.noSideEffect.} ## Searches for `sub` in `s` starting at position `start`. Searching is ## case-sensitive. If `sub` is not in `s`, -1 is returned. -proc findSubStr*(sub: char, s: string, start: int = 0): int {.noSideEffect.} +proc find*(s: string, sub: char, start: int = 0): int {.noSideEffect.} ## Searches for `sub` in `s` starting at position `start`. Searching is ## case-sensitive. If `sub` is not in `s`, -1 is returned. -proc findChars*(chars: set[char], s: string, start: int = 0): int {.noSideEffect.} +proc find*(s: string, chars: set[char], start: int = 0): int {.noSideEffect.} ## Searches for `chars` in `s` starting at position `start`. If `s` contains ## none of the characters in `chars`, -1 is returned. @@ -95,15 +168,15 @@ iterator split*(s: string, seps: set[char] = Whitespace): string = ## Splits the string `s` into substrings. ## ## Substrings are separated by a substring containing only `seps`. - ## The seperator substrings are not returned in `sub`, nor are they part - ## of `sub`. - ## Examples:: + ## Examples: ## + ## .. code-block:: nimrod ## for word in split(" this is an example "): ## writeln(stdout, word) ## - ## Results in:: + ## Results in: ## + ## .. code-block:: nimrod ## "this" ## "is" ## "an" @@ -123,18 +196,54 @@ iterator split*(s: string, seps: set[char] = Whitespace): string = while last < len(s) and s[last] not_in seps: inc(last) # BUGFIX! yield copy(s, first, last-1) +iterator split*(s: string, sep: char): string = + ## Splits the string `s` into substrings. + ## + ## Substrings are separated by the character `sep`. + ## Example: + ## + ## .. code-block:: nimrod + ## for word in split(";;this;is;an;;example;;;", ';'): + ## writeln(stdout, word) + ## + ## Results in: + ## + ## .. code-block:: nimrod + ## "" + ## "" + ## "this" + ## "is" + ## "an" + ## "" + ## "example" + ## "" + ## "" + ## "" + ## + var last = 0 + assert('\0' != sep) + if len(s) > 0: + # `<=` is correct here for the edge cases! + while last <= len(s): + var first = last + while last < len(s) and s[last] != sep: inc(last) + yield copy(s, first, last-1) + inc(last) + iterator splitLines*(s: string): string = ## Splits the string `s` into its containing lines. Each newline ## combination (CR, LF, CR-LF) is supported. The result strings contain ## no trailing ``\n``. ## - ## Example:: + ## Example: ## + ## .. code-block:: nimrod ## for line in lines("\nthis\nis\nan\n\nexample\n"): ## writeln(stdout, line) ## - ## Results in:: + ## Results in: ## + ## .. code-block:: nimrod ## "" ## "this" ## "is" @@ -164,6 +273,11 @@ proc splitSeq*(s: string, seps: set[char] = Whitespace): seq[string] {. noSideEffect.} ## The same as `split`, but is a proc that returns a sequence of substrings. +proc splitSeq*(s: string, sep: char): seq[string] {.noSideEffect.} = + ## The same as `split`, but is a proc that returns a sequence of substrings. + result = @[] + for sub in split(s, sep): add(result, sub) + proc cmpIgnoreCase*(a, b: string): int {.noSideEffect.} ## Compares two strings in a case insensitive manner. Returns: ## @@ -207,7 +321,7 @@ proc ParseBiggestInt*(s: string): biggestInt {.noSideEffect.} ## Parses a decimal integer value contained in `s`. If `s` is not ## a valid integer, `EInvalidValue` is raised. -proc ParseFloat*(s: string): float {.noSideEffect.} +proc ParseFloat*(s: string, start = 0): float {.noSideEffect.} ## Parses a decimal floating point value contained in `s`. If `s` is not ## a valid floating point number, `EInvalidValue` is raised. ``NAN``, ## ``INF``, ``-INF`` are also supported (case insensitive comparison). @@ -217,37 +331,6 @@ proc ParseFloat*(s: string): float {.noSideEffect.} proc toString*[Ty](x: Ty): string ## This generic proc is the same as the stringify operator `$`. -proc `%` *(formatstr: string, a: openarray[string]): string {.noSideEffect.} - ## The substitution operator performs string substitutions in `formatstr` - ## and returns the modified `formatstr`. - ## - ## This is best explained by an example:: - ## - ## "$1 eats $2." % ["The cat", "fish"] - ## - ## Results in:: - ## - ## "The cat eats fish." - ## - ## The substitution variables (the thing after the ``$``) - ## are enumerated from 1 to 9. - ## Substitution variables can also be words (that is - ## ``[A-Za-z_]+[A-Za-z0-9_]*``) in which case the arguments in `a` with even - ## indices are keys and with odd indices are the corresponding values. Again - ## an example:: - ## - ## "$animal eats $food." % ["animal", "The cat", "food", "fish"] - ## - ## Results in:: - ## - ## "The cat eats fish." - ## - ## The variables are compared with `cmpIgnoreStyle`. `EInvalidValue` is - ## raised if an ill-formed format string has been passed to the `%` operator. - -proc `%` *(formatstr, a: string): string {.noSideEffect.} - ## This is the same as `formatstr % [a]`. - proc repeatChar*(count: int, c: Char = ' '): string ## Returns a string of length `count` consisting only of ## the character `c`. @@ -260,7 +343,25 @@ proc endsWith*(s, suffix: string): bool {.noSideEffect.} ## Returns true iff ``s`` ends with ``suffix``. ## If ``suffix == ""`` true is returned. -# implementation +proc addSep*(dest: var string, sep = ", ", startLen = 0) {.noSideEffect, + inline.} = + ## A shorthand for: + ## + ## .. code-block:: nimrod + ## if dest.len > startLen: add(dest, sep) + ## + ## This is often useful for generating some code where the items need to + ## be *separated* by `sep`. `sep` is only added if `dest` is longer than + ## `startLen`. The following example creates a string describing + ## an array of integers: + ## + ## .. code-block:: nimrod + ## var arr = "[" + ## for x in items([2, 3, 5, 7, 11]): + ## addSep(arr, startLen=len("[")) + ## add(arr, $x) + ## add(arr, "]") + if dest.len > startLen: add(dest, sep) proc allCharsInSet*(s: string, theSet: TCharSet): bool = ## returns true iff each character of `s` is in the set `theSet`. @@ -271,7 +372,7 @@ proc allCharsInSet*(s: string, theSet: TCharSet): bool = proc quoteIfContainsWhite*(s: string): string = ## returns ``'"' & s & '"'`` if `s` contains a space and does not ## start with a quote, else returns `s` - if findChars({' ', '\t'}, s) >= 0 and s[0] != '"': + if find(s, {' ', '\t'}) >= 0 and s[0] != '"': result = '"' & s & '"' else: result = s @@ -307,10 +408,8 @@ proc intToStr(x: int, minchars: int = 1): string = proc toString[Ty](x: Ty): string = return $x proc toOctal(c: char): string = - var - val: int result = newString(3) - val = ord(c) + var val = ord(c) for i in countdown(2, 0): result[i] = Chr(val mod 8 + ord('0')) val = val div 8 @@ -326,18 +425,15 @@ proc findNormalized(x: string, inArray: openarray[string]): int = # security whole ... return -1 -proc `%`(formatstr: string, a: openarray[string]): string = - # the format operator - const - PatternChars = {'a'..'z', 'A'..'Z', '0'..'9', '\128'..'\255', '_'} - result = "" +proc addf(s: var string, formatstr: string, a: openarray[string]) = + const PatternChars = {'a'..'z', 'A'..'Z', '0'..'9', '\128'..'\255', '_'} var i = 0 while i < len(formatstr): if formatstr[i] == '$': case formatstr[i+1] # again we use the fact that strings # are zero-terminated here of '$': - add result, '$' + add s, '$' inc(i, 2) of '1'..'9': var j = 0 @@ -345,25 +441,29 @@ proc `%`(formatstr: string, a: openarray[string]): string = while formatstr[i] in {'0'..'9'}: j = j * 10 + ord(formatstr[i]) - ord('0') inc(i) - add result, a[j - 1] + add s, a[j - 1] of '{': var j = i+1 while formatstr[j] notin {'\0', '}'}: inc(j) var x = findNormalized(copy(formatstr, i+2, j-1), a) - if x >= 0 and x < high(a): add result, a[x+1] + if x >= 0 and x < high(a): add s, a[x+1] else: raise newException(EInvalidValue, "invalid format string") i = j+1 of 'a'..'z', 'A'..'Z', '\128'..'\255', '_': var j = i+1 while formatstr[j] in PatternChars: inc(j) var x = findNormalized(copy(formatstr, i+1, j-1), a) - if x >= 0 and x < high(a): add result, a[x+1] + if x >= 0 and x < high(a): add s, a[x+1] else: raise newException(EInvalidValue, "invalid format string") i = j else: raise newException(EInvalidValue, "invalid format string") else: - add result, formatstr[i] + add s, formatstr[i] inc(i) + +proc `%`(formatstr: string, a: openarray[string]): string = + result = "" + addf(result, formatstr, a) proc cmpIgnoreCase(a, b: string): int = # makes usage of the fact that strings are zero-terminated @@ -377,9 +477,8 @@ proc cmpIgnoreCase(a, b: string): int = # thus we compile without checks here proc cmpIgnoreStyle(a, b: string): int = - var - i = 0 - j = 0 + var i = 0 + var j = 0 while True: while a[i] == '_': inc(i) while b[j] == '_': inc(j) # BUGFIX: typo @@ -400,14 +499,16 @@ proc splitSeq(s: string, seps: set[char]): seq[string] = # --------------------------------------------------------------------------- -proc strip(s: string): string = +proc strip(s: string, leading = true, trailing = true): string = const chars: set[Char] = Whitespace var first = 0 last = len(s)-1 - while s[first] in chars: inc(first) - while last >= 0 and s[last] in chars: dec(last) + if leading: + while s[first] in chars: inc(first) + if trailing: + while last >= 0 and s[last] in chars: dec(last) result = copy(s, first, last) proc toLower(c: Char): Char = @@ -451,7 +552,7 @@ proc preprocessSub(sub: string, a: var TSkipTable) = for i in 0..0xff: a[chr(i)] = m+1 for i in 0..m-1: a[sub[i]] = m-i -proc findSubStrAux(sub, s: string, start: int, a: TSkipTable): int = +proc findSubStrAux(s, sub: string, start: int, a: TSkipTable): int = # fast "quick search" algorithm: var m = len(sub) @@ -469,7 +570,7 @@ proc findSubStrAux(sub, s: string, start: int, a: TSkipTable): int = proc findSubStr(sub, s: string, start: int = 0): int = var a: TSkipTable preprocessSub(sub, a) - result = findSubStrAux(sub, s, start, a) + result = findSubStrAux(s, sub, start, a) # slow linear search: #var # i, j, M, N: int @@ -492,6 +593,20 @@ proc findSubStr(sub, s: string, start: int = 0): int = # elif (i >= N): # return -1 +proc find(s, sub: string, start: int = 0): int = + var a: TSkipTable + preprocessSub(sub, a) + result = findSubStrAux(s, sub, start, a) + +proc find(s: string, sub: char, start: int = 0): int = + for i in start..len(s)-1: + if sub == s[i]: return i + return -1 + +proc find(s: string, chars: set[char], start: int = 0): int = + for i in start..s.len-1: + if s[i] in chars: return i + return -1 proc findSubStr(sub: char, s: string, start: int = 0): int = for i in start..len(s)-1: @@ -504,23 +619,21 @@ proc findChars(chars: set[char], s: string, start: int = 0): int = return -1 proc contains(s: string, chars: set[char]): bool = - return findChars(chars, s) >= 0 + return find(s, chars) >= 0 proc contains(s: string, c: char): bool = - return findSubStr(c, s) >= 0 + return find(s, c) >= 0 proc contains(s, sub: string): bool = - return findSubStr(sub, s) >= 0 + return find(s, sub) >= 0 proc replaceStr(s, sub, by: string): string = - var - i, j: int - a: TSkipTable + var a: TSkipTable result = "" preprocessSub(sub, a) - i = 0 + var i = 0 while true: - j = findSubStrAux(sub, s, i, a) + var j = findSubStrAux(s, sub, i, a) if j < 0: break add result, copy(s, i, j - 1) add result, by @@ -583,7 +696,10 @@ proc rawParseInt(s: string, index: var int): BiggestInt = while s[i] == '_': inc(i) # underscores are allowed and ignored result = result * sign - index = i # store index back + if s[i] == '\0': + index = i # store index back + else: + index = -1 # BUGFIX: error! else: index = -1 @@ -602,17 +718,17 @@ proc parseInt(s: string): int = result = int(res) # convert to smaller integer type proc ParseBiggestInt(s: string): biggestInt = - var - index: int = 0 + var index = 0 result = rawParseInt(s, index) if index == -1: raise newException(EInvalidValue, "invalid integer: " & s) -proc ParseFloat(s: string): float = +proc ParseFloat(s: string, start = 0): float = var esign = 1.0 sign = 1.0 - exponent, i: int + i = start + exponent: int flags: int result = 0.0 if s[i] == '+': inc(i) @@ -677,7 +793,7 @@ proc ParseFloat(s: string): float = proc toOct*(x: BiggestInt, len: int): string = ## converts `x` into its octal representation. The resulting string is - ## always `len` characters long. No leading ``0c`` prefix is generated. + ## always `len` characters long. No leading ``0o`` prefix is generated. var mask: BiggestInt = 7 shift: BiggestInt = 0 @@ -701,7 +817,7 @@ proc toBin*(x: BiggestInt, len: int): string = shift = shift + 1 mask = mask shl 1 -proc escape*(s: string, prefix, suffix = "\""): string = +proc escape*(s: string, prefix = "\"", suffix = "\""): string = ## Escapes a string `s`. This does these operations (at the same time): ## * replaces any ``\`` by ``\\`` ## * replaces any ``'`` by ``\'`` @@ -723,8 +839,34 @@ proc escape*(s: string, prefix, suffix = "\""): string = else: add(result, c) add(result, suffix) +proc validEmailAddress*(s: string): bool = + ## returns true if `s` seems to be a valid e-mail address. + ## The checking also uses a domain list. + const + chars = Letters + Digits + {'!','#','$','%','&', + '\'','*','+','/','=','?','^','_','`','{','}','|','~','-','.'} + var i = 0 + if s[i] notin chars or s[i] == '.': return false + while s[i] in chars: + if s[i] == '.' and s[i+1] == '.': return false + inc(i) + if s[i] != '@': return false + var j = len(s)-1 + if s[j] notin letters: return false + while j >= i and s[j] in letters: dec(j) + inc(i) # skip '@' + while s[i] in {'0'..'9', 'a'..'z', '-', '.'}: inc(i) + if s[i] != '\0': return false + + var x = copy(s, j+1) + if len(x) == 2 and x[0] in Letters and x[1] in Letters: return true + case toLower(x) + of "com", "org", "net", "gov", "mil", "biz", "info", "mobi", "name", + "aero", "jobs", "museum": return true + return false + proc editDistance*(a, b: string): int = - ## returns the edit distance between `s` and `t`. This uses the Levenshtein + ## returns the edit distance between `a` and `b`. This uses the Levenshtein ## distance algorithm with only a linear memory overhead. This implementation ## is highly optimized! var len1 = a.len diff --git a/lib/sysstr.nim b/lib/sysstr.nim index 72f50f85a..ea46fa503 100644 --- a/lib/sysstr.nim +++ b/lib/sysstr.nim @@ -37,16 +37,21 @@ proc eqStrings(a, b: NimString): bool {.inline, compilerProc.} = proc rawNewString(space: int): NimString {.compilerProc.} = var s = space if s < 8: s = 7 - result = cast[NimString](newObj(addr(strDesc), sizeof(TGenericSeq) + - (s+1) * sizeof(char))) - #result.len = 0 + when defined(boehmGC): + result = cast[NimString](boehmAllocAtomic( + sizeof(TGenericSeq) + (s+1) * sizeof(char))) + result.len = 0 + result.data[0] = '\0' + else: + result = cast[NimString](newObj(addr(strDesc), sizeof(TGenericSeq) + + (s+1) * sizeof(char))) result.space = s - #result.data[0] = '\0' proc mnewString(len: int): NimString {.exportc.} = result = rawNewString(len) result.len = len - #result.data[len] = '\0' + when defined(boehmGC): + result.data[len] = '\0' proc toNimStr(str: CString, len: int): NimString {.compilerProc.} = result = rawNewString(len) @@ -224,10 +229,11 @@ proc setLengthSeq(seq: PGenericSeq, elemSize, newLen: int): PGenericSeq {. GenericSeqSize)) elif newLen < result.len: # we need to decref here, otherwise the GC leaks! - for i in newLen..result.len-1: - forAllChildrenAux(cast[pointer](cast[TAddress](result) +% - GenericSeqSize +% (i*%elemSize)), - extGetCellType(result).base, waZctDecRef) + when not defined(boehmGC): + for i in newLen..result.len-1: + forAllChildrenAux(cast[pointer](cast[TAddress](result) +% + GenericSeqSize +% (i*%elemSize)), + extGetCellType(result).base, waZctDecRef) # and set the memory to nil: zeroMem(cast[pointer](cast[TAddress](result) +% GenericSeqSize +% (newLen*%elemSize)), (result.len-%newLen) *% elemSize) diff --git a/lib/system.nim b/lib/system.nim index 1ac6a8445..67a4221f1 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -14,8 +14,8 @@ ## explicitly. Because of this there can not be a user-defined module named ## ``system``. ## -## *"The good thing about reinventing the wheel is that you can get a -## round one."* +## *The good thing about reinventing the wheel is that you can get a +## round one.* {.push hints: off.} @@ -1044,8 +1044,9 @@ proc isNil*(x: cstring): bool {.noSideEffect, magic: "IsNil".} # Fixup some magic symbols here: -{.fixup_system.} # This is an undocumented pragma that can only be used - # once in the system module. +#{.fixup_system.} +# This is an undocumented pragma that can only be used +# once in the system module. proc `&` *[T](x, y: seq[T]): seq[T] {.noSideEffect.} = newSeq(result, x.len + y.len) @@ -1099,6 +1100,13 @@ proc find*[T, S](a: T, item: S): int {.inline.} = inc(result) result = -1 +proc pop*[T](s: var seq[T]): T {.inline.} = + ## returns the last item of `s` and decreases ``s.len`` by one. This treats + ## `s` as a stack and implements the common *pop* operation. + var L = s.len-1 + result = s[L] + setLen(s, L) + # ----------------- FPU ------------------------------------------------------ #proc disableFPUExceptions*() @@ -1401,16 +1409,95 @@ when not defined(EcmaScript) and not defined(NimrodVM): # as it would recurse endlessly! include arithm {.pop.} # stack trace + include dyncalls const GenericSeqSize = (2 * sizeof(int)) - - when not defined(boehmgc) and not defined(nogc): + + proc reprAny(p: pointer, typ: PNimType): string {.compilerproc.} + + proc getDiscriminant(aa: Pointer, n: ptr TNimNode): int = + assert(n.kind == nkCase) + var d: int + var a = cast[TAddress](aa) + case n.typ.size + of 1: d = ze(cast[ptr int8](a +% n.offset)^) + of 2: d = ze(cast[ptr int16](a +% n.offset)^) + of 4: d = int(cast[ptr int32](a +% n.offset)^) + else: assert(false) + return d + + proc selectBranch(aa: Pointer, n: ptr TNimNode): ptr TNimNode = + var discr = getDiscriminant(aa, n) + if discr <% n.len: + result = n.sons[discr] + if result == nil: result = n.sons[n.len] + # n.sons[n.len] contains the ``else`` part (but may be nil) + else: + result = n.sons[n.len] + + when defined(boehmgc): + const + boehmLib = "/opt/lib/libgc.so" + + proc boehmGC_disable {.importc: "GC_disable", dynlib: boehmLib.} + proc boehmGC_enable {.importc: "GC_enable", dynlib: boehmLib.} + proc boehmGCincremental {. + importc: "GC_enable_incremental", dynlib: boehmLib.} + proc boehmGCfullCollect {.importc: "GC_gcollect", dynlib: boehmLib.} + proc boehmAlloc(size: int): pointer {. + importc: "GC_malloc", dynlib: boehmLib.} + proc boehmAllocAtomic(size: int): pointer {. + importc: "GC_malloc_atomic", dynlib: boehmLib.} + proc boehmRealloc(p: pointer, size: int): pointer {. + importc: "GC_realloc", dynlib: boehmLib.} + proc boehmDealloc(p: pointer) {.importc: "GC_free", dynlib: boehmLib.} + + include cellsets + + when defined(boehmGC): + proc initGC() = nil + + #boehmGCincremental() + + proc GC_disable() = boehmGC_disable() + proc GC_enable() = boehmGC_enable() + proc GC_fullCollect() = boehmGCfullCollect() + proc GC_setStrategy(strategy: TGC_Strategy) = nil + proc GC_enableMarkAndSweep() = nil + proc GC_disableMarkAndSweep() = nil + proc GC_getStatistics(): string = return "" + + proc getOccupiedMem(): int = return -1 + proc getFreeMem(): int = return -1 + proc getTotalMem(): int = return -1 + + proc growObj(old: pointer, newsize: int): pointer {.inline.} = + result = boehmRealloc(old, newsize) + proc newObj(size: int): pointer {.compilerproc.} = + result = boehmAlloc(size) + proc newSeq(baseSize, len: int): pointer {.compilerproc.} = + # XXX: overflow checks! + result = newObj(len * baseSize + GenericSeqSize) + cast[PGenericSeq](result).len = len + cast[PGenericSeq](result).space = len + + proc setStackBottom(theStackBottom: pointer) {.compilerproc.} = nil + proc nimGCref(p: pointer) {.compilerproc, inline.} = nil + proc nimGCunref(p: pointer) {.compilerproc, inline.} = nil + + proc unsureAsgnRef(dest: ppointer, src: pointer) {.compilerproc, inline.} = + dest^ = src + proc asgnRef(dest: ppointer, src: pointer) {.compilerproc, inline.} = + dest^ = src + proc asgnRefNoCycle(dest: ppointer, src: pointer) {.compilerproc, inline.} = + dest^ = src + + elif not defined(nogc): include gc include sysstr include assign - include dyncalls include repr # we have to implement it here after gentostr for the cstrToNimStrDummy proc diff --git a/lib/tinalloc.nim b/lib/tinalloc.nim deleted file mode 100644 index 27a1e0b00..000000000 --- a/lib/tinalloc.nim +++ /dev/null @@ -1,72 +0,0 @@ -# Memory handling for small objects - -const - minRequestSize = 2 * sizeof(pointer) # minimal block is 16 bytes - pageSize = 1024 * sizeof(int) - pageBits = pageSize div minRequestSize - pageMask = pageSize-1 - - bitarraySize = pageBits div (sizeof(int)*8) - dataSize = pageSize - (bitarraySize+6) * sizeof(pointer) - -type - TMinRequest {.final.} = object - next, prev: ptr TMinRequest # stores next free bit - - TChunk {.pure.} = object # a chunk manages at least a page - size: int # lowest bit signals if it is a small chunk (0) or - # a big chunk (1) - typ: PNimType - next, prev: ptr TChunk - nextOfSameType: ptr TChunk - - TSmallChunk = object of TChunk ## manages pageSize bytes for a type and a - ## fixed size - free: int ## index of first free bit - bits: array[0..bitarraySize-1, int] - data: array[0..dataSize div minRequestSize - 1, TMinRequest] - - PSmallChunk = ptr TSmallChunk - -assert(sizeof(TSmallChunk) == pageSize) - -proc getNewChunk(size: int, typ: PNimType): PSmallChunk = - result = cast[PSmallChunk](getPages(1)) - result.size = PageSize - result.typ = typ - result.next = chunkHead - result.prev = nil - chunkHead.prev = result - chunkHead = result.next - result.nextOfSameType = cast[PSmallChunk](typ.chunk) - typ.chunk = result - result.free = addr(result.data[0]) - result.data[0].next = addr(result.data[1]) - result.data[0].prev = nil - result.data[high(result.data)].next = nil - result.data[high(result.data)].prev = addr(result.data[high(result.data)-1]) - for i in 1..high(result.data)-1: - result.data[i].next = addr(result.data[i+1]) - result.data[i].prev = addr(result.data[i-1]) - -proc newSmallObj(size: int, typ: PNimType): pointer = - var chunk = cast[PSmallChunk](typ.chunk) - if chunk == nil or chunk.free <= 0: - if chunk.free < 0: GC_collect() - chunk = getNewChunk(size, typ) - chunk.nextOfSameType = typ.chunk - typ.chunk = chunk - var idx = chunk.free - setBit(chunk.bits[idx /% bitarraySize], idx %% bitarraySize) - result = cast[pointer](cast[TAddress](addr(chunk.data)) + - minRequestSize * idx) - var res = cast[PMinRequest](result) - chunk.free = res.next - res.next - -proc freeObj(obj: pointer) = - var chunk = cast[PChunk](cast[TAddress(obj) and not pageMask) - if size and 1 == 0: # small chunk - var idx = (cast[TAddress](obj) shr pageShift) div minRequestSize - resetBit(chunk.bits[idx /% bitarraySize], idx %% bitarraySize) - diff --git a/lib/unicode.nim b/lib/unicode.nim index 045439690..70a18f70d 100644 --- a/lib/unicode.nim +++ b/lib/unicode.nim @@ -9,6 +9,8 @@ ## This module provides support to handle the Unicode UTF-8 encoding. +{.deadCodeElim: on.} + type TRune* = int ## type that can hold any Unicode character TRune16* = int16 ## 16 bit Unicode character diff --git a/nim/ast.pas b/nim/ast.pas index c22385805..a57632468 100644 --- a/nim/ast.pas +++ b/nim/ast.pas @@ -93,12 +93,12 @@ type nkTypeDef, nkYieldStmt, nkTryStmt, nkFinally, nkRaiseStmt, nkReturnStmt, nkBreakStmt, nkContinueStmt, nkBlockStmt, nkDiscardStmt, nkStmtList, nkImportStmt, - nkFromStmt, nkImportAs, nkIncludeStmt, nkAccessStmt, - nkCommentStmt, nkStmtListExpr, nkBlockExpr, nkStmtListType, - nkBlockType, nkVm, nkTypeOfExpr, nkObjectTy, - nkTupleTy, nkRecList, nkRecCase, nkRecWhen, - nkRefTy, nkPtrTy, nkVarTy, nkProcTy, - nkEnumTy, nkEnumFieldDef, nkReturnToken); + nkFromStmt, nkImportAs, nkIncludeStmt, nkCommentStmt, + nkStmtListExpr, nkBlockExpr, nkStmtListType, nkBlockType, + nkVm, nkTypeOfExpr, nkObjectTy, nkTupleTy, + nkRecList, nkRecCase, nkRecWhen, nkRefTy, + nkPtrTy, nkVarTy, nkProcTy, nkEnumTy, + nkEnumFieldDef, nkReturnToken); TNodeKinds = set of TNodeKind; const NodeKindToStr: array [TNodeKind] of string = ( @@ -128,12 +128,12 @@ const 'nkTypeDef', 'nkYieldStmt', 'nkTryStmt', 'nkFinally', 'nkRaiseStmt', 'nkReturnStmt', 'nkBreakStmt', 'nkContinueStmt', 'nkBlockStmt', 'nkDiscardStmt', 'nkStmtList', 'nkImportStmt', - 'nkFromStmt', 'nkImportAs', 'nkIncludeStmt', 'nkAccessStmt', - 'nkCommentStmt', 'nkStmtListExpr', 'nkBlockExpr', 'nkStmtListType', - 'nkBlockType', 'nkVm', 'nkTypeOfExpr', 'nkObjectTy', - 'nkTupleTy', 'nkRecList', 'nkRecCase', 'nkRecWhen', - 'nkRefTy', 'nkPtrTy', 'nkVarTy', 'nkProcTy', - 'nkEnumTy', 'nkEnumFieldDef', 'nkReturnToken'); + 'nkFromStmt', 'nkImportAs', 'nkIncludeStmt', 'nkCommentStmt', + 'nkStmtListExpr', 'nkBlockExpr', 'nkStmtListType', 'nkBlockType', + 'nkVm', 'nkTypeOfExpr', 'nkObjectTy', 'nkTupleTy', + 'nkRecList', 'nkRecCase', 'nkRecWhen', 'nkRefTy', + 'nkPtrTy', 'nkVarTy', 'nkProcTy', 'nkEnumTy', + 'nkEnumFieldDef', 'nkReturnToken'); type TSymFlag = ( sfUsed, sfStar, sfMinus, sfInInterface, @@ -327,7 +327,8 @@ type ); TLocFlag = ( - lfIndirect, // backend introduced a pointer + lfIndirect, // backend introduced a pointer + lfParamCopy, // backend introduced a parameter copy (LLVM) lfNoDeepCopy, // no need for a deep copy lfNoDecl, // do not declare it in C lfDynamicLib, // link symbol to dynamic library diff --git a/nim/ccgexprs.pas b/nim/ccgexprs.pas index 161804208..03de5c4de 100644 --- a/nim/ccgexprs.pas +++ b/nim/ccgexprs.pas @@ -1233,16 +1233,14 @@ begin app(r, '.Sup'); s := skipGeneric(s.sons[0]); end; - appf(p.s[cpsStmts], '$1.m_type = $2;$n', - [r, genTypeInfo(p.module, t)]) + appf(p.s[cpsStmts], '$1.m_type = $2;$n', [r, genTypeInfo(p.module, t)]) end; frEmbedded: begin // worst case for performance: useMagic(p.module, 'objectInit'); if takeAddr then r := addrLoc(a) else r := rdLoc(a); - appf(p.s[cpsStmts], 'objectInit($1, $2);$n', - [r, genTypeInfo(p.module, t)]) + appf(p.s[cpsStmts], 'objectInit($1, $2);$n', [r, genTypeInfo(p.module, t)]) end end end; @@ -1256,9 +1254,15 @@ begin refType := skipVarGenericRange(e.sons[1].typ); InitLocExpr(p, e.sons[1], a); initLoc(b, locExpr, a.t, OnHeap); - b.r := ropef('($1) newObj($2, sizeof($3))', - [getTypeDesc(p.module, reftype), genTypeInfo(p.module, refType), - getTypeDesc(p.module, skipGenericRange(reftype.sons[0]))]); + + if optBoehmGC in gGlobalOptions then + b.r := ropef('($1) newObj(sizeof($2))', + [getTypeDesc(p.module, reftype), + getTypeDesc(p.module, skipGenericRange(reftype.sons[0]))]) + else + b.r := ropef('($1) newObj($2, sizeof($3))', + [getTypeDesc(p.module, reftype), genTypeInfo(p.module, refType), + getTypeDesc(p.module, skipGenericRange(reftype.sons[0]))]); genAssignment(p, a, b, {@set}[]); // set the object type: bt := skipGenericRange(refType.sons[0]); @@ -1275,10 +1279,16 @@ begin InitLocExpr(p, e.sons[1], a); InitLocExpr(p, e.sons[2], b); initLoc(c, locExpr, a.t, OnHeap); - c.r := ropef('($1) newSeq($2, $3)', - [getTypeDesc(p.module, seqtype), - genTypeInfo(p.module, seqType), - rdLoc(b)]); + if optBoehmGC in gGlobalOptions then + c.r := ropef('($1) newSeq(sizeof($2), $3)', + [getTypeDesc(p.module, seqtype), + getTypeDesc(p.module, skipGenericRange(seqtype.sons[0])), + rdLoc(b)]) + else + c.r := ropef('($1) newSeq($2, $3)', + [getTypeDesc(p.module, seqtype), + genTypeInfo(p.module, seqType), + rdLoc(b)]); genAssignment(p, a, c, {@set}[]); end; @@ -1324,7 +1334,8 @@ begin refType := skipVarGenericRange(e.sons[1].typ); InitLocExpr(p, e.sons[1], a); - // This is a little hack: + // This is a little hack: + // XXX this is also a bug, if the finalizer expression produces side-effects oldModule := p.module; p.module := gmti; InitLocExpr(p, e.sons[2], f); @@ -2290,7 +2301,7 @@ begin len := sonsLen(n); result := toRope('{'+''); for i := 0 to len - 2 do - app(result, ropef('$1,$n', [genConstExpr(p, n.sons[i])])); + appf(result, '$1,$n', [genConstExpr(p, n.sons[i])]); if len > 0 then app(result, genConstExpr(p, n.sons[len-1])); app(result, '}' + tnl) end; @@ -2299,6 +2310,7 @@ function genConstExpr(p: BProc; n: PNode): PRope; var trans: PNode; cs: TBitSet; + d: TLoc; begin case n.Kind of nkHiddenStdConv, nkHiddenSubConv: result := genConstExpr(p, n.sons[1]); @@ -2317,7 +2329,10 @@ begin trans := n; result := genConstSimpleList(p, trans); end - else - result := genLiteral(p, n) + else begin + // result := genLiteral(p, n) + initLocExpr(p, n, d); + result := rdLoc(d) + end end end; diff --git a/nim/ccgstmts.pas b/nim/ccgstmts.pas index e611bbeea..7588f7e15 100644 --- a/nim/ccgstmts.pas +++ b/nim/ccgstmts.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -18,25 +18,41 @@ begin line := toLinenumber(t.info); // BUGFIX if line < 0 then line := 0; // negative numbers are not allowed in #line if optLineDir in p.Options then - appf(p.s[cpsStmts], '#line $2 "$1"$n', + appff(p.s[cpsStmts], + '#line $2 "$1"$n', + '; line $2 "$1"$n', [toRope(toFilename(t.info)), toRope(line)]); if ([optStackTrace, optEndb] * p.Options = [optStackTrace, optEndb]) and ((p.prc = nil) or not (sfPure in p.prc.flags)) then begin useMagic(p.module, 'endb'); // new: endb support - appf(p.s[cpsStmts], 'endb($1);$n', [toRope(line)]) + appff(p.s[cpsStmts], 'endb($1);$n', + 'call void @endb(%NI $1)$n', + [toRope(line)]) end else if ([optLineTrace, optStackTrace] * p.Options = [optLineTrace, optStackTrace]) and ((p.prc = nil) or - not (sfPure in p.prc.flags)) then - appf(p.s[cpsStmts], 'F.line = $1;$n', [toRope(line)]) + not (sfPure in p.prc.flags)) then begin + inc(p.labels); + appff(p.s[cpsStmts], 'F.line = $1;$n', + '%LOC$2 = getelementptr %TF %F, %NI 2$n' + + 'store %NI $1, %NI* %LOC$2$n', + [toRope(line), toRope(p.labels)]) + end end; procedure finishTryStmt(p: BProc; howMany: int); var i: int; begin - for i := 1 to howMany do - app(p.s[cpsStmts], 'excHandler = excHandler->prev;' + tnl); + for i := 1 to howMany do begin + inc(p.labels, 3); + appff(p.s[cpsStmts], 'excHandler = excHandler->prev;$n', + '%LOC$1 = load %TSafePoint** @excHandler$n' + + '%LOC$2 = getelementptr %TSafePoint* %LOC$1, %NI 0$n' + + '%LOC$3 = load %TSafePoint** %LOC$2$n' + + 'store %TSafePoint* %LOC$3, %TSafePoint** @excHandler$n', + [toRope(p.labels), toRope(p.labels-1), toRope(p.labels-2)]); + end end; procedure genReturnStmt(p: BProc; t: PNode); @@ -45,7 +61,7 @@ begin genLineDir(p, t); if (t.sons[0] <> nil) then genStmts(p, t.sons[0]); finishTryStmt(p, p.nestedTryStmts); - app(p.s[cpsStmts], 'goto BeforeRet;' + tnl) + appff(p.s[cpsStmts], 'goto BeforeRet;$n', 'br label %BeforeRet$n', []) end; procedure initVariable(p: BProc; v: PSym); @@ -53,11 +69,29 @@ begin if containsGarbageCollectedRef(v.typ) or (v.ast = nil) then // Language change: always initialize variables if v.ast == nil! if not (skipVarGenericRange(v.typ).Kind in [tyArray, tyArrayConstr, tySet, - tyTuple, tyObject]) then - appf(p.s[cpsStmts], '$1 = 0;$n', [rdLoc(v.loc)]) - else - appf(p.s[cpsStmts], 'memset((void*)$1, 0, sizeof($2));$n', - [addrLoc(v.loc), rdLoc(v.loc)]) + tyTuple, tyObject]) then begin + if gCmd = cmdCompileToLLVM then + appf(p.s[cpsStmts], 'store $2 0, $2* $1$n', + [addrLoc(v.loc), getTypeDesc(p.module, v.loc.t)]) + else + appf(p.s[cpsStmts], '$1 = 0;$n', [rdLoc(v.loc)]) + end + else begin + if gCmd = cmdCompileToLLVM then begin + app(p.module.s[cfsProcHeaders], + 'declare void @llvm.memset.i32(i8*, i8, i32, i32)' + tnl); + inc(p.labels, 2); + appf(p.s[cpsStmts], + '%LOC$3 = getelementptr $2* null, %NI 1$n' + + '%LOC$4 = cast $2* %LOC$3 to i32$n' + + 'call void @llvm.memset.i32(i8* $1, i8 0, i32 %LOC$4, i32 0)$n', + [addrLoc(v.loc), getTypeDesc(p.module, v.loc.t), + toRope(p.labels), toRope(p.labels-1)]) + end + else + appf(p.s[cpsStmts], 'memset((void*)$1, 0, sizeof($2));$n', + [addrLoc(v.loc), rdLoc(v.loc)]) + end end; procedure genVarStmt(p: BProc; n: PNode); @@ -73,7 +107,7 @@ begin assert(a.sons[0].kind = nkSym); v := a.sons[0].sym; if sfGlobal in v.flags then - assignGlobalVar(p.module, v) + assignGlobalVar(p, v) else begin assignLocalVar(p, v); initVariable(p, v) // XXX: this is not required if a.sons[2] != nil, @@ -140,10 +174,14 @@ begin nkElifBranch: begin initLocExpr(p, it.sons[0], a); Lelse := getLabel(p); - appf(p.s[cpsStmts], 'if (!$1) goto $2;$n', [rdLoc(a), Lelse]); + inc(p.labels); + appff(p.s[cpsStmts], 'if (!$1) goto $2;$n', + 'br i1 $1, label %LOC$3, label %$2$n' + + 'LOC$3: $n', + [rdLoc(a), Lelse, toRope(p.labels)]); genStmts(p, it.sons[1]); if sonsLen(n) > 1 then - appf(p.s[cpsStmts], 'goto $1;$n', [Lend]); + appff(p.s[cpsStmts], 'goto $1;$n', 'br label %$1$n', [Lend]); fixLabel(p, Lelse); end; nkElse: begin @@ -857,7 +895,7 @@ begin nkCaseStmt: genCaseStmt(p, t); nkReturnStmt: genReturnStmt(p, t); nkBreakStmt: genBreakStmt(p, t); - nkCall: begin + nkCall, nkHiddenCallConv, nkInfix, nkPrefix, nkPostfix, nkCommand: begin genLineDir(p, t); initLocExpr(p, t, a); end; diff --git a/nim/ccgtypes.pas b/nim/ccgtypes.pas index f6eb64c08..ee7388e1c 100644 --- a/nim/ccgtypes.pas +++ b/nim/ccgtypes.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -45,7 +45,19 @@ function mangleName(s: PSym): PRope; begin result := s.loc.r; if result = nil then begin - result := toRope(mangle(s.name.s)); + if gCmd = cmdCompileToLLVM then begin + case s.kind of + skProc, skConverter, skConst: result := toRope('@'+''); + skVar: begin + if (sfGlobal in s.flags) then result := toRope('@'+'') + else result := toRope('%'+''); + end; + skForVar, skTemp, skParam, skType, skEnumField, skModule: + result := toRope('%'+''); + else InternalError(s.info, 'mangleName'); + end; + end; + app(result, toRope(mangle(s.name.s))); app(result, '_'+''); app(result, toRope(s.id)); if optGenMapping in gGlobalOptions then @@ -58,15 +70,33 @@ end; function getTypeName(typ: PType): PRope; begin - if (typ.sym <> nil) and ([sfImportc, sfExportc] * typ.sym.flags <> []) then + if (typ.sym <> nil) and ([sfImportc, sfExportc] * typ.sym.flags <> []) + and (gCmd <> cmdCompileToLLVM) then result := typ.sym.loc.r else begin - if typ.loc.r = nil then typ.loc.r := con('TY', toRope(typ.id)); + if typ.loc.r = nil then + typ.loc.r := ropeff('TY$1', '%TY$1', [toRope(typ.id)]); result := typ.loc.r end; if result = nil then InternalError('getTypeName: ' + typeKindToStr[typ.kind]); end; +// ----------------------------- other helpers ---------------------------- +(* +function getSizeof(m: BModule; var labels: int; + var body: PRope; typ: PType): PRope; +begin + if (gCmd <> cmdCompileToLLVM) then + result := ropef('sizeof($1)', getTypeDesc(m, typ)) + else begin + inc(labels, 2); + result := ropef('%UOC$1', [toRope(labels)]); + appf(body, '%UOC$1 = getelementptr $3* null, %NI 1$n' + + '$2 = cast $3* %UOC$1 to i32$n', + [toRope(labels-1), result, getTypeDesc(m, typ)]); + end +end; *) + // ------------------------------ C type generator ------------------------ function mapType(typ: PType): TCTypeKind; @@ -104,10 +134,6 @@ begin tyPtr, tyVar, tyRef: begin case typ.sons[0].kind of tyOpenArray, tyArrayConstr, tyArray: result := ctArray; - (*tySet: begin - if mapType(typ.sons[0]) = ctArray then result := ctArray - else result := ctPtr - end*) else result := ctPtr end end; @@ -155,6 +181,10 @@ const // but one can //define it to what you want so there will no problem 'N_INLINE', 'N_NOINLINE', 'N_FASTCALL', 'N_CLOSURE', 'N_NOCONV'); + CallingConvToStrLLVM: array [TCallingConvention] of string = ('fastcc $1', + 'stdcall $1', 'ccc $1', 'safecall $1', 'syscall $1', + '$1 alwaysinline', '$1 noinline', 'fastcc $1', 'ccc $1', '$1'); + function CacheGetType(const tab: TIdTable; key: PType): PRope; begin // returns nil if we need to declare this type @@ -165,7 +195,13 @@ end; function getTempName(): PRope; begin - result := con('TMP', toRope(gId)); + result := ropeff('TMP$1', '%TMP$1', [toRope(gId)]); + inc(gId); +end; + +function getGlobalTempName(): PRope; +begin + result := ropeff('TMP$1', '@TMP$1', [toRope(gId)]); inc(gId); end; @@ -194,7 +230,8 @@ end; procedure fillResult(param: PSym); begin - fillLoc(param.loc, locParam, param.typ, toRope('Result'), OnStack); + fillLoc(param.loc, locParam, param.typ, ropeff('Result', '%Result', []), + OnStack); if (mapType(param.typ) <> ctArray) and IsInvalidReturnType(param.typ) then begin include(param.loc.flags, lfIndirect); @@ -232,7 +269,7 @@ begin if arr.kind = tyVar then arr := arr.sons[0]; j := 0; while arr.Kind = tyOpenArray do begin // need to pass hidden parameter: - appf(params, ', NI $1Len$2', [param.loc.r, toRope(j)]); + appff(params, ', NI $1Len$2', ', @NI $1Len$2', [param.loc.r, toRope(j)]); inc(j); arr := arr.sons[0] end; @@ -241,8 +278,9 @@ begin if (t.sons[0] <> nil) and isInvalidReturnType(t.sons[0]) then begin if params <> nil then app(params, ', '); app(params, getTypeDescAux(m, t.sons[0], check)); - if mapType(t.sons[0]) <> ctArray then app(params, '*'+''); - app(params, ' Result'); + if (mapType(t.sons[0]) <> ctArray) or (gCmd = cmdCompileToLLVM) then + app(params, '*'+''); + appff(params, ' Result', ' @Result', []); end; if t.callConv = ccClosure then begin if params <> nil then app(params, ', '); @@ -252,7 +290,7 @@ begin if params <> nil then app(params, ', '); app(params, '...') end; - if params = nil then + if (params = nil) and (gCmd <> cmdCompileToLLVM) then app(params, 'void)') else app(params, ')'+''); @@ -621,7 +659,7 @@ begin end end; -function getTypeDesc(m: BModule; typ: PType): PRope; +function getTypeDesc(m: BModule; typ: PType): PRope; overload; var check: TIntSet; begin @@ -629,6 +667,19 @@ begin result := getTypeDescAux(m, typ, check); end; +function getTypeDesc(m: BModule; const magic: string): PRope; overload; +var + sym: PSym; +begin + sym := magicsys.getCompilerProc(magic); + if sym <> nil then + result := getTypeDesc(m, sym.typ) + else begin + rawMessage(errSystemNeeds, magic); + result := nil + end +end; + procedure finishTypeDescriptions(m: BModule); var i: int; @@ -1012,4 +1063,4 @@ begin end end end; -*) \ No newline at end of file +*) diff --git a/nim/ccgutils.pas b/nim/ccgutils.pas index 97ef65f70..56eff6c9e 100644 --- a/nim/ccgutils.pas +++ b/nim/ccgutils.pas @@ -20,6 +20,7 @@ uses function toCChar(c: Char): string; function makeCString(const s: string): PRope; +function makeLLVMString(const s: string): PRope; function TableGetType(const tab: TIdTable; key: PType): PObject; function GetUniqueType(key: PType): PType; @@ -154,6 +155,33 @@ begin app(result, toRope(res)); end; +function makeLLVMString(const s: string): PRope; +const + MaxLineLength = 64; +var + i: int; + res: string; +begin + result := nil; + res := 'c"'; + for i := strStart to length(s)+strStart-1 do begin + if (i-strStart+1) mod MaxLineLength = 0 then begin + app(result, toRope(res)); + setLength(res, 0); + end; + case s[i] of + #0..#31, #128..#255, '"', '\': begin + addChar(res, '\'); + add(res, toHex(ord(s[i]), 2)); + end + else + addChar(res, s[i]) + end; + end; + add(res, '\00"'); + app(result, toRope(res)); +end; + begin InitTypeTables(); end. diff --git a/nim/cgen.pas b/nim/cgen.pas index 02713f902..5dcb7f50b 100644 --- a/nim/cgen.pas +++ b/nim/cgen.pas @@ -37,9 +37,9 @@ type // reasons cfsFieldInfo, // section for field information cfsTypeInfo, // section for type information + cfsProcHeaders, // section for C procs prototypes cfsData, // section for C constant data cfsVars, // section for C variable declarations - cfsProcHeaders, // section for C procs prototypes cfsProcs, // section for C procs that are not inline cfsTypeInit1, // section 1 for declarations of type information cfsTypeInit2, // section 2 for initialization of type information @@ -120,6 +120,7 @@ type forwardedProcs: TSymSeq; // keep forwarded procs here typeNodes, nimTypes: int;// used for type info generation typeNodesName, nimTypesName: PRope; // used for type info generation + labels: natural; // for generating unique module-scope names end; var @@ -132,6 +133,24 @@ var gForwardedProcsCounter: int = 0; gmti: BModule; // generated type info: no need to initialize: defaults fit +function ropeff(const cformat, llvmformat: string; + const args: array of PRope): PRope; +begin + if gCmd = cmdCompileToLLVM then + result := ropef(llvmformat, args) + else + result := ropef(cformat, args) +end; + +procedure appff(var dest: PRope; const cformat, llvmformat: string; + const args: array of PRope); +begin + if gCmd = cmdCompileToLLVM then + appf(dest, llvmformat, args) + else + appf(dest, cformat, args); +end; + procedure addForwardedProc(m: BModule; prc: PSym); var L: int; @@ -240,8 +259,12 @@ end; procedure getTemp(p: BProc; t: PType; var result: TLoc); begin inc(p.labels); - result.r := con('LOC', toRope(p.labels)); - appf(p.s[cpsLocals], '$1 $2;$n', [getTypeDesc(p.module, t), result.r]); + if gCmd = cmdCompileToLLVM then + result.r := con('%LOC', toRope(p.labels)) + else begin + result.r := con('LOC', toRope(p.labels)); + appf(p.s[cpsLocals], '$1 $2;$n', [getTypeDesc(p.module, t), result.r]); + end; result.k := locTemp; result.a := -1; result.t := getUniqueType(t); @@ -251,6 +274,86 @@ end; // -------------------------- Variable manager ---------------------------- +function cstringLit(p: BProc; var r: PRope; const s: string): PRope; overload; +begin + if gCmd = cmdCompileToLLVM then begin + inc(p.module.labels); + inc(p.labels); + result := ropef('%LOC$1', [toRope(p.labels)]); + appf(p.module.s[cfsData], '@C$1 = private constant [$2 x i8] $3$n', [ + toRope(p.module.labels), toRope(length(s)), makeLLVMString(s)]); + appf(r, '$1 = getelementptr [$2 x i8]* @C$3, %NI 0, %NI 0$n', + [result, toRope(length(s)), toRope(p.module.labels)]); + end + else + result := makeCString(s) +end; + +function cstringLit(m: BModule; var r: PRope; const s: string): PRope; overload; +begin + if gCmd = cmdCompileToLLVM then begin + inc(m.labels, 2); + result := ropef('%MOC$1', [toRope(m.labels-1)]); + appf(m.s[cfsData], '@MOC$1 = private constant [$2 x i8] $3$n', [ + toRope(m.labels), toRope(length(s)), makeLLVMString(s)]); + appf(r, '$1 = getelementptr [$2 x i8]* @MOC$3, %NI 0, %NI 0$n', + [result, toRope(length(s)), toRope(m.labels)]); + end + else + result := makeCString(s) +end; + +procedure allocParam(p: BProc; s: PSym); +var + tmp: PRope; +begin + assert(s.kind = skParam); + if not (lfParamCopy in s.loc.flags) then begin + inc(p.labels); + tmp := con('%LOC', toRope(p.labels)); + include(s.loc.flags, lfParamCopy); + include(s.loc.flags, lfIndirect); + appf(p.s[cpsInit], + '$1 = alloca $3$n' + + 'store $3 $2, $3* $1$n', [tmp, s.loc.r, getTypeDesc(p.module, s.loc.t)]); + s.loc.r := tmp + end; +end; + +procedure localDebugInfo(p: BProc; s: PSym); +var + name, a: PRope; +begin + if [optStackTrace, optEndb] * p.options <> [optStackTrace, optEndb] then exit; + if gCmd = cmdCompileToLLVM then begin + // "address" is the 0th field + // "typ" is the 1rst field + // "name" is the 2nd field + name := cstringLit(p, p.s[cpsInit], normalize(s.name.s)); + if (s.kind = skParam) and not ccgIntroducedPtr(s) then allocParam(p, s); + inc(p.labels, 3); + appf(p.s[cpsInit], + '%LOC$6 = getelementptr %TF* %F, %NI 0, $1, %NI 0$n' + + '%LOC$7 = getelementptr %TF* %F, %NI 0, $1, %NI 1$n' + + '%LOC$8 = getelementptr %TF* %F, %NI 0, $1, %NI 2$n' + + 'store i8* $2, i8** %LOC$6$n' + + 'store $3* $4, $3** %LOC$7$n' + + 'store i8* $5, i8** %LOC$8$n', + [toRope(p.frameLen), s.loc.r, getTypeDesc(p.module, 'TNimType'), + genTypeInfo(p.module, s.loc.t), name, toRope(p.labels), + toRope(p.labels-1), toRope(p.labels-2)]) + end + else begin + a := con('&'+'', s.loc.r); + if (s.kind = skParam) and ccgIntroducedPtr(s) then a := s.loc.r; + appf(p.s[cpsInit], + 'F.s[$1].address = (void*)$3; F.s[$1].typ = $4; F.s[$1].name = $2;$n', + [toRope(p.frameLen), makeCString(normalize(s.name.s)), a, + genTypeInfo(p.module, s.loc.t)]); + end; + inc(p.frameLen); +end; + procedure assignLocalVar(p: BProc; s: PSym); begin //assert(s.loc.k == locNone) // not yet assigned @@ -258,45 +361,54 @@ begin // for each module that uses them! if s.loc.k = locNone then fillLoc(s.loc, locLocalVar, s.typ, mangleName(s), OnStack); - app(p.s[cpsLocals], getTypeDesc(p.module, s.loc.t)); - if sfRegister in s.flags then - app(p.s[cpsLocals], ' register'); - if (sfVolatile in s.flags) or (p.nestedTryStmts > 0) then - app(p.s[cpsLocals], ' volatile'); + if gCmd = cmdCompileToLLVM then begin + appf(p.s[cpsLocals], '$1 = alloca $2$n', + [s.loc.r, getTypeDesc(p.module, s.loc.t)]); + include(s.loc.flags, lfIndirect); + end + else begin + app(p.s[cpsLocals], getTypeDesc(p.module, s.loc.t)); + if sfRegister in s.flags then + app(p.s[cpsLocals], ' register'); + if (sfVolatile in s.flags) or (p.nestedTryStmts > 0) then + app(p.s[cpsLocals], ' volatile'); - appf(p.s[cpsLocals], ' $1;$n', [s.loc.r]); + appf(p.s[cpsLocals], ' $1;$n', [s.loc.r]); + end; // if debugging we need a new slot for the local variable: - if [optStackTrace, optEndb] * p.Options = [optStackTrace, optEndb] then begin - appf(p.s[cpsInit], - 'F.s[$1].name = $2; F.s[$1].address = (void*)&$3; F.s[$1].typ = $4;$n', - [toRope(p.frameLen), makeCString(normalize(s.name.s)), s.loc.r, - genTypeInfo(p.module, s.loc.t)]); - inc(p.frameLen); - end + localDebugInfo(p, s); end; -procedure assignGlobalVar(m: BModule; s: PSym); +procedure assignGlobalVar(p: BProc; s: PSym); begin if s.loc.k = locNone then fillLoc(s.loc, locGlobalVar, s.typ, mangleName(s), OnHeap); - useHeader(m, s); - if lfNoDecl in s.loc.flags then exit; - if sfImportc in s.flags then app(m.s[cfsVars], 'extern '); - app(m.s[cfsVars], getTypeDesc(m, s.loc.t)); - if sfRegister in s.flags then - app(m.s[cfsVars], ' register'); - if sfVolatile in s.flags then - app(m.s[cfsVars], ' volatile'); - if sfThreadVar in s.flags then - app(m.s[cfsVars], ' NIM_THREADVAR'); - appf(m.s[cfsVars], ' $1;$n', [s.loc.r]); - if [optStackTrace, optEndb] * m.module.options = + if gCmd = cmdCompileToLLVM then begin + appf(p.module.s[cfsVars], '$1 = linkonce global $2 zeroinitializer$n', + [s.loc.r, getTypeDesc(p.module, s.loc.t)]); + include(s.loc.flags, lfIndirect); + end + else begin + useHeader(p.module, s); + if lfNoDecl in s.loc.flags then exit; + if sfImportc in s.flags then app(p.module.s[cfsVars], 'extern '); + app(p.module.s[cfsVars], getTypeDesc(p.module, s.loc.t)); + if sfRegister in s.flags then app(p.module.s[cfsVars], ' register'); + if sfVolatile in s.flags then app(p.module.s[cfsVars], ' volatile'); + if sfThreadVar in s.flags then app(p.module.s[cfsVars], ' NIM_THREADVAR'); + appf(p.module.s[cfsVars], ' $1;$n', [s.loc.r]); + end; + if [optStackTrace, optEndb] * p.module.module.options = [optStackTrace, optEndb] then begin - useMagic(m, 'dbgRegisterGlobal'); - appf(m.s[cfsDebugInit], + useMagic(p.module, 'dbgRegisterGlobal'); + appff(p.module.s[cfsDebugInit], 'dbgRegisterGlobal($1, &$2, $3);$n', - [makeCString(normalize(s.owner.name.s + '.' +{&} s.name.s)), s.loc.r, - genTypeInfo(m, s.typ)]) + 'call void @dbgRegisterGlobal(i8* $1, i8* $2, $4* $3)$n', + [cstringLit(p, p.module.s[cfsDebugInit], + normalize(s.owner.name.s + '.' +{&} s.name.s)), + s.loc.r, + genTypeInfo(p.module, s.typ), + getTypeDesc(p.module, 'TNimType')]); end; end; @@ -308,15 +420,9 @@ end; procedure assignParam(p: BProc; s: PSym); begin assert(s.loc.r <> nil); - if [optStackTrace, optEndb] * p.options = [optStackTrace, optEndb] then begin - appf(p.s[cpsInit], - 'F.s[$1].name = $2; F.s[$1].address = (void*)$3; ' + - 'F.s[$1].typ = $4;$n', - [toRope(p.frameLen), makeCString(normalize(s.name.s)), - iff(ccgIntroducedPtr(s), s.loc.r, con('&'+'', s.loc.r)), - genTypeInfo(p.module, s.loc.t)]); - inc(p.frameLen) - end + if (sfAddrTaken in s.flags) and (gCmd = cmdCompileToLLVM) then + allocParam(p, s); + localDebugInfo(p, s); end; procedure fillProcLoc(sym: PSym); @@ -359,19 +465,26 @@ begin assert(lib <> nil); if not lib.generated then begin lib.generated := true; + tmp := getGlobalTempName(); + assert(lib.name = nil); + lib.name := tmp; + // BUGFIX: useMagic has awful side-effects + appff(m.s[cfsVars], 'static void* $1;$n', + '$1 = linkonce global i8* zeroinitializer$n', [tmp]); + inc(m.labels); + appff(m.s[cfsDynLibInit], + '$1 = nimLoadLibrary((NimStringDesc*) &$2);$n', + '%MOC$4 = call i8* @nimLoadLibrary($3 $2)$n' + + 'store i8* %MOC$4, i8** $1$n', + [tmp, getStrLit(m, lib.path), getTypeDesc(m, getSysType(tyString)), + toRope(m.labels)]); + //appf(m.s[cfsDynLibDeinit], + // 'if ($1 != NIM_NIL) nimUnloadLibrary($1);$n', [tmp]); useMagic(m, 'nimLoadLibrary'); useMagic(m, 'nimUnloadLibrary'); useMagic(m, 'NimStringDesc'); - tmp := getTempName(); - appf(m.s[cfsVars], 'static void* $1;$n', [tmp]); - appf(m.s[cfsDynLibInit], - '$1 = nimLoadLibrary((NimStringDesc*) &$2);$n', - [tmp, getStrLit(m, lib.path)]); - appf(m.s[cfsDynLibDeinit], - 'if ($1 != NIM_NIL) nimUnloadLibrary($1);$n', [tmp]); - assert(lib.name = nil); - lib.name := tmp - end + end; + if lib.name = nil then InternalError('loadDynamicLib'); end; procedure SymInDynamicLib(m: BModule; sym: PSym); @@ -383,14 +496,25 @@ begin extname := sym.loc.r; loadDynamicLib(m, lib); useMagic(m, 'nimGetProcAddr'); - tmp := ropef('Dl_$1', [toRope(sym.id)]); + if gCmd = cmdCompileToLLVM then include(sym.loc.flags, lfIndirect); + + tmp := ropeff('Dl_$1', '@Dl_$1', [toRope(sym.id)]); sym.loc.r := tmp; // from now on we only need the internal name sym.typ.sym := nil; // generate a new name - appf(m.s[cfsDynLibInit], '$1 = ($2) nimGetProcAddr($3, $4);$n', - [tmp, getTypeDesc(m, sym.typ), lib.name, makeCString(ropeToStr(extname))]); - - app(m.s[cfsVars], getTypeDesc(m, sym.loc.t)); - appf(m.s[cfsVars], ' $1;$n', [sym.loc.r]); + inc(m.labels, 2); + appff(m.s[cfsDynLibInit], + '$1 = ($2) nimGetProcAddr($3, $4);$n', + '%MOC$5 = load i8* $3$n' + + '%MOC$6 = call $2 @nimGetProcAddr(i8* %MOC$5, i8* $4)$n' + + 'store $2 %MOC$6, $2* $1$n', + [tmp, getTypeDesc(m, sym.typ), lib.name, + cstringLit(m, m.s[cfsDynLibInit], ropeToStr(extname)), + toRope(m.labels), toRope(m.labels-1)]); + + appff(m.s[cfsVars], + '$2 $1;$n', + '$1 = linkonce global $2 zeroinitializer$n', + [sym.loc.r, getTypeDesc(m, sym.loc.t)]); end; // ----------------------------- sections --------------------------------- @@ -433,14 +557,23 @@ var begin if p.frameLen > 0 then begin useMagic(p.module, 'TVarSlot'); - slots := ropef(' TVarSlot s[$1];$n', [toRope(p.frameLen)]) + slots := ropeff(' TVarSlot s[$1];$n', + ', [$1 x %TVarSlot]', [toRope(p.frameLen)]) end else slots := nil; - appf(p.s[cpsLocals], 'volatile struct {TFrame* prev;' + + appff(p.s[cpsLocals], + 'volatile struct {TFrame* prev;' + 'NCSTRING procname;NI line;NCSTRING filename;' + - 'NI len;$n$1} F;$n', [slots]); - prepend(p.s[cpsInit], ropef('F.len = $1;$n', [toRope(p.frameLen)])) + 'NI len;$n$1} F;$n', + '%TF = type {%TFrame*, i8*, %NI, %NI$1}$n' + + '%F = alloca %TF$n', + [slots]); + inc(p.labels); + prepend(p.s[cpsInit], ropeff('F.len = $1;$n', + '%LOC$2 = getelementptr %TF %F, %NI 4$n' + + 'store %NI $1, %NI* %LOC$2$n', + [toRope(p.frameLen), toRope(p.labels)])) end; function retIsNotVoid(s: PSym): bool; @@ -448,10 +581,48 @@ begin result := (s.typ.sons[0] <> nil) and not isInvalidReturnType(s.typ.sons[0]) end; +function initFrame(p: BProc; procname, filename: PRope): PRope; +begin + inc(p.labels, 5); + result := ropeff( + 'F.procname = $1;$n' + + 'F.prev = framePtr;$n' + + 'F.filename = $2;$n' + + 'F.line = 0;$n' + + 'framePtr = (TFrame*)&F;$n', + + '%LOC$3 = getelementptr %TF %F, %NI 1$n' + + '%LOC$4 = getelementptr %TF %F, %NI 0$n' + + '%LOC$5 = getelementptr %TF %F, %NI 3$n' + + '%LOC$6 = getelementptr %TF %F, %NI 2$n' + + + 'store i8* $1, i8** %LOC$3$n' + + 'store %TFrame* @framePtr, %TFrame** %LOC$4$n' + + 'store i8* $2, i8** %LOC$5$n' + + 'store %NI 0, %NI* %LOC$6$n' + + + '%LOC$7 = bitcast %TF* %F to %TFrame*$n' + + 'store %TFrame* %LOC$7, %TFrame** @framePtr$n', + [procname, filename, toRope(p.labels), toRope(p.labels-1), + toRope(p.labels-2), toRope(p.labels-3), toRope(p.labels-4)]); +end; + +function deinitFrame(p: BProc): PRope; +begin + inc(p.labels, 3); + result := ropeff('framePtr = framePtr->prev;$n', + + '%LOC$1 = load %TFrame* @framePtr$n' + + '%LOC$2 = getelementptr %TFrame* %LOC$1, %NI 0$n' + + '%LOC$3 = load %TFrame** %LOC$2$n' + + 'store %TFrame* $LOC$3, %TFrame** @framePtr', [ + toRope(p.labels), toRope(p.labels-1), toRope(p.labels-2)]) +end; + procedure genProcAux(m: BModule; prc: PSym); var p: BProc; - generatedProc, header, returnStmt: PRope; + generatedProc, header, returnStmt, procname, filename: PRope; i: int; res, param: PSym; begin @@ -466,7 +637,7 @@ begin // declare the result symbol: assignLocalVar(p, res); assert(res.loc.r <> nil); - returnStmt := ropef('return $1;$n', [rdLoc(res.loc)]); + returnStmt := ropeff('return $1;$n', 'ret $1$n', [rdLoc(res.loc)]); end else begin fillResult(res); @@ -482,22 +653,21 @@ begin genStmts(p, prc.ast.sons[codePos]); // modifies p.locals, p.init, etc. if sfPure in prc.flags then - generatedProc := ropef('$1 {$n$2$3$4}$n', + generatedProc := ropeff('$1 {$n$2$3$4}$n', 'define $1 {$n$2$3$4}$n', [header, p.s[cpsLocals], p.s[cpsInit], p.s[cpsStmts]]) else begin - generatedProc := con(header, '{' + tnl); + generatedProc := ropeff('$1 {$n', 'define $1 {$n', [header]); if optStackTrace in prc.options then begin getFrameDecl(p); - prepend(p.s[cpsInit], ropef( - 'F.procname = $1;$n' + - 'F.prev = framePtr;$n' + - 'F.filename = $2;$n' + - 'F.line = 0;$n' + - 'framePtr = (TFrame*)&F;$n', - [makeCString(prc.owner.name.s +{&} '.' +{&} prc.name.s), - makeCString(toFilename(prc.info))])); - end; - if optProfiler in prc.options then begin + app(generatedProc, p.s[cpsLocals]); + procname := CStringLit(p, generatedProc, + prc.owner.name.s +{&} '.' +{&} prc.name.s); + filename := CStringLit(p, generatedProc, toFilename(prc.info)); + app(generatedProc, initFrame(p, procname, filename)); + end + else + app(generatedProc, p.s[cpsLocals]); + if (optProfiler in prc.options) and (gCmd <> cmdCompileToLLVM) then begin if gProcProfile >= 64*1024 then // XXX: hard coded value! InternalError(prc.info, 'too many procedures for profiling'); useMagic(m, 'profileData'); @@ -511,12 +681,13 @@ begin end; prepend(p.s[cpsInit], toRope('NIM_profilingStart = getticks();' + tnl)); end; - app(generatedProc, con(p.s)); + app(generatedProc, p.s[cpsInit]); + app(generatedProc, p.s[cpsStmts]); if p.beforeRetNeeded then app(generatedProc, 'BeforeRet: ;' + tnl); if optStackTrace in prc.options then - app(generatedProc, 'framePtr = framePtr->prev;' + tnl); - if optProfiler in prc.options then + app(generatedProc, deinitFrame(p)); + if (optProfiler in prc.options) and (gCmd <> cmdCompileToLLVM) then appf(generatedProc, 'profileData[$1].total += elapsed(getticks(), NIM_profilingStart);$n', [toRope(prc.loc.a)]); @@ -533,8 +704,10 @@ begin if lfDynamicLib in sym.loc.Flags then begin if (sym.owner.id <> m.module.id) and not intSetContainsOrIncl(m.declaredThings, sym.id) then begin - appf(m.s[cfsVars], 'extern $1 Dl_$2;$n', - [getTypeDesc(m, sym.loc.t), toRope(sym.id)]) + appff(m.s[cfsVars], 'extern $1 Dl_$2;$n', + '@Dl_$2 = linkonce global $1 zeroinitializer$n', + [getTypeDesc(m, sym.loc.t), toRope(sym.id)]); + if gCmd = cmdCompileToLLVM then include(sym.loc.flags, lfIndirect); end end else begin @@ -586,15 +759,22 @@ begin if sym.owner.id <> m.module.id then begin // else we already have the symbol generated! assert(sym.loc.r <> nil); - app(m.s[cfsVars], 'extern '); - app(m.s[cfsVars], getTypeDesc(m, sym.loc.t)); - if sfRegister in sym.flags then - app(m.s[cfsVars], ' register'); - if sfVolatile in sym.flags then - app(m.s[cfsVars], ' volatile'); - if sfThreadVar in sym.flags then - app(m.s[cfsVars], ' NIM_THREADVAR'); - appf(m.s[cfsVars], ' $1;$n', [sym.loc.r]) + if gCmd = cmdCompileToLLVM then begin + include(sym.loc.flags, lfIndirect); + appf(m.s[cfsVars], '$1 = linkonce global $2 zeroinitializer$n', + [sym.loc.r, getTypeDesc(m, sym.loc.t)]); + end + else begin + app(m.s[cfsVars], 'extern '); + app(m.s[cfsVars], getTypeDesc(m, sym.loc.t)); + if sfRegister in sym.flags then + app(m.s[cfsVars], ' register'); + if sfVolatile in sym.flags then + app(m.s[cfsVars], ' volatile'); + if sfThreadVar in sym.flags then + app(m.s[cfsVars], ' NIM_THREADVAR'); + appf(m.s[cfsVars], ' $1;$n', [sym.loc.r]) + end end end; @@ -609,8 +789,9 @@ begin if sym.owner.id <> m.module.id then begin // else we already have the symbol generated! assert(sym.loc.r <> nil); - app(m.s[cfsData], 'extern '); - appf(m.s[cfsData], 'NIM_CONST $1 $2;$n', + appff(m.s[cfsData], + 'extern NIM_CONST $1 $2;$n', + '$1 = linkonce constant $2 zeroinitializer', [getTypeDesc(m, sym.loc.t), sym.loc.r]) end end; @@ -618,27 +799,36 @@ end; function getFileHeader(const cfilenoext: string): PRope; begin if optCompileOnly in gGlobalOptions then - result := ropef( + result := ropeff( '/* Generated by the Nimrod Compiler v$1 */$n' + '/* (c) 2008 Andreas Rumpf */$n', + '; Generated by the Nimrod Compiler v$1$n' + + '; (c) 2008 Andreas Rumpf$n', [toRope(versionAsString)]) else - result := ropef( + result := ropeff( '/* Generated by the Nimrod Compiler v$1 */$n' + '/* (c) 2008 Andreas Rumpf */$n' + '/* Compiled for: $2, $3, $4 */$n' + '/* Command for C compiler:$n $5 */$n', + '; Generated by the Nimrod Compiler v$1$n' + + '; (c) 2008 Andreas Rumpf$n' + + '; Compiled for: $2, $3, $4$n' + + '; Command for C compiler:$n $5$n', [toRope(versionAsString), toRope(platform.OS[targetOS].name), toRope(platform.CPU[targetCPU].name), toRope(extccomp.CC[extccomp.ccompiler].name), toRope(getCompileCFileCmd(cfilenoext))]); case platform.CPU[targetCPU].intSize of - 16: appf(result, '$ntypedef short int NI;$n' + - 'typedef unsigned short int NU;$n', []); - 32: appf(result, '$ntypedef long int NI;$n' + - 'typedef unsigned long int NU;$n', []); - 64: appf(result, '$ntypedef long long int NI;$n' + - 'typedef unsigned long long int NU;$n', []); + 16: appff(result, '$ntypedef short int NI;$n' + + 'typedef unsigned short int NU;$n', + '$n%NI = type i16$n', []); + 32: appff(result, '$ntypedef long int NI;$n' + + 'typedef unsigned long int NU;$n', + '$n%NI = type i32$n', []); + 64: appff(result, '$ntypedef long long int NI;$n' + + 'typedef unsigned long long int NU;$n', + '$n%NI = type i64$n', []); else begin end end end; @@ -651,18 +841,37 @@ const ' systemInit();$n' + '$1' + '$2'; + CommonMainBodyLLVM = + ' %MOC$3 = bitcast [8 x %NI]* %dummy to i8*$n' + + ' call void @setStackBottom(i8* %MOC$3)$n' + + ' call void @nim__datInit()$n' + + ' call void systemInit()$n' + + '$1' + + '$2'; PosixMain = - 'NI cmdCount;$n' + + 'int cmdCount;$n' + 'char** cmdLine;$n' + 'char** gEnv;$n' + 'int main(int argc, char** args, char** env) {$n' + ' int dummy[8];$n' + ' cmdLine = args;$n' + - ' cmdCount = (NI)argc;$n' + + ' cmdCount = argc;$n' + ' gEnv = env;$n' +{&} CommonMainBody +{&} ' return 0;$n' + '}$n'; + PosixMainLLVM = + '@cmdCount = linkonce i32$n' + + '@cmdLine = linkonce i8**$n' + + '@gEnv = linkonce i8**$n' + + 'define i32 @main(i32 %argc, i8** %args, i8** %env) {$n' + + ' %dummy = alloca [8 x %NI]$n' + + ' store i8** %args, i8*** @cmdLine$n' + + ' store i32 %argc, i32* @cmdCount$n' + + ' store i8** %env, i8*** @gEnv$n' +{&} + CommonMainBodyLLVM +{&} + ' ret i32 0$n' + + '}$n'; WinMain = 'N_STDCALL(int, WinMain)(HINSTANCE hCurInstance, $n' + ' HINSTANCE hPrevInstance, $n' + @@ -671,6 +880,14 @@ const CommonMainBody +{&} ' return 0;$n' + '}$n'; + WinMainLLVM = + 'define stdcall i32 @WinMain(i32 %hCurInstance, $n' + + ' i32 %hPrevInstance, $n' + + ' i8* %lpCmdLine, i32 %nCmdShow) {$n' + + ' %dummy = alloca [8 x %NI]$n' +{&} + CommonMainBodyLLVM +{&} + ' ret i32 0$n' + + '}$n'; WinDllMain = 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, $n' + ' LPVOID lpvReserved) {$n' + @@ -678,6 +895,13 @@ const CommonMainBody +{&} ' return 1;$n' + '}$n'; + WinDllMainLLVM = + 'define stdcall i32 @DllMain(i32 %hinstDLL, i32 %fwdreason, $n' + + ' i8* %lpvReserved) {$n' + + ' %dummy = alloca [8 x %NI]$n' +{&} + CommonMainBodyLLVM +{&} + ' ret i32 1$n' + + '}$n'; var frmt: TFormatStr; begin @@ -685,21 +909,28 @@ begin if (platform.targetOS = osWindows) and (gGlobalOptions * [optGenGuiApp, optGenDynLib] <> []) then begin if optGenGuiApp in gGlobalOptions then - frmt := WinMain + if gCmd = cmdCompileToLLVM then frmt := WinMainLLVM else frmt := WinMain else - frmt := WinDllMain; + if gCmd = cmdCompileToLLVM then + frmt := WinDllMainLLVM + else + frmt := WinDllMain; {@discard} lists.IncludeStr(m.headerFiles, '<windows.h>') end - else - frmt := PosixMain; + else + if gCmd = cmdCompileToLLVM then + frmt := PosixMainLLVM + else + frmt := PosixMain; if gBreakpoints <> nil then useMagic(m, 'dbgRegisterBreakpoint'); - appf(m.s[cfsProcs], frmt, [gBreakpoints, mainModInit]) + inc(m.labels); + appf(m.s[cfsProcs], frmt, [gBreakpoints, mainModInit, toRope(m.labels)]) end; function getInitName(m: PSym): PRope; begin - result := con(m.name.s, toRope('Init')); + result := ropeff('$1Init', '@$1Init', [toRope(m.name.s)]); end; procedure registerModuleToMain(m: PSym); @@ -707,14 +938,15 @@ var initname: PRope; begin initname := getInitName(m); - appf(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', [initname]); + appff(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', + 'declare void $1() noinline$n', [initname]); if not (sfSystemModule in m.flags) then - appf(mainModInit, '$1();$n', [initname]); + appff(mainModInit, '$1();$n', 'call void ()* $1$n', [initname]); end; procedure genInitCode(m: BModule); var - initname, prc: PRope; + initname, prc, procname, filename: PRope; begin if optProfiler in m.initProc.options then begin // This does not really belong here, but there is no good place for this @@ -723,31 +955,28 @@ begin {@discard} lists.IncludeStr(m.headerFiles, '<cycle.h>'); end; initname := getInitName(m.module); - prc := ropef('N_NOINLINE(void, $1)(void) {$n', [initname]); - + prc := ropeff('N_NOINLINE(void, $1)(void) {$n', + 'define void $1() noinline {$n', [initname]); if m.typeNodes > 0 then begin useMagic(m, 'TNimNode'); - appf(m.s[cfsTypeInit1], 'static TNimNode $1[$2];$n', + appff(m.s[cfsTypeInit1], 'static TNimNode $1[$2];$n', + '$1 = private alloca [$2 x @TNimNode]$n', [m.typeNodesName, toRope(m.typeNodes)]); end; if m.nimTypes > 0 then begin useMagic(m, 'TNimType'); - appf(m.s[cfsTypeInit1], 'static TNimType $1[$2];$n', + appff(m.s[cfsTypeInit1], 'static TNimType $1[$2];$n', + '$1 = private alloca [$2 x @TNimType]$n', [m.nimTypesName, toRope(m.nimTypes)]); end; if optStackTrace in m.initProc.options then begin getFrameDecl(m.initProc); app(prc, m.initProc.s[cpsLocals]); app(prc, m.s[cfsTypeInit1]); - appf(prc, - 'F.len = 0;$n' + // IMPORTANT: else the debugger crashes! - 'F.procname = $1;$n' + - 'F.prev = framePtr;$n' + - 'F.filename = $2;$n' + - 'F.line = 0;$n' + - 'framePtr = (TFrame*)&F;$n', - [makeCString('module ' + m.module.name.s), - makeCString(toFilename(m.module.info))]) + + procname := CStringLit(m.initProc, prc, 'module ' +{&} m.module.name.s); + filename := CStringLit(m.initProc, prc, toFilename(m.module.info)); + app(prc, initFrame(m.initProc, procname, filename)); end else begin app(prc, m.initProc.s[cpsLocals]); @@ -760,7 +989,7 @@ begin app(prc, m.initProc.s[cpsInit]); app(prc, m.initProc.s[cpsStmts]); if optStackTrace in m.initProc.options then - app(prc, 'framePtr = framePtr->prev;' + tnl); + app(prc, deinitFrame(m.initProc)); app(prc, '}' +{&} tnl +{&} tnl); app(m.s[cfsProcs], prc) end; @@ -817,7 +1046,8 @@ begin s := NewSym(skModule, getIdent(moduleName), nil); gmti := rawNewModule(s, joinPath(options.projectPath, moduleName)+'.nim'); addPendingModule(gmti); - appf(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', [getInitName(s)]); + appff(mainModProcs, 'N_NOINLINE(void, $1)(void);$n', + 'declare void $1() noinline$n', [getInitName(s)]); end; function myOpen(module: PSym; const filename: string): PPassContext; diff --git a/nim/commands.pas b/nim/commands.pas index d87a8f084..8a4435eb0 100644 --- a/nim/commands.pas +++ b/nim/commands.pas @@ -77,14 +77,14 @@ const +{&} ' --debugger:on|off turn Embedded Nimrod Debugger ON|OFF' +{&} nl +{&} ' -x, --checks:on|off code generation for all runtime checks ON|OFF' +{&} nl +{&} ' --obj_checks:on|off code generation for obj conversion checks ON|OFF' +{&} nl -+{&} ' --field_checks:on|off code generation for case record fields ON|OFF' +{&} nl ++{&} ' --field_checks:on|off code generation for case variant fields ON|OFF' +{&} nl +{&} ' --range_checks:on|off code generation for range checks ON|OFF' +{&} nl +{&} ' --bound_checks:on|off code generation for bound checks ON|OFF' +{&} nl +{&} ' --overflow_checks:on|off code generation for over-/underflow checks ON|OFF' +{&} nl +{&} ' -a, --assertions:on|off code generation for assertions ON|OFF' +{&} nl +{&} ' --dead_code_elim:on|off whole program dead code elimination ON|OFF' +{&} nl +{&} ' --opt:none|speed|size optimize not at all or for speed|size' +{&} nl -+{&} ' --app:console|gui|lib generate a console|GUI application or a shared lib' +{&} nl ++{&} ' --app:console|gui generate a console|GUI application' +{&} nl +{&} ' -r, --run run the compiled program with given arguments' +{&} nl +{&} ' --advanced show advanced command line switches' +{&} nl +{&} ' -h, --help show this help' +{&} nl @@ -125,7 +125,6 @@ const +{&} ' --checkpoints:on|off turn on|off checkpoints; for debugging Nimrod' +{&} nl +{&} ' --skip_cfg do not read the general configuration file' +{&} nl +{&} ' --skip_proj_cfg do not read the project''s configuration file' +{&} nl -+{&} ' --import:MODULE_FILE import the given module implicitly for each module' +{&} nl +{&} ' --index:FILE use FILE to generate a documenation index file' +{&} nl +{&} ' --putenv:key=value set an environment variable' +{&} nl +{&} ' --list_cmd list the commands used to execute external programs' +{&} nl @@ -506,7 +505,7 @@ begin expectArg(switch, arg, pass, info); gErrorMax := parseInt(arg); end; - else if findSubStr('.', switch) >= strStart then + else if strutils.find(switch, '.') >= strStart then options.setConfigVar(switch, arg) else InvalidCmdLineOption(pass, switch, info) diff --git a/nim/debugids.pas b/nim/debugids.pas deleted file mode 100644 index fff9ed10b..000000000 --- a/nim/debugids.pas +++ /dev/null @@ -1,129 +0,0 @@ -// -// -// The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf -// -// See the file "copying.txt", included in this -// distribution, for details about the copyright. -// -unit debugids; - -interface - -{$include 'config.inc'} - -uses - nsystem, nos, strutils, ast; - -const - idfile = 'debugids.txt'; - -// This module implements debugging facilities for the ID mechanism. -procedure registerID(s: PSym); - -procedure writeIDTable(); -procedure loadIDTable(); - -implementation - -type - TIdSymTuple = record{@tuple} // keep id from sym to better detect bugs - id: int; - s: PSym; - end; - TIdSymTupleSeq = array of TIdSymTuple; - TIdSymTable = record - counter: int; - data: TIdSymTupleSeq; - end; - -function TableRawGet(const t: TTable; key: PObject): int; -var - h: THash; -begin - h := hashNode(key) and high(t.data); // start with real hash value - while t.data[h].key <> nil do begin - if (t.data[h].key = key) then begin - result := h; exit - end; - h := nextTry(h, high(t.data)) - end; - result := -1 -end; - -function TableSearch(const t: TTable; key, closure: PObject; - comparator: TCmpProc): PObject; -var - h: THash; -begin - h := hashNode(key) and high(t.data); // start with real hash value - while t.data[h].key <> nil do begin - if (t.data[h].key = key) then - if comparator(t.data[h].val, closure) then begin // BUGFIX 1 - result := t.data[h].val; exit - end; - h := nextTry(h, high(t.data)) - end; - result := nil -end; - -function TableGet(const t: TTable; key: PObject): PObject; -var - index: int; -begin - index := TableRawGet(t, key); - if index >= 0 then result := t.data[index].val - else result := nil -end; - -procedure TableRawInsert(var data: TPairSeq; key, val: PObject); -var - h: THash; -begin - h := HashNode(key) and high(data); - while data[h].key <> nil do begin - assert(data[h].key <> key); - h := nextTry(h, high(data)) - end; - assert(data[h].key = nil); - data[h].key := key; - data[h].val := val; -end; - -procedure TableEnlarge(var t: TTable); -var - n: TPairSeq; - i: int; -begin -{@ignore} - n := emptySeq; - setLength(n, length(t.data) * growthFactor); - fillChar(n[0], length(n)*sizeof(n[0]), 0); -{@emit - newSeq(n, length(t.data) * growthFactor); } - for i := 0 to high(t.data) do - if t.data[i].key <> nil then - TableRawInsert(n, t.data[i].key, t.data[i].val); -{@ignore} - t.data := n; -{@emit - swap(t.data, n); -} -end; - -procedure TablePut(var t: TTable; key, val: PObject); -var - index: int; -begin - index := TableRawGet(t, key); - if index >= 0 then - t.data[index].val := val - else begin - if mustRehash(length(t.data), t.counter) then TableEnlarge(t); - TableRawInsert(t.data, key, val); - inc(t.counter) - end; -end; - - -end. diff --git a/nim/docgen.pas b/nim/docgen.pas index bd4613180..15969f51d 100644 --- a/nim/docgen.pas +++ b/nim/docgen.pas @@ -40,7 +40,7 @@ type modDesc: PRope; // module description dependsOn: PRope; // dependencies id: int; // for generating IDs - splitAfter: int; // split to long entries in the TOC + splitAfter: int; // split too long entries in the TOC tocPart: array of TTocEntry; hasToc: bool; toc, section: TSections; @@ -777,7 +777,7 @@ begin rnLineBlock: outer := '<p>$1</p>'; rnLineBlockItem: outer := '$1<br />'; - rnBlockQuote: outer := '<blockquote>$1</blockquote>$n'; + rnBlockQuote: outer := '<blockquote><p>$1</p></blockquote>$n'; rnTable, rnGridTable: outer := '<table border="1" class="docutils">$1</table>'; diff --git a/nim/extccomp.pas b/nim/extccomp.pas index 51cf009d1..f51e5f690 100644 --- a/nim/extccomp.pas +++ b/nim/extccomp.pas @@ -352,13 +352,13 @@ end; procedure addCompileOption(const option: string); begin - if strutils.findSubStr(option, compileOptions, strStart) < strStart then + if strutils.find(compileOptions, option, strStart) < strStart then addOpt(compileOptions, option) end; procedure addLinkOption(const option: string); begin - if findSubStr(option, linkOptions, strStart) < strStart then + if find(linkOptions, option, strStart) < strStart then addOpt(linkOptions, option) end; diff --git a/nim/idents.pas b/nim/idents.pas index 44957ba7a..c0e4c994f 100644 --- a/nim/idents.pas +++ b/nim/idents.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -38,8 +38,15 @@ function getIdent(identifier: cstring; len: int; h: THash): PIdent; overload; // special version for the scanner; the scanner's buffering scheme makes // this horribly efficient. Most of the time no character copying is needed! +function IdentEq(id: PIdent; const name: string): bool; + implementation +function IdentEq(id: PIdent; const name: string): bool; +begin + result := id.id = getIdent(name).id; +end; + var buckets: array [0..4096*2-1] of PIdent; diff --git a/nim/llstream.pas b/nim/llstream.pas index 2d4336664..df4c823a6 100644 --- a/nim/llstream.pas +++ b/nim/llstream.pas @@ -22,7 +22,7 @@ type llsFile, // stream encapsulates a file llsStdIn); // stream encapsulates stdin TLLStream = object(NObject) - kind: TLLStreamKind; // exposed for low-level access (lexbase uses this) + kind: TLLStreamKind; // accessible for low-level access (lexbase uses this) f: TBinaryFile; s: string; pos: int; // for string streams diff --git a/nim/main.pas b/nim/main.pas index 565373685..c888e5c3c 100644 --- a/nim/main.pas +++ b/nim/main.pas @@ -119,7 +119,7 @@ procedure CompileProject(const filename: string); begin {@discard} CompileModule( JoinPath(options.libpath, appendFileExt('system', nimExt)), false, true); - {@discard} CompileModule(filename, true, false); + {@discard} CompileModule(appendFileExt(filename, nimExt), true, false); end; procedure semanticPasses; @@ -352,6 +352,11 @@ begin wantFile(filename); CommandCompileToEcmaScript(filename); end; + wCompileToLLVM: begin + gCmd := cmdCompileToLLVM; + wantFile(filename); + CommandCompileToC(filename); + end; wPretty: begin gCmd := cmdPretty; wantFile(filename); diff --git a/nim/msgs.pas b/nim/msgs.pas index a91c328ef..0eb1651d9 100644 --- a/nim/msgs.pas +++ b/nim/msgs.pas @@ -278,6 +278,7 @@ type errXRequiresOneArgument, errUnhandledExceptionX, errCyclicTree, + errXisNoMacroOrTemplate, errUser, warnCannotOpenFile, warnOctalEscape, @@ -491,7 +492,7 @@ const '$1 here not allowed', 'invalid control flow: $1', 'a type has no value', - '''$1'' is no type', + 'invalid type: ''$1''', '''^'' needs a pointer or reference type', 'invalid context for builtin ''$1''', 'invalid expression', @@ -536,6 +537,7 @@ const 'converter requires one parameter', 'unhandled exception: $1', 'macro returned a cyclic abstract syntax tree', + '''$1'' is no macro or template', '$1', 'cannot open ''$1'' [CannotOpenFile]', 'octal escape sequences do not exist; leading zero is ignored [OctalEscape]', @@ -645,8 +647,8 @@ const // this format is understood by many text editors: it is the same that procedure MessageOut(const s: string); procedure rawMessage(const msg: TMsgKind; const arg: string = ''); overload; -procedure rawMessage(const msg: TMsgKind; const args: array of string); overload; - +procedure rawMessage(const msg: TMsgKind; const args: array of string); overload; + procedure liMessage(const info: TLineInfo; const msg: TMsgKind; const arg: string = ''); @@ -840,37 +842,37 @@ begin getMessageStr(errInstantiationFrom, '')])); end; end; - -procedure rawMessage(const msg: TMsgKind; const args: array of string); -var - frmt: string; -begin - case msg of - errMin..errMax: begin - writeContext(); - frmt := rawErrorFormat; - end; - warnMin..warnMax: begin - if not (optWarns in gOptions) then exit; - if not (msg in gNotes) then exit; - frmt := rawWarningFormat; - inc(gWarnCounter); - end; - hintMin..hintMax: begin - if not (optHints in gOptions) then exit; - if not (msg in gNotes) then exit; - frmt := rawHintFormat; - inc(gHintCounter); - end; - else assert(false) // cannot happen - end; - MessageOut(Format(frmt, format(msgKindToString(msg), args))); - handleError(msg); -end; + +procedure rawMessage(const msg: TMsgKind; const args: array of string); +var + frmt: string; +begin + case msg of + errMin..errMax: begin + writeContext(); + frmt := rawErrorFormat; + end; + warnMin..warnMax: begin + if not (optWarns in gOptions) then exit; + if not (msg in gNotes) then exit; + frmt := rawWarningFormat; + inc(gWarnCounter); + end; + hintMin..hintMax: begin + if not (optHints in gOptions) then exit; + if not (msg in gNotes) then exit; + frmt := rawHintFormat; + inc(gHintCounter); + end; + else assert(false) // cannot happen + end; + MessageOut(Format(frmt, format(msgKindToString(msg), args))); + handleError(msg); +end; procedure rawMessage(const msg: TMsgKind; const arg: string = ''); -begin - rawMessage(msg, [arg]); +begin + rawMessage(msg, [arg]); end; procedure liMessage(const info: TLineInfo; const msg: TMsgKind; diff --git a/nim/nimconf.pas b/nim/nimconf.pas index 1a70abdbe..8f908bf62 100644 --- a/nim/nimconf.pas +++ b/nim/nimconf.pas @@ -9,9 +9,7 @@ unit nimconf; -// This module used to handle the reading of the config file. We now just -// read environment variables. This is easier to avoid bootstraping issues. - +// This module handles the reading of the config file. {$include 'config.inc'} interface @@ -258,7 +256,7 @@ begin addChar(s, '.'); confTok(L, tok); checkSymbol(L, tok); - s := s +{&} tokToStr(tok); + add(s, tokToStr(tok)); confTok(L, tok) end; if tok.tokType = tkBracketLe then begin @@ -266,7 +264,7 @@ begin // BUGFIX: do not copy '['! confTok(L, tok); checkSymbol(L, tok); - val := val +{&} tokToStr(tok); + add(val, tokToStr(tok)); confTok(L, tok); if tok.tokType = tkBracketRi then confTok(L, tok) else lexMessage(L, errTokenExpected, ''']'''); @@ -276,12 +274,12 @@ begin if length(val) > 0 then addChar(val, ':'); // BUGFIX confTok(L, tok); // skip ':' or '=' checkSymbol(L, tok); - val := val +{&} tokToStr(tok); + add(val, tokToStr(tok)); confTok(L, tok); // skip symbol while (tok.ident <> nil) and (tok.ident.id = getIdent('&'+'').id) do begin confTok(L, tok); checkSymbol(L, tok); - val := val +{&} tokToStr(tok); + add(val, tokToStr(tok)); confTok(L, tok) end end; diff --git a/nim/nimrod.pas b/nim/nimrod.pas index 99d9a9d0f..728325ccc 100644 --- a/nim/nimrod.pas +++ b/nim/nimrod.pas @@ -61,7 +61,7 @@ type procedure HandleCmdLine; var - command, filename: string; + command, filename, prog: string; start: TTime; begin {@emit start := getTime(); } @@ -92,13 +92,21 @@ begin toString(getTime() - start)]); } end; - if optRun in gGlobalOptions then - execExternalProgram(quoteIfContainsWhite(changeFileExt(filename, '')) +{&} - ' ' +{&} arguments) + if optRun in gGlobalOptions then begin + {$ifdef unix} + prog := './' + quoteIfContainsWhite(changeFileExt(filename, '')); + {$else} + prog := quoteIfContainsWhite(changeFileExt(filename, '')); + {$endif} + execExternalProgram(prog +{&} ' ' +{&} arguments) + end end end; begin +//{@emit +// GC_disableMarkAndSweep(); +//} cmdLineInfo := newLineInfo('command line', -1, -1); condsyms.InitDefines(); HandleCmdLine(); diff --git a/nim/nos.pas b/nim/nos.pas index 73b17ae58..4926c99b0 100644 --- a/nim/nos.pas +++ b/nim/nos.pas @@ -123,7 +123,7 @@ procedure createDir(const dir: string); var i: int; begin - for i := 1 to length(dir) do begin + for i := 2 to length(dir) do begin if dir[i] in [sep, altsep] then sysutils.createDir(ncopy(dir, 1, i-1)); end; sysutils.createDir(dir); diff --git a/nim/nsystem.pas b/nim/nsystem.pas index f476e09ca..51ca05605 100644 --- a/nim/nsystem.pas +++ b/nim/nsystem.pas @@ -43,6 +43,7 @@ type {$endif} EOutOfRange = class(Exception) end; + EOS = class(Exception) end; float32 = single; float64 = double; diff --git a/nim/nversion.pas b/nim/nversion.pas index 7d179bb35..de0ad2b79 100644 --- a/nim/nversion.pas +++ b/nim/nversion.pas @@ -31,10 +31,10 @@ const //cog.outl('VersionMinor = %s;' % ver[1]) //cog.outl('VersionPatch = %s;' % ver[2]) //]]] - VersionAsString = '0.7.4'; + VersionAsString = '0.7.6'; VersionMajor = 0; VersionMinor = 7; - VersionPatch = 4; + VersionPatch = 6; //[[[[end]]]] implementation diff --git a/nim/options.pas b/nim/options.pas index 5bbfbbbee..d6f6d14da 100644 --- a/nim/options.pas +++ b/nim/options.pas @@ -55,6 +55,7 @@ type cmdCompileToC, cmdCompileToCpp, cmdCompileToEcmaScript, + cmdCompileToLLVM, cmdInterpret, cmdPretty, cmdDoc, @@ -207,7 +208,15 @@ begin if startsWith(dir, prefix) then begin result := ncopy(dir, length(prefix) + strStart); exit end; - result := dir + result := dir; +end; + +function removeTrailingDirSep(const path: string): string; +begin + if (length(path) > 0) and (path[length(path)+strStart-1] = dirSep) then + result := ncopy(path, strStart, length(path)+strStart-2) + else + result := path end; function toGeneratedFile(const path, ext: string): string; @@ -215,7 +224,8 @@ var head, tail: string; begin splitPath(path, head, tail); - result := joinPath([projectPath, genSubDir, shortenDir(head +{&} dirSep), + if length(head) > 0 then head := shortenDir(head +{&} dirSep); + result := joinPath([projectPath, genSubDir, head, changeFileExt(tail, ext)]) end; @@ -225,10 +235,18 @@ var head, tail, subdir: string; begin splitPath(f, head, tail); - subdir := joinPath([projectPath, genSubDir, shortenDir(head +{&} dirSep)]); + if length(head) > 0 then + head := removeTrailingDirSep(shortenDir(head +{&} dirSep)); + subdir := joinPath([projectPath, genSubDir, head]); if createSubDir then begin - //Writeln(output, subdir); - createDir(subdir); + try + createDir(subdir); + except + on EOS do begin + writeln(output, 'cannot create directory: ' + subdir); + halt(1) + end + end end; result := joinPath(subdir, tail) end; diff --git a/nim/parsecfg.pas b/nim/parsecfg.pas index a99da6852..3c10cc8fc 100644 --- a/nim/parsecfg.pas +++ b/nim/parsecfg.pas @@ -350,7 +350,7 @@ begin addChar(result.key, '.'); rawGetTok(c, c.tok); if c.tok.kind = tkSymbol then begin - result.key := result.key +{&} c.tok.literal; + add(result.key, c.tok.literal); rawGetTok(c, c.tok); end else begin diff --git a/nim/passes.pas b/nim/passes.pas index 028cfc2a2..f5dff3559 100644 --- a/nim/passes.pas +++ b/nim/passes.pas @@ -57,7 +57,7 @@ function astNeeded(s: PSym): bool; // appropriate to free the procedure body's memory. This is important // to keep memory usage down. -// some passes (the semantic checker) need these: +// the semantic checker needs these: var gImportModule: function (const filename: string): PSym; gIncludeFile: function (const filename: string): PNode; diff --git a/nim/platform.pas b/nim/platform.pas index 8bf4f3d9b..9f8d30f60 100644 --- a/nim/platform.pas +++ b/nim/platform.pas @@ -12,7 +12,7 @@ unit platform; // and operating systems. // Note: Unfortunately if an OS or CPU is listed here this does not mean that // Nimrod has been tested on this platform or that the RTL has been ported. -// Feel free to test for your exentric platform! +// Feel free to test for your excentric platform! interface diff --git a/nim/pragmas.pas b/nim/pragmas.pas index 636a1198a..9a60e6bd3 100644 --- a/nim/pragmas.pas +++ b/nim/pragmas.pas @@ -228,7 +228,7 @@ procedure processDynLib(c: PContext; n: PNode; sym: PSym); var lib: PLib; begin - if sym = nil then + if (sym = nil) or (sym.kind = skModule) then POptionEntry(c.optionStack.tail).dynlib := getLib(c, libDynamic, expectStrLit(c, n)) else begin @@ -553,13 +553,6 @@ begin wPassL: extccomp.addLinkOption(expectStrLit(c, it)); wPassC: extccomp.addCompileOption(expectStrLit(c, it)); - // fixupSystem not even documented: - wFixupSystem: begin - if c.module = magicSys.SystemModule then - magicsys.FinishSystem(magicsys.SystemModule.tab) - else - invalidPragma(it) - end; wBreakpoint: PragmaBreakpoint(c, it); wCheckpoint: PragmaCheckpoint(c, it); @@ -585,7 +578,7 @@ begin processNote(c, n) end; end; - if sym <> nil then begin + if (sym <> nil) and (sym.kind <> skModule) then begin lib := POptionEntry(c.optionstack.tail).dynlib; if ([lfDynamicLib, lfHeader] * sym.loc.flags = []) and (sfImportc in sym.flags) and @@ -625,7 +618,7 @@ begin wHints, wLinedir, wStacktrace, wLinetrace, wOptimization, wHint, wWarning, wError, wFatal, wDefine, wUndef, wCompile, wLink, wLinkSys, wPure, - wPush, wPop, wFixupSystem, wBreakpoint, wCheckpoint, + wPush, wPop, wBreakpoint, wCheckpoint, wPassL, wPassC, wDeadCodeElim]); end; diff --git a/nim/rodread.pas b/nim/rodread.pas index 549cfec58..a34153ccf 100644 --- a/nim/rodread.pas +++ b/nim/rodread.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -123,7 +123,7 @@ type files: TStringSeq; dataIdx: int; // offset of start of data section convertersIdx: int; // offset of start of converters section - initIdx, interfIdx, compilerProcsIdx: int; + initIdx, interfIdx, compilerProcsIdx, cgenIdx: int; filename: string; index, imports: TIndex; readerIndex: int; @@ -841,6 +841,10 @@ begin r.initIdx := r.pos+2; // "(\10" skipSection(r); end + else if section = 'CGEN' then begin + r.cgenIdx := r.pos+2; + skipSection(r); + end else begin MessageOut('skipping section: ' + toString(r.pos)); skipSection(r); diff --git a/nim/rodwrite.pas b/nim/rodwrite.pas index 637f69ff7..72d5c893d 100644 --- a/nim/rodwrite.pas +++ b/nim/rodwrite.pas @@ -530,6 +530,7 @@ begin nkVarSection: begin for i := 0 to sonsLen(n)-1 do begin a := n.sons[i]; + if a.kind = nkCommentStmt then continue; if a.kind <> nkIdentDefs then InternalError(a.info, 'rodwrite.process'); addInterfaceSym(w, a.sons[0].sym); end @@ -537,6 +538,7 @@ begin nkConstSection: begin for i := 0 to sonsLen(n)-1 do begin a := n.sons[i]; + if a.kind = nkCommentStmt then continue; if a.kind <> nkConstDef then InternalError(a.info, 'rodwrite.process'); addInterfaceSym(w, a.sons[0].sym); end @@ -544,6 +546,7 @@ begin nkTypeSection: begin for i := 0 to sonsLen(n)-1 do begin a := n.sons[i]; + if a.kind = nkCommentStmt then continue; if a.sons[0].kind <> nkSym then InternalError(a.info, 'rodwrite.process'); s := a.sons[0].sym; diff --git a/nim/ropes.pas b/nim/ropes.pas index a6ba2a11b..864afd5b8 100644 --- a/nim/ropes.pas +++ b/nim/ropes.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -112,8 +112,6 @@ function ropef(const frmt: TFormatStr; const args: array of PRope): PRope; procedure appf(var c: PRope; const frmt: TFormatStr; const args: array of PRope); -procedure RopeSeqInsert(var rs: TRopeSeq; r: PRope; at: Natural); - function getCacheStats: string; function RopeEqualsFile(r: PRope; const f: string): Boolean; @@ -524,8 +522,7 @@ begin assert(RopeInvariant(result)); end; -procedure appf(var c: PRope; const frmt: TFormatStr; - const args: array of PRope); +procedure appf(var c: PRope; const frmt: TFormatStr; const args: array of PRope); begin app(c, ropef(frmt, args)) end; diff --git a/nim/rst.pas b/nim/rst.pas index 55c2c933a..0c5377646 100644 --- a/nim/rst.pas +++ b/nim/rst.pas @@ -1967,6 +1967,10 @@ begin initParser(q, p.s); q.filename := filename; getTokens(readFile(path), false, q.tok); + // workaround a GCC bug: + if find(q.tok[high(q.tok)].symbol, #0#1#2) > 0 then begin + InternalError('Too many binary zeros in include file'); + end; result := parseDoc(q); end end diff --git a/nim/scanner.pas b/nim/scanner.pas index a78f9c6ce..d035b973b 100644 --- a/nim/scanner.pas +++ b/nim/scanner.pas @@ -428,7 +428,7 @@ begin L.bufpos := pos; // restore position try - if (L.buf[pos] = '0') and (L.buf[pos+1] in ['x','X','b','B','o','O']) + if (L.buf[pos] = '0') and (L.buf[pos+1] in ['x','X','b','B','o','O','c','C']) then begin inc(pos, 2); xi := 0; @@ -451,7 +451,7 @@ begin end end end; - 'o': begin + 'o', 'c', 'C': begin result.base := base8; while true do begin case L.buf[pos] of diff --git a/nim/sem.pas b/nim/sem.pas index 6d97da3e8..3494754fd 100644 --- a/nim/sem.pas +++ b/nim/sem.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -183,7 +183,7 @@ begin c := newContext(module, filename); if (c.p <> nil) then InternalError(module.info, 'sem.myOpen'); c.semConstExpr := semConstExpr; - c.p := newProcCon(nil); + c.p := newProcCon(module); pushOwner(c.module); openScope(c.tab); // scope for imported symbols SymTabAdd(c.tab, module); // a module knows itself diff --git a/nim/semdata.pas b/nim/semdata.pas index 9ffd41eac..3393ed4b3 100644 --- a/nim/semdata.pas +++ b/nim/semdata.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -128,6 +128,7 @@ end; function newProcCon(owner: PSym): PProcCon; begin + if owner = nil then InternalError('owner is nil'); new(result); {@ignore} fillChar(result^, sizeof(result^), 0); diff --git a/nim/semexprs.pas b/nim/semexprs.pas index 3e95e3457..59d7f969a 100644 --- a/nim/semexprs.pas +++ b/nim/semexprs.pas @@ -1,7 +1,7 @@ // // // The Ethexor Morpork Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -87,19 +87,23 @@ begin end end; -function isCastable(castDest, src: PType): Boolean; +function isCastable(dst, src: PType): Boolean; +//const +// castableTypeKinds = {@set}[tyInt, tyPtr, tyRef, tyCstring, tyString, +// tySequence, tyPointer, tyNil, tyOpenArray, +// tyProc, tySet, tyEnum, tyBool, tyChar]; var ds, ss: biggestInt; begin // this is very unrestrictive; cast is allowed if castDest.size >= src.size - ds := computeSize(castDest); + ds := computeSize(dst); ss := computeSize(src); if ds < 0 then result := false else if ss < 0 then result := false - else + else result := (ds >= ss) or - (castDest.kind in [tyInt..tyFloat128]) or - (src.kind in [tyInt..tyFloat128]) + (skipGeneric(dst).kind in [tyInt..tyFloat128]) or + (skipGeneric(src).kind in [tyInt..tyFloat128]) end; function semConv(c: PContext; n: PNode; s: PSym): PNode; @@ -620,6 +624,11 @@ begin end; end; +procedure checkDeprecated(n: PNode; s: PSym); +begin + if sfDeprecated in s.flags then liMessage(n.info, warnDeprecated, s.name.s); +end; + function semSym(c: PContext; n: PNode; s: PSym; flags: TExprFlags): PNode; begin result := newSymNode(s); @@ -652,7 +661,8 @@ begin end end else begin end - end + end; + checkDeprecated(n, s); end; function isTypeExpr(n: PNode): bool; @@ -787,6 +797,7 @@ begin result := newSymNode(f); result.info := n.info; result.typ := ty; + checkDeprecated(n, f); end else liMessage(n.sons[1].info, errEnumHasNoValueX, i.s); @@ -814,6 +825,7 @@ begin n.sons[0] := makeDeref(n.sons[0]); n.sons[1] := newSymNode(f); // we now have the correct field n.typ := f.typ; + checkDeprecated(n, f); if check = nil then result := n else begin check.sons[0] := n; @@ -831,14 +843,17 @@ begin n.sons[1] := newSymNode(f); n.typ := f.typ; result := n; + checkDeprecated(n, f); exit end end; // allow things like "".replace(...) // --> replace("", ...) f := SymTabGet(c.tab, i); - if (f <> nil) and (f.kind = skStub) then loadStub(f); - if (f <> nil) and (f.kind in [skProc, skIterator]) then begin + //if (f <> nil) and (f.kind = skStub) then loadStub(f); + // XXX ``loadStub`` is not correct here as we don't care for ``f`` really + if (f <> nil) then begin + // BUGFIX: do not check for (f.kind in [skProc, skIterator]) here result := newNodeI(nkDotCall, n.info); // This special node kind is to merge with the call handler in `semExpr`. addSon(result, newIdentNode(i, n.info)); @@ -1121,6 +1136,57 @@ begin result := semFieldAccess(c, n, flags); end; +function isCallExpr(n: PNode): bool; +begin + result := n.kind in [nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand]; +end; + +function semMacroStmt(c: PContext; n: PNode): PNode; +var + s: PSym; + a: PNode; + i: int; +begin + checkMinSonsLen(n, 2); + if isCallExpr(n.sons[0]) then + a := n.sons[0].sons[0] + else + a := n.sons[0]; + s := qualifiedLookup(c, a, false); + if (s <> nil) then begin + checkDeprecated(n, s); + case s.kind of + skMacro: begin + include(s.flags, sfUsed); + result := semMacroExpr(c, n, s); + end; + skTemplate: begin + include(s.flags, sfUsed); + // transform + // nkMacroStmt(nkCall(a...), stmt, b...) + // to + // nkCall(a..., stmt, b...) + result := newNodeI(nkCall, n.info); + addSon(result, a); + if isCallExpr(n.sons[0]) then begin + for i := 1 to sonsLen(n.sons[0])-1 do + addSon(result, n.sons[0].sons[i]); + end; + for i := 1 to sonsLen(n)-1 do + addSon(result, n.sons[i]); + pushInfoContext(n.info); + result := evalTemplate(c, result, s); + popInfoContext(); + end; + else + liMessage(n.info, errXisNoMacroOrTemplate, s.name.s); + end + end + else + liMessage(n.info, errInvalidExpressionX, + renderTree(a, {@set}[renderNoComments])); +end; + function semExpr(c: PContext; n: PNode; flags: TExprFlags = {@set}[]): PNode; var s: PSym; @@ -1174,6 +1240,7 @@ begin checkMinSonsLen(n, 1); s := qualifiedLookup(c, n.sons[0], false); if (s <> nil) then begin + checkDeprecated(n, s); case s.kind of skMacro: begin include(s.flags, sfUsed); @@ -1200,6 +1267,9 @@ begin end else result := semIndirectOp(c, n); end; + nkMacroStmt: begin + result := semMacroStmt(c, n); + end; nkBracketExpr: begin checkMinSonsLen(n, 1); s := qualifiedLookup(c, n.sons[0], false); @@ -1221,7 +1291,7 @@ begin nkPar: begin case checkPar(n) of paNone: result := nil; - paTuplePositions: result := semTuplePositionsConstr(c, n); + paTuplePositions: result := semTuplePositionsConstr(c, n); paTupleFields: result := semTupleFieldsConstr(c, n); paSingle: result := semExpr(c, n.sons[0]); end; diff --git a/nim/semfold.pas b/nim/semfold.pas index 422ddbd01..781c3b97d 100644 --- a/nim/semfold.pas +++ b/nim/semfold.pas @@ -406,6 +406,8 @@ begin else result := copyTree(s.ast); // BUGFIX end end + else if s.kind = skProc then // BUGFIX + result := n end; nkCharLit..nkNilLit: result := copyNode(n); nkIfExpr: result := getConstIfExpr(module, n); diff --git a/nim/seminst.pas b/nim/seminst.pas index 4c3d416d4..a49d8478e 100644 --- a/nim/seminst.pas +++ b/nim/seminst.pas @@ -58,10 +58,29 @@ begin end end; +procedure genericToConcreteTypeKind(t: PType); +var + body: PNode; +begin + if (t.kind = tyGeneric) and (t.sym <> nil) then begin + body := t.sym.ast.sons[2]; + case body.kind of + nkObjectTy: t.kind := tyObject; + nkTupleTy: t.kind := tyTuple; + nkRefTy: t.kind := tyRef; + nkPtrTy: t.kind := tyPtr; + nkVarTy: t.kind := tyVar; + nkProcTy: t.kind := tyProc; + else InternalError('genericToConcreteTypeKind'); + end + end +end; + function instantiateType(c: PInstantiateClosure; typ: PType): PType; var i: int; begin + if typ = nil then begin result := nil; exit end; result := PType(idTableGet(c.typeMap, typ)); if result <> nil then exit; //if typ.kind = tyOpenArray then @@ -73,6 +92,7 @@ begin result.sons[i] := instantiateType(c, result.sons[i]); if result.n <> nil then result.n := instTypeNode(c, result.n); + genericToConcreteTypeKind(result); end else result := typ; @@ -272,6 +292,20 @@ begin result := instantiateType(c, t); end; +function newInstantiateClosure(p: PContext; + const instantiator: TLineInfo): PInstantiateClosure; +begin + new(result); +{@ignore} + fillChar(result^, sizeof(result^), 0); +{@emit} + InitIdTable(result.typeMap); + InitIdTable(result.symMap); + result.fn := nil; + result.instantiator := instantiator; + result.module := p.module; +end; + function partialSpecialization(c: PContext; n: PNode; s: PSym): PNode; begin result := n; diff --git a/nim/semstmts.pas b/nim/semstmts.pas index 098b95072..ebf14693c 100644 --- a/nim/semstmts.pas +++ b/nim/semstmts.pas @@ -42,7 +42,7 @@ begin end; if result = nil then result := newNodeI(nkNilLit, n.info); // The ``when`` statement implements the mechanism for platform dependant - // code. Thus we try to ensure here consistent ID distribution after the + // code. Thus we try to ensure here consistent ID allocation after the // ``when`` statement. IDsynchronizationPoint(200); end; @@ -59,9 +59,11 @@ begin case it.kind of nkElifBranch: begin checkSonsLen(it, 2); + openScope(c.tab); it.sons[0] := semExprWithType(c, it.sons[0]); checkBool(it.sons[0]); - it.sons[1] := semStmtScope(c, it.sons[1]) + it.sons[1] := semStmt(c, it.sons[1]); + closeScope(c.tab); end; nkElse: begin if sonsLen(it) = 1 then it.sons[0] := semStmtScope(c, it.sons[0]) @@ -144,7 +146,7 @@ begin // now parse the string literal and substitute symbols: a := strStart; repeat - b := findSubStr(marker, str, a); + b := strutils.find(str, marker, a); if b < strStart then sub := ncopy(str, a) else @@ -153,7 +155,7 @@ begin addSon(result, newStrNode(nkStrLit, sub)); if b < strStart then break; - c := findSubStr(marker, str, b+1); + c := strutils.find(str, marker, b+1); if c < strStart then sub := ncopy(str, b+1) else @@ -179,11 +181,13 @@ function semWhile(c: PContext; n: PNode): PNode; begin result := n; checkSonsLen(n, 2); + openScope(c.tab); n.sons[0] := semExprWithType(c, n.sons[0]); CheckBool(n.sons[0]); inc(c.p.nestedLoopCounter); - n.sons[1] := semStmtScope(c, n.sons[1]); + n.sons[1] := semStmt(c, n.sons[1]); dec(c.p.nestedLoopCounter); + closeScope(c.tab); end; function semCase(c: PContext; n: PNode): PNode; @@ -197,6 +201,7 @@ begin // check selector: result := n; checkMinSonsLen(n, 2); + openScope(c.tab); n.sons[0] := semExprWithType(c, n.sons[0]); chckCovered := false; covered := 0; @@ -216,7 +221,7 @@ begin end; nkElifBranch: begin chckCovered := false; - checkSonsLen(n, 2); + checkSonsLen(x, 2); x.sons[0] := semExprWithType(c, x.sons[0]); checkBool(x.sons[0]); x.sons[1] := semStmtScope(c, x.sons[1]) @@ -231,6 +236,7 @@ begin end; if chckCovered and (covered <> lengthOrd(n.sons[0].typ)) then liMessage(n.info, errNotAllCasesCovered); + closeScope(c.tab); end; function semAsgn(c: PContext; n: PNode): PNode; @@ -388,7 +394,7 @@ begin if (a.kind <> nkIdentDefs) and (a.kind <> nkVarTuple) then IllFormedAst(a); checkMinSonsLen(a, 3); len := sonsLen(a); - if a.sons[len-2] <> nil then + if a.sons[len-2] <> nil then typ := semTypeNode(c, a.sons[len-2], nil) else typ := nil; @@ -401,6 +407,8 @@ begin end else def := nil; + if not typeAllowed(typ, skVar) then + liMessage(a.info, errXisNoType, typeToString(typ)); tup := skipGeneric(typ); if a.kind = nkVarTuple then begin if tup.kind <> tyTuple then liMessage(a.info, errXExpected, 'tuple'); @@ -408,7 +416,7 @@ begin liMessage(a.info, errWrongNumberOfVariables); end; for j := 0 to len-3 do begin - if c.p.owner = nil then begin + if (c.p.owner.kind = skModule) then begin v := semIdentWithPragma(c, skVar, a.sons[j], {@set}[sfStar, sfMinus]); include(v.flags, sfGlobal); end @@ -441,7 +449,7 @@ begin if a.kind = nkCommentStmt then continue; if (a.kind <> nkConstDef) then IllFormedAst(a); checkSonsLen(a, 3); - if (c.p.owner = nil) then begin + if (c.p.owner.kind = skModule) then begin v := semIdentWithPragma(c, skConst, a.sons[0], {@set}[sfStar, sfMinus]); include(v.flags, sfGlobal); end @@ -456,6 +464,8 @@ begin def := fitRemoveHiddenConv(c, typ, def); end else typ := def.typ; + if not typeAllowed(typ, skConst) then + liMessage(a.info, errXisNoType, typeToString(typ)); v.typ := typ; v.ast := def; // no need to copy @@ -480,6 +490,7 @@ begin result := n; checkMinSonsLen(n, 3); len := sonsLen(n); + openScope(c.tab); if n.sons[len-2].kind = nkRange then begin checkSonsLen(n.sons[len-2], 2); // convert ``in 3..5`` to ``in countup(3, 5)`` @@ -500,7 +511,6 @@ begin end; n.sons[len-2] := semExprWithType(c, n.sons[len-2]); iter := skipGeneric(n.sons[len-2].typ); - openScope(c.tab); if iter.kind <> tyTuple then begin if len <> 3 then liMessage(n.info, errWrongNumberOfVariables); v := newSymS(skForVar, n.sons[0], c); @@ -573,7 +583,7 @@ begin end; end; -procedure semGenericParamList(c: PContext; n: PNode); +procedure semGenericParamList(c: PContext; n: PNode; father: PType = nil); var i: int; s: PSym; @@ -590,6 +600,7 @@ begin s.typ := newTypeS(tyGenericParam, c); s.typ.sym := s; end; + if father <> nil then addSon(father, s.typ); s.position := i; n.sons[i] := newSymNode(s); addDecl(c, s); @@ -631,7 +642,7 @@ begin if a.kind = nkCommentStmt then continue; if (a.kind <> nkTypeDef) then IllFormedAst(a); checkSonsLen(a, 3); - if (c.p.owner = nil) then begin + if (c.p.owner.kind = skModule) then begin s := semIdentWithPragma(c, skType, a.sons[0], {@set}[sfStar, sfMinus]); include(s.flags, sfGlobal); end @@ -665,7 +676,8 @@ begin openScope(c.tab); pushOwner(s); s.typ.kind := tyGeneric; - semGenericParamList(c, a.sons[1]); + semGenericParamList(c, a.sons[1], s.typ); + addSon(s.typ, nil); // process the type body for symbol lookup of generic params // we can use the same algorithm as for template parameters: a.sons[2] := resolveTemplateParams(c, a.sons[2]); @@ -736,7 +748,7 @@ var begin result := n; checkSonsLen(n, codePos+1); - if c.p.owner <> nil then + if c.p.owner.kind <> skModule then liMessage(n.info, errIteratorNotAllowed); oldP := c.p; // restore later s := semIdentVis(c, skIterator, n.sons[0], {@set}[sfStar]); @@ -857,7 +869,7 @@ var begin result := n; checkSonsLen(n, codePos+1); - if c.p.owner = nil then begin + if c.p.owner.kind = skModule then begin s := semIdentVis(c, kind, n.sons[0], {@set}[sfStar]); include(s.flags, sfGlobal); end @@ -885,7 +897,7 @@ begin proto := SearchForProc(c, s, c.tab.tos-2); // -2 because we have a scope open // for parameters if proto = nil then begin - if oldP.owner <> nil then // we are in a nested proc + if oldP.owner.kind <> skModule then // we are in a nested proc s.typ.callConv := ccClosure else s.typ.callConv := lastOptionEntry(c).defaultCC; @@ -1025,7 +1037,7 @@ begin if nfSem in n.flags then exit; case n.kind of nkAsgn: result := semAsgn(c, n); - nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand: + nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand, nkMacroStmt: result := semCommand(c, n); nkEmpty, nkCommentStmt, nkNilLit: begin end; nkBlockStmt: result := semBlock(c, n); @@ -1051,8 +1063,7 @@ begin nkDiscardStmt: result := semDiscard(c, n); nkWhileStmt: result := semWhile(c, n); nkTryStmt: result := semTry(c, n); - nkBreakStmt, nkContinueStmt: - result := semBreakOrContinue(c, n); + nkBreakStmt, nkContinueStmt: result := semBreakOrContinue(c, n); nkForStmt: result := semFor(c, n); nkCaseStmt: result := semCase(c, n); nkReturnStmt: result := semReturn(c, n); diff --git a/nim/semtempl.pas b/nim/semtempl.pas index c07a7bd13..ebc5e1ebb 100644 --- a/nim/semtempl.pas +++ b/nim/semtempl.pas @@ -164,7 +164,7 @@ var i, j, len, counter: int; params, p, paramKind: PNode; begin - if c.p.owner = nil then begin + if c.p.owner.kind = skModule then begin s := semIdentVis(c, skTemplate, n.sons[0], {@set}[sfStar]); include(s.flags, sfGlobal); end diff --git a/nim/semtypes.pas b/nim/semtypes.pas index 37958c4d0..014ff0216 100644 --- a/nim/semtypes.pas +++ b/nim/semtypes.pas @@ -51,10 +51,12 @@ begin e := newSymS(skEnumField, n.sons[i].sons[0], c); v := semConstExpr(c, n.sons[i].sons[1]); x := getOrdValue(v); - if (x <> counter) and (i <> 1) then - include(result.flags, tfEnumHasWholes); - if x < counter then - liMessage(n.sons[i].info, errInvalidOrderInEnumX, e.name.s); + if i <> 1 then begin + if (x <> counter) then + include(result.flags, tfEnumHasWholes); + if x < counter then + liMessage(n.sons[i].info, errInvalidOrderInEnumX, e.name.s); + end; counter := x; end; nkSym: e := n.sons[i].sym; @@ -247,7 +249,7 @@ begin end end end; - +(* function instGenericAux(c: PContext; templ, actual: PNode; sym: PSym): PNode; var @@ -271,34 +273,48 @@ begin result.sons[i] := instGenericAux(c, templ.sons[i], actual, sym); end end -end; +end; *) function semGeneric(c: PContext; n: PNode; s: PSym; prev: PType): PType; var i: int; elem: PType; inst: PNode; + cl: PInstantiateClosure; begin if (s.typ = nil) or (s.typ.kind <> tyGeneric) then liMessage(n.info, errCannotInstantiateX, s.name.s); result := newOrPrevType(tyGenericInst, prev, c); // new ID... result.containerID := s.typ.containerID; // ... but the same containerID result.sym := s; - if (s.typ.containerID = 0) then - InternalError(n.info, 'semtypes.semGeneric'); + if (s.typ.containerID = 0) then InternalError(n.info, 'semtypes.semGeneric'); + cl := newInstantiateClosure(c, n.info); + // check the number of supplied arguments suffices: + if sonsLen(n) <> sonsLen(s.typ) then begin + //MessageOut('n: ' +{&} toString(sonsLen(n)) +{&} ' s: ' + // +{&} toString(sonsLen(s.typ))); + liMessage(n.info, errWrongNumberOfTypeParams); + end; + // a generic type should be instantiated with itself: + // idTablePut(cl.typeMap, s.typ, result); + // iterate over arguments: for i := 1 to sonsLen(n)-1 do begin elem := semTypeNode(c, n.sons[i], nil); if elem.kind = tyGenericParam then - result.kind := tyGeneric; // prevend type from instantiation + result.kind := tyGeneric // prevend type from instantiation + else + idTablePut(cl.typeMap, s.typ.sons[i-1], elem); addSon(result, elem); end; if s.ast <> nil then begin if (result.kind = tyGenericInst) then begin - inst := instGenericAux(c, s.ast.sons[2], n, s); + // inst := instGenericAux(c, s.ast.sons[2], n, s); internalError(n.info, 'Generic containers not implemented'); // XXX: implementation does not work this way + // we need to do the following: + // traverse and copy the type and replace any tyGenericParam type // does checking of instantiated type for us: - elem := semTypeNode(c, inst, nil); + elem := instantiateType(cl, s.typ); //semTypeNode(c, inst, nil); elem.id := result.containerID; addSon(result, elem); end diff --git a/nim/sigmatch.pas b/nim/sigmatch.pas index 289a17673..ebcbb2529 100644 --- a/nim/sigmatch.pas +++ b/nim/sigmatch.pas @@ -80,7 +80,7 @@ var begin result := msgKindToString(errTypeMismatch); for i := 1 to sonsLen(n)-1 do begin - debug(n.sons[i].typ); + //debug(n.sons[i].typ); add(result, typeToString(n.sons[i].typ)); if i <> sonsLen(n)-1 then add(result, ', '); end; @@ -361,9 +361,7 @@ begin // is a subtype of f? tyProc: begin if (sonsLen(f) = sonsLen(a)) and (f.callconv = a.callconv) then begin // Note: We have to do unification for the parameters before the - // return type! Otherwise it'd be counter-intuitive for the standard - // Nimrod syntax. For the C-based syntax it IS counter-intuitive. - // But that is one of the reasons a standard syntax was picked. + // return type! result := isEqual; // start with maximum; also correct for no // params at all for i := 1 to sonsLen(f)-1 do begin @@ -433,8 +431,9 @@ begin // is a subtype of f? end; tyAnyEnum: begin case a.kind of - tyRange: result := typeRel(mapping, f, base(a)); - tyEnum: result := isSubtype; + tyRange: result := typeRel(mapping, f, base(a)); + tyEnum: result := isSubtype; + tyAnyEnum: result := isEqual; else begin end end end; @@ -726,11 +725,11 @@ begin end else begin setSon(m.call, formal.position+1, arg); - end; - inc(f); + end end end; inc(a); + inc(f); end; // iterate over all formal params and check all are provided: f := 1; diff --git a/nim/strtabs.pas b/nim/strtabs.pas index b07aefab1..4fcf32891 100644 --- a/nim/strtabs.pas +++ b/nim/strtabs.pas @@ -269,14 +269,14 @@ begin j := i+1; while (j <= length(f)+strStart-1) and (f[j] <> '}') do inc(j); key := ncopy(f, i+2+strStart-1, j-1+strStart-1); - result := result +{&} getValue(t, flags, key); + add(result, getValue(t, flags, key)); i := j+1 end; 'a'..'z', 'A'..'Z', #128..#255, '_': begin j := i+1; while (j <= length(f)+strStart-1) and (f[j] in PatternChars) do inc(j); key := ncopy(f, i+1+strStart-1, j-1+strStart-1); - result := result +{&} getValue(t, flags, key); + add(result, getValue(t, flags, key)); i := j end else begin diff --git a/nim/strutils.pas b/nim/strutils.pas index 71a428dbb..cd07105be 100644 --- a/nim/strutils.pas +++ b/nim/strutils.pas @@ -28,6 +28,7 @@ function cmp(const x, y: string): int; function cmpIgnoreCase(const x, y: string): int; function format(const f: string; const args: array of string): string; +procedure addf(var result: string; const f: string; args: array of string); function toHex(x: BiggestInt; len: int): string; function toOctal(value: Char): string; @@ -47,7 +48,7 @@ function ToString(b: Boolean): string; overload; function IntToStr(i: BiggestInt; minChars: int): string; -function findSubStr(const sub, s: string; start: int = 1): int; +function find(const s, sub: string; start: int = 1): int; overload; function replaceStr(const s, search, by: string): string; procedure deleteStr(var s: string; first, last: int); @@ -81,8 +82,8 @@ implementation function quoteIfContainsWhite(const s: string): string; begin - if ((findSubStr(' ', s) >= strStart) - or (findSubStr(#9, s) >= strStart)) and (s[strStart] <> '"') then + if ((find(s, ' ') >= strStart) + or (find(s, #9) >= strStart)) and (s[strStart] <> '"') then result := '"' +{&} s +{&} '"' else result := s @@ -247,7 +248,7 @@ begin result := result + s[i] end; -function findSubStr(const sub, s: string; start: int = 1): int; +function find(const s, sub: string; start: int = 1): int; var i, j, M, N: int; begin @@ -277,7 +278,7 @@ begin result := ''; i := 1; repeat - j := findSubStr(search, s, i); + j := find(s, search, i); if j = 0 then begin // copy the rest: result := result + copy(s, i, length(s) - i + 1); @@ -475,7 +476,7 @@ begin until false end; -function find(const x: string; const inArray: array of string): int; +function find(const x: string; const inArray: array of string): int; overload; var i: int; y: string; @@ -491,30 +492,29 @@ begin result := -1 end; -function format(const f: string; const args: array of string): string; +procedure addf(var result: string; const f: string; args: array of string); const PatternChars = ['a'..'z', 'A'..'Z', '0'..'9', '_', #128..#255]; var i, j, x: int; begin - result := ''; i := 1; while i <= length(f) do if f[i] = '$' then begin case f[i+1] of '$': begin - result := result + '$'; + addChar(result, '$'); inc(i, 2); end; '1'..'9': begin - result := result + args[ord(f[i+1]) - ord('0') - 1]; + add(result, args[ord(f[i+1]) - ord('0') - 1]); inc(i, 2); end; '{': begin j := i+1; while (j <= length(f)) and (f[j] <> '}') do inc(j); x := find(ncopy(f, i+2, j-1), args); - if (x >= 0) and (x < high(args)) then result := result + args[x+1] + if (x >= 0) and (x < high(args)) then add(result, args[x+1]) else raise EInvalidFormatStr.create(''); i := j+1 end; @@ -522,7 +522,7 @@ begin j := i+1; while (j <= length(f)) and (f[j] in PatternChars) do inc(j); x := find(ncopy(f, i+1, j-1), args); - if (x >= 0) and (x < high(args)) then result := result + args[x+1] + if (x >= 0) and (x < high(args)) then add(result, args[x+1]) else raise EInvalidFormatStr.create(ncopy(f, i+1, j-1)); i := j end @@ -530,11 +530,17 @@ begin end end else begin - result := result + f[i]; + addChar(result, f[i]); inc(i) end end; +function format(const f: string; const args: array of string): string; +begin + result := ''; + addf(result, f, args) +end; + {@ignore} {$ifopt Q-} {$Q+} {$else} {$define Q_off} diff --git a/nim/transf.pas b/nim/transf.pas index 98d1e89ea..5d9f44143 100644 --- a/nim/transf.pas +++ b/nim/transf.pas @@ -14,6 +14,7 @@ unit transf; // * inlines iterators // * inlines constants // * performes contant folding +// * introduces nkHiddenDeref, nkHiddenSubConv, etc. interface @@ -446,12 +447,51 @@ begin end; end; +function skipPassAsOpenArray(n: PNode): PNode; +begin + result := n; + while result.kind = nkPassAsOpenArray do + result := result.sons[0] +end; + +type + TPutArgInto = (paDirectMapping, paFastAsgn, paVarAsgn); + +function putArgInto(arg: PNode; formal: PType): TPutArgInto; +// This analyses how to treat the mapping "formal <-> arg" in an +// inline context. +var + i: int; +begin + if skipGeneric(formal).kind = tyOpenArray then begin + result := paDirectMapping; // XXX really correct? + // what if ``arg`` has side-effects? + exit + end; + case arg.kind of + nkEmpty..nkNilLit: result := paDirectMapping; + nkPar, nkCurly, nkBracket: begin + result := paFastAsgn; + for i := 0 to sonsLen(arg)-1 do + if putArgInto(arg.sons[i], formal) <> paDirectMapping then + exit; + result := paDirectMapping; + end; + else begin + if skipGeneric(formal).kind = tyVar then + result := paVarAsgn + else + result := paFastAsgn + end + end +end; + function transformFor(c: PTransf; n: PNode): PNode; // generate access statements for the parameters (unless they are constant) // put mapping from formal parameters to actual parameters var i, len: int; - call, e, v, body: PNode; + call, v, body, arg: PNode; newC: PTransCon; temp, formal: PSym; begin @@ -473,24 +513,24 @@ begin // generate access statements for the parameters (unless they are constant) pushTransCon(c, newC); for i := 1 to sonsLen(call)-1 do begin - e := getConstExpr(c.module, call.sons[i]); + arg := skipPassAsOpenArray(transform(c, call.sons[i])); formal := skipGeneric(newC.owner.typ).n.sons[i].sym; - if e <> nil then - IdNodeTablePut(newC.mapping, formal, e) - else if (skipConv(call.sons[i]).kind = nkSym) then begin - // since parameters cannot be modified, we can identify the formal and - // the actual params - IdNodeTablePut(newC.mapping, formal, call.sons[i]); - end - else begin - // generate a temporary and produce an assignment statement: - temp := newTemp(c, formal.typ, formal.info); - addVar(v, newSymNode(temp)); - // BUGFIX: do not copy call.sons[i], but transform it! - addSon(result, newAsgnStmt(c, newSymNode(temp), - transform(c, call.sons[i]))); - IdNodeTablePut(newC.mapping, formal, newSymNode(temp)); // BUGFIX - end + //if IdentEq(newc.Owner.name, 'items') then + // liMessage(arg.info, warnUser, 'items: ' + nodeKindToStr[arg.kind]); + case putArgInto(arg, formal.typ) of + paDirectMapping: IdNodeTablePut(newC.mapping, formal, arg); + paFastAsgn: begin + // generate a temporary and produce an assignment statement: + temp := newTemp(c, formal.typ, formal.info); + addVar(v, newSymNode(temp)); + addSon(result, newAsgnStmt(c, newSymNode(temp), arg)); + IdNodeTablePut(newC.mapping, formal, newSymNode(temp)); + end; + paVarAsgn: begin + assert(skipGeneric(formal.typ).kind = tyVar); + InternalError(arg.info, 'not implemented: pass to var parameter'); + end; + end; end; body := newC.owner.ast.sons[codePos]; pushInfoContext(n.info); @@ -668,7 +708,7 @@ function transformCase(c: PTransf; n: PNode): PNode; // removes `elif` branches of a case stmt var len, i, j: int; - ifs: PNode; + ifs, elsen: PNode; begin len := sonsLen(n); i := len-1; @@ -678,9 +718,11 @@ begin if (n.sons[i].kind <> nkOfBranch) then InternalError(n.sons[i].info, 'transformCase'); ifs := newNodeI(nkIfStmt, n.sons[i+1].info); + elsen := newNodeI(nkElse, ifs.info); for j := i+1 to len-1 do addSon(ifs, n.sons[j]); setLength(n.sons, i+2); - n.sons[i+1] := ifs; + addSon(elsen, ifs); + n.sons[i+1] := elsen; end; result := n; for j := 0 to sonsLen(n)-1 do result.sons[j] := transform(c, n.sons[j]); diff --git a/nim/types.pas b/nim/types.pas index 25ad54b33..af19a1671 100644 --- a/nim/types.pas +++ b/nim/types.pas @@ -1,12 +1,11 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. // - unit types; // this module contains routines for accessing and iterating over types @@ -47,7 +46,6 @@ function mutateType(t: PType; iter: TTypeMutator; closure: PObject): PType; // Returns result of `iter`. - function SameType(x, y: PType): Boolean; function SameTypeOrNil(a, b: PType): Boolean; @@ -115,6 +113,8 @@ function analyseObjectWithTypeField(t: PType): TTypeFieldResult; // made or intializing of the type field suffices or if there is no type field // at all in this type. +function typeAllowed(t: PType; kind: TSymKind): bool; + implementation function InvalidGenericInst(f: PType): bool; @@ -185,11 +185,13 @@ begin n := sym.typ.n; for i := 1 to sonsLen(n)-1 do begin p := n.sons[i]; - assert(p.kind = nkSym); - result := result +{&} p.sym.name.s +{&} ': ' +{&} typeToString(p.sym.typ); - if i <> sonsLen(n)-1 then result := result + ', '; + if (p.kind <> nkSym) then InternalError('getProcHeader'); + add(result, p.sym.name.s); + add(result, ': '); + add(result, typeToString(p.sym.typ)); + if i <> sonsLen(n)-1 then add(result, ', '); end; - result := result + ')'; + addChar(result, ')'); if n.sons[0].typ <> nil then result := result +{&} ': ' +{&} typeToString(n.sons[0].typ); end; @@ -928,6 +930,96 @@ begin end end; +function typeAllowedAux(var marker: TIntSet; t: PType; + kind: TSymKind): bool; forward; + +function typeAllowedNode(var marker: TIntSet; n: PNode; kind: TSymKind): bool; +var + i: int; +begin + result := true; + if n <> nil then begin + result := typeAllowedAux(marker, n.typ, kind); + if result then + case n.kind of + nkNone..nkNilLit: begin end; + else begin + for i := 0 to sonsLen(n)-1 do begin + result := typeAllowedNode(marker, n.sons[i], kind); + if not result then exit + end + end + end + end +end; + +function typeAllowedAux(var marker: TIntSet; t: PType; kind: TSymKind): bool; +var + i: int; +begin + assert(kind in [skVar, skConst, skParam]); + result := true; + if t = nil then exit; + // if we have already checked the type, return true, because we stop the + // evaluation if something is wrong: + if IntSetContainsOrIncl(marker, t.id) then exit; + case skipGeneric(t).kind of + tyVar: begin + case skipGeneric(t.sons[0]).kind of + tyVar: result := false; // ``var var`` is always an invalid type: + tyOpenArray: result := (kind = skParam) and + typeAllowedAux(marker, t.sons[0], kind); + else result := (kind <> skConst) and + typeAllowedAux(marker, t.sons[0], kind); + end + end; + tyProc: begin + for i := 1 to sonsLen(t)-1 do begin + result := typeAllowedAux(marker, t.sons[i], skParam); + if not result then exit; + end; + if t.sons[0] <> nil then + result := typeAllowedAux(marker, t.sons[0], skVar) + end; + tyGeneric, tyGenericParam, tyForward, tyNone: result := false; + tyEmpty, tyNil: result := kind = skConst; + tyString, tyBool, tyChar, tyEnum, tyInt..tyFloat128, tyCString, tyPointer: + result := true; + tyAnyEnum: result := kind = skParam; + tyGenericInst: result := typeAllowedAux(marker, lastSon(t), kind); + tyRange: result := skipGeneric(t.sons[0]).kind in + [tyChar, tyEnum, tyInt..tyFloat128]; + tyOpenArray: + result := (kind = skParam) and typeAllowedAux(marker, t.sons[0], skVar); + tySequence: result := (kind <> skConst) + and typeAllowedAux(marker, t.sons[0], skVar) + or (t.sons[0].kind = tyEmpty); + tyArray: result := typeAllowedAux(marker, t.sons[1], skVar); + tyPtr, tyRef: result := typeAllowedAux(marker, t.sons[0], skVar); + tyArrayConstr, tyTuple, tySet: begin + for i := 0 to sonsLen(t)-1 do begin + result := typeAllowedAux(marker, t.sons[i], kind); + if not result then exit + end; + end; + tyObject: begin + for i := 0 to sonsLen(t)-1 do begin + result := typeAllowedAux(marker, t.sons[i], skVar); + if not result then exit + end; + if t.n <> nil then result := typeAllowedNode(marker, t.n, skVar) + end + end +end; + +function typeAllowed(t: PType; kind: TSymKind): bool; +var + marker: TIntSet; +begin + IntSetInit(marker); + result := typeAllowedAux(marker, t, kind); +end; + function align(address, alignment: biggestInt): biggestInt; begin result := (address + (alignment-1)) and not (alignment-1); diff --git a/nim/wordrecg.pas b/nim/wordrecg.pas index 587005c2a..dd2df0047 100644 --- a/nim/wordrecg.pas +++ b/nim/wordrecg.pas @@ -1,7 +1,7 @@ // // // The Nimrod Compiler -// (c) Copyright 2008 Andreas Rumpf +// (c) Copyright 2009 Andreas Rumpf // // See the file "copying.txt", included in this // distribution, for details about the copyright. @@ -66,7 +66,7 @@ type wMerge, wLib, wDynlib, wCompilerproc, wCppmethod, wFatal, wError, wWarning, wHint, wLine, wPush, wPop, wDefine, wUndef, wLinedir, wStacktrace, wLinetrace, wPragma, - wLink, wCompile, wLinksys, wFixupsystem, wDeprecated, wVarargs, + wLink, wCompile, wLinksys, wDeprecated, wVarargs, wByref, wCallconv, wBreakpoint, wDebugger, wNimcall, wStdcall, wCdecl, wSafecall, wSyscall, wInline, wNoInline, wFastcall, wClosure, wNoconv, wOn, wOff, wChecks, wRangechecks, wBoundchecks, @@ -84,7 +84,7 @@ type wMaxErr, wExpr, wStmt, wTypeDesc, wSubsChar, wAstCache, wAcyclic, wIndex, // commands: - wCompileToC, wCompileToCpp, wCompileToEcmaScript, + wCompileToC, wCompileToCpp, wCompileToEcmaScript, wCompileToLLVM, wPretty, wDoc, wPas, wGenDepend, wListDef, wCheck, wParse, wScan, wBoot, wLazy, wRst2html, wI, @@ -140,7 +140,7 @@ const 'merge', 'lib', 'dynlib', 'compilerproc', 'cppmethod', 'fatal', 'error', 'warning', 'hint', 'line', 'push', 'pop', 'define', 'undef', 'linedir', 'stacktrace', 'linetrace', 'pragma', - 'link', 'compile', 'linksys', 'fixupsystem', 'deprecated', 'varargs', + 'link', 'compile', 'linksys', 'deprecated', 'varargs', 'byref', 'callconv', 'breakpoint', 'debugger', 'nimcall', 'stdcall', 'cdecl', 'safecall', 'syscall', 'inline', 'noinline', 'fastcall', 'closure', 'noconv', 'on', 'off', 'checks', 'rangechecks', 'boundchecks', @@ -158,7 +158,7 @@ const 'maxerr', 'expr', 'stmt', 'typedesc', 'subschar', 'astcache', 'acyclic', 'index', // commands: - 'compiletoc', 'compiletocpp', 'compiletoecmascript', + 'compiletoc', 'compiletocpp', 'compiletoecmascript', 'compiletollvm', 'pretty', 'doc', 'pas', 'gendepend', 'listdef', 'check', 'parse', 'scan', 'boot', 'lazy', 'rst2html', 'i'+'', diff --git a/rod/nimrod.cfg b/rod/nimrod.cfg index 31abf7a2a..65bb92bc5 100644 --- a/rod/nimrod.cfg +++ b/rod/nimrod.cfg @@ -13,3 +13,4 @@ @elif vcc: cgen.speed = "" @end + diff --git a/rod/nimrod.ini b/rod/nimrod.ini index 3d0852f3b..755c1dd17 100644 --- a/rod/nimrod.ini +++ b/rod/nimrod.ini @@ -59,6 +59,12 @@ Files: "tests/*.cfg" Files: "tests/*.tmpl" Files: "tests/gtk/*.nim" +Files: "examples/*.nim" +Files: "examples/*.html" +Files: "examples/*.txt" +Files: "examples/*.cfg" +Files: "examples/*.tmpl" + Files: "lib/base/*.c" Files: "lib/base/*.nim" Files: "lib/base/gtk/*.nim" @@ -75,8 +81,8 @@ Files: "lib/base/lua/*.nim" [Windows] Files: "bin/nimrod.exe" -Files: "dist/llvm-gcc4.2" -BinPath: r"bin;dist\llvm-gcc4.2\bin" +Files: "dist/mingw" +BinPath: r"bin;dist\mingw\bin" [Unix] diff --git a/tests/tcasestm.nim b/tests/tcasestm.nim index ef3f2dfc9..16051ceb8 100644 --- a/tests/tcasestm.nim +++ b/tests/tcasestm.nim @@ -1,4 +1,4 @@ -# Test the case statment +# Test the case statement type tenum = enum eA, eB, eC @@ -6,6 +6,7 @@ type var x: string y: Tenum = eA + i: int case y of eA: write(stdout, "a\n") @@ -18,3 +19,14 @@ of "aa", "bb": write(stdout, "Du bist nicht mein Meister\n") of "cc", "hash", "when": nil of "will", "it", "finally", "be", "generated": nil else: write(stdout, "das sollte nicht passieren!\N") + +case i +of 0..5, 8, 9: nil +of 6, 7: nil +elif x == "Ha": + nil +elif x == "Ho": + nil +else: + nil + diff --git a/tests/tlibs.nim b/tests/tlibs.nim index 2326fba64..b5c4036a6 100644 --- a/tests/tlibs.nim +++ b/tests/tlibs.nim @@ -1,7 +1,8 @@ # Test wether the bindings at least compile... import - unicode, + unicode, cgi, terminal, libcurl, web, + parsexml, parseopt, parsecfg, osproc, zipfiles, sdl, smpeg, sdl_gfx, sdl_net, sdl_mixer, sdl_ttf, sdl_image, sdl_mixer_nosmpeg, diff --git a/tests/tprocvar.nim b/tests/tprocvar.nim index ec23dcb1d..f51543dfa 100644 --- a/tests/tprocvar.nim +++ b/tests/tprocvar.nim @@ -1,4 +1,13 @@ # test variables of type proc + +proc pa() {.cdecl.} = write(stdout, "pa") +proc pb() {.cdecl.} = write(stdout, "pb") +proc pc() {.cdecl.} = write(stdout, "pc") +proc pd() {.cdecl.} = write(stdout, "pd") +proc pe() {.cdecl.} = write(stdout, "pe") + +const + algos = [pa, pb, pc, pd, pe] var x: proc (a, b: int): int {.cdecl.} @@ -6,9 +15,12 @@ var proc ha(c, d: int): int {.cdecl.} = echo(c + d) result = c + d + +for a in items(algos): + a() x = ha discard x(3, 4) -#OUT 7 +#OUT papbpcpdpe7 diff --git a/tests/trectype.nim b/tests/trectype.nim index 3161b0255..a7a6f56e0 100644 --- a/tests/trectype.nim +++ b/tests/trectype.nim @@ -13,5 +13,9 @@ type PB = ref TB TB = array [0..3, P1] T1 = array [0..6, PB] + +var + x: PA +new(x) #ERROR_MSG internal error: cannot generate C type for: PA diff --git a/tests/tregex.nim b/tests/tregex.nim index aa32ca847..d9d22d603 100644 --- a/tests/tregex.nim +++ b/tests/tregex.nim @@ -3,10 +3,17 @@ import regexprs + +if "keyA = valueA" =~ r"\s*(\w+)\s*\=\s*(\w+)": + write(stdout, "key: ", matches[1]) +elif "# comment!" =~ r"\s*(\#.*)": + echo("comment: ", matches[1]) +else: + echo("Bug!") if "Username".match("[A-Za-z]+"): echo("Yes!") else: echo("Bug!") -#OUT Yes! +#OUT key: keyAYes! diff --git a/todo.txt b/todo.txt index 44050d637..3e80ba6f1 100644 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,13 @@ TO IMPLEMENT ============ +Plan +---- + +* implement new memory manager --> hopefully faster turnaround times +* implement LLVM backend --> faster turnaround times + + RST --- - footnotes; prefix :i: whitespace before :i:, _reference, `reference`__ @@ -9,55 +16,181 @@ RST Bugs ---- +- BUG: check if "break" is valid is not complete: "break" within "for" + may be incorrect, if the called iterator is not in a loop + --> check that "yield" is inside a loop! +- BUG: returning an array does not work --> see md5.nim module +- BUG: if not nodeOfDegree(g, 1) >= 0: inc(counter) - BUG: addr/deref may not work when interpreting - BUG: the parser allows empty object case branches - BUG: when optmizing cgen.c with Visual C++, GCC, LLVM (O3), it breaks. - BUG: ``-cc:bcc`` command line option does not error - BUG: symbol files still do not work - BUG: tlastmod returns wrong results on BSD (Linux, MacOS X: works) -- BUG: sigmatch for ``len`` matches the open array too often... (?) High priority ------------- +- typeAllowed() for parameters... +- implicit conversions from ``ptr/ref T`` to ``var T`` and from + ``ptr/ref T`` to ``T``? Yes. +- implement generic types - implement tuple unpacking - implement closures for the C code generator -- implement a better memory manager -- implement stack walking via assembler for horribly advanced optimizers - -- documentation: ``[]`` overloading, type convertions, - anonymous procs, ``len(s) == s.len``, type converters +- documentation: type converters - implement two-phase lookup for generics (this is hard...): This is useful for macros too! Alternative: Explicit early name binding. Both are hard to implement -- get rid of ``nkHiddenStdConv`` in several places: this mechanism caused more - bugs than it ever solved! +- language change: inheritance should only work with reference types, so that + the ``type`` field is not needed for objects! --> zero overhead aggregation + +For the next versions +===================== + +- multi-processor support +- IDE +- better support for GDB? +- support for generation of dynamic libraries +- better code generator: skip ropes datastructure, it uses too much memory +- make set optimizations part of the transformation (--> all backends profit + from it), but this really needs a more abstract code generator + + +Further ideas/nice to have +========================== + +- queues additional to streams: have to positions (read/write) instead of one +- introduce: refany type??? +- CLR code generator; better use XYZ? --> Version 1.2? +- provide an interactive shell: if the user wants his commands + to be executed, the command should end with # +- implement packed arrays (bit arrays)/ packed records +- implement tables (implement as library? - no! Builtin because of + constructor syntax is nice to have) + + +Version 2 +--------- + +- language support for aggregation: + type + TMyObject = object + x: TOtherObject + + --> can be done via type converters elegantly + + +- type tags: + type + sqlString* = type string + + everywhere where a string is expected, a "sqlString" is allowed, but not + vice versa. However, this causes problems: + + type + TDollar = type decimal + + TDollar * int --> allowed + TDollar div int --> allowed + TDollar + int --> not allowed + TDollar + TEuro --> not allowed, or implicit conversion + + --> Explicit converters are probably flawed + +- explicit nil types? + * nil seq[int] + * nil string + * nil ref int + * nil ptr THallo + * nil proc + +.. code-block:: nimrod + var + x: string = nil # initialized with invalid value! + if not isNil(x): + # now x + +- better for backwards compability: default nilable, but prefix ``!`` operator + to specify that null is not allowed + + type + PWindow = ! ref TWindow + Library ------- -- xml, html, url, fastcgi: implement from scratch -- socket library (does SDL for us?) + +- gui module +- finish json module: hard +- socket, http, ftp, email, fastcgi: implement from scratch +- ncurses bindings - osproc for Windows - bignums - python +- TCL +- automate module: expect-like module for Nimrod +- parsecsv module + +- YAML module Low priority ------------ +- ``when T is int`` for generic code +- ``when validCode( proc () )`` for generic code + + when compiles: + + elif compiles: + + +- copy more of C++'s object modell? +- syntactic sugar for OOP: + + type + TObj* = object + fx = 0.nat + fy = 0.nat + s = "" + proc setX(var, val: int) = my.fx = val + proc getX: int = return my.fx + + `x=`: proc (var, val: int) = setX + x: proc: int = getX + + proc q*(query: int): int = + # implicit "my: TObj" parameter + # variables are looked up automatically: + return fx + + proc setEvent(var, e: TEvent): int = + # implicit "my: var TObj" parameter + nil + + proc init(var) = + # constructor + nil + + o.x = 13 # ambigious + +- implement stack walking via assembler for horribly advanced optimizers - use `` notation for identifier concatenation? - Visual C++: emit ``default: __assume(0);`` for optimization - macros: ``typecheck`` pragma; this is really a good idea! This allows transformations based on types! - make callconv a set - partial generic instantation is missing -- commas are not optional any longer as this may lead to bugs (which?) - get code generation for C++ exception handling right! - find a way for easy constructors and destructors; though constructors are flawed... destructors are not, however! -- multiple dispatch +- multiple dispatch: no, but provide a proc ``typeId`` to allow the user to + implement it efficiently +- replace ropes with strings in the C code generator: This may yield a HUGE + speedup of the compiler! (10%) +- code generated for type information is wasteful Changelog @@ -369,27 +502,44 @@ Changelog resolutions - ``macros`` are no longer part of the ``system`` module, to use macros you have to import the ``macros`` module +0.7.5 +- GC now uses the simpler "markStackAndRegisters" version +- fixed a bug that kept the "recursive modules" example from working +- docgen: changed ``<blockquote>`` to ``<blockquote><p>`` to generate valid + HTML +- BUGFIX: ``nkCommand``, etc. supported by the C code generator for statements +- ``addf`` for ``strutils`` +- added common regular expressions for regexprs +- BUGFIX: ``g.show(name="VC", vc)`` + Error: cannot bind parameter 'name' twice +- BUGFIX: got rid of debug output in sigmatch module +- implemented ``nkMacroStmt`` +- ``findSubStr``, ``findChars`` deprecated: use ``find`` instead; the library + has already been adapted +- deprecated items are now warned for +- BUGFIX: octal numbers with the prefix ``0c`` are now properly supported +- posix module now declares socket stuff +- new ``terminal`` module +- BUGFIX: ``parseInt``, ``ParseBiggestInt`` now throw an exception if the + string does not end after the parsed number +- libcurl wrapper library +- BUGFIX: ``semEnum``: enumerations now may start with negative values +- started ``web`` library +- added ``system.pop`` built-in for sequences +- added ``parsexml`` module +- BUGFIX: c.p.owner is now never nil +- the scoping rules for ``for``, ``while``, ``if``, ``case`` changed + in a subtle way to support the new ``=~`` template +- BUGFIX: generated ``nimcache`` directory never ends in a slash +- BUGFIX: ``createDir`` now works for global directories under + UNIX "/somepath/here" +- BUGFIX: now executes the executable with "./" &exe under UNIX +- added ``strutils.addSep`` proc +- BUGFIX: constant array of procs +- BUGFIX: elif in case statements +- mysql, sqlite3 interface +- md5 module +- BUGFIX: iterators using open arrays +- BUGFIX: [$anyEnum] -For the next versions -===================== - -- multi-processor support -- IDE -- better support for GDB? -- support for generation of dynamic libraries -- better code generator: skip ropes datastructure, it uses too much memory -- make set optimizations part of the transformation (--> all backends profit - from it), but this really needs a more abstract code generator - - -Further ideas/nice to have -========================== - -- introduce: refany type??? -- CLR code generator; better use XYZ? --> Version 1.2? -- provide an interactive shell: if the user wants his commands - to be executed, the command should end with # -- implement packed arrays (bit arrays)/ packed records -- implement tables (implement as library? - no! Builtin because of - constructor syntax is nice to have) diff --git a/tools/niminst b/tools/niminst index 4f007f577..a21ff1486 100644 --- a/tools/niminst +++ b/tools/niminst Binary files differdiff --git a/tools/niminst.nim b/tools/niminst.nim index 2418ea6c9..2b05e2e68 100644 --- a/tools/niminst.nim +++ b/tools/niminst.nim @@ -114,7 +114,7 @@ proc parseCmdLine(c: var TConfigData) = of "version", "v": writeln(stdout, Version) of "o", "output": c.outdir = val of "var": - var idx = findSubStr('=', val) + var idx = val.find('=') if idx < 0: quit("invalid command line") c.vars[copy(val, 0, idx-1)] = copy(val, idx+1) else: quit(Usage) diff --git a/tools/nimweb.nim b/tools/nimweb.nim index 81602549c..135be9570 100644 --- a/tools/nimweb.nim +++ b/tools/nimweb.nim @@ -70,7 +70,7 @@ proc parseCmdLine(c: var TConfigData) = of "version", "v": writeln(stdout, Version) of "o", "output": c.outdir = val of "var": - var idx = findSubStr('=', val) + var idx = val.find('=') if idx < 0: quit("invalid command line") c.vars[copy(val, 0, idx-1)] = copy(val, idx+1) else: quit(Usage) diff --git a/tools/sunset.tmpl b/tools/sunset.tmpl index 02e49218c..e10f58eff 100644 --- a/tools/sunset.tmpl +++ b/tools/sunset.tmpl @@ -62,7 +62,7 @@ </div> </div> <div id="footer"> - copyright © 2008 $c.authors | Last update: ${getDateStr()} + copyright © 2009 $c.authors | Last update: ${getDateStr()} | <a class="reference" href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a> | <a class="reference" href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a> | <a class="reference" href="http://www.dcarter.co.uk">design by dcarter</a> diff --git a/whiteutils.py b/whiteutils.py index e203e7e08..763f08361 100644 --- a/whiteutils.py +++ b/whiteutils.py @@ -7,8 +7,9 @@ # $Id: whiteutils.py 110 2005-08-27 22:35:20Z ned $ # modified to run with Python1.5.2 by Andreas Rumpf -import re, types -from string import strip, split, replace, join +import sys, re, types, os, os.path, re, shutil, time, getopt +import glob, zlib +from pycompab import * def whitePrefix(strings): """ Determine the whitespace prefix common to all non-blank lines |