From 7bf98411b6d4dfd203371b5d2ec0a5ef3a2305df Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Sun, 14 Mar 2010 01:25:25 +0100 Subject: [PATCH] version 0.8.8 --- config/nimdoc.cfg | 8 +- config/nimrod.cfg | 1 + doc/lib.txt | 6 +- doc/manual.txt | 20 +- doc/theindex.txt | 12609 +++++++++++---------- examples/parsecfgex.nim | 25 + lib/impure/graphics.nim | 309 +- lib/oldwrappers/zip/libzip_all.c | 4189 +++++++ lib/pure/htmlparser.nim | 4 +- lib/pure/httpclient.nim | 6 +- lib/pure/macros.nim | 3 +- lib/pure/os.nim | 11 +- lib/pure/parsecfg.nim | 6 +- lib/pure/pegs.nim | 2 +- lib/pure/strtabs.nim | 6 +- lib/pure/unidecode/unidecode.nim | 4 +- lib/pure/xmltree.nim | 34 +- lib/wrappers/gtk/libglade2.nim | 3 - lib/wrappers/sdl/sdl.nim | 116 +- lib/wrappers/sdl/sdl_ttf.nim | 8 +- lib/wrappers/zip/libzip_all.c | 4189 +++++++ rod/ccgexprs.nim | 9 +- rod/evals.nim | 52 +- rod/extccomp.nim | 6 +- rod/msgs.nim | 4 +- rod/nimrod.ini | 21 +- rod/nimrod.nim | 2 +- rod/nversion.nim | 2 +- rod/passes.nim | 60 +- rod/semexprs.nim | 9 +- rod/sigmatch.nim | 45 +- rod/syntaxes.nim | 6 +- tests/accept/compile/tconvcolors.nim | 5 + tests/accept/compile/tdialogs.nim | 2 +- tests/accept/compile/tgtk.nim | 40 +- tests/accept/compile/tlexer.nim | 2 +- tests/accept/compile/tlibs.nim | 5 +- tests/accept/compile/tnoargopenarray.nim | 7 + tests/accept/run/spec.csv | 1 + tests/accept/run/tcgbug.nim | 17 + tests/accept/run/txmlgen.nim | 6 + tests/accept/run/txmltree.nim | 6 +- tests/reject/spec.csv | 4 +- tests/reject/tambsym2.nim | 6 + tests/reject/tinc.nim | 2 +- tests/tester.nim | 7 +- tools/sunset.tmpl | 2 +- web/download.txt | 4 +- web/news.txt | 11 +- web/nimrod.ini | 6 +- web/question.txt | 12 +- web/ticker.txt | 5 +- 52 files changed, 15732 insertions(+), 6193 deletions(-) create mode 100755 examples/parsecfgex.nim create mode 100755 lib/oldwrappers/zip/libzip_all.c create mode 100755 lib/wrappers/zip/libzip_all.c create mode 100755 tests/accept/compile/tconvcolors.nim create mode 100644 tests/accept/compile/tnoargopenarray.nim create mode 100644 tests/accept/run/tcgbug.nim create mode 100755 tests/accept/run/txmlgen.nim create mode 100755 tests/reject/tambsym2.nim diff --git a/config/nimdoc.cfg b/config/nimdoc.cfg index 300b5e5091..46249dcd28 100755 --- a/config/nimdoc.cfg +++ b/config/nimdoc.cfg @@ -138,7 +138,7 @@ pre, span.tok { border-width: 1px 1px 1px 2px; color: black; line-spacing: 110%; - padding: 5px; + padding: 2px; } span.red { @@ -264,8 +264,10 @@ 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 td, table.docutils th { border-bottom:1px solid #9D9D9D; color: #4d4d4d} -table.docutils td:hover, table.docinfo td:hover {color: #000000} +table.docutils td, table.docutils th { border-bottom:1px solid #9D9D9D; } +/* color: #4d4d4d} */ + +/* table.docutils td:hover, table.docinfo td:hover {color: #000000} */ table.docutils th.field-name, table.docinfo th.docinfo-name { diff --git a/config/nimrod.cfg b/config/nimrod.cfg index 2c93e167eb..22dc35f5af 100755 --- a/config/nimrod.cfg +++ b/config/nimrod.cfg @@ -28,6 +28,7 @@ path="$lib/wrappers/zip" path="$lib/windows" path="$lib/posix" path="$lib/ecmas" +path="$lib/pure/unidecode" @if release or quick: obj_checks:off diff --git a/doc/lib.txt b/doc/lib.txt index b6a75377fe..a56aa5bf48 100755 --- a/doc/lib.txt +++ b/doc/lib.txt @@ -43,7 +43,7 @@ String handling string into uppercase, splitting a string into substrings, searching for substrings, replacing substrings. -* `parseutils ` +* `parseutils `_ This module contains helpers for parsing tokens, numbers, identifiers, etc. * `strtabs `_ @@ -119,7 +119,7 @@ Internet Protocols and Support * `cgi `_ This module implements helpers for CGI applictions. -* `sockets ` +* `sockets `_ This module implements a simple portable type-safe sockets layer. * `browsers `_ @@ -208,7 +208,7 @@ Multimedia support Impure libraries ================ -* `graphics `_ +* `graphics `_ This module implements graphical output for Nimrod; the current implementation uses SDL but the interface is meant to support multiple backends some day. diff --git a/doc/manual.txt b/doc/manual.txt index d2bfde138c..3f2f9c404c 100755 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -441,7 +441,7 @@ Ordinal types - Ordinal values have a largest possible value. Trying to count further than the largest value gives a checked runtime or static error. -Integers, bool, characters and enumeration types (and subrange of these +Integers, bool, characters and enumeration types (and subranges of these types) belong to ordinal types. @@ -451,8 +451,8 @@ These integer types are pre-defined: ``int`` the generic signed integer type; its size is platform dependent - (the compiler chooses the processor's fastest integer type) - this type should be used in general. An integer literal that has no type + (the compiler chooses the processor's fastest integer type). + This type should be used in general. An integer literal that has no type suffix is of this type. intXX @@ -502,8 +502,8 @@ The following floating point types are pre-defined: ``float`` the generic floating point type; its size is platform dependent - (the compiler chooses the processor's fastest floating point type) - this type should be used in general + (the compiler chooses the processor's fastest floating point type). + This type should be used in general. floatXX an implementation may define additional floating point types of XX bits using @@ -2193,6 +2193,8 @@ special ``:`` syntax: In the example the two ``writeln`` statements are bound to the ``actions`` parameter. +**Note:** Symbol binding rules in templates might change! + Symbol binding within templates happens after template instantation: .. code-block:: nimrod @@ -2476,7 +2478,7 @@ or ``ref T`` or ``ptr T`` this means no locations are modified. It is a static error to mark a proc/iterator to have no side effect if the compiler cannot verify this. -**Possible future**: ``func`` may become a keyword and syntactic sugar for a +**Future directions**: ``func`` may become a keyword and syntactic sugar for a proc with no side effects: .. code-block:: nimrod @@ -2521,7 +2523,7 @@ information that this cannot happen to the GC. If the programmer uses the ``acyclic`` pragma for data types that are in reality cyclic, the GC may leak memory, but nothing worse happens. -**Possible future**: The ``acyclic`` pragma may become a property of a +**Future directions**: The ``acyclic`` pragma may become a property of a ``ref`` type: .. code-block:: nimrod @@ -2544,8 +2546,8 @@ The `pure`:idx: pragma serves two completely different purposes: 1) To mark a procedure that Nimrod should not generate any exit statements like ``return result;`` in the generated code. This is useful for procs that only consist of an assembler statement. -2) To mark an object type that Nimrod should omit its type field. This is - necessary for compatibility with other compiled languages. +2) To mark an object type so that its type field should be omitted. This is + necessary for binary compatibility with other compiled languages. error pragma diff --git a/doc/theindex.txt b/doc/theindex.txt index 06cec5d191..b734046af1 100755 --- a/doc/theindex.txt +++ b/doc/theindex.txt @@ -1,5744 +1,6865 @@ - -===== -Index -===== - -.. index:: - - - `!`:idx: - * `pegs.html#115 `_ - * `macros.html#114 `_ - - `!=`:idx: - `system.html#353 `_ - - `$`:idx: - * `system.html#428 `_ - * `system.html#429 `_ - * `system.html#430 `_ - * `system.html#431 `_ - * `system.html#432 `_ - * `system.html#433 `_ - * `system.html#434 `_ - * `system.html#435 `_ - * `times.html#109 `_ - * `times.html#110 `_ - * `pegs.html#133 `_ - * `macros.html#115 `_ - * `ropes.html#119 `_ - - `%`:idx: - * `strutils.html#109 `_ - * `strutils.html#110 `_ - * `strtabs.html#112 `_ - * `ropes.html#120 `_ - - `%%`:idx: - * `system.html#298 `_ - * `system.html#299 `_ - * `system.html#300 `_ - * `system.html#301 `_ - * `system.html#302 `_ - - `&`:idx: - * `system.html#367 `_ - * `system.html#368 `_ - * `system.html#369 `_ - * `system.html#370 `_ - * `system.html#471 `_ - * `system.html#472 `_ - * `system.html#473 `_ - * `pegs.html#114 `_ - * `ropes.html#109 `_ - * `ropes.html#110 `_ - * `ropes.html#111 `_ - * `ropes.html#112 `_ - - `*`:idx: - * `system.html#218 `_ - * `system.html#219 `_ - * `system.html#220 `_ - * `system.html#221 `_ - * `system.html#222 `_ - * `system.html#317 `_ - * `system.html#325 `_ - * `complex.html#107 `_ - * `pegs.html#111 `_ - - `*%`:idx: - * `system.html#288 `_ - * `system.html#289 `_ - * `system.html#290 `_ - * `system.html#291 `_ - * `system.html#292 `_ - - `+`:idx: - * `system.html#193 `_ - * `system.html#194 `_ - * `system.html#195 `_ - * `system.html#196 `_ - * `system.html#197 `_ - * `system.html#208 `_ - * `system.html#209 `_ - * `system.html#210 `_ - * `system.html#211 `_ - * `system.html#212 `_ - * `system.html#313 `_ - * `system.html#315 `_ - * `system.html#326 `_ - * `complex.html#103 `_ - * `pegs.html#113 `_ - - `+%`:idx: - * `system.html#278 `_ - * `system.html#279 `_ - * `system.html#280 `_ - * `system.html#281 `_ - * `system.html#282 `_ - - `-`:idx: - * `system.html#198 `_ - * `system.html#199 `_ - * `system.html#200 `_ - * `system.html#201 `_ - * `system.html#202 `_ - * `system.html#213 `_ - * `system.html#214 `_ - * `system.html#215 `_ - * `system.html#216 `_ - * `system.html#217 `_ - * `system.html#314 `_ - * `system.html#316 `_ - * `system.html#327 `_ - * `complex.html#104 `_ - * `complex.html#105 `_ - * `times.html#113 `_ - - `-%`:idx: - * `system.html#283 `_ - * `system.html#284 `_ - * `system.html#285 `_ - * `system.html#286 `_ - * `system.html#287 `_ - - `-+-`:idx: - `system.html#328 `_ - - `/`:idx: - * `system.html#318 `_ - * `os.html#124 `_ - * `complex.html#106 `_ - * `pegs.html#108 `_ - - `/%`:idx: - * `system.html#293 `_ - * `system.html#294 `_ - * `system.html#295 `_ - * `system.html#296 `_ - * `system.html#297 `_ - - `/../`:idx: - `os.html#128 `_ - - `<`:idx: - * `system.html#268 `_ - * `system.html#269 `_ - * `system.html#270 `_ - * `system.html#271 `_ - * `system.html#272 `_ - * `system.html#321 `_ - * `system.html#345 `_ - * `system.html#346 `_ - * `system.html#347 `_ - * `system.html#348 `_ - * `system.html#349 `_ - * `system.html#350 `_ - * `system.html#351 `_ - * `system.html#352 `_ - * `times.html#114 `_ - - `<%`:idx: - `unicode.html#104 `_ - - `<%`:idx: - * `system.html#308 `_ - * `system.html#309 `_ - * `system.html#310 `_ - * `system.html#311 `_ - * `system.html#312 `_ - - `<=`:idx: - `times.html#115 `_ - - `<=`:idx: - * `system.html#263 `_ - * `system.html#264 `_ - * `system.html#265 `_ - * `system.html#266 `_ - * `system.html#267 `_ - * `system.html#320 `_ - * `system.html#338 `_ - * `system.html#339 `_ - * `system.html#340 `_ - * `system.html#341 `_ - * `system.html#342 `_ - * `system.html#343 `_ - * `system.html#344 `_ - - `<=%`:idx: - * `system.html#303 `_ - * `system.html#304 `_ - * `system.html#305 `_ - * `system.html#306 `_ - * `system.html#307 `_ - - `<=%`:idx: - `unicode.html#103 `_ - - `==`:idx: - * `md5.html#107 `_ - * `system.html#258 `_ - * `system.html#259 `_ - * `system.html#260 `_ - * `system.html#261 `_ - * `system.html#262 `_ - * `system.html#319 `_ - * `system.html#329 `_ - * `system.html#330 `_ - * `system.html#331 `_ - * `system.html#332 `_ - * `system.html#333 `_ - * `system.html#334 `_ - * `system.html#335 `_ - * `system.html#336 `_ - * `system.html#337 `_ - * `system.html#474 `_ - * `complex.html#102 `_ - * `unicode.html#105 `_ - * `macros.html#116 `_ - * `macros.html#117 `_ - - `=~`:idx: - `regexprs.html#111 `_ - - `=~`:idx: - `pegs.html#140 `_ - - `>`:idx: - `system.html#355 `_ - - `>%`:idx: - `system.html#427 `_ - - `>=`:idx: - `system.html#354 `_ - - `>=%`:idx: - `system.html#426 `_ - - `?`:idx: - `pegs.html#110 `_ - - `@`:idx: - * `system.html#363 `_ - * `pegs.html#112 `_ - - `[]`:idx: - `ropes.html#115 `_ - - `[]`:idx: - `strtabs.html#107 `_ - - `[]`:idx: - `macros.html#112 `_ - - `[]=`:idx: - `strtabs.html#106 `_ - - `[]=`:idx: - `macros.html#113 `_ - - `[ESC]`:idx: - `manual.html#134 `_ - - `a`:idx: - `xmlgen.html#107 `_ - - `abs`:idx: - * `system.html#273 `_ - * `system.html#274 `_ - * `system.html#275 `_ - * `system.html#276 `_ - * `system.html#277 `_ - * `system.html#322 `_ - * `complex.html#108 `_ - - `accumulateResult`:idx: - `system.html#493 `_ - - `acronym`:idx: - `xmlgen.html#108 `_ - - `acyclic`:idx: - `manual.html#238 `_ - - `add`:idx: - * `system.html#371 `_ - * `system.html#372 `_ - * `system.html#373 `_ - * `system.html#374 `_ - * `system.html#375 `_ - * `parsesql.html#108 `_ - * `macros.html#119 `_ - * `macros.html#120 `_ - * `ropes.html#113 `_ - * `ropes.html#114 `_ - - `addf`:idx: - * `strutils.html#111 `_ - * `ropes.html#121 `_ - - `addFile`:idx: - * `zipfiles.html#105 `_ - * `zipfiles.html#106 `_ - * `zipfiles.html#107 `_ - - `addFileExt`:idx: - `os.html#137 `_ - - `addQuitProc`:idx: - `system.html#412 `_ - - `address`:idx: - `xmlgen.html#109 `_ - - `addSep`:idx: - `strutils.html#150 `_ - - `alert`:idx: - `manual.html#131 `_ - - `allCharsInSet`:idx: - `strutils.html#151 `_ - - `alloc`:idx: - `system.html#419 `_ - - `alloc0`:idx: - `system.html#420 `_ - - `ALLOC_MAX_BLOCK_TO_DROP`:idx: - `mysql.html#317 `_ - - `ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP`:idx: - `mysql.html#318 `_ - - `AltSep`:idx: - `os.html#104 `_ - - `and`:idx: - * `system.html#121 `_ - * `system.html#243 `_ - * `system.html#244 `_ - * `system.html#245 `_ - * `system.html#246 `_ - * `system.html#247 `_ - - `any`:idx: - `pegs.html#117 `_ - - `any character`:idx: - `pegs.html#116 `_ - - `any rune`:idx: - `pegs.html#118 `_ - - `anyRune`:idx: - `pegs.html#119 `_ - - `apostrophe`:idx: - `manual.html#129 `_ - - `AppendFileExt`:idx: - `os.html#138 `_ - - `arccos`:idx: - `math.html#122 `_ - - `arcsin`:idx: - `math.html#123 `_ - - `arctan`:idx: - `math.html#124 `_ - - `arctan2`:idx: - `math.html#125 `_ - - `area`:idx: - `xmlgen.html#110 `_ - - `arithmetic bit shifts`:idx: - `tut1.html#110 `_ - - `array`:idx: - * `tut1.html#117 `_ - * `system.html#129 `_ - - `array properties`:idx: - `tut2.html#106 `_ - - `Arrays`:idx: - `manual.html#159 `_ - - `assembler`:idx: - `manual.html#205 `_ - - `assert`:idx: - `system.html#424 `_ - - `AST`:idx: - `macros.html#101 `_ - - `attrKey`:idx: - `parsexml.html#113 `_ - - `attrValue`:idx: - `parsexml.html#114 `_ - - `AUTO_INCREMENT_FLAG`:idx: - `mysql.html#133 `_ - - `Automatic type conversion`:idx: - * `manual.html#145 `_ - * `tut1.html#111 `_ - - `b`:idx: - `xmlgen.html#111 `_ - - `backslash`:idx: - * `manual.html#127 `_ - * `regexprs.html#101 `_ - - `backspace`:idx: - `manual.html#132 `_ - - `base`:idx: - `xmlgen.html#112 `_ - - `base type`:idx: - `manual.html#180 `_ - - `big`:idx: - `xmlgen.html#113 `_ - - `BiggestFloat`:idx: - `system.html#382 `_ - - `BiggestInt`:idx: - `system.html#381 `_ - - `BINARY_FLAG`:idx: - `mysql.html#131 `_ - - `BINCMP_FLAG`:idx: - `mysql.html#141 `_ - - `binom`:idx: - `math.html#105 `_ - - `BLOB_FLAG`:idx: - `mysql.html#128 `_ - - `block`:idx: - `manual.html#201 `_ - - `blockquote`:idx: - `xmlgen.html#114 `_ - - `body`:idx: - `xmlgen.html#115 `_ - - `bool`:idx: - `system.html#109 `_ - - `boolean`:idx: - * `manual.html#153 `_ - * `tut1.html#107 `_ - - `br`:idx: - `xmlgen.html#116 `_ - - `break`:idx: - `manual.html#202 `_ - - `breakpoint`:idx: - `endb.html#103 `_ - - `button`:idx: - `xmlgen.html#117 `_ - - `Byte`:idx: - `system.html#133 `_ - - `calling conventions`:idx: - `manual.html#170 `_ - - `capitalize`:idx: - `strutils.html#117 `_ - - `caption`:idx: - `xmlgen.html#118 `_ - - `capture`:idx: - `pegs.html#122 `_ - - `card`:idx: - `system.html#181 `_ - - `carriage return`:idx: - `manual.html#122 `_ - - `case`:idx: - `manual.html#190 `_ - - `cchar`:idx: - `system.html#383 `_ - - `cdecl`:idx: - `manual.html#172 `_ - - `cdouble`:idx: - `system.html#390 `_ - - `cfloat`:idx: - `system.html#389 `_ - - `cgiError`:idx: - `cgi.html#106 `_ - - `ChangeFileExt`:idx: - `os.html#136 `_ - - `char`:idx: - `system.html#110 `_ - - `character type`:idx: - `manual.html#154 `_ - - `character with decimal value d`:idx: - `manual.html#130 `_ - - `character with hex value HH`:idx: - `manual.html#135 `_ - - `character_set`:idx: - `mysql.html#351 `_ - - `charData`:idx: - `parsexml.html#109 `_ - - `charSet`:idx: - `pegs.html#107 `_ - - `CHARSET_INFO`:idx: - `mysql.html#348 `_ - - `charset_info_st`:idx: - `mysql.html#347 `_ - - `checked runtime error`:idx: - `manual.html#110 `_ - - `checkedSymAddr`:idx: - `dynlib.html#105 `_ - - `check_scramble`:idx: - `mysql.html#279 `_ - - `check_scramble_323`:idx: - `mysql.html#273 `_ - - `chr`:idx: - `system.html#183 `_ - - `cint`:idx: - `system.html#386 `_ - - `cite`:idx: - `xmlgen.html#119 `_ - - `classify`:idx: - `math.html#104 `_ - - `CLIENT_COMPRESS`:idx: - `mysql.html#161 `_ - - `CLIENT_CONNECT_WITH_DB`:idx: - `mysql.html#159 `_ - - `CLIENT_FOUND_ROWS`:idx: - `mysql.html#157 `_ - - `CLIENT_IGNORE_SIGPIPE`:idx: - `mysql.html#168 `_ - - `CLIENT_IGNORE_SPACE`:idx: - `mysql.html#164 `_ - - `CLIENT_INTERACTIVE`:idx: - `mysql.html#166 `_ - - `CLIENT_LOCAL_FILES`:idx: - `mysql.html#163 `_ - - `CLIENT_LONG_FLAG`:idx: - `mysql.html#158 `_ - - `CLIENT_LONG_PASSWORD`:idx: - `mysql.html#156 `_ - - `CLIENT_MULTI_QUERIES`:idx: - `mysql.html#203 `_ - - `CLIENT_MULTI_RESULTS`:idx: - `mysql.html#173 `_ - - `CLIENT_MULTI_STATEMENTS`:idx: - `mysql.html#172 `_ - - `CLIENT_NET_READ_TIMEOUT`:idx: - `mysql.html#292 `_ - - `CLIENT_NET_WRITE_TIMEOUT`:idx: - `mysql.html#293 `_ - - `CLIENT_NO_SCHEMA`:idx: - `mysql.html#160 `_ - - `CLIENT_ODBC`:idx: - `mysql.html#162 `_ - - `CLIENT_PROTOCOL_41`:idx: - `mysql.html#165 `_ - - `CLIENT_REMEMBER_OPTIONS`:idx: - `mysql.html#174 `_ - - `CLIENT_RESERVED`:idx: - `mysql.html#170 `_ - - `CLIENT_SECURE_CONNECTION`:idx: - `mysql.html#171 `_ - - `CLIENT_SSL`:idx: - `mysql.html#167 `_ - - `CLIENT_TRANSACTIONS`:idx: - `mysql.html#169 `_ - - `clong`:idx: - `system.html#387 `_ - - `clongdouble`:idx: - `system.html#391 `_ - - `clonglong`:idx: - `system.html#388 `_ - - `close`:idx: - * `lexbase.html#105 `_ - * `parsecfg.html#105 `_ - * `parsexml.html#108 `_ - * `parsecsv.html#109 `_ - * `zipfiles.html#103 `_ - * `httpserver.html#106 `_ - - `Close`:idx: - * `system.html#510 `_ - * `db_postgres.html#117 `_ - * `db_mysql.html#117 `_ - - `CloseFile`:idx: - `system.html#509 `_ - - `closure`:idx: - `manual.html#177 `_ - - `cmdLineRest`:idx: - `parseopt.html#106 `_ - - `cmp`:idx: - * `system.html#361 `_ - * `system.html#362 `_ - - `cmpIgnoreCase`:idx: - `strutils.html#135 `_ - - `cmpIgnoreStyle`:idx: - `strutils.html#136 `_ - - `cmpPaths`:idx: - `os.html#139 `_ - - `cmpRunesIgnoreCase`:idx: - `unicode.html#120 `_ - - `code`:idx: - `xmlgen.html#120 `_ - - `col`:idx: - `xmlgen.html#121 `_ - - `colgroup`:idx: - `xmlgen.html#122 `_ - - `comma separated value`:idx: - `parsecsv.html#102 `_ - - `comment pieces`:idx: - * `manual.html#115 `_ - * `tut1.html#103 `_ - - `Comments`:idx: - * `manual.html#114 `_ - * `tut1.html#102 `_ - - `commonAttr`:idx: - `xmlgen.html#105 `_ - - `COMP_HEADER_SIZE`:idx: - `mysql.html#266 `_ - - `CompileDate`:idx: - `system.html#399 `_ - - `CompileTime`:idx: - `system.html#400 `_ - - `compileTime`:idx: - `manual.html#236 `_ - - `complex statements`:idx: - `manual.html#184 `_ - - `const`:idx: - `manual.html#188 `_ - - `constant expressions`:idx: - `manual.html#108 `_ - - `Constants`:idx: - * `manual.html#140 `_ - * `tut1.html#104 `_ - - `contains`:idx: - * `system.html#356 `_ - * `system.html#476 `_ - * `strutils.html#137 `_ - * `strutils.html#138 `_ - * `strutils.html#139 `_ - * `pegs.html#141 `_ - * `pegs.html#142 `_ - - `continue`:idx: - `manual.html#204 `_ - - `copy`:idx: - * `system.html#413 `_ - * `system.html#414 `_ - - `copyFile`:idx: - `os.html#142 `_ - - `copyMem`:idx: - `system.html#416 `_ - - `copyNimNode`:idx: - `macros.html#136 `_ - - `copyNimTree`:idx: - `macros.html#137 `_ - - `coreAttr`:idx: - `xmlgen.html#103 `_ - - `cos`:idx: - `math.html#126 `_ - - `cosh`:idx: - `math.html#127 `_ - - `countBits32`:idx: - `math.html#109 `_ - - `countdown`:idx: - `system.html#445 `_ - - `countProcessors`:idx: - `osproc.html#117 `_ - - `countup`:idx: - `system.html#446 `_ - - `cpuEndian`:idx: - `system.html#405 `_ - - `createDir`:idx: - * `os.html#159 `_ - * `zipfiles.html#104 `_ - - `create_random_string`:idx: - `mysql.html#269 `_ - - `cschar`:idx: - `system.html#384 `_ - - `cshort`:idx: - `system.html#385 `_ - - `cstring`:idx: - `system.html#112 `_ - - `cstringArray`:idx: - `system.html#392 `_ - - `cstringArrayToSeq`:idx: - * `system.html#537 `_ - * `system.html#538 `_ - - `CSV`:idx: - `parsecsv.html#101 `_ - - `cuint`:idx: - `mysql.html#109 `_ - - `CurDir`:idx: - `os.html#101 `_ - - `CURLAUTH_ANY`:idx: - `libcurl.html#192 `_ - - `CURLAUTH_ANYSAFE`:idx: - `libcurl.html#194 `_ - - `CURLAUTH_BASIC`:idx: - `libcurl.html#193 `_ - - `CURLAUTH_DIGEST`:idx: - `libcurl.html#195 `_ - - `CURLAUTH_GSSNEGOTIATE`:idx: - `libcurl.html#196 `_ - - `CURLAUTH_NONE`:idx: - `libcurl.html#197 `_ - - `CURLAUTH_NTLM`:idx: - `libcurl.html#198 `_ - - `CURLE_ALREADY_COMPLETE`:idx: - `libcurl.html#199 `_ - - `curl_easy_cleanup`:idx: - `libcurl.html#304 `_ - - `curl_easy_duphandle`:idx: - `libcurl.html#306 `_ - - `curl_easy_escape`:idx: - `libcurl.html#284 `_ - - `curl_easy_getinfo`:idx: - `libcurl.html#305 `_ - - `curl_easy_init`:idx: - `libcurl.html#301 `_ - - `curl_easy_perform`:idx: - `libcurl.html#303 `_ - - `curl_easy_reset`:idx: - `libcurl.html#307 `_ - - `curl_easy_setopt`:idx: - `libcurl.html#302 `_ - - `curl_easy_strerror`:idx: - `libcurl.html#299 `_ - - `curl_easy_unescape`:idx: - `libcurl.html#286 `_ - - `CURLE_FTP_BAD_DOWNLOAD_RESUME`:idx: - `libcurl.html#200 `_ - - `CURLE_FTP_PARTIAL_FILE`:idx: - `libcurl.html#201 `_ - - `CURLE_HTTP_NOT_FOUND`:idx: - `libcurl.html#202 `_ - - `CURLE_HTTP_PORT_FAILED`:idx: - `libcurl.html#203 `_ - - `CURLE_OPERATION_TIMEDOUT`:idx: - `libcurl.html#204 `_ - - `CURL_ERROR_SIZE`:idx: - `libcurl.html#205 `_ - - `curl_escape`:idx: - `libcurl.html#285 `_ - - `curl_formadd`:idx: - `libcurl.html#279 `_ - - `CURL_FORMAT_OFF_T`:idx: - `libcurl.html#206 `_ - - `curl_formfree`:idx: - `libcurl.html#281 `_ - - `curl_formget`:idx: - `libcurl.html#280 `_ - - `curl_free`:idx: - `libcurl.html#288 `_ - - `curl_getdate`:idx: - `libcurl.html#294 `_ - - `curl_getenv`:idx: - `libcurl.html#282 `_ - - `CURL_GLOBAL_ALL`:idx: - `libcurl.html#210 `_ - - `curl_global_cleanup`:idx: - `libcurl.html#291 `_ - - `CURL_GLOBAL_DEFAULT`:idx: - `libcurl.html#211 `_ - - `curl_global_init`:idx: - `libcurl.html#289 `_ - - `curl_global_init_mem`:idx: - `libcurl.html#290 `_ - - `CURL_GLOBAL_NOTHING`:idx: - `libcurl.html#207 `_ - - `CURL_GLOBAL_SSL`:idx: - `libcurl.html#208 `_ - - `CURL_GLOBAL_WIN32`:idx: - `libcurl.html#209 `_ - - `CURLINFO_DOUBLE`:idx: - `libcurl.html#212 `_ - - `CURLINFO_HTTP_CODE`:idx: - `libcurl.html#213 `_ - - `CURLINFO_LONG`:idx: - `libcurl.html#214 `_ - - `CURLINFO_MASK`:idx: - `libcurl.html#215 `_ - - `CURLINFO_SLIST`:idx: - `libcurl.html#216 `_ - - `CURLINFO_STRING`:idx: - `libcurl.html#217 `_ - - `CURLINFO_TYPEMASK`:idx: - `libcurl.html#218 `_ - - `CURL_IPRESOLVE_V4`:idx: - `libcurl.html#219 `_ - - `CURL_IPRESOLVE_V6`:idx: - `libcurl.html#220 `_ - - `CURL_IPRESOLVE_WHATEVER`:idx: - `libcurl.html#221 `_ - - `CURL_MAX_WRITE_SIZE`:idx: - `libcurl.html#222 `_ - - `CURLM_CALL_MULTI_SOCKET`:idx: - `libcurl.html#223 `_ - - `curl_multi_add_handle`:idx: - `libcurl.html#309 `_ - - `curl_multi_assign`:idx: - `libcurl.html#320 `_ - - `curl_multi_cleanup`:idx: - `libcurl.html#313 `_ - - `curl_multi_fdset`:idx: - `libcurl.html#311 `_ - - `curl_multi_info_read`:idx: - `libcurl.html#314 `_ - - `curl_multi_init`:idx: - `libcurl.html#308 `_ - - `curl_multi_perform`:idx: - `libcurl.html#312 `_ - - `curl_multi_remove_handle`:idx: - `libcurl.html#310 `_ - - `curl_multi_setopt`:idx: - `libcurl.html#319 `_ - - `curl_multi_socket`:idx: - `libcurl.html#316 `_ - - `curl_multi_socket_all`:idx: - `libcurl.html#317 `_ - - `curl_multi_strerror`:idx: - `libcurl.html#315 `_ - - `curl_multi_timeout`:idx: - `libcurl.html#318 `_ - - `CURLOPT_CLOSEFUNCTION`:idx: - `libcurl.html#224 `_ - - `CURLOPT_FTPASCII`:idx: - `libcurl.html#225 `_ - - `CURLOPT_HEADERDATA`:idx: - `libcurl.html#226 `_ - - `CURLOPT_HTTPREQUEST`:idx: - `libcurl.html#227 `_ - - `CURLOPT_MUTE`:idx: - `libcurl.html#228 `_ - - `CURLOPT_PASSWDDATA`:idx: - `libcurl.html#229 `_ - - `CURLOPT_PASSWDFUNCTION`:idx: - `libcurl.html#230 `_ - - `CURLOPT_PASV_HOST`:idx: - `libcurl.html#231 `_ - - `CURLOPT_READDATA`:idx: - `libcurl.html#232 `_ - - `CURLOPT_SOURCE_HOST`:idx: - `libcurl.html#233 `_ - - `CURLOPT_SOURCE_PATH`:idx: - `libcurl.html#234 `_ - - `CURLOPT_SOURCE_PORT`:idx: - `libcurl.html#235 `_ - - `CURLOPT_SSLKEYPASSWD`:idx: - `libcurl.html#191 `_ - - `CURLOPTTYPE_FUNCTIONPOINT`:idx: - `libcurl.html#236 `_ - - `CURLOPTTYPE_LONG`:idx: - `libcurl.html#237 `_ - - `CURLOPTTYPE_OBJECTPOINT`:idx: - `libcurl.html#238 `_ - - `CURLOPTTYPE_OFF_T`:idx: - `libcurl.html#239 `_ - - `CURLOPT_WRITEDATA`:idx: - `libcurl.html#240 `_ - - `CURL_POLL_IN`:idx: - `libcurl.html#241 `_ - - `CURL_POLL_INOUT`:idx: - `libcurl.html#242 `_ - - `CURL_POLL_NONE`:idx: - `libcurl.html#243 `_ - - `CURL_POLL_OUT`:idx: - `libcurl.html#244 `_ - - `CURL_POLL_REMOVE`:idx: - `libcurl.html#245 `_ - - `CURL_READFUNC_ABORT`:idx: - `libcurl.html#246 `_ - - `curl_share_cleanup`:idx: - `libcurl.html#297 `_ - - `curl_share_init`:idx: - `libcurl.html#295 `_ - - `curl_share_setopt`:idx: - `libcurl.html#296 `_ - - `curl_share_strerror`:idx: - `libcurl.html#300 `_ - - `curl_slist_append`:idx: - `libcurl.html#292 `_ - - `curl_slist_free_all`:idx: - `libcurl.html#293 `_ - - `CURL_SOCKET_BAD`:idx: - `libcurl.html#247 `_ - - `CURL_SOCKET_TIMEOUT`:idx: - `libcurl.html#248 `_ - - `curl_strequal`:idx: - `libcurl.html#277 `_ - - `curl_strnequal`:idx: - `libcurl.html#278 `_ - - `curl_unescape`:idx: - `libcurl.html#287 `_ - - `curl_version`:idx: - `libcurl.html#283 `_ - - `CURL_VERSION_ASYNCHDNS`:idx: - `libcurl.html#249 `_ - - `CURL_VERSION_CONV`:idx: - `libcurl.html#250 `_ - - `CURL_VERSION_DEBUG`:idx: - `libcurl.html#251 `_ - - `CURL_VERSION_GSSNEGOTIATE`:idx: - `libcurl.html#252 `_ - - `CURL_VERSION_IDN`:idx: - `libcurl.html#253 `_ - - `curl_version_info`:idx: - `libcurl.html#298 `_ - - `CURL_VERSION_IPV6`:idx: - `libcurl.html#254 `_ - - `CURL_VERSION_KERBEROS4`:idx: - `libcurl.html#255 `_ - - `CURL_VERSION_LARGEFILE`:idx: - `libcurl.html#256 `_ - - `CURL_VERSION_LIBZ`:idx: - `libcurl.html#257 `_ - - `CURLVERSION_NOW`:idx: - `libcurl.html#258 `_ - - `CURL_VERSION_NTLM`:idx: - `libcurl.html#259 `_ - - `CURL_VERSION_SPNEGO`:idx: - `libcurl.html#260 `_ - - `CURL_VERSION_SSL`:idx: - `libcurl.html#261 `_ - - `CURL_VERSION_SSPI`:idx: - `libcurl.html#262 `_ - - `CursorBackward`:idx: - `terminal.html#107 `_ - - `CursorDown`:idx: - `terminal.html#105 `_ - - `CursorForward`:idx: - `terminal.html#106 `_ - - `CursorUp`:idx: - `terminal.html#104 `_ - - `dangling else problem`:idx: - `manual.html#185 `_ - - `dbError`:idx: - * `db_postgres.html#107 `_ - * `db_mysql.html#106 `_ - - `dbgLineHook`:idx: - `system.html#441 `_ - - `dbQueryOpt`:idx: - `db_mysql.html#107 `_ - - `dd`:idx: - `xmlgen.html#123 `_ - - `deadCodeElim`:idx: - `manual.html#247 `_ - - `dealloc`:idx: - `system.html#422 `_ - - `debugger`:idx: - `nimrodc.html#106 `_ - - `dec`:idx: - `system.html#172 `_ - - `decodeData`:idx: - * `cgi.html#107 `_ - * `cgi.html#108 `_ - - `defined`:idx: - `system.html#118 `_ - - `definedInScope`:idx: - `system.html#119 `_ - - `del`:idx: - * `system.html#376 `_ - * `xmlgen.html#124 `_ - * `macros.html#121 `_ - - `delete`:idx: - * `system.html#377 `_ - * `strutils.html#157 `_ - - `deleteStr`:idx: - * `strutils.html#124 `_ - * `strutils.html#158 `_ - - `dfn`:idx: - `xmlgen.html#125 `_ - - `Digits`:idx: - `strutils.html#104 `_ - - `digits`:idx: - `pegs.html#126 `_ - - `DirSep`:idx: - `os.html#103 `_ - - `disableCache`:idx: - `ropes.html#107 `_ - - `discard`:idx: - `manual.html#186 `_ - - `div`:idx: - * `system.html#223 `_ - * `system.html#224 `_ - * `system.html#225 `_ - * `system.html#226 `_ - * `system.html#227 `_ - * `xmlgen.html#126 `_ - - `dl`:idx: - `xmlgen.html#127 `_ - - `domain specific languages`:idx: - `manual.html#222 `_ - - `downloadFile`:idx: - `httpclient.html#110 `_ - - `dt`:idx: - `xmlgen.html#128 `_ - - `dynamic type`:idx: - `manual.html#104 `_ - - `DYNAMIC_ARRAY`:idx: - `mysql.html#340 `_ - - `dynlib`:idx: - `manual.html#252 `_ - - `E`:idx: - `math.html#102 `_ - - `EAccessViolation`:idx: - `system.html#149 `_ - - `each`:idx: - `system.html#478 `_ - - `EArithmetic`:idx: - `system.html#146 `_ - - `EAssertionFailed`:idx: - `system.html#150 `_ - - `EAsynch`:idx: - `system.html#139 `_ - - `E_Base`:idx: - `system.html#138 `_ - - `ECgi`:idx: - `cgi.html#104 `_ - - `echo`:idx: - `system.html#494 `_ - - `EControlC`:idx: - `system.html#151 `_ - - `EDb`:idx: - * `db_postgres.html#104 `_ - * `db_mysql.html#104 `_ - - `editDistance`:idx: - `strutils.html#165 `_ - - `EDivByZero`:idx: - `system.html#147 `_ - - `EFloatDivByZero`:idx: - * `manual.html#146 `_ - * `system.html#163 `_ - - `EFloatInexact`:idx: - * `manual.html#149 `_ - * `system.html#166 `_ - - `EFloatingPoint`:idx: - * `manual.html#150 `_ - * `system.html#161 `_ - - `EFloatInvalidOp`:idx: - `system.html#162 `_ - - `EFloatOverflow`:idx: - * `manual.html#147 `_ - * `system.html#164 `_ - - `EFloatUnderflow`:idx: - * `manual.html#148 `_ - * `system.html#165 `_ - - `EHttpRequestErr`:idx: - `httpclient.html#103 `_ - - `EInvalidCsv`:idx: - `parsecsv.html#105 `_ - - `EInvalidField`:idx: - `system.html#155 `_ - - `EInvalidIndex`:idx: - `system.html#154 `_ - - `EInvalidLibrary`:idx: - `system.html#144 `_ - - `EInvalidObjectAssignment`:idx: - `system.html#159 `_ - - `EInvalidObjectConversion`:idx: - `system.html#160 `_ - - `EInvalidPeg`:idx: - `pegs.html#150 `_ - - `EInvalidProtocol`:idx: - `httpclient.html#102 `_ - - `EInvalidRegEx`:idx: - `regexprs.html#104 `_ - - `EInvalidSql`:idx: - `parsesql.html#103 `_ - - `EInvalidValue`:idx: - `system.html#152 `_ - - `EIO`:idx: - `system.html#142 `_ - - `elementName`:idx: - `parsexml.html#111 `_ - - `em`:idx: - `xmlgen.html#129 `_ - - `Embedded Nimrod Debugger`:idx: - `endb.html#101 `_ - - `enableCache`:idx: - `ropes.html#108 `_ - - `ENDB`:idx: - `endb.html#102 `_ - - `EndOfFile`:idx: - * `system.html#511 `_ - * `lexbase.html#101 `_ - - `endsWith`:idx: - * `strutils.html#149 `_ - * `pegs.html#144 `_ - - `ENoExceptionToReraise`:idx: - * `manual.html#193 `_ - * `system.html#158 `_ - - `entityName`:idx: - `parsexml.html#112 `_ - - `enum_cursor_type`:idx: - `mysql.html#237 `_ - - `Enumeration`:idx: - `manual.html#155 `_ - - `enumeration`:idx: - `tut1.html#113 `_ - - `enum_field_types`:idx: - `mysql.html#202 `_ - - `ENUM_FLAG`:idx: - `mysql.html#132 `_ - - `enum_mysql_set_option`:idx: - `mysql.html#238 `_ - - `enum_mysql_stmt_state`:idx: - `mysql.html#376 `_ - - `enum_server_command`:idx: - `mysql.html#119 `_ - - `enum_stmt_attr_type`:idx: - `mysql.html#383 `_ - - `envPairs`:idx: - `os.html#151 `_ - - `EOS`:idx: - `system.html#143 `_ - - `EOutOfMemory`:idx: - `system.html#153 `_ - - `EOutOfRange`:idx: - * `tut1.html#112 `_ - * `system.html#156 `_ - - `EOverflow`:idx: - `system.html#148 `_ - - `equalMem`:idx: - `system.html#418 `_ - - `equalsFile`:idx: - * `ropes.html#122 `_ - * `ropes.html#123 `_ - - `EraseLine`:idx: - `terminal.html#108 `_ - - `EraseScreen`:idx: - `terminal.html#109 `_ - - `ERessourceExhausted`:idx: - `system.html#145 `_ - - `error`:idx: - * `manual.html#233 `_ - * `manual.html#241 `_ - * `macros.html#138 `_ - - `errorMsg`:idx: - `parsexml.html#120 `_ - - `errorMsgExpected`:idx: - `parsexml.html#121 `_ - - `errorStr`:idx: - `parsecfg.html#110 `_ - - `errorStream`:idx: - `osproc.html#116 `_ - - `escape`:idx: - * `manual.html#133 `_ - * `strutils.html#162 `_ - - `escape sequences`:idx: - `manual.html#120 `_ - - `EStackOverflow`:idx: - `system.html#157 `_ - - `ESynch`:idx: - `system.html#140 `_ - - `ESystem`:idx: - `system.html#141 `_ - - `eventAttr`:idx: - `xmlgen.html#104 `_ - - `except`:idx: - `manual.html#196 `_ - - `exception handlers`:idx: - `manual.html#195 `_ - - `exceptions`:idx: - `tut2.html#107 `_ - - `excl`:idx: - `system.html#180 `_ - - `exclFilePermissions`:idx: - `os.html#165 `_ - - `execCmd`:idx: - `osproc.html#105 `_ - - `execProcess`:idx: - `osproc.html#103 `_ - - `execProcesses`:idx: - `osproc.html#118 `_ - - `execShellCmd`:idx: - `os.html#146 `_ - - `executeCommand`:idx: - `osproc.html#106 `_ - - `executeProcess`:idx: - `osproc.html#104 `_ - - `executeShellCommand`:idx: - `os.html#145 `_ - - `ExeExt`:idx: - `os.html#107 `_ - - `existsCookie`:idx: - `cgi.html#147 `_ - - `existsDir`:idx: - `os.html#115 `_ - - `existsEnv`:idx: - `os.html#148 `_ - - `existsFile`:idx: - `os.html#114 `_ - - `exp`:idx: - `math.html#119 `_ - - `expandFilename`:idx: - `os.html#132 `_ - - `expectKind`:idx: - `macros.html#147 `_ - - `expectLen`:idx: - `macros.html#149 `_ - - `expectMinLen`:idx: - `macros.html#148 `_ - - `exportc`:idx: - `manual.html#250 `_ - - `expr`:idx: - `system.html#115 `_ - - `expression macros`:idx: - `tut2.html#111 `_ - - `extractDir`:idx: - `os.html#130 `_ - - `extractFileExt`:idx: - `os.html#134 `_ - - `extractFilename`:idx: - `os.html#131 `_ - - `extractFileTrunk`:idx: - `os.html#135 `_ - - `ExtSep`:idx: - `os.html#109 `_ - - `fac`:idx: - `math.html#106 `_ - - `fastcall`:idx: - `manual.html#175 `_ - - `FastRows`:idx: - * `db_postgres.html#110 `_ - * `db_mysql.html#110 `_ - - `fastRuneAt`:idx: - `unicode.html#108 `_ - - `fatal`:idx: - `manual.html#242 `_ - - `FFI`:idx: - `manual.html#248 `_ - - `fieldset`:idx: - `xmlgen.html#130 `_ - - `FIELD_TYPE_BIT`:idx: - `mysql.html#231 `_ - - `FIELD_TYPE_BLOB`:idx: - `mysql.html#225 `_ - - `FIELD_TYPE_CHAR`:idx: - `mysql.html#228 `_ - - `FIELD_TYPE_DATE`:idx: - `mysql.html#215 `_ - - `FIELD_TYPE_DATETIME`:idx: - `mysql.html#217 `_ - - `FIELD_TYPE_DECIMAL`:idx: - `mysql.html#204 `_ - - `FIELD_TYPE_DOUBLE`:idx: - `mysql.html#210 `_ - - `FIELD_TYPE_ENUM`:idx: - `mysql.html#220 `_ - - `FIELD_TYPE_FLOAT`:idx: - `mysql.html#209 `_ - - `FIELD_TYPE_GEOMETRY`:idx: - `mysql.html#230 `_ - - `FIELD_TYPE_INT24`:idx: - `mysql.html#214 `_ - - `FIELD_TYPE_INTERVAL`:idx: - `mysql.html#229 `_ - - `FIELD_TYPE_LONG`:idx: - `mysql.html#208 `_ - - `FIELD_TYPE_LONG_BLOB`:idx: - `mysql.html#224 `_ - - `FIELD_TYPE_LONGLONG`:idx: - `mysql.html#213 `_ - - `FIELD_TYPE_MEDIUM_BLOB`:idx: - `mysql.html#223 `_ - - `FIELD_TYPE_NEWDATE`:idx: - `mysql.html#219 `_ - - `FIELD_TYPE_NEWDECIMAL`:idx: - `mysql.html#205 `_ - - `FIELD_TYPE_NULL`:idx: - `mysql.html#211 `_ - - `FIELD_TYPE_SET`:idx: - `mysql.html#221 `_ - - `FIELD_TYPE_SHORT`:idx: - `mysql.html#207 `_ - - `FIELD_TYPE_STRING`:idx: - `mysql.html#227 `_ - - `FIELD_TYPE_TIME`:idx: - `mysql.html#216 `_ - - `FIELD_TYPE_TIMESTAMP`:idx: - `mysql.html#212 `_ - - `FIELD_TYPE_TINY`:idx: - `mysql.html#206 `_ - - `FIELD_TYPE_TINY_BLOB`:idx: - `mysql.html#222 `_ - - `FIELD_TYPE_VAR_STRING`:idx: - `mysql.html#226 `_ - - `FIELD_TYPE_YEAR`:idx: - `mysql.html#218 `_ - - `fileHandle`:idx: - `system.html#536 `_ - - `fileNewer`:idx: - `os.html#119 `_ - - `FILE_OFFSET_BITS`:idx: - `libcurl.html#263 `_ - - `FILESIZEBITS`:idx: - `libcurl.html#264 `_ - - `FileSystemCaseSensitive`:idx: - `os.html#106 `_ - - `final`:idx: - `manual.html#239 `_ - - `finally`:idx: - `manual.html#197 `_ - - `find`:idx: - * `system.html#475 `_ - * `strutils.html#119 `_ - * `strutils.html#120 `_ - * `strutils.html#121 `_ - * `regexprs.html#109 `_ - * `regexprs.html#110 `_ - * `pegs.html#138 `_ - * `pegs.html#139 `_ - - `float`:idx: - `system.html#106 `_ - - `float32`:idx: - `system.html#107 `_ - - `float64`:idx: - `system.html#108 `_ - - `floatChecks`:idx: - `manual.html#152 `_ - - `floatVal`:idx: - `macros.html#124 `_ - - `floatVal=`:idx: - `macros.html#130 `_ - - `FlushFile`:idx: - `system.html#513 `_ - - `for`:idx: - * `manual.html#214 `_ - * `tut1.html#105 `_ - - `form`:idx: - `xmlgen.html#131 `_ - - `form feed`:idx: - `manual.html#124 `_ - - `forward`:idx: - `manual.html#209 `_ - - `frexp`:idx: - `math.html#120 `_ - - `functional`:idx: - * `manual.html#169 `_ - * `tut1.html#124 `_ - - `FUNCTIONPOINT`:idx: - `libcurl.html#265 `_ - - `functions`:idx: - `manual.html#207 `_ - - `GC_disable`:idx: - `system.html#479 `_ - - `GC_disableMarkAndSweep`:idx: - `system.html#485 `_ - - `GC_enable`:idx: - `system.html#480 `_ - - `GC_enableMarkAndSweep`:idx: - `system.html#484 `_ - - `GC_fullCollect`:idx: - `system.html#481 `_ - - `GC_getStatistics`:idx: - `system.html#486 `_ - - `GC_ref`:idx: - * `system.html#487 `_ - * `system.html#488 `_ - * `system.html#489 `_ - - `GC_setStrategy`:idx: - `system.html#483 `_ - - `GC_unref`:idx: - * `system.html#490 `_ - * `system.html#491 `_ - * `system.html#492 `_ - - `generalized raw string literal`:idx: - `manual.html#136 `_ - - `generic character types`:idx: - `regexprs.html#102 `_ - - `Generics`:idx: - * `manual.html#218 `_ - * `tut2.html#109 `_ - - `get`:idx: - `httpclient.html#106 `_ - - `GetAllRows`:idx: - * `db_postgres.html#111 `_ - * `db_mysql.html#111 `_ - - `getApplicationDir`:idx: - `os.html#169 `_ - - `getApplicationFilename`:idx: - `os.html#168 `_ - - `getClockStr`:idx: - `times.html#112 `_ - - `getColNumber`:idx: - `lexbase.html#107 `_ - - `getColumn`:idx: - * `parsecfg.html#107 `_ - * `parsexml.html#117 `_ - - `getConfigDir`:idx: - `os.html#167 `_ - - `getContent`:idx: - `httpclient.html#107 `_ - - `getContentLength`:idx: - `cgi.html#111 `_ - - `getContentType`:idx: - `cgi.html#112 `_ - - `getCookie`:idx: - `cgi.html#146 `_ - - `getCreationTime`:idx: - `os.html#118 `_ - - `getCurrentDir`:idx: - `os.html#120 `_ - - `getCurrentExceptionMsg`:idx: - `system.html#437 `_ - - `getCurrentLine`:idx: - `lexbase.html#106 `_ - - `getDateStr`:idx: - `times.html#111 `_ - - `getDocumentRoot`:idx: - `cgi.html#113 `_ - - `getEnv`:idx: - `os.html#147 `_ - - `getFilename`:idx: - * `parsecfg.html#109 `_ - * `parsexml.html#119 `_ - - `getFilePermissions`:idx: - `os.html#162 `_ - - `getFilePos`:idx: - `system.html#533 `_ - - `getFileSize`:idx: - `system.html#525 `_ - - `getFreeMem`:idx: - `system.html#443 `_ - - `getGatewayInterface`:idx: - `cgi.html#114 `_ - - `getGMTime`:idx: - `times.html#107 `_ - - `getHomeDir`:idx: - `os.html#166 `_ - - `getHttpAccept`:idx: - `cgi.html#115 `_ - - `getHttpAcceptCharset`:idx: - `cgi.html#116 `_ - - `getHttpAcceptEncoding`:idx: - `cgi.html#117 `_ - - `getHttpAcceptLanguage`:idx: - `cgi.html#118 `_ - - `getHttpConnection`:idx: - `cgi.html#119 `_ - - `getHttpCookie`:idx: - `cgi.html#120 `_ - - `getHttpHost`:idx: - `cgi.html#121 `_ - - `getHttpReferer`:idx: - `cgi.html#122 `_ - - `getHttpUserAgent`:idx: - `cgi.html#123 `_ - - `getLastAccessTime`:idx: - `os.html#117 `_ - - `getLastModificationTime`:idx: - `os.html#116 `_ - - `getLine`:idx: - * `parsecfg.html#108 `_ - * `parsexml.html#118 `_ - - `getLocalTime`:idx: - `times.html#106 `_ - - `getMD5`:idx: - `md5.html#106 `_ - - `getOccupiedMem`:idx: - `system.html#442 `_ - - `getopt`:idx: - `parseopt.html#108 `_ - - `getPathInfo`:idx: - `cgi.html#124 `_ - - `getPathTranslated`:idx: - `cgi.html#125 `_ - - `getQueryString`:idx: - `cgi.html#126 `_ - - `getRefcount`:idx: - `system.html#436 `_ - - `getRemoteAddr`:idx: - `cgi.html#127 `_ - - `getRemoteHost`:idx: - `cgi.html#128 `_ - - `getRemoteIdent`:idx: - `cgi.html#129 `_ - - `getRemotePort`:idx: - `cgi.html#130 `_ - - `getRemoteUser`:idx: - `cgi.html#131 `_ - - `getRequestMethod`:idx: - `cgi.html#132 `_ - - `getRequestURI`:idx: - `cgi.html#133 `_ - - `getRestOfCommandLine`:idx: - `parseopt.html#107 `_ - - `get_salt_from_password`:idx: - `mysql.html#280 `_ - - `get_salt_from_password_323`:idx: - `mysql.html#274 `_ - - `getScriptFilename`:idx: - `cgi.html#134 `_ - - `getScriptName`:idx: - `cgi.html#135 `_ - - `getServerAddr`:idx: - `cgi.html#136 `_ - - `getServerAdmin`:idx: - `cgi.html#137 `_ - - `getServerName`:idx: - `cgi.html#138 `_ - - `getServerPort`:idx: - `cgi.html#139 `_ - - `getServerProtocol`:idx: - `cgi.html#140 `_ - - `getServerSignature`:idx: - `cgi.html#141 `_ - - `getServerSoftware`:idx: - `cgi.html#142 `_ - - `getStartMilsecs`:idx: - `times.html#116 `_ - - `getStream`:idx: - `zipfiles.html#109 `_ - - `getTime`:idx: - `times.html#105 `_ - - `getTotalMem`:idx: - `system.html#444 `_ - - `get_tty_password`:idx: - `mysql.html#282 `_ - - `GetValue`:idx: - * `db_postgres.html#113 `_ - * `db_mysql.html#113 `_ - - `gptr`:idx: - `mysql.html#105 `_ - - `GROUP_FLAG`:idx: - `mysql.html#139 `_ - - `h1`:idx: - `xmlgen.html#132 `_ - - `h2`:idx: - `xmlgen.html#133 `_ - - `h3`:idx: - `xmlgen.html#134 `_ - - `h4`:idx: - `xmlgen.html#135 `_ - - `h5`:idx: - `xmlgen.html#136 `_ - - `h6`:idx: - `xmlgen.html#137 `_ - - `HandleCR`:idx: - `lexbase.html#108 `_ - - `HandleLF`:idx: - `lexbase.html#109 `_ - - `hash`:idx: - * `hashes.html#103 `_ - * `hashes.html#104 `_ - * `hashes.html#105 `_ - * `hashes.html#106 `_ - * `hashes.html#107 `_ - - `hashData`:idx: - `hashes.html#102 `_ - - `hashIgnoreCase`:idx: - `hashes.html#109 `_ - - `hashIgnoreStyle`:idx: - `hashes.html#108 `_ - - `hash_password`:idx: - `mysql.html#270 `_ - - `hasKey`:idx: - `strtabs.html#108 `_ - - `head`:idx: - `xmlgen.html#138 `_ - - `header`:idx: - `nimrodc.html#102 `_ - - `high`:idx: - `system.html#126 `_ - - `hint`:idx: - * `manual.html#231 `_ - * `manual.html#244 `_ - * `macros.html#140 `_ - - `hostCPU`:idx: - `system.html#407 `_ - - `HOSTNAME_LENGTH`:idx: - `mysql.html#111 `_ - - `hostOS`:idx: - `system.html#406 `_ - - `hr`:idx: - `xmlgen.html#140 `_ - - `html`:idx: - `xmlgen.html#139 `_ - - `HTML`:idx: - * `parsexml.html#102 `_ - * `xmlgen.html#102 `_ - - `HTTPPOST_BUFFER`:idx: - `libcurl.html#266 `_ - - `HTTPPOST_FILENAME`:idx: - `libcurl.html#267 `_ - - `HTTPPOST_PTRBUFFER`:idx: - `libcurl.html#268 `_ - - `HTTPPOST_PTRCONTENTS`:idx: - `libcurl.html#269 `_ - - `HTTPPOST_PTRNAME`:idx: - `libcurl.html#270 `_ - - `HTTPPOST_READFILE`:idx: - `libcurl.html#271 `_ - - `hypot`:idx: - `math.html#128 `_ - - `i`:idx: - `xmlgen.html#141 `_ - - `ident`:idx: - * `pegs.html#130 `_ - * `macros.html#126 `_ - - `ident=`:idx: - `macros.html#132 `_ - - `identChars`:idx: - `pegs.html#128 `_ - - `IdentChars`:idx: - `strutils.html#105 `_ - - `identifier`:idx: - `manual.html#105 `_ - - `Identifiers`:idx: - `manual.html#116 `_ - - `IdentStartChars`:idx: - `strutils.html#106 `_ - - `identStartChars`:idx: - `pegs.html#129 `_ - - `if`:idx: - `manual.html#189 `_ - - `img`:idx: - `xmlgen.html#142 `_ - - `implicit block`:idx: - `manual.html#216 `_ - - `import`:idx: - * `manual.html#227 `_ - * `tut1.html#128 `_ - - `importc`:idx: - `manual.html#249 `_ - - `in`:idx: - `system.html#357 `_ - - `inc`:idx: - `system.html#171 `_ - - `incl`:idx: - `system.html#179 `_ - - `inclFilePermissions`:idx: - `os.html#164 `_ - - `include`:idx: - `tut1.html#129 `_ - - `indentation sensitive`:idx: - `manual.html#113 `_ - - `inf`:idx: - `system.html#438 `_ - - `InfChecks`:idx: - `manual.html#151 `_ - - `information hiding`:idx: - * `manual.html#225 `_ - * `tut1.html#126 `_ - - `init`:idx: - `parseopt.html#104 `_ - - `initOptParser`:idx: - `parseopt.html#103 `_ - - `inline`:idx: - `manual.html#174 `_ - - `input`:idx: - `xmlgen.html#143 `_ - - `inputStream`:idx: - `osproc.html#114 `_ - - `ins`:idx: - `xmlgen.html#144 `_ - - `insert`:idx: - `system.html#378 `_ - - `InsertID`:idx: - * `db_postgres.html#115 `_ - * `db_mysql.html#115 `_ - - `int`:idx: - `system.html#101 `_ - - `int16`:idx: - `system.html#103 `_ - - `int32`:idx: - `system.html#104 `_ - - `int64`:idx: - `system.html#105 `_ - - `int8`:idx: - `system.html#102 `_ - - `INTERNAL_NUM_FIELD`:idx: - `mysql.html#306 `_ - - `intToStr`:idx: - `strutils.html#141 `_ - - `intVal`:idx: - `macros.html#123 `_ - - `intVal=`:idx: - `macros.html#129 `_ - - `is`:idx: - `system.html#359 `_ - - `isAlpha`:idx: - `unicode.html#116 `_ - - `IS_BLOB`:idx: - `mysql.html#304 `_ - - `isLower`:idx: - `unicode.html#114 `_ - - `isMainModule`:idx: - `system.html#398 `_ - - `isNil`:idx: - * `system.html#465 `_ - * `system.html#466 `_ - * `system.html#467 `_ - * `system.html#468 `_ - * `system.html#469 `_ - * `system.html#470 `_ - - `is_not`:idx: - `system.html#360 `_ - - `IS_NOT_NULL`:idx: - `mysql.html#303 `_ - - `IS_NUM`:idx: - `mysql.html#305 `_ - - `IS_NUM_FIELD`:idx: - `mysql.html#307 `_ - - `isPowerOfTwo`:idx: - `math.html#107 `_ - - `IS_PRI_KEY`:idx: - `mysql.html#302 `_ - - `isTitle`:idx: - `unicode.html#117 `_ - - `isUpper`:idx: - `unicode.html#115 `_ - - `isWhiteSpace`:idx: - `unicode.html#118 `_ - - `Item_result`:idx: - `mysql.html#255 `_ - - `items`:idx: - * `system.html#459 `_ - * `system.html#460 `_ - * `system.html#461 `_ - * `system.html#462 `_ - * `system.html#463 `_ - * `system.html#464 `_ - * `ropes.html#117 `_ - - `iterator`:idx: - `manual.html#215 `_ - - `iterOverEnvironment`:idx: - `os.html#150 `_ - - `join`:idx: - * `strutils.html#153 `_ - * `strutils.html#154 `_ - - `JoinPath`:idx: - * `os.html#122 `_ - * `os.html#123 `_ - - `kbd`:idx: - `xmlgen.html#145 `_ - - `keywords`:idx: - `manual.html#117 `_ - - `kind`:idx: - * `parsexml.html#110 `_ - * `macros.html#122 `_ - - `l-values`:idx: - `manual.html#107 `_ - - `label`:idx: - `xmlgen.html#146 `_ - - `leaves`:idx: - `ropes.html#116 `_ - - `legend`:idx: - `xmlgen.html#147 `_ - - `len`:idx: - * `system.html#174 `_ - * `system.html#175 `_ - * `system.html#176 `_ - * `system.html#177 `_ - * `system.html#178 `_ - * `strtabs.html#109 `_ - * `parsesql.html#107 `_ - * `macros.html#118 `_ - * `ropes.html#103 `_ - - `letters`:idx: - `pegs.html#125 `_ - - `Letters`:idx: - `strutils.html#103 `_ - - `li`:idx: - `xmlgen.html#148 `_ - - `LIBCURL_VERSION`:idx: - `libcurl.html#272 `_ - - `LIBCURL_VERSION_MAJOR`:idx: - `libcurl.html#273 `_ - - `LIBCURL_VERSION_MINOR`:idx: - `libcurl.html#274 `_ - - `LIBCURL_VERSION_NUM`:idx: - `libcurl.html#275 `_ - - `LIBCURL_VERSION_PATCH`:idx: - `libcurl.html#276 `_ - - `line feed`:idx: - `manual.html#123 `_ - - `lineDir`:idx: - `nimrodc.html#103 `_ - - `lines`:idx: - * `system.html#534 `_ - * `system.html#535 `_ - - `lineTrace`:idx: - `nimrodc.html#105 `_ - - `link`:idx: - `xmlgen.html#149 `_ - - `ln`:idx: - `math.html#116 `_ - - `load_defaults`:idx: - `mysql.html#285 `_ - - `LoadLib`:idx: - `dynlib.html#102 `_ - - `local type inference`:idx: - `tut1.html#101 `_ - - `LOCAL_HOST`:idx: - `mysql.html#115 `_ - - `LOCAL_HOST_NAMEDPIPE`:idx: - `mysql.html#116 `_ - - `LOCAL_INFILE_ERROR_LEN`:idx: - `mysql.html#424 `_ - - `locations`:idx: - `manual.html#101 `_ - - `log10`:idx: - `math.html#117 `_ - - `log2`:idx: - `math.html#118 `_ - - `low`:idx: - `system.html#127 `_ - - `Macros`:idx: - `manual.html#221 `_ - - `make_password_from_salt`:idx: - `mysql.html#281 `_ - - `make_password_from_salt_323`:idx: - `mysql.html#275 `_ - - `make_scrambled_password`:idx: - `mysql.html#277 `_ - - `make_scrambled_password_323`:idx: - `mysql.html#271 `_ - - `MANAGER_ACCESS`:idx: - `mysql.html#336 `_ - - `MANAGER_CLIENT_ERR`:idx: - `mysql.html#337 `_ - - `MANAGER_INFO`:idx: - `mysql.html#335 `_ - - `MANAGER_INTERNAL_ERR`:idx: - `mysql.html#338 `_ - - `MANAGER_OK`:idx: - `mysql.html#334 `_ - - `map`:idx: - `xmlgen.html#150 `_ - - `match`:idx: - * `regexprs.html#106 `_ - * `regexprs.html#107 `_ - * `pegs.html#134 `_ - * `pegs.html#135 `_ - - `matchLen`:idx: - * `regexprs.html#108 `_ - * `pegs.html#136 `_ - * `pegs.html#137 `_ - - `max`:idx: - * `system.html#324 `_ - * `system.html#453 `_ - * `system.html#454 `_ - * `system.html#455 `_ - * `system.html#456 `_ - * `system.html#457 `_ - * `system.html#458 `_ - - `MAX_BIGINT_WIDTH`:idx: - `mysql.html#194 `_ - - `MAX_BLOB_WIDTH`:idx: - `mysql.html#196 `_ - - `MAX_CHAR_WIDTH`:idx: - `mysql.html#195 `_ - - `MAX_INT_WIDTH`:idx: - `mysql.html#193 `_ - - `MAX_MEDIUMINT_WIDTH`:idx: - `mysql.html#192 `_ - - `MAX_MYSQL_MANAGER_ERR`:idx: - `mysql.html#332 `_ - - `MAX_MYSQL_MANAGER_MSG`:idx: - `mysql.html#333 `_ - - `MAX_SMALLINT_WIDTH`:idx: - `mysql.html#191 `_ - - `MaxSubpatterns`:idx: - * `regexprs.html#105 `_ - * `pegs.html#132 `_ - - `MAX_TINYINT_WIDTH`:idx: - `mysql.html#190 `_ - - `MD5Context`:idx: - `md5.html#102 `_ - - `MD5Digest`:idx: - `md5.html#101 `_ - - `MD5Final`:idx: - `md5.html#105 `_ - - `MD5Init`:idx: - `md5.html#103 `_ - - `MD5Update`:idx: - `md5.html#104 `_ - - `mean`:idx: - `math.html#111 `_ - - `MEM_ROOT`:idx: - `mysql.html#325 `_ - - `meta`:idx: - `xmlgen.html#151 `_ - - `method call syntax`:idx: - `tut2.html#105 `_ - - `methods`:idx: - `manual.html#206 `_ - - `min`:idx: - * `system.html#323 `_ - * `system.html#447 `_ - * `system.html#448 `_ - * `system.html#449 `_ - * `system.html#450 `_ - * `system.html#451 `_ - * `system.html#452 `_ - - `mod`:idx: - * `system.html#228 `_ - * `system.html#229 `_ - * `system.html#230 `_ - * `system.html#231 `_ - * `system.html#232 `_ - - `modify_defaults_file`:idx: - `mysql.html#284 `_ - - `module`:idx: - * `manual.html#223 `_ - * `tut1.html#125 `_ - - `moveFile`:idx: - `os.html#143 `_ - - `moveMem`:idx: - `system.html#417 `_ - - `Multi-methods`:idx: - `manual.html#213 `_ - - `multi-methods`:idx: - `tut2.html#104 `_ - - `MULTIPLE_KEY_FLAG`:idx: - `mysql.html#127 `_ - - `my_bool`:idx: - `mysql.html#101 `_ - - `MY_CHARSET_INFO`:idx: - `mysql.html#352 `_ - - `my_connect`:idx: - `mysql.html#252 `_ - - `my_init`:idx: - `mysql.html#286 `_ - - `my_net_init`:idx: - `mysql.html#240 `_ - - `my_net_local_init`:idx: - `mysql.html#241 `_ - - `my_net_read`:idx: - `mysql.html#249 `_ - - `my_net_write`:idx: - `mysql.html#246 `_ - - `myodbc_remove_escape`:idx: - `mysql.html#465 `_ - - `my_rnd`:idx: - `mysql.html#268 `_ - - `my_socket`:idx: - `mysql.html#107 `_ - - `mySQL`:idx: - `db_mysql.html#101 `_ - - `MYSQL`:idx: - `mysql.html#357 `_ - - `mysql_add_slave`:idx: - `mysql.html#435 `_ - - `mysql_affected_rows`:idx: - `mysql.html#399 `_ - - `mysql_autocommit`:idx: - `mysql.html#503 `_ - - `MYSQL_BIND`:idx: - `mysql.html#379 `_ - - `mysql_change_user`:idx: - `mysql.html#411 `_ - - `mysql_character_set_name`:idx: - `mysql.html#407 `_ - - `mysql_close`:idx: - `mysql.html#506 `_ - - `mysql_commit`:idx: - `mysql.html#501 `_ - - `mysql_connect`:idx: - `mysql.html#510 `_ - - `MYSQL_COUNT_ERROR`:idx: - `mysql.html#310 `_ - - `mysql_create_db`:idx: - `mysql.html#511 `_ - - `MYSQL_DATA`:idx: - `mysql.html#329 `_ - - `mysql_data_seek`:idx: - `mysql.html#454 `_ - - `MYSQL_DATA_TRUNCATED`:idx: - `mysql.html#508 `_ - - `mysql_debug`:idx: - `mysql.html#464 `_ - - `mysql_disable_reads_from_master`:idx: - `mysql.html#430 `_ - - `mysql_disable_rpl_parse`:idx: - `mysql.html#427 `_ - - `mysql_drop_db`:idx: - `mysql.html#512 `_ - - `mysql_dump_debug_info`:idx: - `mysql.html#437 `_ - - `mysql_embedded`:idx: - `mysql.html#467 `_ - - `mysql_enable_reads_from_master`:idx: - `mysql.html#429 `_ - - `mysql_enable_rpl_parse`:idx: - `mysql.html#426 `_ - - `mysql_enum_shutdown_level`:idx: - `mysql.html#236 `_ - - `mysql_eof`:idx: - `mysql.html#393 `_ - - `MYSQL_ERRMSG_SIZE`:idx: - `mysql.html#185 `_ - - `mysql_errno`:idx: - `mysql.html#401 `_ - - `mysql_errno_to_sqlstate`:idx: - `mysql.html#283 `_ - - `mysql_error`:idx: - `mysql.html#402 `_ - - `mysql_escape_string`:idx: - `mysql.html#461 `_ - - `mysql_fetch_field`:idx: - `mysql.html#459 `_ - - `mysql_fetch_field_direct`:idx: - `mysql.html#394 `_ - - `mysql_fetch_fields`:idx: - `mysql.html#395 `_ - - `mysql_fetch_lengths`:idx: - `mysql.html#458 `_ - - `mysql_fetch_row`:idx: - `mysql.html#457 `_ - - `MYSQL_FIELD`:idx: - `mysql.html#296 `_ - - `mysql_field_count`:idx: - `mysql.html#398 `_ - - `MYSQL_FIELD_OFFSET`:idx: - `mysql.html#301 `_ - - `mysql_field_seek`:idx: - `mysql.html#456 `_ - - `mysql_field_tell`:idx: - `mysql.html#397 `_ - - `mysql_free_result`:idx: - `mysql.html#453 `_ - - `mysql_get_character_set_info`:idx: - `mysql.html#423 `_ - - `mysql_get_client_info`:idx: - `mysql.html#444 `_ - - `mysql_get_client_version`:idx: - `mysql.html#445 `_ - - `mysql_get_host_info`:idx: - `mysql.html#446 `_ - - `mysql_get_parameters`:idx: - `mysql.html#388 `_ - - `mysql_get_proto_info`:idx: - `mysql.html#448 `_ - - `mysql_get_server_info`:idx: - `mysql.html#443 `_ - - `mysql_get_server_version`:idx: - `mysql.html#447 `_ - - `mysql_hex_string`:idx: - `mysql.html#462 `_ - - `mysql_info`:idx: - `mysql.html#405 `_ - - `mysql_init`:idx: - `mysql.html#409 `_ - - `mysql_insert_id`:idx: - `mysql.html#400 `_ - - `mysql_kill`:idx: - `mysql.html#439 `_ - - `mysql_library_end`:idx: - `mysql.html#387 `_ - - `mysql_library_init`:idx: - `mysql.html#386 `_ - - `mysql_list_dbs`:idx: - `mysql.html#449 `_ - - `mysql_list_fields`:idx: - `mysql.html#460 `_ - - `mysql_list_processes`:idx: - `mysql.html#451 `_ - - `mysql_list_tables`:idx: - `mysql.html#450 `_ - - `MYSQL_LONG_DATA_HEADER`:idx: - `mysql.html#291 `_ - - `MYSQL_MANAGER`:idx: - `mysql.html#370 `_ - - `mysql_manager_close`:idx: - `mysql.html#470 `_ - - `mysql_manager_command`:idx: - `mysql.html#471 `_ - - `mysql_manager_connect`:idx: - `mysql.html#469 `_ - - `mysql_manager_fetch_line`:idx: - `mysql.html#472 `_ - - `mysql_manager_init`:idx: - `mysql.html#468 `_ - - `mysql_master_query`:idx: - `mysql.html#419 `_ - - `mysql_master_send_query`:idx: - `mysql.html#420 `_ - - `MYSQL_METHODS`:idx: - `mysql.html#366 `_ - - `mysql_more_results`:idx: - `mysql.html#504 `_ - - `MYSQL_NAMEDPIPE`:idx: - `mysql.html#117 `_ - - `mysql_next_result`:idx: - `mysql.html#505 `_ - - `MYSQL_NO_DATA`:idx: - `mysql.html#507 `_ - - `mysql_num_fields`:idx: - `mysql.html#392 `_ - - `mysql_num_rows`:idx: - `mysql.html#391 `_ - - `mysql_option`:idx: - `mysql.html#331 `_ - - `mysql_options`:idx: - `mysql.html#452 `_ - - `MYSQL_PARAMETERS`:idx: - `mysql.html#374 `_ - - `mysql_ping`:idx: - `mysql.html#441 `_ - - `mysql_protocol_type`:idx: - `mysql.html#345 `_ - - `mysql_query`:idx: - `mysql.html#414 `_ - - `mysql_read_query_result`:idx: - `mysql.html#473 `_ - - `mysql_reads_from_master_enabled`:idx: - `mysql.html#431 `_ - - `mysql_real_connect`:idx: - `mysql.html#412 `_ - - `mysql_real_escape_string`:idx: - `mysql.html#463 `_ - - `mysql_real_query`:idx: - `mysql.html#416 `_ - - `mysql_refresh`:idx: - `mysql.html#438 `_ - - `mysql_reload`:idx: - * `mysql.html#509 `_ - * `mysql.html#513 `_ - - `MYSQL_RES`:idx: - `mysql.html#361 `_ - - `mysql_rollback`:idx: - `mysql.html#502 `_ - - `MYSQL_ROW`:idx: - `mysql.html#299 `_ - - `MYSQL_ROW_OFFSET`:idx: - `mysql.html#316 `_ - - `MYSQL_ROWS`:idx: - `mysql.html#313 `_ - - `mysql_row_seek`:idx: - `mysql.html#455 `_ - - `mysql_row_tell`:idx: - `mysql.html#396 `_ - - `mysql_rpl_parse_enabled`:idx: - `mysql.html#428 `_ - - `mysql_rpl_probe`:idx: - `mysql.html#433 `_ - - `mysql_rpl_query_type`:idx: - `mysql.html#432 `_ - - `mysql_rpl_type`:idx: - `mysql.html#346 `_ - - `mysql_select_db`:idx: - `mysql.html#413 `_ - - `mysql_send_query`:idx: - `mysql.html#415 `_ - - `mysql_server_end`:idx: - `mysql.html#385 `_ - - `mysql_server_init`:idx: - `mysql.html#384 `_ - - `MYSQL_SERVICENAME`:idx: - `mysql.html#118 `_ - - `mysql_set_character_set`:idx: - `mysql.html#408 `_ - - `mysql_set_local_infile_default`:idx: - `mysql.html#425 `_ - - `mysql_set_master`:idx: - `mysql.html#434 `_ - - `mysql_set_server_option`:idx: - `mysql.html#440 `_ - - `mysql_shutdown`:idx: - `mysql.html#436 `_ - - `MYSQL_SHUTDOWN_KILLABLE_CONNECT`:idx: - `mysql.html#232 `_ - - `MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE`:idx: - `mysql.html#234 `_ - - `MYSQL_SHUTDOWN_KILLABLE_TRANS`:idx: - `mysql.html#233 `_ - - `MYSQL_SHUTDOWN_KILLABLE_UPDATE`:idx: - `mysql.html#235 `_ - - `mysql_slave_query`:idx: - `mysql.html#421 `_ - - `mysql_slave_send_query`:idx: - `mysql.html#422 `_ - - `mysql_sqlstate`:idx: - `mysql.html#403 `_ - - `mysql_ssl_set`:idx: - `mysql.html#410 `_ - - `mysql_stat`:idx: - `mysql.html#442 `_ - - `mysql_status`:idx: - `mysql.html#344 `_ - - `MYSQL_STMT`:idx: - `mysql.html#382 `_ - - `mysql_stmt_affected_rows`:idx: - `mysql.html#498 `_ - - `mysql_stmt_attr_get`:idx: - `mysql.html#482 `_ - - `mysql_stmt_attr_set`:idx: - `mysql.html#481 `_ - - `mysql_stmt_bind_param`:idx: - `mysql.html#483 `_ - - `mysql_stmt_bind_result`:idx: - `mysql.html#484 `_ - - `mysql_stmt_close`:idx: - `mysql.html#485 `_ - - `mysql_stmt_data_seek`:idx: - `mysql.html#496 `_ - - `mysql_stmt_errno`:idx: - `mysql.html#491 `_ - - `mysql_stmt_error`:idx: - `mysql.html#492 `_ - - `mysql_stmt_execute`:idx: - `mysql.html#476 `_ - - `mysql_stmt_fetch`:idx: - `mysql.html#477 `_ - - `mysql_stmt_fetch_column`:idx: - `mysql.html#478 `_ - - `mysql_stmt_field_count`:idx: - `mysql.html#500 `_ - - `mysql_stmt_free_result`:idx: - `mysql.html#487 `_ - - `MYSQL_STMT_HEADER`:idx: - `mysql.html#290 `_ - - `mysql_stmt_init`:idx: - `mysql.html#474 `_ - - `mysql_stmt_insert_id`:idx: - `mysql.html#499 `_ - - `mysql_stmt_num_rows`:idx: - `mysql.html#497 `_ - - `mysql_stmt_param_count`:idx: - `mysql.html#480 `_ - - `mysql_stmt_param_metadata`:idx: - `mysql.html#490 `_ - - `mysql_stmt_prepare`:idx: - `mysql.html#475 `_ - - `mysql_stmt_reset`:idx: - `mysql.html#486 `_ - - `mysql_stmt_result_metadata`:idx: - `mysql.html#489 `_ - - `mysql_stmt_row_seek`:idx: - `mysql.html#494 `_ - - `mysql_stmt_row_tell`:idx: - `mysql.html#495 `_ - - `mysql_stmt_send_long_data`:idx: - `mysql.html#488 `_ - - `mysql_stmt_sqlstate`:idx: - `mysql.html#493 `_ - - `mysql_stmt_store_result`:idx: - `mysql.html#479 `_ - - `mysql_store_result`:idx: - `mysql.html#417 `_ - - `mysql_thread_end`:idx: - `mysql.html#390 `_ - - `mysql_thread_id`:idx: - `mysql.html#406 `_ - - `mysql_thread_init`:idx: - `mysql.html#389 `_ - - `mysql_thread_safe`:idx: - `mysql.html#466 `_ - - `mysql_use_result`:idx: - `mysql.html#418 `_ - - `mysql_warning_count`:idx: - `mysql.html#404 `_ - - `my_thread_end`:idx: - `mysql.html#288 `_ - - `my_thread_init`:idx: - `mysql.html#287 `_ - - `my_ulonglong`:idx: - `mysql.html#308 `_ - - `NAME_LEN`:idx: - `mysql.html#110 `_ - - `namespace`:idx: - `manual.html#224 `_ - - `nan`:idx: - `system.html#440 `_ - - `natural`:idx: - `pegs.html#131 `_ - - `Natural`:idx: - `system.html#134 `_ - - `neginf`:idx: - `system.html#439 `_ - - `nestList`:idx: - `macros.html#152 `_ - - `NET`:idx: - `mysql.html#199 `_ - - `net_clear`:idx: - `mysql.html#243 `_ - - `net_end`:idx: - `mysql.html#242 `_ - - `net_flush`:idx: - `mysql.html#245 `_ - - `NET_HEADER_SIZE`:idx: - `mysql.html#265 `_ - - `net_new_transaction`:idx: - `mysql.html#239 `_ - - `NET_READ_TIMEOUT`:idx: - `mysql.html#186 `_ - - `net_realloc`:idx: - `mysql.html#244 `_ - - `net_real_write`:idx: - `mysql.html#248 `_ - - `net_safe_read`:idx: - `mysql.html#514 `_ - - `NET_WAIT_TIMEOUT`:idx: - `mysql.html#188 `_ - - `net_write_command`:idx: - `mysql.html#247 `_ - - `NET_WRITE_TIMEOUT`:idx: - `mysql.html#187 `_ - - `new`:idx: - * `system.html#124 `_ - * `system.html#125 `_ - - `newCall`:idx: - * `macros.html#150 `_ - * `macros.html#151 `_ - - `newFileStream`:idx: - * `streams.html#120 `_ - * `streams.html#121 `_ - - `newFloatLitNode`:idx: - `macros.html#143 `_ - - `newIdentNode`:idx: - * `macros.html#144 `_ - * `macros.html#145 `_ - - `newIntLitNode`:idx: - `macros.html#142 `_ - - `newline`:idx: - * `manual.html#121 `_ - * `pegs.html#120 `_ - - `newLine`:idx: - `pegs.html#121 `_ - - `NewLines`:idx: - `lexbase.html#102 `_ - - `newNimNode`:idx: - `macros.html#135 `_ - - `newNonTerminal`:idx: - `pegs.html#124 `_ - - `newSeq`:idx: - `system.html#173 `_ - - `newString`:idx: - `system.html#366 `_ - - `newStringStream`:idx: - `streams.html#117 `_ - - `newStringTable`:idx: - * `strtabs.html#104 `_ - * `strtabs.html#105 `_ - - `newStrLitNode`:idx: - `macros.html#141 `_ - - `next`:idx: - * `parseopt.html#105 `_ - * `parsecfg.html#106 `_ - * `parsexml.html#122 `_ - * `httpserver.html#105 `_ - - `nextPowerOfTwo`:idx: - `math.html#108 `_ - - `nimcall`:idx: - `manual.html#176 `_ - - `NimrodMajor`:idx: - `system.html#402 `_ - - `NimrodMinor`:idx: - `system.html#403 `_ - - `NimrodPatch`:idx: - `system.html#404 `_ - - `NimrodVersion`:idx: - `system.html#401 `_ - - `noconv`:idx: - `manual.html#179 `_ - - `noDecl`:idx: - `nimrodc.html#101 `_ - - `NO_DEFAULT_VALUE_FLAG`:idx: - `mysql.html#136 `_ - - `nonterminal`:idx: - `pegs.html#123 `_ - - `noreturn`:idx: - `manual.html#237 `_ - - `normalize`:idx: - `strutils.html#118 `_ - - `noscript`:idx: - `xmlgen.html#152 `_ - - `noSideEffect`:idx: - `manual.html#234 `_ - - `not`:idx: - * `system.html#120 `_ - * `system.html#203 `_ - * `system.html#204 `_ - * `system.html#205 `_ - * `system.html#206 `_ - * `system.html#207 `_ - - `not_in`:idx: - `system.html#358 `_ - - `NOT_NULL_FLAG`:idx: - `mysql.html#124 `_ - - `NULL_LENGTH`:idx: - `mysql.html#289 `_ - - `Numerical constants`:idx: - `manual.html#137 `_ - - `NUM_FLAG`:idx: - `mysql.html#137 `_ - - `object`:idx: - * `manual.html#162 `_ - * `xmlgen.html#153 `_ - - `octet2hex`:idx: - `mysql.html#276 `_ - - `ol`:idx: - `xmlgen.html#154 `_ - - `ONLY_KILL_QUERY`:idx: - `mysql.html#189 `_ - - `Open`:idx: - * `system.html#507 `_ - * `system.html#508 `_ - * `db_postgres.html#118 `_ - * `db_mysql.html#118 `_ - - `open`:idx: - * `lexbase.html#104 `_ - * `parsecfg.html#104 `_ - * `parsexml.html#107 `_ - * `parsecsv.html#106 `_ - * `zipfiles.html#102 `_ - * `httpserver.html#103 `_ - - `openarray`:idx: - * `tut1.html#119 `_ - * `system.html#130 `_ - - `openDefaultBrowser`:idx: - `browsers.html#101 `_ - - `OpenFile`:idx: - * `system.html#505 `_ - * `system.html#506 `_ - - `operator`:idx: - `manual.html#139 `_ - - `Operators`:idx: - `manual.html#211 `_ - - `optgroup`:idx: - `xmlgen.html#155 `_ - - `option`:idx: - `xmlgen.html#156 `_ - - `or`:idx: - * `system.html#122 `_ - * `system.html#248 `_ - * `system.html#249 `_ - * `system.html#250 `_ - * `system.html#251 `_ - * `system.html#252 `_ - - `ord`:idx: - `system.html#182 `_ - - `Ordinal`:idx: - `system.html#114 `_ - - `ordinal`:idx: - `tut1.html#114 `_ - - `Ordinal types`:idx: - `manual.html#142 `_ - - `OSError`:idx: - `os.html#112 `_ - - `outputStream`:idx: - `osproc.html#115 `_ - - `p`:idx: - `xmlgen.html#157 `_ - - `packet_error`:idx: - `mysql.html#201 `_ - - `pairs`:idx: - `strtabs.html#110 `_ - - `parallelReplace`:idx: - `pegs.html#146 `_ - - `param`:idx: - `xmlgen.html#158 `_ - - `paramCount`:idx: - `os.html#110 `_ - - `paramStr`:idx: - `os.html#111 `_ - - `ParDir`:idx: - `os.html#102 `_ - - `parentDir`:idx: - `os.html#127 `_ - - `parseBiggestFloat`:idx: - `parseutils.html#110 `_ - - `ParseBiggestInt`:idx: - `strutils.html#143 `_ - - `parseBiggestInt`:idx: - `parseutils.html#108 `_ - - `parseCmdLine`:idx: - `os.html#160 `_ - - `ParseFloat`:idx: - `strutils.html#144 `_ - - `parseFloat`:idx: - `parseutils.html#111 `_ - - `parseHex`:idx: - `parseutils.html#101 `_ - - `ParseHexInt`:idx: - `strutils.html#145 `_ - - `parseIdent`:idx: - `parseutils.html#103 `_ - - `ParseInt`:idx: - `strutils.html#142 `_ - - `parseInt`:idx: - `parseutils.html#109 `_ - - `parseOct`:idx: - `parseutils.html#102 `_ - - `ParseOctInt`:idx: - `strutils.html#159 `_ - - `parsePeg`:idx: - `pegs.html#151 `_ - - `parseSQL`:idx: - `parsesql.html#109 `_ - - `parseToken`:idx: - `parseutils.html#104 `_ - - `PART_KEY_FLAG`:idx: - `mysql.html#138 `_ - - `PathSep`:idx: - `os.html#105 `_ - - `pcDirectory`:idx: - `os.html#154 `_ - - `Pcharacter_set`:idx: - `mysql.html#350 `_ - - `Pcharset_info_st`:idx: - `mysql.html#349 `_ - - `pcLinkToDirectory`:idx: - `os.html#155 `_ - - `PCURL`:idx: - `libcurl.html#139 `_ - - `Pcurl_calloc_callback`:idx: - `libcurl.html#101 `_ - - `Pcurl_closepolicy`:idx: - `libcurl.html#102 `_ - - `PCURLcode`:idx: - `libcurl.html#123 `_ - - `PCURLFORMcode`:idx: - `libcurl.html#124 `_ - - `PCURLformoption`:idx: - `libcurl.html#125 `_ - - `Pcurl_forms`:idx: - `libcurl.html#103 `_ - - `Pcurl_ftpauth`:idx: - `libcurl.html#104 `_ - - `Pcurl_ftpmethod`:idx: - `libcurl.html#105 `_ - - `Pcurl_ftpssl`:idx: - `libcurl.html#106 `_ - - `Pcurl_httppost`:idx: - `libcurl.html#108 `_ - - `PCURL_HTTP_VERSION`:idx: - `libcurl.html#107 `_ - - `PCURLINFO`:idx: - `libcurl.html#126 `_ - - `Pcurl_infotype`:idx: - `libcurl.html#110 `_ - - `Pcurliocmd`:idx: - `libcurl.html#127 `_ - - `Pcurlioerr`:idx: - `libcurl.html#128 `_ - - `Pcurl_lock_access`:idx: - `libcurl.html#111 `_ - - `Pcurl_lock_data`:idx: - `libcurl.html#112 `_ - - `PCURLM`:idx: - `libcurl.html#129 `_ - - `Pcurl_malloc_callback`:idx: - `libcurl.html#113 `_ - - `PCURLMcode`:idx: - `libcurl.html#130 `_ - - `PCURLMoption`:idx: - `libcurl.html#131 `_ - - `PCURLMSG`:idx: - `libcurl.html#132 `_ - - `PCURL_NETRC_OPTION`:idx: - `libcurl.html#114 `_ - - `PCURLoption`:idx: - `libcurl.html#133 `_ - - `Pcurl_proxytype`:idx: - `libcurl.html#115 `_ - - `Pcurl_realloc_callback`:idx: - `libcurl.html#116 `_ - - `PCURLSH`:idx: - `libcurl.html#134 `_ - - `PCURLSHcode`:idx: - `libcurl.html#135 `_ - - `PCURLSHoption`:idx: - `libcurl.html#136 `_ - - `Pcurl_slist`:idx: - `libcurl.html#117 `_ - - `Pcurl_socket`:idx: - `libcurl.html#118 `_ - - `PCURL_SSL_VERSION`:idx: - `libcurl.html#119 `_ - - `Pcurl_strdup_callback`:idx: - `libcurl.html#120 `_ - - `PCURL_TIMECOND`:idx: - `libcurl.html#121 `_ - - `PCURLversion`:idx: - `libcurl.html#137 `_ - - `Pcurl_version_info_data`:idx: - `libcurl.html#122 `_ - - `peg`:idx: - `pegs.html#152 `_ - - `Pfd_set`:idx: - `libcurl.html#138 `_ - - `PFileStream`:idx: - `streams.html#118 `_ - - `PFloat32`:idx: - `system.html#394 `_ - - `PFloat64`:idx: - `system.html#395 `_ - - `Pgptr`:idx: - `mysql.html#104 `_ - - `PI`:idx: - `math.html#101 `_ - - `PIName`:idx: - `parsexml.html#115 `_ - - `PInt32`:idx: - `system.html#397 `_ - - `PInt64`:idx: - `system.html#396 `_ - - `PIRest`:idx: - `parsexml.html#116 `_ - - `PItem_result`:idx: - `mysql.html#256 `_ - - `PMEM_ROOT`:idx: - `mysql.html#326 `_ - - `Pmy_bool`:idx: - `mysql.html#102 `_ - - `PMY_CHARSET_INFO`:idx: - `mysql.html#353 `_ - - `Pmy_socket`:idx: - `mysql.html#106 `_ - - `PMYSQL`:idx: - `mysql.html#358 `_ - - `PMYSQL_BIND`:idx: - `mysql.html#380 `_ - - `PMYSQL_DATA`:idx: - `mysql.html#330 `_ - - `PMYSQL_FIELD`:idx: - `mysql.html#297 `_ - - `PMYSQL_FIELD_OFFSET`:idx: - `mysql.html#300 `_ - - `PMYSQL_MANAGER`:idx: - `mysql.html#371 `_ - - `PMYSQL_METHODS`:idx: - `mysql.html#367 `_ - - `PMYSQL_PARAMETERS`:idx: - `mysql.html#375 `_ - - `PMYSQL_RES`:idx: - `mysql.html#362 `_ - - `PMYSQL_ROW`:idx: - `mysql.html#298 `_ - - `PMYSQL_ROW_OFFSET`:idx: - `mysql.html#315 `_ - - `PMYSQL_ROWS`:idx: - `mysql.html#314 `_ - - `PMYSQL_STMT`:idx: - `mysql.html#364 `_ - - `Pmy_ulonglong`:idx: - `mysql.html#309 `_ - - `PNET`:idx: - `mysql.html#200 `_ - - `PNimrodNode`:idx: - `macros.html#111 `_ - - `PNimrodSymbol`:idx: - `macros.html#110 `_ - - `PNimrodType`:idx: - `macros.html#109 `_ - - `PNonTerminal`:idx: - `pegs.html#101 `_ - - `PObject`:idx: - `system.html#137 `_ - - `pointer`:idx: - `system.html#113 `_ - - `pointers`:idx: - * `manual.html#165 `_ - * `tut1.html#120 `_ - - `pop`:idx: - `system.html#477 `_ - - `port`:idx: - `httpserver.html#104 `_ - - `Positive`:idx: - `system.html#135 `_ - - `post`:idx: - `httpclient.html#108 `_ - - `postContent`:idx: - `httpclient.html#109 `_ - - `PostgreSQL`:idx: - `db_postgres.html#101 `_ - - `pow`:idx: - `math.html#132 `_ - - `PPByte`:idx: - `mysql.html#108 `_ - - `PPcurl_httppost`:idx: - `libcurl.html#109 `_ - - `PPPChar`:idx: - `sqlite3.html#174 `_ - - `PProcess`:idx: - `osproc.html#101 `_ - - `PPSqlite3`:idx: - `sqlite3.html#176 `_ - - `PPsqlite3_stmt`:idx: - `sqlite3.html#179 `_ - - `PPsqlite3_value`:idx: - `sqlite3.html#181 `_ - - `Prand_struct`:idx: - `mysql.html#253 `_ - - `pre`:idx: - `xmlgen.html#159 `_ - - `pred`:idx: - `system.html#170 `_ - - `PRI_KEY_FLAG`:idx: - `mysql.html#125 `_ - - `procedural type`:idx: - * `manual.html#168 `_ - * `tut1.html#123 `_ - - `procedures`:idx: - `manual.html#208 `_ - - `processedRows`:idx: - `parsecsv.html#107 `_ - - `processID`:idx: - `osproc.html#112 `_ - - `procvar`:idx: - `manual.html#235 `_ - - `programming by contracts`:idx: - `system.html#423 `_ - - `PRope`:idx: - `ropes.html#102 `_ - - `Psockaddr`:idx: - `mysql.html#250 `_ - - `Psqlite3`:idx: - `sqlite3.html#175 `_ - - `Psqlite3_context`:idx: - `sqlite3.html#177 `_ - - `Psqlite3_stmt`:idx: - `sqlite3.html#178 `_ - - `Psqlite3_value`:idx: - `sqlite3.html#180 `_ - - `PSqlNode`:idx: - `parsesql.html#104 `_ - - `Pst_dynamic_array`:idx: - `mysql.html#341 `_ - - `Pst_mem_root`:idx: - `mysql.html#323 `_ - - `Pst_mysql`:idx: - `mysql.html#355 `_ - - `Pst_mysql_bind`:idx: - `mysql.html#377 `_ - - `Pst_mysql_data`:idx: - `mysql.html#327 `_ - - `Pst_mysql_field`:idx: - `mysql.html#294 `_ - - `Pst_mysql_manager`:idx: - `mysql.html#368 `_ - - `Pst_mysql_methods`:idx: - `mysql.html#354 `_ - - `Pst_mysql_options`:idx: - `mysql.html#342 `_ - - `Pst_mysql_parameters`:idx: - `mysql.html#372 `_ - - `Pst_mysql_res`:idx: - `mysql.html#359 `_ - - `Pst_mysql_rows`:idx: - `mysql.html#311 `_ - - `Pst_mysql_stmt`:idx: - `mysql.html#363 `_ - - `Pst_net`:idx: - `mysql.html#197 `_ - - `PStream`:idx: - `streams.html#101 `_ - - `PStringStream`:idx: - `streams.html#115 `_ - - `PStringTable`:idx: - `strtabs.html#103 `_ - - `Pst_udf_args`:idx: - `mysql.html#257 `_ - - `Pst_udf_init`:idx: - `mysql.html#261 `_ - - `Pst_used_mem`:idx: - `mysql.html#319 `_ - - `PUDF_ARGS`:idx: - `mysql.html#260 `_ - - `PUDF_INIT`:idx: - `mysql.html#264 `_ - - `pure`:idx: - `manual.html#240 `_ - - `PUSED_MEM`:idx: - `mysql.html#322 `_ - - `push`:idx: - `math.html#134 `_ - - `push/pop`:idx: - `manual.html#245 `_ - - `putEnv`:idx: - `os.html#149 `_ - - `PVIO`:idx: - `mysql.html#103 `_ - - `PZipFileStream`:idx: - `zipfiles.html#108 `_ - - `q`:idx: - `xmlgen.html#160 `_ - - `Query`:idx: - * `db_postgres.html#109 `_ - * `db_mysql.html#109 `_ - - `QueryAffectedRows`:idx: - * `db_postgres.html#116 `_ - * `db_mysql.html#116 `_ - - `quit`:idx: - * `system.html#497 `_ - * `system.html#498 `_ - - `QuitFailure`:idx: - `system.html#496 `_ - - `QuitSuccess`:idx: - `system.html#495 `_ - - `quotation mark`:idx: - `manual.html#128 `_ - - `quoteIfContainsWhite`:idx: - `strutils.html#152 `_ - - `random`:idx: - `math.html#113 `_ - - `randominit`:idx: - `mysql.html#267 `_ - - `randomize`:idx: - `math.html#114 `_ - - `rand_struct`:idx: - `mysql.html#254 `_ - - `range`:idx: - `system.html#128 `_ - - `re-raised`:idx: - `manual.html#192 `_ - - `readBool`:idx: - `streams.html#106 `_ - - `readBuffer`:idx: - `system.html#528 `_ - - `ReadBytes`:idx: - `system.html#526 `_ - - `readChar`:idx: - * `system.html#512 `_ - * `streams.html#105 `_ - - `ReadChars`:idx: - `system.html#527 `_ - - `readData`:idx: - `cgi.html#109 `_ - - `readFile`:idx: - `system.html#514 `_ - - `readFloat32`:idx: - `streams.html#111 `_ - - `readFloat64`:idx: - `streams.html#112 `_ - - `readInt16`:idx: - `streams.html#108 `_ - - `readInt32`:idx: - `streams.html#109 `_ - - `readInt64`:idx: - `streams.html#110 `_ - - `readInt8`:idx: - `streams.html#107 `_ - - `readLine`:idx: - * `system.html#522 `_ - * `streams.html#114 `_ - - `readRow`:idx: - `parsecsv.html#108 `_ - - `readStr`:idx: - `streams.html#113 `_ - - `realloc`:idx: - `system.html#421 `_ - - `reBinary`:idx: - `regexprs.html#116 `_ - - `Recursive module dependencies`:idx: - `manual.html#228 `_ - - `reEmail`:idx: - `regexprs.html#119 `_ - - `reFloat`:idx: - `regexprs.html#118 `_ - - `REFRESH_DES_KEY_FILE`:idx: - `mysql.html#154 `_ - - `REFRESH_FAST`:idx: - `mysql.html#151 `_ - - `REFRESH_GRANT`:idx: - `mysql.html#142 `_ - - `REFRESH_HOSTS`:idx: - `mysql.html#145 `_ - - `REFRESH_LOG`:idx: - `mysql.html#143 `_ - - `REFRESH_MASTER`:idx: - `mysql.html#149 `_ - - `REFRESH_QUERY_CACHE`:idx: - `mysql.html#152 `_ - - `REFRESH_QUERY_CACHE_FREE`:idx: - `mysql.html#153 `_ - - `REFRESH_READ_LOCK`:idx: - `mysql.html#150 `_ - - `REFRESH_SLAVE`:idx: - `mysql.html#148 `_ - - `REFRESH_STATUS`:idx: - `mysql.html#146 `_ - - `REFRESH_TABLES`:idx: - `mysql.html#144 `_ - - `REFRESH_THREADS`:idx: - `mysql.html#147 `_ - - `REFRESH_USER_RESOURCES`:idx: - `mysql.html#155 `_ - - `register`:idx: - `manual.html#246 `_ - - `reHex`:idx: - `regexprs.html#115 `_ - - `reIdentifier`:idx: - `regexprs.html#112 `_ - - `reInteger`:idx: - `regexprs.html#114 `_ - - `removeDir`:idx: - `os.html#158 `_ - - `removeFile`:idx: - `os.html#144 `_ - - `reNatural`:idx: - `regexprs.html#113 `_ - - `renderSQL`:idx: - `parsesql.html#110 `_ - - `reOctal`:idx: - `regexprs.html#117 `_ - - `repeatChar`:idx: - `strutils.html#147 `_ - - `replace`:idx: - * `strutils.html#155 `_ - * `strutils.html#156 `_ - * `pegs.html#145 `_ - - `replaceStr`:idx: - * `strutils.html#122 `_ - * `strutils.html#123 `_ - - `repr`:idx: - `system.html#379 `_ - - `request`:idx: - `httpclient.html#105 `_ - - `ResetAttributes`:idx: - `terminal.html#110 `_ - - `result`:idx: - * `manual.html#199 `_ - * `manual.html#210 `_ - - `resume`:idx: - `osproc.html#109 `_ - - `return`:idx: - `manual.html#198 `_ - - `reURL`:idx: - `regexprs.html#120 `_ - - `rope`:idx: - * `ropes.html#101 `_ - * `ropes.html#104 `_ - * `ropes.html#105 `_ - * `ropes.html#106 `_ - - `round`:idx: - `math.html#121 `_ - - `Rows`:idx: - * `db_postgres.html#112 `_ - * `db_mysql.html#112 `_ - - `run`:idx: - `httpserver.html#107 `_ - - `runeAt`:idx: - `unicode.html#109 `_ - - `runeLen`:idx: - `unicode.html#106 `_ - - `runeLenAt`:idx: - `unicode.html#107 `_ - - `runes`:idx: - `unicode.html#119 `_ - - `running`:idx: - `osproc.html#111 `_ - - `safe`:idx: - `manual.html#112 `_ - - `safecall`:idx: - `manual.html#173 `_ - - `sameFile`:idx: - `os.html#140 `_ - - `sameFileContent`:idx: - `os.html#141 `_ - - `samp`:idx: - `xmlgen.html#161 `_ - - `scope`:idx: - * `manual.html#106 `_ - * `manual.html#229 `_ - - `scramble`:idx: - `mysql.html#278 `_ - - `scramble_323`:idx: - `mysql.html#272 `_ - - `SCRAMBLED_PASSWORD_CHAR_LENGTH`:idx: - `mysql.html#122 `_ - - `SCRAMBLED_PASSWORD_CHAR_LENGTH_323`:idx: - `mysql.html#123 `_ - - `SCRAMBLE_LENGTH`:idx: - `mysql.html#120 `_ - - `SCRAMBLE_LENGTH_323`:idx: - `mysql.html#121 `_ - - `script`:idx: - `xmlgen.html#162 `_ - - `ScriptExt`:idx: - `os.html#108 `_ - - `select`:idx: - `xmlgen.html#163 `_ - - `separate compilation`:idx: - * `manual.html#226 `_ - * `tut1.html#127 `_ - - `seq`:idx: - `system.html#131 `_ - - `sequence`:idx: - `pegs.html#109 `_ - - `Sequences`:idx: - * `manual.html#160 `_ - * `tut1.html#118 `_ - - `SERVER_MORE_RESULTS_EXISTS`:idx: - `mysql.html#178 `_ - - `SERVER_QUERY_NO_GOOD_INDEX_USED`:idx: - `mysql.html#179 `_ - - `SERVER_QUERY_NO_INDEX_USED`:idx: - `mysql.html#180 `_ - - `SERVER_STATUS_AUTOCOMMIT`:idx: - `mysql.html#176 `_ - - `SERVER_STATUS_CURSOR_EXISTS`:idx: - `mysql.html#181 `_ - - `SERVER_STATUS_DB_DROPPED`:idx: - `mysql.html#183 `_ - - `SERVER_STATUS_IN_TRANS`:idx: - `mysql.html#175 `_ - - `SERVER_STATUS_LAST_ROW_SENT`:idx: - `mysql.html#182 `_ - - `SERVER_STATUS_MORE_RESULTS`:idx: - `mysql.html#177 `_ - - `SERVER_STATUS_NO_BACKSLASH_ESCAPES`:idx: - `mysql.html#184 `_ - - `SERVER_VERSION_LENGTH`:idx: - `mysql.html#113 `_ - - `set`:idx: - `system.html#132 `_ - - `set type`:idx: - * `manual.html#164 `_ - * `tut1.html#116 `_ - - `setBackgroundColor`:idx: - `terminal.html#116 `_ - - `setCookie`:idx: - `cgi.html#145 `_ - - `setCurrentDir`:idx: - `os.html#121 `_ - - `setCursorPos`:idx: - `terminal.html#101 `_ - - `setCursorXPos`:idx: - `terminal.html#102 `_ - - `setCursorYPos`:idx: - `terminal.html#103 `_ - - `setFilePermissions`:idx: - `os.html#163 `_ - - `setFilePos`:idx: - `system.html#532 `_ - - `SET_FLAG`:idx: - `mysql.html#135 `_ - - `setForegroundColor`:idx: - `terminal.html#115 `_ - - `setLen`:idx: - * `system.html#364 `_ - * `system.html#365 `_ - - `setTestData`:idx: - `cgi.html#143 `_ - - `shl`:idx: - * `system.html#238 `_ - * `system.html#239 `_ - * `system.html#240 `_ - * `system.html#241 `_ - * `system.html#242 `_ - - `shr`:idx: - * `system.html#233 `_ - * `system.html#234 `_ - * `system.html#235 `_ - * `system.html#236 `_ - * `system.html#237 `_ - - `simple assertions`:idx: - `regexprs.html#103 `_ - - `simple statements`:idx: - `manual.html#183 `_ - - `sinh`:idx: - `math.html#129 `_ - - `sizeof`:idx: - `system.html#168 `_ - - `skip`:idx: - `parseutils.html#106 `_ - - `skipIgnoreCase`:idx: - `parseutils.html#107 `_ - - `skipWhitespace`:idx: - `parseutils.html#105 `_ - - `sleep`:idx: - `os.html#170 `_ - - `small`:idx: - `xmlgen.html#164 `_ - - `sockaddr`:idx: - `mysql.html#251 `_ - - `span`:idx: - `xmlgen.html#165 `_ - - `split`:idx: - * `strutils.html#126 `_ - * `strutils.html#127 `_ - * `strutils.html#133 `_ - * `strutils.html#134 `_ - * `pegs.html#148 `_ - * `pegs.html#149 `_ - - `splitFile`:idx: - `os.html#129 `_ - - `SplitFilename`:idx: - `os.html#133 `_ - - `splitLines`:idx: - * `strutils.html#128 `_ - * `strutils.html#132 `_ - - `splitLinesSeq`:idx: - `strutils.html#129 `_ - - `SplitPath`:idx: - * `os.html#125 `_ - * `os.html#126 `_ - - `splitSeq`:idx: - * `strutils.html#130 `_ - * `strutils.html#131 `_ - - `sql`:idx: - `db_postgres.html#106 `_ - - `sqlite3_aggregate_context`:idx: - `sqlite3.html#261 `_ - - `sqlite3_aggregate_count`:idx: - `sqlite3.html#249 `_ - - `sqlite3_bind_blob`:idx: - * `sqlite3.html#216 `_ - * `sqlite3.html#223 `_ - - `sqlite3_bind_double`:idx: - `sqlite3.html#217 `_ - - `sqlite3_bind_int`:idx: - `sqlite3.html#218 `_ - - `sqlite3_bind_int64`:idx: - `sqlite3.html#219 `_ - - `sqlite3_bind_null`:idx: - `sqlite3.html#220 `_ - - `sqlite3_bind_parameter_count`:idx: - `sqlite3.html#226 `_ - - `sqlite3_bind_parameter_index`:idx: - `sqlite3.html#228 `_ - - `sqlite3_bind_parameter_name`:idx: - `sqlite3.html#227 `_ - - `sqlite3_bind_text`:idx: - * `sqlite3.html#221 `_ - * `sqlite3.html#224 `_ - - `sqlite3_bind_text16`:idx: - * `sqlite3.html#222 `_ - * `sqlite3.html#225 `_ - - `sqlite3_busy_handler`:idx: - `sqlite3.html#198 `_ - - `sqlite3_busy_timeout`:idx: - `sqlite3.html#199 `_ - - `sqlite3_changes`:idx: - `sqlite3.html#193 `_ - - `sqlite3_close`:idx: - `sqlite3.html#190 `_ - - `sqlite3_collation_needed`:idx: - `sqlite3.html#279 `_ - - `sqlite3_collation_needed16`:idx: - `sqlite3.html#280 `_ - - `sqlite3_column_blob`:idx: - `sqlite3.html#236 `_ - - `sqlite3_column_bytes`:idx: - `sqlite3.html#237 `_ - - `sqlite3_column_bytes16`:idx: - `sqlite3.html#238 `_ - - `sqlite3_column_count`:idx: - `sqlite3.html#229 `_ - - `sqlite3_column_decltype`:idx: - `sqlite3.html#232 `_ - - `sqlite3_column_decltype16`:idx: - `sqlite3.html#233 `_ - - `sqlite3_column_double`:idx: - `sqlite3.html#239 `_ - - `sqlite3_column_int`:idx: - `sqlite3.html#240 `_ - - `sqlite3_column_int64`:idx: - `sqlite3.html#241 `_ - - `sqlite3_column_name`:idx: - `sqlite3.html#230 `_ - - `sqlite3_column_name16`:idx: - `sqlite3.html#231 `_ - - `sqlite3_column_text`:idx: - `sqlite3.html#242 `_ - - `sqlite3_column_text16`:idx: - `sqlite3.html#243 `_ - - `sqlite3_column_type`:idx: - `sqlite3.html#244 `_ - - `sqlite3_commit_hook`:idx: - `sqlite3.html#208 `_ - - `sqlite3_complete`:idx: - `sqlite3.html#196 `_ - - `sqlite3_complete16`:idx: - `sqlite3.html#197 `_ - - `sqlite3_create_collation`:idx: - `sqlite3.html#277 `_ - - `sqlite3_create_collation16`:idx: - `sqlite3.html#278 `_ - - `sqlite3_create_function`:idx: - `sqlite3.html#247 `_ - - `sqlite3_create_function16`:idx: - `sqlite3.html#248 `_ - - `sqlite3_data_count`:idx: - `sqlite3.html#235 `_ - - `sqlite3_errcode`:idx: - `sqlite3.html#211 `_ - - `sqlite3_errmsg`:idx: - `sqlite3.html#212 `_ - - `sqlite3_errmsg16`:idx: - `sqlite3.html#213 `_ - - `sqlite3_exec`:idx: - `sqlite3.html#191 `_ - - `sqlite3_finalize`:idx: - `sqlite3.html#245 `_ - - `sqlite3_free`:idx: - `sqlite3.html#203 `_ - - `sqlite3_free_table`:idx: - `sqlite3.html#201 `_ - - `sqlite3_get_auxdata`:idx: - `sqlite3.html#263 `_ - - `sqlite3_get_table`:idx: - `sqlite3.html#200 `_ - - `sqlite3_interrupt`:idx: - `sqlite3.html#195 `_ - - `sqlite3_last_insert_rowid`:idx: - `sqlite3.html#192 `_ - - `sqlite3_libversion`:idx: - `sqlite3.html#281 `_ - - `sqlite3_libversion_number`:idx: - `sqlite3.html#283 `_ - - `sqlite3_mprintf`:idx: - `sqlite3.html#202 `_ - - `sqlite3_open`:idx: - `sqlite3.html#209 `_ - - `sqlite3_open16`:idx: - `sqlite3.html#210 `_ - - `sqlite3_prepare`:idx: - `sqlite3.html#214 `_ - - `sqlite3_prepare16`:idx: - `sqlite3.html#215 `_ - - `sqlite3_progress_handler`:idx: - `sqlite3.html#207 `_ - - `sqlite3_reset`:idx: - `sqlite3.html#246 `_ - - `sqlite3_result_blob`:idx: - `sqlite3.html#265 `_ - - `sqlite3_result_double`:idx: - `sqlite3.html#266 `_ - - `sqlite3_result_error`:idx: - `sqlite3.html#267 `_ - - `sqlite3_result_error16`:idx: - `sqlite3.html#268 `_ - - `sqlite3_result_int`:idx: - `sqlite3.html#269 `_ - - `sqlite3_result_int64`:idx: - `sqlite3.html#270 `_ - - `sqlite3_result_null`:idx: - `sqlite3.html#271 `_ - - `sqlite3_result_text`:idx: - `sqlite3.html#272 `_ - - `sqlite3_result_text16`:idx: - `sqlite3.html#273 `_ - - `sqlite3_result_text16be`:idx: - `sqlite3.html#275 `_ - - `sqlite3_result_text16le`:idx: - `sqlite3.html#274 `_ - - `sqlite3_result_value`:idx: - `sqlite3.html#276 `_ - - `sqlite3_set_authorizer`:idx: - `sqlite3.html#205 `_ - - `sqlite3_set_auxdata`:idx: - `sqlite3.html#264 `_ - - `sqlite3_snprintf`:idx: - `sqlite3.html#204 `_ - - `sqlite3_step`:idx: - `sqlite3.html#234 `_ - - `SQLITE3_TEXT`:idx: - `sqlite3.html#106 `_ - - `sqlite3_total_changes`:idx: - `sqlite3.html#194 `_ - - `sqlite3_trace`:idx: - `sqlite3.html#206 `_ - - `sqlite3_user_data`:idx: - `sqlite3.html#262 `_ - - `sqlite3_value_blob`:idx: - `sqlite3.html#250 `_ - - `sqlite3_value_bytes`:idx: - `sqlite3.html#251 `_ - - `sqlite3_value_bytes16`:idx: - `sqlite3.html#252 `_ - - `sqlite3_value_double`:idx: - `sqlite3.html#253 `_ - - `sqlite3_value_int`:idx: - `sqlite3.html#254 `_ - - `sqlite3_value_int64`:idx: - `sqlite3.html#255 `_ - - `sqlite3_value_text`:idx: - `sqlite3.html#256 `_ - - `sqlite3_value_text16`:idx: - `sqlite3.html#257 `_ - - `sqlite3_value_text16be`:idx: - `sqlite3.html#259 `_ - - `sqlite3_value_text16le`:idx: - `sqlite3.html#258 `_ - - `sqlite3_value_type`:idx: - `sqlite3.html#260 `_ - - `sqlite3_version`:idx: - `sqlite3.html#282 `_ - - `SQLITE_ABORT`:idx: - `sqlite3.html#116 `_ - - `SQLITE_ALTER_TABLE`:idx: - `sqlite3.html#167 `_ - - `SQLITE_ANY`:idx: - `sqlite3.html#111 `_ - - `SQLITE_ATTACH`:idx: - `sqlite3.html#165 `_ - - `SQLITE_AUTH`:idx: - `sqlite3.html#135 `_ - - `SQLITE_BLOB`:idx: - `sqlite3.html#103 `_ - - `SQLITE_BUSY`:idx: - `sqlite3.html#117 `_ - - `SQLITE_CANTOPEN`:idx: - `sqlite3.html#126 `_ - - `SQLITE_CONSTRAINT`:idx: - `sqlite3.html#131 `_ - - `SQLITE_COPY`:idx: - `sqlite3.html#141 `_ - - `SQLITE_CORRUPT`:idx: - `sqlite3.html#123 `_ - - `SQLITE_CREATE_INDEX`:idx: - `sqlite3.html#142 `_ - - `SQLITE_CREATE_TABLE`:idx: - `sqlite3.html#143 `_ - - `SQLITE_CREATE_TEMP_INDEX`:idx: - `sqlite3.html#144 `_ - - `SQLITE_CREATE_TEMP_TABLE`:idx: - `sqlite3.html#145 `_ - - `SQLITE_CREATE_TEMP_TRIGGER`:idx: - `sqlite3.html#146 `_ - - `SQLITE_CREATE_TEMP_VIEW`:idx: - `sqlite3.html#147 `_ - - `SQLITE_CREATE_TRIGGER`:idx: - `sqlite3.html#148 `_ - - `SQLITE_CREATE_VIEW`:idx: - `sqlite3.html#149 `_ - - `SQLITE_DELETE`:idx: - `sqlite3.html#150 `_ - - `SQLITE_DENY`:idx: - `sqlite3.html#169 `_ - - `SQLITE_DETACH`:idx: - `sqlite3.html#166 `_ - - `SQLITE_DONE`:idx: - `sqlite3.html#140 `_ - - `SQLITE_DROP_INDEX`:idx: - `sqlite3.html#151 `_ - - `SQLITE_DROP_TABLE`:idx: - `sqlite3.html#152 `_ - - `SQLITE_DROP_TEMP_INDEX`:idx: - `sqlite3.html#153 `_ - - `SQLITE_DROP_TEMP_TABLE`:idx: - `sqlite3.html#154 `_ - - `SQLITE_DROP_TEMP_TRIGGER`:idx: - `sqlite3.html#155 `_ - - `SQLITE_DROP_TEMP_VIEW`:idx: - `sqlite3.html#156 `_ - - `SQLITE_DROP_TRIGGER`:idx: - `sqlite3.html#157 `_ - - `SQLITE_DROP_VIEW`:idx: - `sqlite3.html#158 `_ - - `SQLITE_EMPTY`:idx: - `sqlite3.html#128 `_ - - `SQLITE_ERROR`:idx: - `sqlite3.html#113 `_ - - `SQLITE_FLOAT`:idx: - `sqlite3.html#102 `_ - - `SQLITE_FORMAT`:idx: - `sqlite3.html#136 `_ - - `SQLITE_FULL`:idx: - `sqlite3.html#125 `_ - - `SQLITE_IGNORE`:idx: - `sqlite3.html#170 `_ - - `SQLITE_INSERT`:idx: - `sqlite3.html#159 `_ - - `sqlite_int64`:idx: - `sqlite3.html#173 `_ - - `SQLITE_INTEGER`:idx: - `sqlite3.html#101 `_ - - `SQLITE_INTERNAL`:idx: - `sqlite3.html#114 `_ - - `SQLITE_INTERRUPT`:idx: - `sqlite3.html#121 `_ - - `SQLITE_IOERR`:idx: - `sqlite3.html#122 `_ - - `SQLITE_LOCKED`:idx: - `sqlite3.html#118 `_ - - `SQLITE_MISMATCH`:idx: - `sqlite3.html#132 `_ - - `SQLITE_MISUSE`:idx: - `sqlite3.html#133 `_ - - `SQLITE_NOLFS`:idx: - `sqlite3.html#134 `_ - - `SQLITE_NOMEM`:idx: - `sqlite3.html#119 `_ - - `SQLITE_NOTADB`:idx: - `sqlite3.html#138 `_ - - `SQLITE_NOTFOUND`:idx: - `sqlite3.html#124 `_ - - `SQLITE_NULL`:idx: - `sqlite3.html#104 `_ - - `SQLITE_OK`:idx: - `sqlite3.html#112 `_ - - `SQLITE_PERM`:idx: - `sqlite3.html#115 `_ - - `SQLITE_PRAGMA`:idx: - `sqlite3.html#160 `_ - - `SQLITE_PROTOCOL`:idx: - `sqlite3.html#127 `_ - - `SQLITE_RANGE`:idx: - `sqlite3.html#137 `_ - - `SQLITE_READ`:idx: - `sqlite3.html#161 `_ - - `SQLITE_READONLY`:idx: - `sqlite3.html#120 `_ - - `SQLITE_REINDEX`:idx: - `sqlite3.html#168 `_ - - `SQLITE_ROW`:idx: - `sqlite3.html#139 `_ - - `SQLITE_SCHEMA`:idx: - `sqlite3.html#129 `_ - - `SQLITE_SELECT`:idx: - `sqlite3.html#162 `_ - - `SQLITE_STATIC`:idx: - `sqlite3.html#171 `_ - - `SQLITE_TEXT`:idx: - `sqlite3.html#105 `_ - - `SQLITE_TOOBIG`:idx: - `sqlite3.html#130 `_ - - `SQLITE_TRANSACTION`:idx: - `sqlite3.html#163 `_ - - `SQLITE_TRANSIENT`:idx: - `sqlite3.html#172 `_ - - `SQLITE_UPDATE`:idx: - `sqlite3.html#164 `_ - - `SQLITE_UTF16`:idx: - `sqlite3.html#110 `_ - - `SQLITE_UTF16BE`:idx: - `sqlite3.html#109 `_ - - `SQLITE_UTF16LE`:idx: - `sqlite3.html#108 `_ - - `SQLITE_UTF8`:idx: - `sqlite3.html#107 `_ - - `SQLSTATE_LENGTH`:idx: - `mysql.html#114 `_ - - `sqrt`:idx: - * `math.html#115 `_ - * `complex.html#109 `_ - - `stackTrace`:idx: - `nimrodc.html#104 `_ - - `standardDeviation`:idx: - `math.html#136 `_ - - `startProcess`:idx: - `osproc.html#107 `_ - - `startsWith`:idx: - * `strutils.html#148 `_ - * `pegs.html#143 `_ - - `statement macros`:idx: - `tut2.html#112 `_ - - `Statements`:idx: - `manual.html#182 `_ - - `static error`:idx: - `manual.html#109 `_ - - `static type`:idx: - `manual.html#103 `_ - - `stdcall`:idx: - `manual.html#171 `_ - - `stderr`:idx: - `system.html#504 `_ - - `stdin`:idx: - `system.html#502 `_ - - `stdout`:idx: - `system.html#503 `_ - - `st_dynamic_array`:idx: - `mysql.html#339 `_ - - `st_mem_root`:idx: - `mysql.html#324 `_ - - `stmt`:idx: - `system.html#116 `_ - - `st_mysql`:idx: - `mysql.html#356 `_ - - `st_mysql_bind`:idx: - `mysql.html#378 `_ - - `st_mysql_data`:idx: - `mysql.html#328 `_ - - `st_mysql_field`:idx: - `mysql.html#295 `_ - - `st_mysql_manager`:idx: - `mysql.html#369 `_ - - `st_mysql_methods`:idx: - `mysql.html#365 `_ - - `st_mysql_options`:idx: - `mysql.html#343 `_ - - `st_mysql_parameters`:idx: - `mysql.html#373 `_ - - `st_mysql_res`:idx: - `mysql.html#360 `_ - - `st_mysql_rows`:idx: - `mysql.html#312 `_ - - `st_mysql_stmt`:idx: - `mysql.html#381 `_ - - `st_net`:idx: - `mysql.html#198 `_ - - `string`:idx: - * `manual.html#157 `_ - * `system.html#111 `_ - - `string interpolation`:idx: - `strutils.html#108 `_ - - `String literals`:idx: - `manual.html#119 `_ - - `strip`:idx: - `strutils.html#112 `_ - - `strong`:idx: - `xmlgen.html#166 `_ - - `structured type`:idx: - `manual.html#158 `_ - - `strVal`:idx: - `macros.html#128 `_ - - `strVal=`:idx: - `macros.html#134 `_ - - `st_udf_args`:idx: - `mysql.html#258 `_ - - `st_udf_init`:idx: - `mysql.html#262 `_ - - `st_used_mem`:idx: - `mysql.html#320 `_ - - `style`:idx: - `xmlgen.html#167 `_ - - `style-insensitive`:idx: - `manual.html#118 `_ - - `sub`:idx: - `xmlgen.html#168 `_ - - `subrange`:idx: - * `manual.html#156 `_ - * `tut1.html#115 `_ - - `substitution`:idx: - `strutils.html#107 `_ - - `succ`:idx: - `system.html#169 `_ - - `sum`:idx: - `math.html#110 `_ - - `sup`:idx: - `xmlgen.html#169 `_ - - `suspend`:idx: - `osproc.html#108 `_ - - `swap`:idx: - `system.html#425 `_ - - `symAddr`:idx: - `dynlib.html#104 `_ - - `symbol`:idx: - `macros.html#125 `_ - - `symbol=`:idx: - `macros.html#131 `_ - - `syscall`:idx: - `manual.html#178 `_ - - `system`:idx: - `manual.html#230 `_ - - `table`:idx: - `xmlgen.html#170 `_ - - `tabulator`:idx: - `manual.html#125 `_ - - `TAddress`:idx: - `system.html#380 `_ - - `tan`:idx: - `math.html#130 `_ - - `tanh`:idx: - `math.html#131 `_ - - `TBackgroundColor`:idx: - `terminal.html#114 `_ - - `TBaseLexer`:idx: - `lexbase.html#103 `_ - - `Tbind_destructor_func`:idx: - `sqlite3.html#183 `_ - - `tbody`:idx: - `xmlgen.html#171 `_ - - `TCfgEvent`:idx: - `parsecfg.html#102 `_ - - `TCfgEventKind`:idx: - `parsecfg.html#101 `_ - - `TCfgParser`:idx: - `parsecfg.html#103 `_ - - `TCharSet`:idx: - `strutils.html#101 `_ - - `TCmdLineKind`:idx: - `parseopt.html#101 `_ - - `TComplex`:idx: - `complex.html#101 `_ - - `Tcreate_function_final_func`:idx: - `sqlite3.html#186 `_ - - `Tcreate_function_func_func`:idx: - `sqlite3.html#185 `_ - - `Tcreate_function_step_func`:idx: - `sqlite3.html#184 `_ - - `TCsvParser`:idx: - `parsecsv.html#104 `_ - - `TCsvRow`:idx: - `parsecsv.html#103 `_ - - `TCurl`:idx: - `libcurl.html#140 `_ - - `Tcurl_calloc_callback`:idx: - `libcurl.html#153 `_ - - `Tcurl_closepolicy`:idx: - `libcurl.html#174 `_ - - `TCURLcode`:idx: - `libcurl.html#156 `_ - - `Tcurl_conv_callback`:idx: - `libcurl.html#157 `_ - - `Tcurl_debug_callback`:idx: - `libcurl.html#155 `_ - - `TCURLFORMcode`:idx: - `libcurl.html#170 `_ - - `Tcurl_formget_callback`:idx: - `libcurl.html#171 `_ - - `TCURLformoption`:idx: - `libcurl.html#168 `_ - - `Tcurl_forms`:idx: - `libcurl.html#169 `_ - - `Tcurl_free_callback`:idx: - `libcurl.html#150 `_ - - `Tcurl_ftpauth`:idx: - `libcurl.html#161 `_ - - `Tcurl_ftpmethod`:idx: - `libcurl.html#162 `_ - - `Tcurl_ftpssl`:idx: - `libcurl.html#160 `_ - - `Tcurl_httppost`:idx: - `libcurl.html#141 `_ - - `TCURL_HTTP_VERSION`:idx: - `libcurl.html#164 `_ - - `TCURLINFO`:idx: - `libcurl.html#173 `_ - - `Tcurl_infotype`:idx: - `libcurl.html#154 `_ - - `Tcurliocmd`:idx: - `libcurl.html#147 `_ - - `Tcurl_ioctl_callback`:idx: - `libcurl.html#148 `_ - - `Tcurlioerr`:idx: - `libcurl.html#146 `_ - - `Tcurl_lock_access`:idx: - `libcurl.html#176 `_ - - `Tcurl_lock_data`:idx: - `libcurl.html#175 `_ - - `Tcurl_lock_function`:idx: - `libcurl.html#177 `_ - - `TCURLM`:idx: - `libcurl.html#184 `_ - - `Tcurl_malloc_callback`:idx: - `libcurl.html#149 `_ - - `TCURLMcode`:idx: - `libcurl.html#186 `_ - - `TCURLMoption`:idx: - `libcurl.html#190 `_ - - `TCURLMsg`:idx: - `libcurl.html#188 `_ - - `TCURLMSGEnum`:idx: - `libcurl.html#187 `_ - - `TCURL_NETRC_OPTION`:idx: - `libcurl.html#165 `_ - - `TCURLoption`:idx: - `libcurl.html#163 `_ - - `Tcurl_passwd_callback`:idx: - `libcurl.html#145 `_ - - `Tcurl_progress_callback`:idx: - `libcurl.html#142 `_ - - `Tcurl_proxytype`:idx: - `libcurl.html#159 `_ - - `Tcurl_read_callback`:idx: - `libcurl.html#144 `_ - - `Tcurl_realloc_callback`:idx: - `libcurl.html#151 `_ - - `TCURLSH`:idx: - `libcurl.html#179 `_ - - `TCURLSHcode`:idx: - `libcurl.html#180 `_ - - `TCURLSHoption`:idx: - `libcurl.html#181 `_ - - `Tcurl_slist`:idx: - `libcurl.html#172 `_ - - `Tcurl_socket`:idx: - `libcurl.html#185 `_ - - `Tcurl_socket_callback`:idx: - `libcurl.html#189 `_ - - `Tcurl_ssl_ctx_callback`:idx: - `libcurl.html#158 `_ - - `TCURL_SSL_VERSION`:idx: - `libcurl.html#166 `_ - - `Tcurl_strdup_callback`:idx: - `libcurl.html#152 `_ - - `TCURL_TIMECOND`:idx: - `libcurl.html#167 `_ - - `Tcurl_unlock_function`:idx: - `libcurl.html#178 `_ - - `TCURLversion`:idx: - `libcurl.html#182 `_ - - `Tcurl_version_info_data`:idx: - `libcurl.html#183 `_ - - `Tcurl_write_callback`:idx: - `libcurl.html#143 `_ - - `td`:idx: - `xmlgen.html#172 `_ - - `TDbConn`:idx: - * `db_postgres.html#102 `_ - * `db_mysql.html#102 `_ - - `template`:idx: - `manual.html#220 `_ - - `TEndian`:idx: - `system.html#393 `_ - - `term`:idx: - * `pegs.html#103 `_ - * `pegs.html#106 `_ - - `termIgnoreCase`:idx: - `pegs.html#104 `_ - - `termIgnoreStyle`:idx: - `pegs.html#105 `_ - - `terminate`:idx: - `osproc.html#110 `_ - - `textarea`:idx: - `xmlgen.html#173 `_ - - `TFile`:idx: - `system.html#499 `_ - - `TFileHandle`:idx: - `system.html#501 `_ - - `TFileMode`:idx: - `system.html#500 `_ - - `TFilePermission`:idx: - `os.html#161 `_ - - `TFileStream`:idx: - `streams.html#119 `_ - - `TFloatClass`:idx: - `math.html#103 `_ - - `tfoot`:idx: - `xmlgen.html#174 `_ - - `TForegroundColor`:idx: - `terminal.html#113 `_ - - `TFormatFlag`:idx: - `strtabs.html#111 `_ - - `TGC_Strategy`:idx: - `system.html#482 `_ - - `th`:idx: - `xmlgen.html#175 `_ - - `THash`:idx: - `hashes.html#101 `_ - - `thead`:idx: - `xmlgen.html#176 `_ - - `THttpMethod`:idx: - `httpclient.html#104 `_ - - `TimeInfoToTime`:idx: - `times.html#108 `_ - - `TIMESTAMP_FLAG`:idx: - `mysql.html#134 `_ - - `title`:idx: - `xmlgen.html#177 `_ - - `TLibHandle`:idx: - `dynlib.html#101 `_ - - `TMonth`:idx: - `times.html#101 `_ - - `TNimNodeKinds`:idx: - `macros.html#103 `_ - - `TNimrodIdent`:idx: - `macros.html#108 `_ - - `TNimrodNodeKind`:idx: - `macros.html#102 `_ - - `TNimrodSymKind`:idx: - `macros.html#106 `_ - - `TNimrodTypeKind`:idx: - `macros.html#104 `_ - - `TNimSymKinds`:idx: - `macros.html#107 `_ - - `TNimTypeKinds`:idx: - `macros.html#105 `_ - - `toBiggestFloat`:idx: - `system.html#409 `_ - - `toBiggestInt`:idx: - `system.html#411 `_ - - `toBin`:idx: - `strutils.html#161 `_ - - `TObject`:idx: - `system.html#136 `_ - - `toFloat`:idx: - `system.html#408 `_ - - `toHex`:idx: - `strutils.html#140 `_ - - `toInt`:idx: - `system.html#410 `_ - - `toLower`:idx: - * `strutils.html#113 `_ - * `strutils.html#114 `_ - * `unicode.html#111 `_ - - `toOct`:idx: - `strutils.html#160 `_ - - `toOctal`:idx: - `strutils.html#125 `_ - - `TOptParser`:idx: - `parseopt.html#102 `_ - - `toString`:idx: - `strutils.html#146 `_ - - `toStrLit`:idx: - `macros.html#146 `_ - - `toTitle`:idx: - `unicode.html#113 `_ - - `toU16`:idx: - `system.html#191 `_ - - `toU32`:idx: - `system.html#192 `_ - - `toU8`:idx: - `system.html#190 `_ - - `toUpper`:idx: - * `strutils.html#115 `_ - * `strutils.html#116 `_ - * `unicode.html#112 `_ - - `toUTF8`:idx: - `unicode.html#110 `_ - - `TPathComponent`:idx: - `os.html#153 `_ - - `TPeg`:idx: - `pegs.html#102 `_ - - `TProcessOption`:idx: - `osproc.html#102 `_ - - `tr`:idx: - `xmlgen.html#178 `_ - - `traced`:idx: - * `manual.html#166 `_ - * `tut1.html#121 `_ - - `transformFile`:idx: - `pegs.html#147 `_ - - `TRequestMethod`:idx: - `cgi.html#105 `_ - - `TResponse`:idx: - `httpclient.html#101 `_ - - `TResult`:idx: - `system.html#167 `_ - - `TRow`:idx: - * `db_postgres.html#103 `_ - * `db_mysql.html#103 `_ - - `TRune`:idx: - `unicode.html#101 `_ - - `TRune16`:idx: - `unicode.html#102 `_ - - `TRunningStat`:idx: - `math.html#133 `_ - - `try`:idx: - * `manual.html#194 `_ - * `tut2.html#108 `_ - - `TryInsertID`:idx: - * `db_postgres.html#114 `_ - * `db_mysql.html#114 `_ - - `TryQuery`:idx: - * `db_postgres.html#108 `_ - * `db_mysql.html#108 `_ - - `TServer`:idx: - `httpserver.html#102 `_ - - `Tsqlite3_callback`:idx: - `sqlite3.html#182 `_ - - `Tsqlite3_collation_needed_func`:idx: - `sqlite3.html#189 `_ - - `Tsqlite3_create_collation_func`:idx: - `sqlite3.html#188 `_ - - `Tsqlite3_result_func`:idx: - `sqlite3.html#187 `_ - - `TSqlLexer`:idx: - `parsesql.html#101 `_ - - `TSqlNode`:idx: - `parsesql.html#105 `_ - - `TSqlNodeKind`:idx: - `parsesql.html#102 `_ - - `TSqlParser`:idx: - `parsesql.html#106 `_ - - `TSqlQuery`:idx: - * `db_postgres.html#105 `_ - * `db_mysql.html#105 `_ - - `TStream`:idx: - `streams.html#102 `_ - - `TStringStream`:idx: - `streams.html#116 `_ - - `TStringTable`:idx: - `strtabs.html#102 `_ - - `TStringTableMode`:idx: - `strtabs.html#101 `_ - - `TStyle`:idx: - `terminal.html#111 `_ - - `tt`:idx: - `xmlgen.html#179 `_ - - `TTime`:idx: - `times.html#103 `_ - - `TTimeInfo`:idx: - `times.html#104 `_ - - `tuple`:idx: - `manual.html#161 `_ - - `tuple unpacking`:idx: - `manual.html#212 `_ - - `TWeekDay`:idx: - `times.html#102 `_ - - `TXmlError`:idx: - `parsexml.html#104 `_ - - `TXmlEventKind`:idx: - `parsexml.html#103 `_ - - `TXmlParseOption`:idx: - `parsexml.html#105 `_ - - `TXmlParser`:idx: - `parsexml.html#106 `_ - - `typ`:idx: - `macros.html#127 `_ - - `typ=`:idx: - `macros.html#133 `_ - - `type`:idx: - * `manual.html#102 `_ - * `manual.html#141 `_ - * `manual.html#217 `_ - - `type casts`:idx: - `tut2.html#101 `_ - - `type conversions`:idx: - `tut2.html#102 `_ - - `type parameters`:idx: - * `manual.html#219 `_ - * `tut2.html#110 `_ - - `type suffix`:idx: - `manual.html#138 `_ - - `typeDesc`:idx: - `system.html#117 `_ - - `TZipArchive`:idx: - `zipfiles.html#101 `_ - - `UDF_ARGS`:idx: - `mysql.html#259 `_ - - `UDF_INIT`:idx: - `mysql.html#263 `_ - - `ul`:idx: - `xmlgen.html#180 `_ - - `unchecked runtime error`:idx: - `manual.html#111 `_ - - `UNIQUE_FLAG`:idx: - `mysql.html#140 `_ - - `UNIQUE_KEY_FLAG`:idx: - `mysql.html#126 `_ - - `units`:idx: - `manual.html#181 `_ - - `unixTimeToWinTime`:idx: - `times.html#117 `_ - - `UnixToNativePath`:idx: - `os.html#113 `_ - - `UnloadLib`:idx: - `dynlib.html#103 `_ - - `unsigned integer`:idx: - * `manual.html#143 `_ - * `tut1.html#108 `_ - - `unsigned operations`:idx: - * `manual.html#144 `_ - * `tut1.html#109 `_ - - `UNSIGNED_FLAG`:idx: - `mysql.html#129 `_ - - `untraced`:idx: - * `manual.html#167 `_ - * `tut1.html#122 `_ - - `URLdecode`:idx: - `cgi.html#102 `_ - - `URLencode`:idx: - `cgi.html#101 `_ - - `URLretrieveStream`:idx: - `web.html#101 `_ - - `URLretrieveString`:idx: - `web.html#102 `_ - - `USED_MEM`:idx: - `mysql.html#321 `_ - - `USERNAME_LENGTH`:idx: - `mysql.html#112 `_ - - `validateData`:idx: - `cgi.html#110 `_ - - `validEmailAddress`:idx: - `strutils.html#163 `_ - - `validIdentifier`:idx: - `strutils.html#164 `_ - - `var`:idx: - `xmlgen.html#181 `_ - - `Var`:idx: - `manual.html#187 `_ - - `varargs`:idx: - `manual.html#251 `_ - - `variance`:idx: - * `math.html#112 `_ - * `math.html#135 `_ - - `variant`:idx: - * `manual.html#163 `_ - * `tut2.html#103 `_ - - `verbose`:idx: - `regexprs.html#121 `_ - - `vertical tabulator`:idx: - `manual.html#126 `_ - - `volatile`:idx: - `nimrodc.html#107 `_ - - `waitForExit`:idx: - `osproc.html#113 `_ - - `walkDir`:idx: - `os.html#156 `_ - - `walkDirRec`:idx: - `os.html#157 `_ - - `walkFiles`:idx: - * `os.html#152 `_ - * `zipfiles.html#110 `_ - - `warning`:idx: - * `manual.html#232 `_ - * `manual.html#243 `_ - * `macros.html#139 `_ - - `when`:idx: - * `manual.html#191 `_ - * `tut1.html#106 `_ - - `while`:idx: - `manual.html#203 `_ - - `whitespace`:idx: - `pegs.html#127 `_ - - `Whitespace`:idx: - `strutils.html#102 `_ - - `winTimeToUnixTime`:idx: - `times.html#118 `_ - - `write`:idx: - * `system.html#515 `_ - * `system.html#516 `_ - * `system.html#517 `_ - * `system.html#518 `_ - * `system.html#519 `_ - * `system.html#520 `_ - * `system.html#521 `_ - * `streams.html#103 `_ - * `streams.html#104 `_ - * `ropes.html#118 `_ - - `writeBuffer`:idx: - `system.html#531 `_ - - `writeBytes`:idx: - `system.html#529 `_ - - `writeChars`:idx: - `system.html#530 `_ - - `writeContentType`:idx: - `cgi.html#144 `_ - - `writeln`:idx: - * `system.html#523 `_ - * `system.html#524 `_ - - `WriteStyled`:idx: - `terminal.html#112 `_ - - `wwwNL`:idx: - `httpserver.html#101 `_ - - `XML`:idx: - * `parsexml.html#101 `_ - * `xmlgen.html#101 `_ - - `xmlCheckedTag`:idx: - `xmlgen.html#106 `_ - - `XMLencode`:idx: - `cgi.html#103 `_ - - `xor`:idx: - * `system.html#123 `_ - * `system.html#253 `_ - * `system.html#254 `_ - * `system.html#255 `_ - * `system.html#256 `_ - * `system.html#257 `_ - - `yield`:idx: - `manual.html#200 `_ - - `ze`:idx: - * `system.html#184 `_ - * `system.html#185 `_ - - `ze64`:idx: - * `system.html#186 `_ - * `system.html#187 `_ - * `system.html#188 `_ - * `system.html#189 `_ - - `ZEROFILL_FLAG`:idx: - `mysql.html#130 `_ - - `zeroMem`:idx: - `system.html#415 `_ \ No newline at end of file + +===== +Index +===== + +.. index:: + + + `!`:idx: + * `pegs.html#116 `_ + * `macros.html#114 `_ + + `!=`:idx: + `system.html#353 `_ + + `$`:idx: + * `sockets.html#111 `_ + * `system.html#429 `_ + * `system.html#430 `_ + * `system.html#431 `_ + * `system.html#432 `_ + * `system.html#433 `_ + * `system.html#434 `_ + * `system.html#435 `_ + * `system.html#436 `_ + * `times.html#109 `_ + * `times.html#110 `_ + * `pegs.html#136 `_ + * `macros.html#115 `_ + * `ropes.html#119 `_ + * `xmldom.html#206 `_ + * `xmltree.html#125 `_ + * `colors.html#248 `_ + + `%`:idx: + * `strutils.html#109 `_ + * `strutils.html#110 `_ + * `strtabs.html#112 `_ + * `ropes.html#120 `_ + + `%%`:idx: + * `system.html#298 `_ + * `system.html#299 `_ + * `system.html#300 `_ + * `system.html#301 `_ + * `system.html#302 `_ + + `&`:idx: + * `system.html#367 `_ + * `system.html#368 `_ + * `system.html#369 `_ + * `system.html#370 `_ + * `system.html#472 `_ + * `system.html#473 `_ + * `system.html#474 `_ + * `pegs.html#115 `_ + * `ropes.html#109 `_ + * `ropes.html#110 `_ + * `ropes.html#111 `_ + * `ropes.html#112 `_ + + `*`:idx: + * `system.html#218 `_ + * `system.html#219 `_ + * `system.html#220 `_ + * `system.html#221 `_ + * `system.html#222 `_ + * `system.html#317 `_ + * `system.html#325 `_ + * `complex.html#107 `_ + * `pegs.html#112 `_ + + `*%`:idx: + * `system.html#288 `_ + * `system.html#289 `_ + * `system.html#290 `_ + * `system.html#291 `_ + * `system.html#292 `_ + + `+`:idx: + * `system.html#193 `_ + * `system.html#194 `_ + * `system.html#195 `_ + * `system.html#196 `_ + * `system.html#197 `_ + * `system.html#208 `_ + * `system.html#209 `_ + * `system.html#210 `_ + * `system.html#211 `_ + * `system.html#212 `_ + * `system.html#313 `_ + * `system.html#315 `_ + * `system.html#326 `_ + * `complex.html#103 `_ + * `pegs.html#114 `_ + * `colors.html#103 `_ + + `+%`:idx: + * `system.html#278 `_ + * `system.html#279 `_ + * `system.html#280 `_ + * `system.html#281 `_ + * `system.html#282 `_ + + `-`:idx: + * `system.html#198 `_ + * `system.html#199 `_ + * `system.html#200 `_ + * `system.html#201 `_ + * `system.html#202 `_ + * `system.html#213 `_ + * `system.html#214 `_ + * `system.html#215 `_ + * `system.html#216 `_ + * `system.html#217 `_ + * `system.html#314 `_ + * `system.html#316 `_ + * `system.html#327 `_ + * `complex.html#104 `_ + * `complex.html#105 `_ + * `times.html#113 `_ + * `colors.html#104 `_ + + `-%`:idx: + * `system.html#283 `_ + * `system.html#284 `_ + * `system.html#285 `_ + * `system.html#286 `_ + * `system.html#287 `_ + + `-+-`:idx: + `system.html#328 `_ + + `/`:idx: + * `system.html#318 `_ + * `system.html#412 `_ + * `os.html#124 `_ + * `complex.html#106 `_ + * `pegs.html#109 `_ + + `/%`:idx: + * `system.html#293 `_ + * `system.html#294 `_ + * `system.html#295 `_ + * `system.html#296 `_ + * `system.html#297 `_ + + `/../`:idx: + `os.html#128 `_ + + `<`:idx: + * `system.html#268 `_ + * `system.html#269 `_ + * `system.html#270 `_ + * `system.html#271 `_ + * `system.html#272 `_ + * `system.html#321 `_ + * `system.html#345 `_ + * `system.html#346 `_ + * `system.html#347 `_ + * `system.html#348 `_ + * `system.html#349 `_ + * `system.html#350 `_ + * `system.html#351 `_ + * `system.html#352 `_ + * `times.html#114 `_ + + `<%`:idx: + * `system.html#308 `_ + * `system.html#309 `_ + * `system.html#310 `_ + * `system.html#311 `_ + * `system.html#312 `_ + + `<%`:idx: + `unicode.html#104 `_ + + `<=`:idx: + * `system.html#263 `_ + * `system.html#264 `_ + * `system.html#265 `_ + * `system.html#266 `_ + * `system.html#267 `_ + * `system.html#320 `_ + * `system.html#338 `_ + * `system.html#339 `_ + * `system.html#340 `_ + * `system.html#341 `_ + * `system.html#342 `_ + * `system.html#343 `_ + * `system.html#344 `_ + + `<=`:idx: + `times.html#115 `_ + + `<=%`:idx: + * `system.html#303 `_ + * `system.html#304 `_ + * `system.html#305 `_ + * `system.html#306 `_ + * `system.html#307 `_ + + `<=%`:idx: + `unicode.html#103 `_ + + `<>`:idx: + `xmltree.html#127 `_ + + `==`:idx: + * `md5.html#107 `_ + * `sockets.html#109 `_ + * `sockets.html#110 `_ + * `system.html#258 `_ + * `system.html#259 `_ + * `system.html#260 `_ + * `system.html#261 `_ + * `system.html#262 `_ + * `system.html#319 `_ + * `system.html#329 `_ + * `system.html#330 `_ + * `system.html#331 `_ + * `system.html#332 `_ + * `system.html#333 `_ + * `system.html#334 `_ + * `system.html#335 `_ + * `system.html#336 `_ + * `system.html#337 `_ + * `system.html#475 `_ + * `complex.html#102 `_ + * `unicode.html#105 `_ + * `macros.html#116 `_ + * `macros.html#117 `_ + * `colors.html#102 `_ + + `=~`:idx: + `regexprs.html#111 `_ + + `=~`:idx: + `pegs.html#143 `_ + + `=~`:idx: + `re.html#115 `_ + + `>`:idx: + `system.html#355 `_ + + `>%`:idx: + `system.html#428 `_ + + `>=`:idx: + `system.html#354 `_ + + `>=%`:idx: + `system.html#427 `_ + + `?`:idx: + `pegs.html#111 `_ + + `@`:idx: + * `system.html#363 `_ + * `pegs.html#113 `_ + + `[,]`:idx: + `graphics.html#112 `_ + + `[,]=`:idx: + `graphics.html#114 `_ + + `[]`:idx: + `strtabs.html#107 `_ + + `[]`:idx: + `macros.html#112 `_ + + `[]`:idx: + `ropes.html#115 `_ + + `[]`:idx: + `xmltree.html#114 `_ + + `[]`:idx: + `graphics.html#111 `_ + + `[]=`:idx: + `strtabs.html#106 `_ + + `[]=`:idx: + `macros.html#113 `_ + + `[]=`:idx: + `graphics.html#113 `_ + + `[ESC]`:idx: + `manual.html#134 `_ + + `a`:idx: + `xmlgen.html#107 `_ + + `abs`:idx: + * `system.html#273 `_ + * `system.html#274 `_ + * `system.html#275 `_ + * `system.html#276 `_ + * `system.html#277 `_ + * `system.html#322 `_ + * `complex.html#108 `_ + + `accept`:idx: + `sockets.html#120 `_ + + `accumulateResult`:idx: + `system.html#494 `_ + + `acronym`:idx: + `xmlgen.html#108 `_ + + `acyclic`:idx: + `manual.html#238 `_ + + `add`:idx: + * `system.html#371 `_ + * `system.html#372 `_ + * `system.html#373 `_ + * `system.html#374 `_ + * `system.html#375 `_ + * `parsesql.html#108 `_ + * `macros.html#119 `_ + * `macros.html#120 `_ + * `ropes.html#113 `_ + * `ropes.html#114 `_ + * `xmltree.html#111 `_ + * `xmltree.html#123 `_ + + `addEscaped`:idx: + `xmltree.html#121 `_ + + `addf`:idx: + * `strutils.html#111 `_ + * `ropes.html#121 `_ + + `addFile`:idx: + * `zipfiles.html#105 `_ + * `zipfiles.html#106 `_ + * `zipfiles.html#107 `_ + + `addFileExt`:idx: + `os.html#137 `_ + + `addQuitProc`:idx: + `system.html#413 `_ + + `address`:idx: + `xmlgen.html#109 `_ + + `addSep`:idx: + `strutils.html#150 `_ + + `alert`:idx: + `manual.html#131 `_ + + `allCharsInSet`:idx: + `strutils.html#151 `_ + + `alloc`:idx: + `system.html#420 `_ + + `alloc0`:idx: + `system.html#421 `_ + + `ALLOC_MAX_BLOCK_TO_DROP`:idx: + `mysql.html#317 `_ + + `ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP`:idx: + `mysql.html#318 `_ + + `AltSep`:idx: + `os.html#104 `_ + + `and`:idx: + * `system.html#121 `_ + * `system.html#243 `_ + * `system.html#244 `_ + * `system.html#245 `_ + * `system.html#246 `_ + * `system.html#247 `_ + + `any`:idx: + `pegs.html#118 `_ + + `any character`:idx: + `pegs.html#117 `_ + + `any rune`:idx: + `pegs.html#119 `_ + + `anyRune`:idx: + `pegs.html#120 `_ + + `apostrophe`:idx: + `manual.html#129 `_ + + `appendChild`:idx: + `xmldom.html#165 `_ + + `AppendFileExt`:idx: + `os.html#138 `_ + + `arccos`:idx: + `math.html#122 `_ + + `arcsin`:idx: + `math.html#123 `_ + + `arctan`:idx: + `math.html#124 `_ + + `arctan2`:idx: + `math.html#125 `_ + + `area`:idx: + `xmlgen.html#110 `_ + + `arithmetic bit shifts`:idx: + `tut1.html#110 `_ + + `array`:idx: + * `tut1.html#117 `_ + * `system.html#129 `_ + + `array properties`:idx: + `tut2.html#106 `_ + + `Arrays`:idx: + `manual.html#159 `_ + + `assembler`:idx: + `manual.html#205 `_ + + `assert`:idx: + `system.html#425 `_ + + `AST`:idx: + `macros.html#101 `_ + + `attr`:idx: + `xmltree.html#116 `_ + + `attr=`:idx: + `xmltree.html#117 `_ + + `AttributeNode`:idx: + `xmldom.html#118 `_ + + `attrKey`:idx: + `parsexml.html#113 `_ + + `attrLen`:idx: + `xmltree.html#118 `_ + + `attrValue`:idx: + `parsexml.html#114 `_ + + `AUTO_INCREMENT_FLAG`:idx: + `mysql.html#133 `_ + + `Automatic type conversion`:idx: + * `manual.html#145 `_ + * `tut1.html#111 `_ + + `b`:idx: + `xmlgen.html#111 `_ + + `backref`:idx: + `pegs.html#124 `_ + + `backrefIgnoreCase`:idx: + `pegs.html#125 `_ + + `backrefIgnoreStyle`:idx: + `pegs.html#126 `_ + + `backslash`:idx: + * `regexprs.html#101 `_ + * `manual.html#127 `_ + * `re.html#101 `_ + + `backspace`:idx: + `manual.html#132 `_ + + `base`:idx: + `xmlgen.html#112 `_ + + `base type`:idx: + `manual.html#180 `_ + + `big`:idx: + `xmlgen.html#113 `_ + + `BiggestFloat`:idx: + `system.html#382 `_ + + `BiggestInt`:idx: + `system.html#381 `_ + + `BINARY_FLAG`:idx: + `mysql.html#131 `_ + + `BINCMP_FLAG`:idx: + `mysql.html#141 `_ + + `bindAddr`:idx: + `sockets.html#118 `_ + + `binom`:idx: + `math.html#105 `_ + + `blit`:idx: + `graphics.html#115 `_ + + `BLOB_FLAG`:idx: + `mysql.html#128 `_ + + `block`:idx: + `manual.html#201 `_ + + `blockquote`:idx: + `xmlgen.html#114 `_ + + `BlockTags`:idx: + `htmlparser.html#103 `_ + + `body`:idx: + `xmlgen.html#115 `_ + + `bool`:idx: + `system.html#109 `_ + + `boolean`:idx: + * `manual.html#153 `_ + * `tut1.html#107 `_ + + `br`:idx: + `xmlgen.html#116 `_ + + `break`:idx: + `manual.html#202 `_ + + `breakpoint`:idx: + `endb.html#103 `_ + + `button`:idx: + `xmlgen.html#117 `_ + + `Byte`:idx: + `system.html#133 `_ + + `calling conventions`:idx: + `manual.html#170 `_ + + `capitalize`:idx: + `strutils.html#117 `_ + + `caption`:idx: + `xmlgen.html#118 `_ + + `capture`:idx: + `pegs.html#123 `_ + + `card`:idx: + `system.html#181 `_ + + `carriage return`:idx: + `manual.html#122 `_ + + `case`:idx: + `manual.html#190 `_ + + `cchar`:idx: + `system.html#383 `_ + + `CDataSectionNode`:idx: + `xmldom.html#120 `_ + + `cdecl`:idx: + `manual.html#172 `_ + + `cdouble`:idx: + `system.html#390 `_ + + `cfloat`:idx: + `system.html#389 `_ + + `cgiError`:idx: + `cgi.html#106 `_ + + `ChangeFileExt`:idx: + `os.html#136 `_ + + `char`:idx: + `system.html#110 `_ + + `character type`:idx: + `manual.html#154 `_ + + `character with decimal value d`:idx: + `manual.html#130 `_ + + `character with hex value HH`:idx: + `manual.html#135 `_ + + `character_set`:idx: + `mysql.html#351 `_ + + `charData`:idx: + `parsexml.html#109 `_ + + `charSet`:idx: + `pegs.html#108 `_ + + `CHARSET_INFO`:idx: + `mysql.html#348 `_ + + `charset_info_st`:idx: + `mysql.html#347 `_ + + `checked runtime error`:idx: + `manual.html#110 `_ + + `checkedSymAddr`:idx: + `dynlib.html#105 `_ + + `check_scramble`:idx: + `mysql.html#279 `_ + + `check_scramble_323`:idx: + `mysql.html#273 `_ + + `chr`:idx: + `system.html#183 `_ + + `cint`:idx: + `system.html#386 `_ + + `cite`:idx: + `xmlgen.html#119 `_ + + `classify`:idx: + `math.html#104 `_ + + `CLIENT_COMPRESS`:idx: + `mysql.html#161 `_ + + `CLIENT_CONNECT_WITH_DB`:idx: + `mysql.html#159 `_ + + `clientData`:idx: + `xmltree.html#119 `_ + + `clientData=`:idx: + `xmltree.html#120 `_ + + `CLIENT_FOUND_ROWS`:idx: + `mysql.html#157 `_ + + `CLIENT_IGNORE_SIGPIPE`:idx: + `mysql.html#168 `_ + + `CLIENT_IGNORE_SPACE`:idx: + `mysql.html#164 `_ + + `CLIENT_INTERACTIVE`:idx: + `mysql.html#166 `_ + + `CLIENT_LOCAL_FILES`:idx: + `mysql.html#163 `_ + + `CLIENT_LONG_FLAG`:idx: + `mysql.html#158 `_ + + `CLIENT_LONG_PASSWORD`:idx: + `mysql.html#156 `_ + + `CLIENT_MULTI_QUERIES`:idx: + `mysql.html#203 `_ + + `CLIENT_MULTI_RESULTS`:idx: + `mysql.html#173 `_ + + `CLIENT_MULTI_STATEMENTS`:idx: + `mysql.html#172 `_ + + `CLIENT_NET_READ_TIMEOUT`:idx: + `mysql.html#292 `_ + + `CLIENT_NET_WRITE_TIMEOUT`:idx: + `mysql.html#293 `_ + + `CLIENT_NO_SCHEMA`:idx: + `mysql.html#160 `_ + + `CLIENT_ODBC`:idx: + `mysql.html#162 `_ + + `CLIENT_PROTOCOL_41`:idx: + `mysql.html#165 `_ + + `CLIENT_REMEMBER_OPTIONS`:idx: + `mysql.html#174 `_ + + `CLIENT_RESERVED`:idx: + `mysql.html#170 `_ + + `CLIENT_SECURE_CONNECTION`:idx: + `mysql.html#171 `_ + + `CLIENT_SSL`:idx: + `mysql.html#167 `_ + + `CLIENT_TRANSACTIONS`:idx: + `mysql.html#169 `_ + + `cloneNode`:idx: + `xmldom.html#166 `_ + + `clong`:idx: + `system.html#387 `_ + + `clongdouble`:idx: + `system.html#391 `_ + + `clonglong`:idx: + `system.html#388 `_ + + `Close`:idx: + * `system.html#512 `_ + * `db_postgres.html#117 `_ + * `db_mysql.html#117 `_ + * `db_sqlite.html#117 `_ + + `close`:idx: + * `sockets.html#121 `_ + * `lexbase.html#105 `_ + * `parsecfg.html#105 `_ + * `parsexml.html#108 `_ + * `parsecsv.html#109 `_ + * `zipfiles.html#103 `_ + * `httpserver.html#106 `_ + + `CloseFile`:idx: + `system.html#511 `_ + + `closure`:idx: + `manual.html#177 `_ + + `cmdLineRest`:idx: + `parseopt.html#106 `_ + + `cmp`:idx: + * `system.html#361 `_ + * `system.html#362 `_ + + `cmpIgnoreCase`:idx: + `strutils.html#135 `_ + + `cmpIgnoreStyle`:idx: + `strutils.html#136 `_ + + `cmpPaths`:idx: + `os.html#139 `_ + + `cmpRunesIgnoreCase`:idx: + `unicode.html#120 `_ + + `code`:idx: + `xmlgen.html#120 `_ + + `col`:idx: + `xmlgen.html#121 `_ + + `colAliceBlue`:idx: + `colors.html#108 `_ + + `colAntiqueWhite`:idx: + `colors.html#109 `_ + + `colAqua`:idx: + `colors.html#110 `_ + + `colAquamarine`:idx: + `colors.html#111 `_ + + `colAzure`:idx: + `colors.html#112 `_ + + `colBeige`:idx: + `colors.html#113 `_ + + `colBisque`:idx: + `colors.html#114 `_ + + `colBlack`:idx: + `colors.html#115 `_ + + `colBlanchedAlmond`:idx: + `colors.html#116 `_ + + `colBlue`:idx: + `colors.html#117 `_ + + `colBlueViolet`:idx: + `colors.html#118 `_ + + `colBrown`:idx: + `colors.html#119 `_ + + `colBurlyWood`:idx: + `colors.html#120 `_ + + `colCadetBlue`:idx: + `colors.html#121 `_ + + `colChartreuse`:idx: + `colors.html#122 `_ + + `colChocolate`:idx: + `colors.html#123 `_ + + `colCoral`:idx: + `colors.html#124 `_ + + `colCornflowerBlue`:idx: + `colors.html#125 `_ + + `colCornsilk`:idx: + `colors.html#126 `_ + + `colCrimson`:idx: + `colors.html#127 `_ + + `colCyan`:idx: + `colors.html#128 `_ + + `colDarkBlue`:idx: + `colors.html#129 `_ + + `colDarkCyan`:idx: + `colors.html#130 `_ + + `colDarkGoldenRod`:idx: + `colors.html#131 `_ + + `colDarkGray`:idx: + `colors.html#132 `_ + + `colDarkGreen`:idx: + `colors.html#133 `_ + + `colDarkKhaki`:idx: + `colors.html#134 `_ + + `colDarkMagenta`:idx: + `colors.html#135 `_ + + `colDarkOliveGreen`:idx: + `colors.html#136 `_ + + `colDarkorange`:idx: + `colors.html#137 `_ + + `colDarkOrchid`:idx: + `colors.html#138 `_ + + `colDarkRed`:idx: + `colors.html#139 `_ + + `colDarkSalmon`:idx: + `colors.html#140 `_ + + `colDarkSeaGreen`:idx: + `colors.html#141 `_ + + `colDarkSlateBlue`:idx: + `colors.html#142 `_ + + `colDarkSlateGray`:idx: + `colors.html#143 `_ + + `colDarkTurquoise`:idx: + `colors.html#144 `_ + + `colDarkViolet`:idx: + `colors.html#145 `_ + + `colDeepPink`:idx: + `colors.html#146 `_ + + `colDeepSkyBlue`:idx: + `colors.html#147 `_ + + `colDimGray`:idx: + `colors.html#148 `_ + + `colDodgerBlue`:idx: + `colors.html#149 `_ + + `colFireBrick`:idx: + `colors.html#150 `_ + + `colFloralWhite`:idx: + `colors.html#151 `_ + + `colForestGreen`:idx: + `colors.html#152 `_ + + `colFuchsia`:idx: + `colors.html#153 `_ + + `colGainsboro`:idx: + `colors.html#154 `_ + + `colGhostWhite`:idx: + `colors.html#155 `_ + + `colGold`:idx: + `colors.html#156 `_ + + `colGoldenRod`:idx: + `colors.html#157 `_ + + `colGray`:idx: + `colors.html#158 `_ + + `colGreen`:idx: + `colors.html#159 `_ + + `colGreenYellow`:idx: + `colors.html#160 `_ + + `colgroup`:idx: + `xmlgen.html#122 `_ + + `colHoneyDew`:idx: + `colors.html#161 `_ + + `colHotPink`:idx: + `colors.html#162 `_ + + `colIndianRed`:idx: + `colors.html#163 `_ + + `colIndigo`:idx: + `colors.html#164 `_ + + `colIvory`:idx: + `colors.html#165 `_ + + `colKhaki`:idx: + `colors.html#166 `_ + + `colLavender`:idx: + `colors.html#167 `_ + + `colLavenderBlush`:idx: + `colors.html#168 `_ + + `colLawnGreen`:idx: + `colors.html#169 `_ + + `colLemonChiffon`:idx: + `colors.html#170 `_ + + `colLightBlue`:idx: + `colors.html#171 `_ + + `colLightCoral`:idx: + `colors.html#172 `_ + + `colLightCyan`:idx: + `colors.html#173 `_ + + `colLightGoldenRodYellow`:idx: + `colors.html#174 `_ + + `colLightGreen`:idx: + `colors.html#176 `_ + + `colLightGrey`:idx: + `colors.html#175 `_ + + `colLightPink`:idx: + `colors.html#177 `_ + + `colLightSalmon`:idx: + `colors.html#178 `_ + + `colLightSeaGreen`:idx: + `colors.html#179 `_ + + `colLightSkyBlue`:idx: + `colors.html#180 `_ + + `colLightSlateGray`:idx: + `colors.html#181 `_ + + `colLightSteelBlue`:idx: + `colors.html#182 `_ + + `colLightYellow`:idx: + `colors.html#183 `_ + + `colLime`:idx: + `colors.html#184 `_ + + `colLimeGreen`:idx: + `colors.html#185 `_ + + `colLinen`:idx: + `colors.html#186 `_ + + `colMagenta`:idx: + `colors.html#187 `_ + + `colMaroon`:idx: + `colors.html#188 `_ + + `colMediumAquaMarine`:idx: + `colors.html#189 `_ + + `colMediumBlue`:idx: + `colors.html#190 `_ + + `colMediumOrchid`:idx: + `colors.html#191 `_ + + `colMediumPurple`:idx: + `colors.html#192 `_ + + `colMediumSeaGreen`:idx: + `colors.html#193 `_ + + `colMediumSlateBlue`:idx: + `colors.html#194 `_ + + `colMediumSpringGreen`:idx: + `colors.html#195 `_ + + `colMediumTurquoise`:idx: + `colors.html#196 `_ + + `colMediumVioletRed`:idx: + `colors.html#197 `_ + + `colMidnightBlue`:idx: + `colors.html#198 `_ + + `colMintCream`:idx: + `colors.html#199 `_ + + `colMistyRose`:idx: + `colors.html#200 `_ + + `colMoccasin`:idx: + `colors.html#201 `_ + + `colNavajoWhite`:idx: + `colors.html#202 `_ + + `colNavy`:idx: + `colors.html#203 `_ + + `colOldLace`:idx: + `colors.html#204 `_ + + `colOlive`:idx: + `colors.html#205 `_ + + `colOliveDrab`:idx: + `colors.html#206 `_ + + `colOrange`:idx: + `colors.html#207 `_ + + `colOrangeRed`:idx: + `colors.html#208 `_ + + `colOrchid`:idx: + `colors.html#209 `_ + + `colPaleGoldenRod`:idx: + `colors.html#210 `_ + + `colPaleGreen`:idx: + `colors.html#211 `_ + + `colPaleTurquoise`:idx: + `colors.html#212 `_ + + `colPaleVioletRed`:idx: + `colors.html#213 `_ + + `colPapayaWhip`:idx: + `colors.html#214 `_ + + `colPeachPuff`:idx: + `colors.html#215 `_ + + `colPeru`:idx: + `colors.html#216 `_ + + `colPink`:idx: + `colors.html#217 `_ + + `colPlum`:idx: + `colors.html#218 `_ + + `colPowderBlue`:idx: + `colors.html#219 `_ + + `colPurple`:idx: + `colors.html#220 `_ + + `colRed`:idx: + `colors.html#221 `_ + + `colRosyBrown`:idx: + `colors.html#222 `_ + + `colRoyalBlue`:idx: + `colors.html#223 `_ + + `colSaddleBrown`:idx: + `colors.html#224 `_ + + `colSalmon`:idx: + `colors.html#225 `_ + + `colSandyBrown`:idx: + `colors.html#226 `_ + + `colSeaGreen`:idx: + `colors.html#227 `_ + + `colSeaShell`:idx: + `colors.html#228 `_ + + `colSienna`:idx: + `colors.html#229 `_ + + `colSilver`:idx: + `colors.html#230 `_ + + `colSkyBlue`:idx: + `colors.html#231 `_ + + `colSlateBlue`:idx: + `colors.html#232 `_ + + `colSlateGray`:idx: + `colors.html#233 `_ + + `colSnow`:idx: + `colors.html#234 `_ + + `colSpringGreen`:idx: + `colors.html#235 `_ + + `colSteelBlue`:idx: + `colors.html#236 `_ + + `colTan`:idx: + `colors.html#237 `_ + + `colTeal`:idx: + `colors.html#238 `_ + + `colThistle`:idx: + `colors.html#239 `_ + + `colTomato`:idx: + `colors.html#240 `_ + + `colTurquoise`:idx: + `colors.html#241 `_ + + `colViolet`:idx: + `colors.html#242 `_ + + `colWheat`:idx: + `colors.html#243 `_ + + `colWhite`:idx: + `colors.html#244 `_ + + `colWhiteSmoke`:idx: + `colors.html#245 `_ + + `colYellow`:idx: + `colors.html#246 `_ + + `colYellowGreen`:idx: + `colors.html#247 `_ + + `comma separated value`:idx: + `parsecsv.html#102 `_ + + `comment pieces`:idx: + * `manual.html#115 `_ + * `tut1.html#103 `_ + + `CommentNode`:idx: + `xmldom.html#122 `_ + + `Comments`:idx: + * `manual.html#114 `_ + * `tut1.html#102 `_ + + `commonAttr`:idx: + `xmlgen.html#105 `_ + + `COMP_HEADER_SIZE`:idx: + `mysql.html#266 `_ + + `CompileDate`:idx: + `system.html#399 `_ + + `CompileTime`:idx: + `system.html#400 `_ + + `compileTime`:idx: + `manual.html#236 `_ + + `complex statements`:idx: + `manual.html#184 `_ + + `connect`:idx: + `sockets.html#127 `_ + + `const`:idx: + `manual.html#188 `_ + + `constant expressions`:idx: + `manual.html#108 `_ + + `Constants`:idx: + * `manual.html#140 `_ + * `tut1.html#104 `_ + + `contains`:idx: + * `system.html#356 `_ + * `system.html#477 `_ + * `strutils.html#137 `_ + * `strutils.html#138 `_ + * `strutils.html#139 `_ + * `re.html#116 `_ + * `re.html#117 `_ + * `pegs.html#144 `_ + * `pegs.html#145 `_ + + `continue`:idx: + `manual.html#204 `_ + + `copy`:idx: + * `system.html#414 `_ + * `system.html#415 `_ + + `copyFile`:idx: + `os.html#142 `_ + + `copyMem`:idx: + `system.html#417 `_ + + `copyNimNode`:idx: + `macros.html#136 `_ + + `copyNimTree`:idx: + `macros.html#137 `_ + + `coreAttr`:idx: + `xmlgen.html#103 `_ + + `cos`:idx: + `math.html#126 `_ + + `cosh`:idx: + `math.html#127 `_ + + `countBits32`:idx: + `math.html#109 `_ + + `countdown`:idx: + `system.html#446 `_ + + `countProcessors`:idx: + `osproc.html#117 `_ + + `countup`:idx: + `system.html#447 `_ + + `cpuEndian`:idx: + `system.html#405 `_ + + `createAttribute`:idx: + `xmldom.html#141 `_ + + `createAttributeNS`:idx: + `xmldom.html#142 `_ + + `createCDATASection`:idx: + `xmldom.html#143 `_ + + `createComment`:idx: + `xmldom.html#144 `_ + + `createDir`:idx: + * `os.html#159 `_ + * `zipfiles.html#104 `_ + + `createDocument`:idx: + * `xmldom.html#136 `_ + * `xmldom.html#137 `_ + + `createDocumentFragment`:idx: + `xmldom.html#145 `_ + + `createElement`:idx: + `xmldom.html#146 `_ + + `createElementNS`:idx: + `xmldom.html#147 `_ + + `createProcessingInstruction`:idx: + `xmldom.html#148 `_ + + `create_random_string`:idx: + `mysql.html#269 `_ + + `createTextNode`:idx: + `xmldom.html#149 `_ + + `cschar`:idx: + `system.html#384 `_ + + `cshort`:idx: + `system.html#385 `_ + + `cstring`:idx: + `system.html#112 `_ + + `cstringArray`:idx: + `system.html#392 `_ + + `cstringArrayToSeq`:idx: + * `system.html#539 `_ + * `system.html#540 `_ + + `CSV`:idx: + `parsecsv.html#101 `_ + + `cuint`:idx: + `mysql.html#109 `_ + + `CurDir`:idx: + `os.html#101 `_ + + `CURLAUTH_ANY`:idx: + `libcurl.html#192 `_ + + `CURLAUTH_ANYSAFE`:idx: + `libcurl.html#194 `_ + + `CURLAUTH_BASIC`:idx: + `libcurl.html#193 `_ + + `CURLAUTH_DIGEST`:idx: + `libcurl.html#195 `_ + + `CURLAUTH_GSSNEGOTIATE`:idx: + `libcurl.html#196 `_ + + `CURLAUTH_NONE`:idx: + `libcurl.html#197 `_ + + `CURLAUTH_NTLM`:idx: + `libcurl.html#198 `_ + + `CURLE_ALREADY_COMPLETE`:idx: + `libcurl.html#199 `_ + + `curl_easy_cleanup`:idx: + `libcurl.html#304 `_ + + `curl_easy_duphandle`:idx: + `libcurl.html#306 `_ + + `curl_easy_escape`:idx: + `libcurl.html#284 `_ + + `curl_easy_getinfo`:idx: + `libcurl.html#305 `_ + + `curl_easy_init`:idx: + `libcurl.html#301 `_ + + `curl_easy_perform`:idx: + `libcurl.html#303 `_ + + `curl_easy_reset`:idx: + `libcurl.html#307 `_ + + `curl_easy_setopt`:idx: + `libcurl.html#302 `_ + + `curl_easy_strerror`:idx: + `libcurl.html#299 `_ + + `curl_easy_unescape`:idx: + `libcurl.html#286 `_ + + `CURLE_FTP_BAD_DOWNLOAD_RESUME`:idx: + `libcurl.html#200 `_ + + `CURLE_FTP_PARTIAL_FILE`:idx: + `libcurl.html#201 `_ + + `CURLE_HTTP_NOT_FOUND`:idx: + `libcurl.html#202 `_ + + `CURLE_HTTP_PORT_FAILED`:idx: + `libcurl.html#203 `_ + + `CURLE_OPERATION_TIMEDOUT`:idx: + `libcurl.html#204 `_ + + `CURL_ERROR_SIZE`:idx: + `libcurl.html#205 `_ + + `curl_escape`:idx: + `libcurl.html#285 `_ + + `curl_formadd`:idx: + `libcurl.html#279 `_ + + `CURL_FORMAT_OFF_T`:idx: + `libcurl.html#206 `_ + + `curl_formfree`:idx: + `libcurl.html#281 `_ + + `curl_formget`:idx: + `libcurl.html#280 `_ + + `curl_free`:idx: + `libcurl.html#288 `_ + + `curl_getdate`:idx: + `libcurl.html#294 `_ + + `curl_getenv`:idx: + `libcurl.html#282 `_ + + `CURL_GLOBAL_ALL`:idx: + `libcurl.html#210 `_ + + `curl_global_cleanup`:idx: + `libcurl.html#291 `_ + + `CURL_GLOBAL_DEFAULT`:idx: + `libcurl.html#211 `_ + + `curl_global_init`:idx: + `libcurl.html#289 `_ + + `curl_global_init_mem`:idx: + `libcurl.html#290 `_ + + `CURL_GLOBAL_NOTHING`:idx: + `libcurl.html#207 `_ + + `CURL_GLOBAL_SSL`:idx: + `libcurl.html#208 `_ + + `CURL_GLOBAL_WIN32`:idx: + `libcurl.html#209 `_ + + `CURLINFO_DOUBLE`:idx: + `libcurl.html#212 `_ + + `CURLINFO_HTTP_CODE`:idx: + `libcurl.html#213 `_ + + `CURLINFO_LONG`:idx: + `libcurl.html#214 `_ + + `CURLINFO_MASK`:idx: + `libcurl.html#215 `_ + + `CURLINFO_SLIST`:idx: + `libcurl.html#216 `_ + + `CURLINFO_STRING`:idx: + `libcurl.html#217 `_ + + `CURLINFO_TYPEMASK`:idx: + `libcurl.html#218 `_ + + `CURL_IPRESOLVE_V4`:idx: + `libcurl.html#219 `_ + + `CURL_IPRESOLVE_V6`:idx: + `libcurl.html#220 `_ + + `CURL_IPRESOLVE_WHATEVER`:idx: + `libcurl.html#221 `_ + + `CURL_MAX_WRITE_SIZE`:idx: + `libcurl.html#222 `_ + + `CURLM_CALL_MULTI_SOCKET`:idx: + `libcurl.html#223 `_ + + `curl_multi_add_handle`:idx: + `libcurl.html#309 `_ + + `curl_multi_assign`:idx: + `libcurl.html#320 `_ + + `curl_multi_cleanup`:idx: + `libcurl.html#313 `_ + + `curl_multi_fdset`:idx: + `libcurl.html#311 `_ + + `curl_multi_info_read`:idx: + `libcurl.html#314 `_ + + `curl_multi_init`:idx: + `libcurl.html#308 `_ + + `curl_multi_perform`:idx: + `libcurl.html#312 `_ + + `curl_multi_remove_handle`:idx: + `libcurl.html#310 `_ + + `curl_multi_setopt`:idx: + `libcurl.html#319 `_ + + `curl_multi_socket`:idx: + `libcurl.html#316 `_ + + `curl_multi_socket_all`:idx: + `libcurl.html#317 `_ + + `curl_multi_strerror`:idx: + `libcurl.html#315 `_ + + `curl_multi_timeout`:idx: + `libcurl.html#318 `_ + + `CURLOPT_CLOSEFUNCTION`:idx: + `libcurl.html#224 `_ + + `CURLOPT_FTPASCII`:idx: + `libcurl.html#225 `_ + + `CURLOPT_HEADERDATA`:idx: + `libcurl.html#226 `_ + + `CURLOPT_HTTPREQUEST`:idx: + `libcurl.html#227 `_ + + `CURLOPT_MUTE`:idx: + `libcurl.html#228 `_ + + `CURLOPT_PASSWDDATA`:idx: + `libcurl.html#229 `_ + + `CURLOPT_PASSWDFUNCTION`:idx: + `libcurl.html#230 `_ + + `CURLOPT_PASV_HOST`:idx: + `libcurl.html#231 `_ + + `CURLOPT_READDATA`:idx: + `libcurl.html#232 `_ + + `CURLOPT_SOURCE_HOST`:idx: + `libcurl.html#233 `_ + + `CURLOPT_SOURCE_PATH`:idx: + `libcurl.html#234 `_ + + `CURLOPT_SOURCE_PORT`:idx: + `libcurl.html#235 `_ + + `CURLOPT_SSLKEYPASSWD`:idx: + `libcurl.html#191 `_ + + `CURLOPTTYPE_FUNCTIONPOINT`:idx: + `libcurl.html#236 `_ + + `CURLOPTTYPE_LONG`:idx: + `libcurl.html#237 `_ + + `CURLOPTTYPE_OBJECTPOINT`:idx: + `libcurl.html#238 `_ + + `CURLOPTTYPE_OFF_T`:idx: + `libcurl.html#239 `_ + + `CURLOPT_WRITEDATA`:idx: + `libcurl.html#240 `_ + + `CURL_POLL_IN`:idx: + `libcurl.html#241 `_ + + `CURL_POLL_INOUT`:idx: + `libcurl.html#242 `_ + + `CURL_POLL_NONE`:idx: + `libcurl.html#243 `_ + + `CURL_POLL_OUT`:idx: + `libcurl.html#244 `_ + + `CURL_POLL_REMOVE`:idx: + `libcurl.html#245 `_ + + `CURL_READFUNC_ABORT`:idx: + `libcurl.html#246 `_ + + `curl_share_cleanup`:idx: + `libcurl.html#297 `_ + + `curl_share_init`:idx: + `libcurl.html#295 `_ + + `curl_share_setopt`:idx: + `libcurl.html#296 `_ + + `curl_share_strerror`:idx: + `libcurl.html#300 `_ + + `curl_slist_append`:idx: + `libcurl.html#292 `_ + + `curl_slist_free_all`:idx: + `libcurl.html#293 `_ + + `CURL_SOCKET_BAD`:idx: + `libcurl.html#247 `_ + + `CURL_SOCKET_TIMEOUT`:idx: + `libcurl.html#248 `_ + + `curl_strequal`:idx: + `libcurl.html#277 `_ + + `curl_strnequal`:idx: + `libcurl.html#278 `_ + + `curl_unescape`:idx: + `libcurl.html#287 `_ + + `curl_version`:idx: + `libcurl.html#283 `_ + + `CURL_VERSION_ASYNCHDNS`:idx: + `libcurl.html#249 `_ + + `CURL_VERSION_CONV`:idx: + `libcurl.html#250 `_ + + `CURL_VERSION_DEBUG`:idx: + `libcurl.html#251 `_ + + `CURL_VERSION_GSSNEGOTIATE`:idx: + `libcurl.html#252 `_ + + `CURL_VERSION_IDN`:idx: + `libcurl.html#253 `_ + + `curl_version_info`:idx: + `libcurl.html#298 `_ + + `CURL_VERSION_IPV6`:idx: + `libcurl.html#254 `_ + + `CURL_VERSION_KERBEROS4`:idx: + `libcurl.html#255 `_ + + `CURL_VERSION_LARGEFILE`:idx: + `libcurl.html#256 `_ + + `CURL_VERSION_LIBZ`:idx: + `libcurl.html#257 `_ + + `CURLVERSION_NOW`:idx: + `libcurl.html#258 `_ + + `CURL_VERSION_NTLM`:idx: + `libcurl.html#259 `_ + + `CURL_VERSION_SPNEGO`:idx: + `libcurl.html#260 `_ + + `CURL_VERSION_SSL`:idx: + `libcurl.html#261 `_ + + `CURL_VERSION_SSPI`:idx: + `libcurl.html#262 `_ + + `CursorBackward`:idx: + `terminal.html#107 `_ + + `CursorDown`:idx: + `terminal.html#105 `_ + + `CursorForward`:idx: + `terminal.html#106 `_ + + `CursorUp`:idx: + `terminal.html#104 `_ + + `dangling else problem`:idx: + `manual.html#185 `_ + + `datafile`:idx: + `unidecode.html#101 `_ + + `dbError`:idx: + * `db_postgres.html#107 `_ + * `db_mysql.html#106 `_ + * `db_sqlite.html#107 `_ + + `dbgLineHook`:idx: + `system.html#442 `_ + + `dbQueryOpt`:idx: + `db_mysql.html#107 `_ + + `dd`:idx: + `xmlgen.html#123 `_ + + `deadCodeElim`:idx: + `manual.html#247 `_ + + `dealloc`:idx: + `system.html#423 `_ + + `debugger`:idx: + `nimrodc.html#106 `_ + + `dec`:idx: + `system.html#172 `_ + + `decodeData`:idx: + * `cgi.html#107 `_ + * `cgi.html#108 `_ + + `defaultFont`:idx: + `graphics.html#108 `_ + + `defined`:idx: + `system.html#118 `_ + + `definedInScope`:idx: + `system.html#119 `_ + + `del`:idx: + * `system.html#376 `_ + * `xmlgen.html#124 `_ + * `macros.html#121 `_ + + `delete`:idx: + * `system.html#377 `_ + * `strutils.html#157 `_ + + `deleteStr`:idx: + * `strutils.html#124 `_ + * `strutils.html#158 `_ + + `dfn`:idx: + `xmlgen.html#125 `_ + + `digits`:idx: + `pegs.html#130 `_ + + `Digits`:idx: + `strutils.html#104 `_ + + `DirSep`:idx: + `os.html#103 `_ + + `disableCache`:idx: + `ropes.html#107 `_ + + `discard`:idx: + `manual.html#186 `_ + + `div`:idx: + * `system.html#223 `_ + * `system.html#224 `_ + * `system.html#225 `_ + * `system.html#226 `_ + * `system.html#227 `_ + * `xmlgen.html#126 `_ + + `dl`:idx: + `xmlgen.html#127 `_ + + `documentElement`:idx: + `xmldom.html#140 `_ + + `DocumentFragmentNode`:idx: + `xmldom.html#124 `_ + + `DocumentNode`:idx: + `xmldom.html#123 `_ + + `domain specific languages`:idx: + `manual.html#222 `_ + + `downloadFile`:idx: + `httpclient.html#110 `_ + + `drawCircle`:idx: + `graphics.html#119 `_ + + `drawEllipse`:idx: + `graphics.html#126 `_ + + `drawHorLine`:idx: + `graphics.html#121 `_ + + `drawLine`:idx: + `graphics.html#120 `_ + + `drawRect`:idx: + `graphics.html#124 `_ + + `drawText`:idx: + * `graphics.html#117 `_ + * `graphics.html#118 `_ + + `drawVerLine`:idx: + `graphics.html#122 `_ + + `dt`:idx: + `xmlgen.html#128 `_ + + `dynamic type`:idx: + `manual.html#104 `_ + + `DYNAMIC_ARRAY`:idx: + `mysql.html#340 `_ + + `dynlib`:idx: + `manual.html#252 `_ + + `E`:idx: + `math.html#102 `_ + + `EAccessViolation`:idx: + `system.html#149 `_ + + `each`:idx: + `system.html#479 `_ + + `EArithmetic`:idx: + `system.html#146 `_ + + `EAssertionFailed`:idx: + `system.html#150 `_ + + `EAsynch`:idx: + `system.html#139 `_ + + `E_Base`:idx: + `system.html#138 `_ + + `ECgi`:idx: + `cgi.html#104 `_ + + `echo`:idx: + `system.html#495 `_ + + `EControlC`:idx: + `system.html#151 `_ + + `EDb`:idx: + * `db_postgres.html#104 `_ + * `db_mysql.html#104 `_ + * `db_sqlite.html#104 `_ + + `editDistance`:idx: + `strutils.html#166 `_ + + `EDivByZero`:idx: + `system.html#147 `_ + + `EDOMException`:idx: + `xmldom.html#101 `_ + + `EDOMStringSizeErr`:idx: + `xmldom.html#102 `_ + + `EFloatDivByZero`:idx: + * `manual.html#146 `_ + * `system.html#163 `_ + + `EFloatInexact`:idx: + * `manual.html#149 `_ + * `system.html#166 `_ + + `EFloatingPoint`:idx: + * `manual.html#150 `_ + * `system.html#161 `_ + + `EFloatInvalidOp`:idx: + `system.html#162 `_ + + `EFloatOverflow`:idx: + * `manual.html#147 `_ + * `system.html#164 `_ + + `EFloatUnderflow`:idx: + * `manual.html#148 `_ + * `system.html#165 `_ + + `EGraphics`:idx: + `graphics.html#104 `_ + + `EHierarchyRequestErr`:idx: + `xmldom.html#103 `_ + + `EHttpRequestErr`:idx: + `httpclient.html#103 `_ + + `EIndexSizeErr`:idx: + `xmldom.html#104 `_ + + `EInuseAttributeErr`:idx: + `xmldom.html#105 `_ + + `EInvalidAccessErr`:idx: + `xmldom.html#106 `_ + + `EInvalidCharacterErr`:idx: + `xmldom.html#107 `_ + + `EInvalidCsv`:idx: + `parsecsv.html#105 `_ + + `EInvalidField`:idx: + `system.html#155 `_ + + `EInvalidIndex`:idx: + `system.html#154 `_ + + `EInvalidLibrary`:idx: + `system.html#144 `_ + + `EInvalidModificationErr`:idx: + `xmldom.html#108 `_ + + `EInvalidObjectAssignment`:idx: + `system.html#159 `_ + + `EInvalidObjectConversion`:idx: + `system.html#160 `_ + + `EInvalidPeg`:idx: + `pegs.html#153 `_ + + `EInvalidProtocol`:idx: + `httpclient.html#102 `_ + + `EInvalidRegEx`:idx: + * `regexprs.html#104 `_ + * `re.html#107 `_ + + `EInvalidSql`:idx: + `parsesql.html#103 `_ + + `EInvalidStateErr`:idx: + `xmldom.html#109 `_ + + `EInvalidValue`:idx: + `system.html#152 `_ + + `EInvalidXml`:idx: + `xmlparser.html#101 `_ + + `EIO`:idx: + `system.html#142 `_ + + `elementName`:idx: + `parsexml.html#111 `_ + + `ElementNode`:idx: + `xmldom.html#117 `_ + + `em`:idx: + `xmlgen.html#129 `_ + + `Embedded Nimrod Debugger`:idx: + `endb.html#101 `_ + + `EMismatchedTag`:idx: + `xmldomparser.html#101 `_ + + `enableCache`:idx: + `ropes.html#108 `_ + + `ENamespaceErr`:idx: + `xmldom.html#110 `_ + + `ENDB`:idx: + `endb.html#102 `_ + + `EndOfFile`:idx: + * `system.html#513 `_ + * `lexbase.html#101 `_ + + `endsWith`:idx: + * `strutils.html#149 `_ + * `re.html#119 `_ + * `pegs.html#147 `_ + + `ENoDataAllowedErr`:idx: + `xmldom.html#113 `_ + + `ENoExceptionToReraise`:idx: + * `manual.html#193 `_ + * `system.html#158 `_ + + `ENoModificationAllowedErr`:idx: + `xmldom.html#114 `_ + + `ENotFoundErr`:idx: + `xmldom.html#111 `_ + + `ENotSupportedErr`:idx: + `xmldom.html#112 `_ + + `entityName`:idx: + `parsexml.html#112 `_ + + `entityToUtf8`:idx: + `htmlparser.html#107 `_ + + `enum_cursor_type`:idx: + `mysql.html#237 `_ + + `enumeration`:idx: + `tut1.html#113 `_ + + `Enumeration`:idx: + `manual.html#155 `_ + + `enum_field_types`:idx: + `mysql.html#202 `_ + + `ENUM_FLAG`:idx: + `mysql.html#132 `_ + + `enum_mysql_set_option`:idx: + `mysql.html#238 `_ + + `enum_mysql_stmt_state`:idx: + `mysql.html#376 `_ + + `enum_server_command`:idx: + `mysql.html#119 `_ + + `enum_stmt_attr_type`:idx: + `mysql.html#383 `_ + + `envPairs`:idx: + `os.html#151 `_ + + `EOS`:idx: + `system.html#143 `_ + + `EOutOfMemory`:idx: + `system.html#153 `_ + + `EOutOfRange`:idx: + * `tut1.html#112 `_ + * `system.html#156 `_ + + `EOverflow`:idx: + `system.html#148 `_ + + `EParserError`:idx: + `xmldomparser.html#102 `_ + + `equalMem`:idx: + `system.html#419 `_ + + `equalsFile`:idx: + * `ropes.html#122 `_ + * `ropes.html#123 `_ + + `EraseLine`:idx: + `terminal.html#108 `_ + + `EraseScreen`:idx: + `terminal.html#109 `_ + + `ERessourceExhausted`:idx: + `system.html#145 `_ + + `error`:idx: + * `manual.html#233 `_ + * `manual.html#241 `_ + * `macros.html#138 `_ + + `errorMsg`:idx: + * `parsexml.html#120 `_ + * `parsexml.html#122 `_ + + `errorMsgExpected`:idx: + `parsexml.html#121 `_ + + `errorStr`:idx: + `parsecfg.html#110 `_ + + `errorStream`:idx: + `osproc.html#116 `_ + + `escape`:idx: + * `manual.html#133 `_ + * `strutils.html#163 `_ + * `xmltree.html#122 `_ + + `escape sequences`:idx: + `manual.html#120 `_ + + `escapePeg`:idx: + `pegs.html#156 `_ + + `escapeRe`:idx: + `re.html#125 `_ + + `EStackOverflow`:idx: + `system.html#157 `_ + + `ESynch`:idx: + `system.html#140 `_ + + `ESyntaxErr`:idx: + `xmldom.html#115 `_ + + `ESystem`:idx: + `system.html#141 `_ + + `eventAttr`:idx: + `xmlgen.html#104 `_ + + `EWrongDocumentErr`:idx: + `xmldom.html#116 `_ + + `except`:idx: + `manual.html#196 `_ + + `exception handlers`:idx: + `manual.html#195 `_ + + `exceptions`:idx: + `tut2.html#107 `_ + + `excl`:idx: + `system.html#180 `_ + + `exclFilePermissions`:idx: + `os.html#165 `_ + + `Exec`:idx: + * `db_postgres.html#109 `_ + * `db_mysql.html#109 `_ + * `db_sqlite.html#109 `_ + + `ExecAffectedRows`:idx: + * `db_postgres.html#116 `_ + * `db_mysql.html#116 `_ + * `db_sqlite.html#116 `_ + + `execCmd`:idx: + `osproc.html#105 `_ + + `execProcess`:idx: + `osproc.html#103 `_ + + `execProcesses`:idx: + `osproc.html#118 `_ + + `execShellCmd`:idx: + `os.html#146 `_ + + `executeCommand`:idx: + `osproc.html#106 `_ + + `executeProcess`:idx: + `osproc.html#104 `_ + + `executeShellCommand`:idx: + `os.html#145 `_ + + `ExeExt`:idx: + `os.html#107 `_ + + `existsCookie`:idx: + `cgi.html#147 `_ + + `existsDir`:idx: + `os.html#115 `_ + + `existsEnv`:idx: + `os.html#148 `_ + + `existsFile`:idx: + `os.html#114 `_ + + `exp`:idx: + `math.html#119 `_ + + `expandFilename`:idx: + `os.html#132 `_ + + `expectKind`:idx: + `macros.html#147 `_ + + `expectLen`:idx: + `macros.html#149 `_ + + `expectMinLen`:idx: + `macros.html#148 `_ + + `exportc`:idx: + `manual.html#250 `_ + + `expr`:idx: + `system.html#115 `_ + + `expression macros`:idx: + `tut2.html#111 `_ + + `extractDir`:idx: + `os.html#130 `_ + + `extractFileExt`:idx: + `os.html#134 `_ + + `extractFilename`:idx: + `os.html#131 `_ + + `extractFileTrunk`:idx: + `os.html#135 `_ + + `extractRGB`:idx: + `colors.html#105 `_ + + `ExtSep`:idx: + `os.html#109 `_ + + `fac`:idx: + `math.html#106 `_ + + `fastcall`:idx: + `manual.html#175 `_ + + `FastRows`:idx: + * `db_postgres.html#110 `_ + * `db_mysql.html#110 `_ + * `db_sqlite.html#110 `_ + + `fastRuneAt`:idx: + `unicode.html#108 `_ + + `fatal`:idx: + `manual.html#242 `_ + + `FFI`:idx: + `manual.html#248 `_ + + `fieldset`:idx: + `xmlgen.html#130 `_ + + `FIELD_TYPE_BIT`:idx: + `mysql.html#231 `_ + + `FIELD_TYPE_BLOB`:idx: + `mysql.html#225 `_ + + `FIELD_TYPE_CHAR`:idx: + `mysql.html#228 `_ + + `FIELD_TYPE_DATE`:idx: + `mysql.html#215 `_ + + `FIELD_TYPE_DATETIME`:idx: + `mysql.html#217 `_ + + `FIELD_TYPE_DECIMAL`:idx: + `mysql.html#204 `_ + + `FIELD_TYPE_DOUBLE`:idx: + `mysql.html#210 `_ + + `FIELD_TYPE_ENUM`:idx: + `mysql.html#220 `_ + + `FIELD_TYPE_FLOAT`:idx: + `mysql.html#209 `_ + + `FIELD_TYPE_GEOMETRY`:idx: + `mysql.html#230 `_ + + `FIELD_TYPE_INT24`:idx: + `mysql.html#214 `_ + + `FIELD_TYPE_INTERVAL`:idx: + `mysql.html#229 `_ + + `FIELD_TYPE_LONG`:idx: + `mysql.html#208 `_ + + `FIELD_TYPE_LONG_BLOB`:idx: + `mysql.html#224 `_ + + `FIELD_TYPE_LONGLONG`:idx: + `mysql.html#213 `_ + + `FIELD_TYPE_MEDIUM_BLOB`:idx: + `mysql.html#223 `_ + + `FIELD_TYPE_NEWDATE`:idx: + `mysql.html#219 `_ + + `FIELD_TYPE_NEWDECIMAL`:idx: + `mysql.html#205 `_ + + `FIELD_TYPE_NULL`:idx: + `mysql.html#211 `_ + + `FIELD_TYPE_SET`:idx: + `mysql.html#221 `_ + + `FIELD_TYPE_SHORT`:idx: + `mysql.html#207 `_ + + `FIELD_TYPE_STRING`:idx: + `mysql.html#227 `_ + + `FIELD_TYPE_TIME`:idx: + `mysql.html#216 `_ + + `FIELD_TYPE_TIMESTAMP`:idx: + `mysql.html#212 `_ + + `FIELD_TYPE_TINY`:idx: + `mysql.html#206 `_ + + `FIELD_TYPE_TINY_BLOB`:idx: + `mysql.html#222 `_ + + `FIELD_TYPE_VAR_STRING`:idx: + `mysql.html#226 `_ + + `FIELD_TYPE_YEAR`:idx: + `mysql.html#218 `_ + + `fileHandle`:idx: + `system.html#538 `_ + + `fileNewer`:idx: + `os.html#119 `_ + + `FILE_OFFSET_BITS`:idx: + `libcurl.html#263 `_ + + `FILESIZEBITS`:idx: + `libcurl.html#264 `_ + + `FileSystemCaseSensitive`:idx: + `os.html#106 `_ + + `fillCircle`:idx: + `graphics.html#123 `_ + + `fillRect`:idx: + `graphics.html#125 `_ + + `final`:idx: + `manual.html#239 `_ + + `finally`:idx: + `manual.html#197 `_ + + `find`:idx: + * `regexprs.html#109 `_ + * `regexprs.html#110 `_ + * `system.html#476 `_ + * `strutils.html#119 `_ + * `strutils.html#120 `_ + * `strutils.html#121 `_ + * `re.html#113 `_ + * `re.html#114 `_ + * `pegs.html#141 `_ + * `pegs.html#142 `_ + + `firstChild`:idx: + `xmldom.html#153 `_ + + `float`:idx: + `system.html#106 `_ + + `float32`:idx: + `system.html#107 `_ + + `float64`:idx: + `system.html#108 `_ + + `floatChecks`:idx: + `manual.html#152 `_ + + `floatVal`:idx: + `macros.html#124 `_ + + `floatVal=`:idx: + `macros.html#130 `_ + + `FlushFile`:idx: + `system.html#515 `_ + + `for`:idx: + * `manual.html#214 `_ + * `tut1.html#105 `_ + + `form`:idx: + `xmlgen.html#131 `_ + + `form feed`:idx: + `manual.html#124 `_ + + `forward`:idx: + `manual.html#209 `_ + + `frexp`:idx: + `math.html#120 `_ + + `functional`:idx: + * `manual.html#169 `_ + * `tut1.html#124 `_ + + `FUNCTIONPOINT`:idx: + `libcurl.html#265 `_ + + `functions`:idx: + `manual.html#207 `_ + + `GC_disable`:idx: + `system.html#480 `_ + + `GC_disableMarkAndSweep`:idx: + `system.html#486 `_ + + `GC_enable`:idx: + `system.html#481 `_ + + `GC_enableMarkAndSweep`:idx: + `system.html#485 `_ + + `GC_fullCollect`:idx: + `system.html#482 `_ + + `GC_getStatistics`:idx: + `system.html#487 `_ + + `GC_ref`:idx: + * `system.html#488 `_ + * `system.html#489 `_ + * `system.html#490 `_ + + `GC_setStrategy`:idx: + `system.html#484 `_ + + `GC_unref`:idx: + * `system.html#491 `_ + * `system.html#492 `_ + * `system.html#493 `_ + + `generalized raw string literal`:idx: + `manual.html#136 `_ + + `generic character types`:idx: + * `regexprs.html#102 `_ + * `re.html#102 `_ + + `Generics`:idx: + * `manual.html#218 `_ + * `tut2.html#109 `_ + + `get`:idx: + `httpclient.html#106 `_ + + `GetAllRows`:idx: + * `db_postgres.html#111 `_ + * `db_mysql.html#111 `_ + * `db_sqlite.html#111 `_ + + `getApplicationDir`:idx: + `os.html#169 `_ + + `getApplicationFilename`:idx: + `os.html#168 `_ + + `getAttribute`:idx: + `xmldom.html#189 `_ + + `getAttributeNode`:idx: + `xmldom.html#191 `_ + + `getAttributeNodeNS`:idx: + `xmldom.html#192 `_ + + `getAttributeNS`:idx: + `xmldom.html#190 `_ + + `getClockStr`:idx: + `times.html#112 `_ + + `getColNumber`:idx: + `lexbase.html#107 `_ + + `getColumn`:idx: + * `parsecfg.html#107 `_ + * `parsexml.html#117 `_ + + `getConfigDir`:idx: + `os.html#167 `_ + + `getContent`:idx: + `httpclient.html#107 `_ + + `getContentLength`:idx: + `cgi.html#111 `_ + + `getContentType`:idx: + `cgi.html#112 `_ + + `getCookie`:idx: + `cgi.html#146 `_ + + `getCreationTime`:idx: + `os.html#118 `_ + + `getCurrentDir`:idx: + `os.html#120 `_ + + `getCurrentExceptionMsg`:idx: + `system.html#438 `_ + + `getCurrentLine`:idx: + `lexbase.html#106 `_ + + `getDateStr`:idx: + `times.html#111 `_ + + `getDocumentRoot`:idx: + `cgi.html#113 `_ + + `getDOM`:idx: + `xmldom.html#135 `_ + + `getElementsByTagName`:idx: + * `xmldom.html#150 `_ + * `xmldom.html#193 `_ + + `getElementsByTagNameNS`:idx: + * `xmldom.html#151 `_ + * `xmldom.html#194 `_ + + `getEnv`:idx: + `os.html#147 `_ + + `getFilename`:idx: + * `parsecfg.html#109 `_ + * `parsexml.html#119 `_ + + `getFilePermissions`:idx: + `os.html#162 `_ + + `getFilePos`:idx: + `system.html#535 `_ + + `getFileSize`:idx: + * `system.html#527 `_ + * `os.html#171 `_ + + `getFreeMem`:idx: + `system.html#444 `_ + + `getGatewayInterface`:idx: + `cgi.html#114 `_ + + `getGMTime`:idx: + `times.html#107 `_ + + `getHomeDir`:idx: + `os.html#166 `_ + + `getHostByName`:idx: + `sockets.html#124 `_ + + `getHttpAccept`:idx: + `cgi.html#115 `_ + + `getHttpAcceptCharset`:idx: + `cgi.html#116 `_ + + `getHttpAcceptEncoding`:idx: + `cgi.html#117 `_ + + `getHttpAcceptLanguage`:idx: + `cgi.html#118 `_ + + `getHttpConnection`:idx: + `cgi.html#119 `_ + + `getHttpCookie`:idx: + `cgi.html#120 `_ + + `getHttpHost`:idx: + `cgi.html#121 `_ + + `getHttpReferer`:idx: + `cgi.html#122 `_ + + `getHttpUserAgent`:idx: + `cgi.html#123 `_ + + `getLastAccessTime`:idx: + `os.html#117 `_ + + `getLastModificationTime`:idx: + `os.html#116 `_ + + `getLine`:idx: + * `parsecfg.html#108 `_ + * `parsexml.html#118 `_ + + `getLocalTime`:idx: + `times.html#106 `_ + + `getMD5`:idx: + `md5.html#106 `_ + + `getNamedItem`:idx: + * `xmldom.html#174 `_ + * `xmldom.html#175 `_ + + `getNamedItemNS`:idx: + * `xmldom.html#176 `_ + * `xmldom.html#177 `_ + + `getOccupiedMem`:idx: + `system.html#443 `_ + + `getopt`:idx: + `parseopt.html#108 `_ + + `getPathInfo`:idx: + `cgi.html#124 `_ + + `getPathTranslated`:idx: + `cgi.html#125 `_ + + `getQueryString`:idx: + `cgi.html#126 `_ + + `getRefcount`:idx: + `system.html#437 `_ + + `getRemoteAddr`:idx: + `cgi.html#127 `_ + + `getRemoteHost`:idx: + `cgi.html#128 `_ + + `getRemoteIdent`:idx: + `cgi.html#129 `_ + + `getRemotePort`:idx: + `cgi.html#130 `_ + + `getRemoteUser`:idx: + `cgi.html#131 `_ + + `getRequestMethod`:idx: + `cgi.html#132 `_ + + `getRequestURI`:idx: + `cgi.html#133 `_ + + `getRestOfCommandLine`:idx: + `parseopt.html#107 `_ + + `get_salt_from_password`:idx: + `mysql.html#280 `_ + + `get_salt_from_password_323`:idx: + `mysql.html#274 `_ + + `getScriptFilename`:idx: + `cgi.html#134 `_ + + `getScriptName`:idx: + `cgi.html#135 `_ + + `getServByName`:idx: + `sockets.html#122 `_ + + `getServByPort`:idx: + `sockets.html#123 `_ + + `getServerAddr`:idx: + `cgi.html#136 `_ + + `getServerAdmin`:idx: + `cgi.html#137 `_ + + `getServerName`:idx: + `cgi.html#138 `_ + + `getServerPort`:idx: + `cgi.html#139 `_ + + `getServerProtocol`:idx: + `cgi.html#140 `_ + + `getServerSignature`:idx: + `cgi.html#141 `_ + + `getServerSoftware`:idx: + `cgi.html#142 `_ + + `getSockName`:idx: + `sockets.html#119 `_ + + `getSockOptInt`:idx: + `sockets.html#125 `_ + + `getStartMilsecs`:idx: + `times.html#116 `_ + + `getStream`:idx: + `zipfiles.html#109 `_ + + `getTime`:idx: + `times.html#105 `_ + + `getTotalMem`:idx: + `system.html#445 `_ + + `get_tty_password`:idx: + `mysql.html#282 `_ + + `GetValue`:idx: + * `db_postgres.html#113 `_ + * `db_mysql.html#113 `_ + * `db_sqlite.html#113 `_ + + `gptr`:idx: + `mysql.html#105 `_ + + `GROUP_FLAG`:idx: + `mysql.html#139 `_ + + `h1`:idx: + `xmlgen.html#132 `_ + + `h2`:idx: + `xmlgen.html#133 `_ + + `h3`:idx: + `xmlgen.html#134 `_ + + `h4`:idx: + `xmlgen.html#135 `_ + + `h5`:idx: + `xmlgen.html#136 `_ + + `h6`:idx: + `xmlgen.html#137 `_ + + `HandleCR`:idx: + `lexbase.html#108 `_ + + `HandleLF`:idx: + `lexbase.html#109 `_ + + `hasAttribute`:idx: + `xmldom.html#195 `_ + + `hasAttributeNS`:idx: + `xmldom.html#196 `_ + + `hasAttributes`:idx: + `xmldom.html#167 `_ + + `hasChildNodes`:idx: + `xmldom.html#168 `_ + + `hasFeature`:idx: + `xmldom.html#138 `_ + + `hash`:idx: + * `hashes.html#103 `_ + * `hashes.html#104 `_ + * `hashes.html#105 `_ + * `hashes.html#106 `_ + * `hashes.html#107 `_ + + `hashData`:idx: + `hashes.html#102 `_ + + `hashIgnoreCase`:idx: + `hashes.html#109 `_ + + `hashIgnoreStyle`:idx: + `hashes.html#108 `_ + + `hash_password`:idx: + `mysql.html#270 `_ + + `hasKey`:idx: + `strtabs.html#108 `_ + + `head`:idx: + `xmlgen.html#138 `_ + + `header`:idx: + `nimrodc.html#102 `_ + + `high`:idx: + `system.html#126 `_ + + `hint`:idx: + * `manual.html#231 `_ + * `manual.html#244 `_ + * `macros.html#140 `_ + + `hostCPU`:idx: + `system.html#407 `_ + + `HOSTNAME_LENGTH`:idx: + `mysql.html#111 `_ + + `hostOS`:idx: + `system.html#406 `_ + + `hr`:idx: + `xmlgen.html#140 `_ + + `html`:idx: + `xmlgen.html#139 `_ + + `HTML`:idx: + * `parsexml.html#102 `_ + * `xmlgen.html#102 `_ + + `htmlTag`:idx: + * `htmlparser.html#105 `_ + * `htmlparser.html#106 `_ + + `htonl`:idx: + `sockets.html#114 `_ + + `htons`:idx: + `sockets.html#115 `_ + + `HTTPPOST_BUFFER`:idx: + `libcurl.html#266 `_ + + `HTTPPOST_FILENAME`:idx: + `libcurl.html#267 `_ + + `HTTPPOST_PTRBUFFER`:idx: + `libcurl.html#268 `_ + + `HTTPPOST_PTRCONTENTS`:idx: + `libcurl.html#269 `_ + + `HTTPPOST_PTRNAME`:idx: + `libcurl.html#270 `_ + + `HTTPPOST_READFILE`:idx: + `libcurl.html#271 `_ + + `hypot`:idx: + `math.html#128 `_ + + `i`:idx: + `xmlgen.html#141 `_ + + `ident`:idx: + * `pegs.html#134 `_ + * `macros.html#126 `_ + + `ident=`:idx: + `macros.html#132 `_ + + `IdentChars`:idx: + `strutils.html#105 `_ + + `identChars`:idx: + `pegs.html#132 `_ + + `identifier`:idx: + `manual.html#105 `_ + + `Identifiers`:idx: + `manual.html#116 `_ + + `IdentStartChars`:idx: + `strutils.html#106 `_ + + `identStartChars`:idx: + `pegs.html#133 `_ + + `if`:idx: + `manual.html#189 `_ + + `img`:idx: + `xmlgen.html#142 `_ + + `implementation`:idx: + `xmldom.html#139 `_ + + `implicit block`:idx: + `manual.html#216 `_ + + `import`:idx: + * `manual.html#227 `_ + * `tut1.html#128 `_ + + `importc`:idx: + `manual.html#249 `_ + + `importNode`:idx: + `xmldom.html#152 `_ + + `in`:idx: + `system.html#357 `_ + + `inc`:idx: + `system.html#171 `_ + + `incl`:idx: + `system.html#179 `_ + + `inclFilePermissions`:idx: + `os.html#164 `_ + + `include`:idx: + `tut1.html#129 `_ + + `indentation sensitive`:idx: + `manual.html#113 `_ + + `inf`:idx: + `system.html#439 `_ + + `InfChecks`:idx: + `manual.html#151 `_ + + `information hiding`:idx: + * `manual.html#225 `_ + * `tut1.html#126 `_ + + `init`:idx: + `parseopt.html#104 `_ + + `initDefaultFont`:idx: + `graphics.html#109 `_ + + `initOptParser`:idx: + `parseopt.html#103 `_ + + `inline`:idx: + `manual.html#174 `_ + + `InlineTags`:idx: + `htmlparser.html#102 `_ + + `input`:idx: + `xmlgen.html#143 `_ + + `inputStream`:idx: + `osproc.html#114 `_ + + `ins`:idx: + `xmlgen.html#144 `_ + + `insert`:idx: + `system.html#378 `_ + + `insertBefore`:idx: + `xmldom.html#169 `_ + + `InsertID`:idx: + * `db_postgres.html#115 `_ + * `db_mysql.html#115 `_ + * `db_sqlite.html#115 `_ + + `insertSep`:idx: + `strutils.html#162 `_ + + `int`:idx: + `system.html#101 `_ + + `int16`:idx: + `system.html#103 `_ + + `int32`:idx: + `system.html#104 `_ + + `int64`:idx: + `system.html#105 `_ + + `int8`:idx: + `system.html#102 `_ + + `intensity`:idx: + `colors.html#106 `_ + + `INTERNAL_NUM_FIELD`:idx: + `mysql.html#306 `_ + + `intToStr`:idx: + `strutils.html#141 `_ + + `intVal`:idx: + `macros.html#123 `_ + + `intVal=`:idx: + `macros.html#129 `_ + + `InvalidSocket`:idx: + `sockets.html#108 `_ + + `is`:idx: + `system.html#359 `_ + + `isAlpha`:idx: + `unicode.html#116 `_ + + `IS_BLOB`:idx: + `mysql.html#304 `_ + + `isColor`:idx: + `colors.html#250 `_ + + `isLower`:idx: + `unicode.html#114 `_ + + `isMainModule`:idx: + `system.html#398 `_ + + `isNil`:idx: + * `system.html#466 `_ + * `system.html#467 `_ + * `system.html#468 `_ + * `system.html#469 `_ + * `system.html#470 `_ + * `system.html#471 `_ + + `is_not`:idx: + `system.html#360 `_ + + `IS_NOT_NULL`:idx: + `mysql.html#303 `_ + + `IS_NUM`:idx: + `mysql.html#305 `_ + + `IS_NUM_FIELD`:idx: + `mysql.html#307 `_ + + `isPowerOfTwo`:idx: + `math.html#107 `_ + + `IS_PRI_KEY`:idx: + `mysql.html#302 `_ + + `isSupported`:idx: + `xmldom.html#170 `_ + + `isTitle`:idx: + `unicode.html#117 `_ + + `isUpper`:idx: + `unicode.html#115 `_ + + `isWhiteSpace`:idx: + `unicode.html#118 `_ + + `item`:idx: + `xmldom.html#178 `_ + + `Item_result`:idx: + `mysql.html#255 `_ + + `items`:idx: + * `system.html#460 `_ + * `system.html#461 `_ + * `system.html#462 `_ + * `system.html#463 `_ + * `system.html#464 `_ + * `system.html#465 `_ + * `ropes.html#117 `_ + * `xmltree.html#115 `_ + + `iterator`:idx: + `manual.html#215 `_ + + `iterOverEnvironment`:idx: + `os.html#150 `_ + + `join`:idx: + * `strutils.html#153 `_ + * `strutils.html#154 `_ + + `JoinPath`:idx: + * `os.html#122 `_ + * `os.html#123 `_ + + `kbd`:idx: + `xmlgen.html#145 `_ + + `keywords`:idx: + `manual.html#117 `_ + + `kind`:idx: + * `parsexml.html#110 `_ + * `macros.html#122 `_ + * `xmltree.html#113 `_ + + `l-values`:idx: + `manual.html#107 `_ + + `label`:idx: + `xmlgen.html#146 `_ + + `lastChild`:idx: + `xmldom.html#154 `_ + + `leaves`:idx: + `ropes.html#116 `_ + + `legend`:idx: + `xmlgen.html#147 `_ + + `len`:idx: + * `system.html#174 `_ + * `system.html#175 `_ + * `system.html#176 `_ + * `system.html#177 `_ + * `system.html#178 `_ + * `strtabs.html#109 `_ + * `parsesql.html#107 `_ + * `macros.html#118 `_ + * `ropes.html#103 `_ + * `xmltree.html#112 `_ + + `Letters`:idx: + `strutils.html#103 `_ + + `letters`:idx: + `pegs.html#129 `_ + + `li`:idx: + `xmlgen.html#148 `_ + + `LIBCURL_VERSION`:idx: + `libcurl.html#272 `_ + + `LIBCURL_VERSION_MAJOR`:idx: + `libcurl.html#273 `_ + + `LIBCURL_VERSION_MINOR`:idx: + `libcurl.html#274 `_ + + `LIBCURL_VERSION_NUM`:idx: + `libcurl.html#275 `_ + + `LIBCURL_VERSION_PATCH`:idx: + `libcurl.html#276 `_ + + `line feed`:idx: + `manual.html#123 `_ + + `lineDir`:idx: + `nimrodc.html#103 `_ + + `lines`:idx: + * `system.html#536 `_ + * `system.html#537 `_ + + `lineTrace`:idx: + `nimrodc.html#105 `_ + + `link`:idx: + `xmlgen.html#149 `_ + + `listen`:idx: + `sockets.html#117 `_ + + `ln`:idx: + `math.html#116 `_ + + `load_defaults`:idx: + `mysql.html#285 `_ + + `loadHtml`:idx: + * `htmlparser.html#110 `_ + * `htmlparser.html#111 `_ + + `LoadLib`:idx: + `dynlib.html#102 `_ + + `loadXML`:idx: + `xmldomparser.html#104 `_ + + `loadXml`:idx: + * `xmlparser.html#104 `_ + * `xmlparser.html#105 `_ + + `loadXMLFile`:idx: + `xmldomparser.html#105 `_ + + `loadXMLStream`:idx: + `xmldomparser.html#103 `_ + + `local type inference`:idx: + `tut1.html#101 `_ + + `LOCAL_HOST`:idx: + `mysql.html#115 `_ + + `LOCAL_HOST_NAMEDPIPE`:idx: + `mysql.html#116 `_ + + `LOCAL_INFILE_ERROR_LEN`:idx: + `mysql.html#424 `_ + + `localName`:idx: + `xmldom.html#155 `_ + + `locations`:idx: + `manual.html#101 `_ + + `log10`:idx: + `math.html#117 `_ + + `log2`:idx: + `math.html#118 `_ + + `low`:idx: + `system.html#127 `_ + + `Macros`:idx: + `manual.html#221 `_ + + `make_password_from_salt`:idx: + `mysql.html#281 `_ + + `make_password_from_salt_323`:idx: + `mysql.html#275 `_ + + `make_scrambled_password`:idx: + `mysql.html#277 `_ + + `make_scrambled_password_323`:idx: + `mysql.html#271 `_ + + `MANAGER_ACCESS`:idx: + `mysql.html#336 `_ + + `MANAGER_CLIENT_ERR`:idx: + `mysql.html#337 `_ + + `MANAGER_INFO`:idx: + `mysql.html#335 `_ + + `MANAGER_INTERNAL_ERR`:idx: + `mysql.html#338 `_ + + `MANAGER_OK`:idx: + `mysql.html#334 `_ + + `map`:idx: + `xmlgen.html#150 `_ + + `match`:idx: + * `regexprs.html#106 `_ + * `regexprs.html#107 `_ + * `re.html#109 `_ + * `re.html#110 `_ + * `pegs.html#137 `_ + * `pegs.html#138 `_ + + `matchLen`:idx: + * `regexprs.html#108 `_ + * `re.html#111 `_ + * `re.html#112 `_ + * `pegs.html#139 `_ + * `pegs.html#140 `_ + + `max`:idx: + * `system.html#324 `_ + * `system.html#454 `_ + * `system.html#455 `_ + * `system.html#456 `_ + * `system.html#457 `_ + * `system.html#458 `_ + * `system.html#459 `_ + + `MAX_BIGINT_WIDTH`:idx: + `mysql.html#194 `_ + + `MAX_BLOB_WIDTH`:idx: + `mysql.html#196 `_ + + `MAX_CHAR_WIDTH`:idx: + `mysql.html#195 `_ + + `MAX_INT_WIDTH`:idx: + `mysql.html#193 `_ + + `MAX_MEDIUMINT_WIDTH`:idx: + `mysql.html#192 `_ + + `MAX_MYSQL_MANAGER_ERR`:idx: + `mysql.html#332 `_ + + `MAX_MYSQL_MANAGER_MSG`:idx: + `mysql.html#333 `_ + + `MAX_SMALLINT_WIDTH`:idx: + `mysql.html#191 `_ + + `MaxSubpatterns`:idx: + * `regexprs.html#105 `_ + * `re.html#104 `_ + * `pegs.html#101 `_ + + `MAX_TINYINT_WIDTH`:idx: + `mysql.html#190 `_ + + `MD5Context`:idx: + `md5.html#102 `_ + + `MD5Digest`:idx: + `md5.html#101 `_ + + `MD5Final`:idx: + `md5.html#105 `_ + + `MD5Init`:idx: + `md5.html#103 `_ + + `MD5Update`:idx: + `md5.html#104 `_ + + `mean`:idx: + `math.html#111 `_ + + `MEM_ROOT`:idx: + `mysql.html#325 `_ + + `meta`:idx: + `xmlgen.html#151 `_ + + `method call syntax`:idx: + `tut2.html#105 `_ + + `methods`:idx: + `manual.html#206 `_ + + `min`:idx: + * `system.html#323 `_ + * `system.html#448 `_ + * `system.html#449 `_ + * `system.html#450 `_ + * `system.html#451 `_ + * `system.html#452 `_ + * `system.html#453 `_ + + `mix`:idx: + `colors.html#107 `_ + + `mod`:idx: + * `system.html#228 `_ + * `system.html#229 `_ + * `system.html#230 `_ + * `system.html#231 `_ + * `system.html#232 `_ + + `modify_defaults_file`:idx: + `mysql.html#284 `_ + + `module`:idx: + * `manual.html#223 `_ + * `tut1.html#125 `_ + + `moveFile`:idx: + `os.html#143 `_ + + `moveMem`:idx: + `system.html#418 `_ + + `Multi-methods`:idx: + `manual.html#213 `_ + + `multi-methods`:idx: + `tut2.html#104 `_ + + `MULTIPLE_KEY_FLAG`:idx: + `mysql.html#127 `_ + + `my_bool`:idx: + `mysql.html#101 `_ + + `MY_CHARSET_INFO`:idx: + `mysql.html#352 `_ + + `my_connect`:idx: + `mysql.html#252 `_ + + `my_init`:idx: + `mysql.html#286 `_ + + `my_net_init`:idx: + `mysql.html#240 `_ + + `my_net_local_init`:idx: + `mysql.html#241 `_ + + `my_net_read`:idx: + `mysql.html#249 `_ + + `my_net_write`:idx: + `mysql.html#246 `_ + + `myodbc_remove_escape`:idx: + `mysql.html#465 `_ + + `my_rnd`:idx: + `mysql.html#268 `_ + + `my_socket`:idx: + `mysql.html#107 `_ + + `mySQL`:idx: + `db_mysql.html#101 `_ + + `MYSQL`:idx: + `mysql.html#357 `_ + + `mysql_add_slave`:idx: + `mysql.html#435 `_ + + `mysql_affected_rows`:idx: + `mysql.html#399 `_ + + `mysql_autocommit`:idx: + `mysql.html#503 `_ + + `MYSQL_BIND`:idx: + `mysql.html#379 `_ + + `mysql_change_user`:idx: + `mysql.html#411 `_ + + `mysql_character_set_name`:idx: + `mysql.html#407 `_ + + `mysql_close`:idx: + `mysql.html#506 `_ + + `mysql_commit`:idx: + `mysql.html#501 `_ + + `mysql_connect`:idx: + `mysql.html#510 `_ + + `MYSQL_COUNT_ERROR`:idx: + `mysql.html#310 `_ + + `mysql_create_db`:idx: + `mysql.html#511 `_ + + `MYSQL_DATA`:idx: + `mysql.html#329 `_ + + `mysql_data_seek`:idx: + `mysql.html#454 `_ + + `MYSQL_DATA_TRUNCATED`:idx: + `mysql.html#508 `_ + + `mysql_debug`:idx: + `mysql.html#464 `_ + + `mysql_disable_reads_from_master`:idx: + `mysql.html#430 `_ + + `mysql_disable_rpl_parse`:idx: + `mysql.html#427 `_ + + `mysql_drop_db`:idx: + `mysql.html#512 `_ + + `mysql_dump_debug_info`:idx: + `mysql.html#437 `_ + + `mysql_embedded`:idx: + `mysql.html#467 `_ + + `mysql_enable_reads_from_master`:idx: + `mysql.html#429 `_ + + `mysql_enable_rpl_parse`:idx: + `mysql.html#426 `_ + + `mysql_enum_shutdown_level`:idx: + `mysql.html#236 `_ + + `mysql_eof`:idx: + `mysql.html#393 `_ + + `MYSQL_ERRMSG_SIZE`:idx: + `mysql.html#185 `_ + + `mysql_errno`:idx: + `mysql.html#401 `_ + + `mysql_errno_to_sqlstate`:idx: + `mysql.html#283 `_ + + `mysql_error`:idx: + `mysql.html#402 `_ + + `mysql_escape_string`:idx: + `mysql.html#461 `_ + + `mysql_fetch_field`:idx: + `mysql.html#459 `_ + + `mysql_fetch_field_direct`:idx: + `mysql.html#394 `_ + + `mysql_fetch_fields`:idx: + `mysql.html#395 `_ + + `mysql_fetch_lengths`:idx: + `mysql.html#458 `_ + + `mysql_fetch_row`:idx: + `mysql.html#457 `_ + + `MYSQL_FIELD`:idx: + `mysql.html#296 `_ + + `mysql_field_count`:idx: + `mysql.html#398 `_ + + `MYSQL_FIELD_OFFSET`:idx: + `mysql.html#301 `_ + + `mysql_field_seek`:idx: + `mysql.html#456 `_ + + `mysql_field_tell`:idx: + `mysql.html#397 `_ + + `mysql_free_result`:idx: + `mysql.html#453 `_ + + `mysql_get_character_set_info`:idx: + `mysql.html#423 `_ + + `mysql_get_client_info`:idx: + `mysql.html#444 `_ + + `mysql_get_client_version`:idx: + `mysql.html#445 `_ + + `mysql_get_host_info`:idx: + `mysql.html#446 `_ + + `mysql_get_parameters`:idx: + `mysql.html#388 `_ + + `mysql_get_proto_info`:idx: + `mysql.html#448 `_ + + `mysql_get_server_info`:idx: + `mysql.html#443 `_ + + `mysql_get_server_version`:idx: + `mysql.html#447 `_ + + `mysql_hex_string`:idx: + `mysql.html#462 `_ + + `mysql_info`:idx: + `mysql.html#405 `_ + + `mysql_init`:idx: + `mysql.html#409 `_ + + `mysql_insert_id`:idx: + `mysql.html#400 `_ + + `mysql_kill`:idx: + `mysql.html#439 `_ + + `mysql_library_end`:idx: + `mysql.html#387 `_ + + `mysql_library_init`:idx: + `mysql.html#386 `_ + + `mysql_list_dbs`:idx: + `mysql.html#449 `_ + + `mysql_list_fields`:idx: + `mysql.html#460 `_ + + `mysql_list_processes`:idx: + `mysql.html#451 `_ + + `mysql_list_tables`:idx: + `mysql.html#450 `_ + + `MYSQL_LONG_DATA_HEADER`:idx: + `mysql.html#291 `_ + + `MYSQL_MANAGER`:idx: + `mysql.html#370 `_ + + `mysql_manager_close`:idx: + `mysql.html#470 `_ + + `mysql_manager_command`:idx: + `mysql.html#471 `_ + + `mysql_manager_connect`:idx: + `mysql.html#469 `_ + + `mysql_manager_fetch_line`:idx: + `mysql.html#472 `_ + + `mysql_manager_init`:idx: + `mysql.html#468 `_ + + `mysql_master_query`:idx: + `mysql.html#419 `_ + + `mysql_master_send_query`:idx: + `mysql.html#420 `_ + + `MYSQL_METHODS`:idx: + `mysql.html#366 `_ + + `mysql_more_results`:idx: + `mysql.html#504 `_ + + `MYSQL_NAMEDPIPE`:idx: + `mysql.html#117 `_ + + `mysql_next_result`:idx: + `mysql.html#505 `_ + + `MYSQL_NO_DATA`:idx: + `mysql.html#507 `_ + + `mysql_num_fields`:idx: + `mysql.html#392 `_ + + `mysql_num_rows`:idx: + `mysql.html#391 `_ + + `mysql_option`:idx: + `mysql.html#331 `_ + + `mysql_options`:idx: + `mysql.html#452 `_ + + `MYSQL_PARAMETERS`:idx: + `mysql.html#374 `_ + + `mysql_ping`:idx: + `mysql.html#441 `_ + + `mysql_protocol_type`:idx: + `mysql.html#345 `_ + + `mysql_query`:idx: + `mysql.html#414 `_ + + `mysql_read_query_result`:idx: + `mysql.html#473 `_ + + `mysql_reads_from_master_enabled`:idx: + `mysql.html#431 `_ + + `mysql_real_connect`:idx: + `mysql.html#412 `_ + + `mysql_real_escape_string`:idx: + `mysql.html#463 `_ + + `mysql_real_query`:idx: + `mysql.html#416 `_ + + `mysql_refresh`:idx: + `mysql.html#438 `_ + + `mysql_reload`:idx: + * `mysql.html#509 `_ + * `mysql.html#513 `_ + + `MYSQL_RES`:idx: + `mysql.html#361 `_ + + `mysql_rollback`:idx: + `mysql.html#502 `_ + + `MYSQL_ROW`:idx: + `mysql.html#299 `_ + + `MYSQL_ROW_OFFSET`:idx: + `mysql.html#316 `_ + + `MYSQL_ROWS`:idx: + `mysql.html#313 `_ + + `mysql_row_seek`:idx: + `mysql.html#455 `_ + + `mysql_row_tell`:idx: + `mysql.html#396 `_ + + `mysql_rpl_parse_enabled`:idx: + `mysql.html#428 `_ + + `mysql_rpl_probe`:idx: + `mysql.html#433 `_ + + `mysql_rpl_query_type`:idx: + `mysql.html#432 `_ + + `mysql_rpl_type`:idx: + `mysql.html#346 `_ + + `mysql_select_db`:idx: + `mysql.html#413 `_ + + `mysql_send_query`:idx: + `mysql.html#415 `_ + + `mysql_server_end`:idx: + `mysql.html#385 `_ + + `mysql_server_init`:idx: + `mysql.html#384 `_ + + `MYSQL_SERVICENAME`:idx: + `mysql.html#118 `_ + + `mysql_set_character_set`:idx: + `mysql.html#408 `_ + + `mysql_set_local_infile_default`:idx: + `mysql.html#425 `_ + + `mysql_set_master`:idx: + `mysql.html#434 `_ + + `mysql_set_server_option`:idx: + `mysql.html#440 `_ + + `mysql_shutdown`:idx: + `mysql.html#436 `_ + + `MYSQL_SHUTDOWN_KILLABLE_CONNECT`:idx: + `mysql.html#232 `_ + + `MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE`:idx: + `mysql.html#234 `_ + + `MYSQL_SHUTDOWN_KILLABLE_TRANS`:idx: + `mysql.html#233 `_ + + `MYSQL_SHUTDOWN_KILLABLE_UPDATE`:idx: + `mysql.html#235 `_ + + `mysql_slave_query`:idx: + `mysql.html#421 `_ + + `mysql_slave_send_query`:idx: + `mysql.html#422 `_ + + `mysql_sqlstate`:idx: + `mysql.html#403 `_ + + `mysql_ssl_set`:idx: + `mysql.html#410 `_ + + `mysql_stat`:idx: + `mysql.html#442 `_ + + `mysql_status`:idx: + `mysql.html#344 `_ + + `MYSQL_STMT`:idx: + `mysql.html#382 `_ + + `mysql_stmt_affected_rows`:idx: + `mysql.html#498 `_ + + `mysql_stmt_attr_get`:idx: + `mysql.html#482 `_ + + `mysql_stmt_attr_set`:idx: + `mysql.html#481 `_ + + `mysql_stmt_bind_param`:idx: + `mysql.html#483 `_ + + `mysql_stmt_bind_result`:idx: + `mysql.html#484 `_ + + `mysql_stmt_close`:idx: + `mysql.html#485 `_ + + `mysql_stmt_data_seek`:idx: + `mysql.html#496 `_ + + `mysql_stmt_errno`:idx: + `mysql.html#491 `_ + + `mysql_stmt_error`:idx: + `mysql.html#492 `_ + + `mysql_stmt_execute`:idx: + `mysql.html#476 `_ + + `mysql_stmt_fetch`:idx: + `mysql.html#477 `_ + + `mysql_stmt_fetch_column`:idx: + `mysql.html#478 `_ + + `mysql_stmt_field_count`:idx: + `mysql.html#500 `_ + + `mysql_stmt_free_result`:idx: + `mysql.html#487 `_ + + `MYSQL_STMT_HEADER`:idx: + `mysql.html#290 `_ + + `mysql_stmt_init`:idx: + `mysql.html#474 `_ + + `mysql_stmt_insert_id`:idx: + `mysql.html#499 `_ + + `mysql_stmt_num_rows`:idx: + `mysql.html#497 `_ + + `mysql_stmt_param_count`:idx: + `mysql.html#480 `_ + + `mysql_stmt_param_metadata`:idx: + `mysql.html#490 `_ + + `mysql_stmt_prepare`:idx: + `mysql.html#475 `_ + + `mysql_stmt_reset`:idx: + `mysql.html#486 `_ + + `mysql_stmt_result_metadata`:idx: + `mysql.html#489 `_ + + `mysql_stmt_row_seek`:idx: + `mysql.html#494 `_ + + `mysql_stmt_row_tell`:idx: + `mysql.html#495 `_ + + `mysql_stmt_send_long_data`:idx: + `mysql.html#488 `_ + + `mysql_stmt_sqlstate`:idx: + `mysql.html#493 `_ + + `mysql_stmt_store_result`:idx: + `mysql.html#479 `_ + + `mysql_store_result`:idx: + `mysql.html#417 `_ + + `mysql_thread_end`:idx: + `mysql.html#390 `_ + + `mysql_thread_id`:idx: + `mysql.html#406 `_ + + `mysql_thread_init`:idx: + `mysql.html#389 `_ + + `mysql_thread_safe`:idx: + `mysql.html#466 `_ + + `mysql_use_result`:idx: + `mysql.html#418 `_ + + `mysql_warning_count`:idx: + `mysql.html#404 `_ + + `my_thread_end`:idx: + `mysql.html#288 `_ + + `my_thread_init`:idx: + `mysql.html#287 `_ + + `my_ulonglong`:idx: + `mysql.html#308 `_ + + `name`:idx: + `xmldom.html#185 `_ + + `NAME_LEN`:idx: + `mysql.html#110 `_ + + `namespace`:idx: + `manual.html#224 `_ + + `namespaceURI`:idx: + `xmldom.html#156 `_ + + `namespaceURI=`:idx: + `xmldom.html#157 `_ + + `nan`:idx: + `system.html#441 `_ + + `natural`:idx: + `pegs.html#135 `_ + + `Natural`:idx: + `system.html#134 `_ + + `neginf`:idx: + `system.html#440 `_ + + `nestList`:idx: + `macros.html#152 `_ + + `NET`:idx: + `mysql.html#199 `_ + + `net_clear`:idx: + `mysql.html#243 `_ + + `net_end`:idx: + `mysql.html#242 `_ + + `net_flush`:idx: + `mysql.html#245 `_ + + `NET_HEADER_SIZE`:idx: + `mysql.html#265 `_ + + `net_new_transaction`:idx: + `mysql.html#239 `_ + + `NET_READ_TIMEOUT`:idx: + `mysql.html#186 `_ + + `net_realloc`:idx: + `mysql.html#244 `_ + + `net_real_write`:idx: + `mysql.html#248 `_ + + `net_safe_read`:idx: + `mysql.html#514 `_ + + `NET_WAIT_TIMEOUT`:idx: + `mysql.html#188 `_ + + `net_write_command`:idx: + `mysql.html#247 `_ + + `NET_WRITE_TIMEOUT`:idx: + `mysql.html#187 `_ + + `new`:idx: + * `system.html#124 `_ + * `system.html#125 `_ + + `newCall`:idx: + * `macros.html#150 `_ + * `macros.html#151 `_ + + `newCData`:idx: + `xmltree.html#107 `_ + + `newComment`:idx: + `xmltree.html#106 `_ + + `newElement`:idx: + `xmltree.html#104 `_ + + `newEntity`:idx: + `xmltree.html#108 `_ + + `newException`:idx: + `system.html#496 `_ + + `newFileStream`:idx: + * `streams.html#120 `_ + * `streams.html#121 `_ + + `newFloatLitNode`:idx: + `macros.html#143 `_ + + `newFont`:idx: + `graphics.html#107 `_ + + `newIdentNode`:idx: + * `macros.html#144 `_ + * `macros.html#145 `_ + + `newIntLitNode`:idx: + `macros.html#142 `_ + + `newline`:idx: + * `manual.html#121 `_ + * `pegs.html#121 `_ + + `newLine`:idx: + `pegs.html#122 `_ + + `NewLines`:idx: + `lexbase.html#102 `_ + + `newNimNode`:idx: + `macros.html#135 `_ + + `newNonTerminal`:idx: + `pegs.html#128 `_ + + `newSeq`:idx: + `system.html#173 `_ + + `newString`:idx: + `system.html#366 `_ + + `newStringStream`:idx: + `streams.html#117 `_ + + `newStringTable`:idx: + * `strtabs.html#104 `_ + * `strtabs.html#105 `_ + + `newStrLitNode`:idx: + `macros.html#141 `_ + + `newSurface`:idx: + `graphics.html#106 `_ + + `newText`:idx: + `xmltree.html#105 `_ + + `newXmlTree`:idx: + `xmltree.html#126 `_ + + `next`:idx: + * `parseopt.html#105 `_ + * `parsecfg.html#106 `_ + * `parsexml.html#123 `_ + * `httpserver.html#105 `_ + + `nextPowerOfTwo`:idx: + `math.html#108 `_ + + `nextSibling`:idx: + `xmldom.html#158 `_ + + `nimcall`:idx: + `manual.html#176 `_ + + `NimrodMajor`:idx: + `system.html#402 `_ + + `NimrodMinor`:idx: + `system.html#403 `_ + + `NimrodPatch`:idx: + `system.html#404 `_ + + `NimrodVersion`:idx: + `system.html#401 `_ + + `noconv`:idx: + `manual.html#179 `_ + + `noDecl`:idx: + `nimrodc.html#101 `_ + + `NO_DEFAULT_VALUE_FLAG`:idx: + `mysql.html#136 `_ + + `nodeName`:idx: + `xmldom.html#159 `_ + + `nodeType`:idx: + `xmldom.html#160 `_ + + `nonterminal`:idx: + `pegs.html#127 `_ + + `noreturn`:idx: + `manual.html#237 `_ + + `normalize`:idx: + * `strutils.html#118 `_ + * `xmldom.html#171 `_ + + `noscript`:idx: + `xmlgen.html#152 `_ + + `noSideEffect`:idx: + `manual.html#234 `_ + + `not`:idx: + * `system.html#120 `_ + * `system.html#203 `_ + * `system.html#204 `_ + * `system.html#205 `_ + * `system.html#206 `_ + * `system.html#207 `_ + + `not_in`:idx: + `system.html#358 `_ + + `NOT_NULL_FLAG`:idx: + `mysql.html#124 `_ + + `ntohl`:idx: + `sockets.html#112 `_ + + `ntohs`:idx: + `sockets.html#113 `_ + + `NULL_LENGTH`:idx: + `mysql.html#289 `_ + + `Numerical constants`:idx: + `manual.html#137 `_ + + `NUM_FLAG`:idx: + `mysql.html#137 `_ + + `object`:idx: + * `manual.html#162 `_ + * `xmlgen.html#153 `_ + + `octet2hex`:idx: + `mysql.html#276 `_ + + `ol`:idx: + `xmlgen.html#154 `_ + + `ONLY_KILL_QUERY`:idx: + `mysql.html#189 `_ + + `Open`:idx: + * `system.html#509 `_ + * `system.html#510 `_ + * `db_postgres.html#118 `_ + * `db_mysql.html#118 `_ + * `db_sqlite.html#118 `_ + + `open`:idx: + * `lexbase.html#104 `_ + * `parsecfg.html#104 `_ + * `parsexml.html#107 `_ + * `parsecsv.html#106 `_ + * `zipfiles.html#102 `_ + * `httpserver.html#103 `_ + + `openarray`:idx: + * `tut1.html#119 `_ + * `system.html#130 `_ + + `openDefaultBrowser`:idx: + `browsers.html#101 `_ + + `OpenFile`:idx: + * `system.html#507 `_ + * `system.html#508 `_ + + `operator`:idx: + `manual.html#139 `_ + + `Operators`:idx: + `manual.html#211 `_ + + `optgroup`:idx: + `xmlgen.html#155 `_ + + `option`:idx: + `xmlgen.html#156 `_ + + `or`:idx: + * `system.html#122 `_ + * `system.html#248 `_ + * `system.html#249 `_ + * `system.html#250 `_ + * `system.html#251 `_ + * `system.html#252 `_ + + `ord`:idx: + `system.html#182 `_ + + `ordinal`:idx: + `tut1.html#114 `_ + + `Ordinal`:idx: + `system.html#114 `_ + + `Ordinal types`:idx: + `manual.html#142 `_ + + `OSError`:idx: + `os.html#112 `_ + + `outputStream`:idx: + `osproc.html#115 `_ + + `ownerDocument`:idx: + `xmldom.html#161 `_ + + `ownerElement`:idx: + `xmldom.html#187 `_ + + `p`:idx: + `xmlgen.html#157 `_ + + `packet_error`:idx: + `mysql.html#201 `_ + + `pairs`:idx: + `strtabs.html#110 `_ + + `parallelReplace`:idx: + * `re.html#121 `_ + * `pegs.html#149 `_ + + `param`:idx: + `xmlgen.html#158 `_ + + `paramCount`:idx: + `os.html#110 `_ + + `paramStr`:idx: + `os.html#111 `_ + + `ParDir`:idx: + `os.html#102 `_ + + `parentDir`:idx: + `os.html#127 `_ + + `parentNode`:idx: + `xmldom.html#162 `_ + + `parseBiggestFloat`:idx: + `parseutils.html#110 `_ + + `parseBiggestInt`:idx: + `parseutils.html#108 `_ + + `ParseBiggestInt`:idx: + `strutils.html#143 `_ + + `parseCmdLine`:idx: + `os.html#160 `_ + + `parseColor`:idx: + `colors.html#249 `_ + + `parseFloat`:idx: + `parseutils.html#111 `_ + + `ParseFloat`:idx: + `strutils.html#144 `_ + + `parseHex`:idx: + `parseutils.html#101 `_ + + `ParseHexInt`:idx: + `strutils.html#145 `_ + + `parseHtml`:idx: + * `htmlparser.html#108 `_ + * `htmlparser.html#109 `_ + + `parseIdent`:idx: + `parseutils.html#103 `_ + + `ParseInt`:idx: + `strutils.html#142 `_ + + `parseInt`:idx: + `parseutils.html#109 `_ + + `parseOct`:idx: + `parseutils.html#102 `_ + + `ParseOctInt`:idx: + `strutils.html#159 `_ + + `parsePeg`:idx: + `pegs.html#154 `_ + + `parseSQL`:idx: + `parsesql.html#109 `_ + + `parseToken`:idx: + `parseutils.html#104 `_ + + `parseXml`:idx: + * `xmlparser.html#102 `_ + * `xmlparser.html#103 `_ + + `PART_KEY_FLAG`:idx: + `mysql.html#138 `_ + + `PathSep`:idx: + `os.html#105 `_ + + `PAttr`:idx: + `xmldom.html#129 `_ + + `PCDataSection`:idx: + `xmldom.html#133 `_ + + `pcDirectory`:idx: + `os.html#154 `_ + + `Pcharacter_set`:idx: + `mysql.html#350 `_ + + `Pcharset_info_st`:idx: + `mysql.html#349 `_ + + `pcLinkToDirectory`:idx: + `os.html#155 `_ + + `PComment`:idx: + `xmldom.html#132 `_ + + `PCURL`:idx: + `libcurl.html#139 `_ + + `Pcurl_calloc_callback`:idx: + `libcurl.html#101 `_ + + `Pcurl_closepolicy`:idx: + `libcurl.html#102 `_ + + `PCURLcode`:idx: + `libcurl.html#123 `_ + + `PCURLFORMcode`:idx: + `libcurl.html#124 `_ + + `PCURLformoption`:idx: + `libcurl.html#125 `_ + + `Pcurl_forms`:idx: + `libcurl.html#103 `_ + + `Pcurl_ftpauth`:idx: + `libcurl.html#104 `_ + + `Pcurl_ftpmethod`:idx: + `libcurl.html#105 `_ + + `Pcurl_ftpssl`:idx: + `libcurl.html#106 `_ + + `Pcurl_httppost`:idx: + `libcurl.html#108 `_ + + `PCURL_HTTP_VERSION`:idx: + `libcurl.html#107 `_ + + `PCURLINFO`:idx: + `libcurl.html#126 `_ + + `Pcurl_infotype`:idx: + `libcurl.html#110 `_ + + `Pcurliocmd`:idx: + `libcurl.html#127 `_ + + `Pcurlioerr`:idx: + `libcurl.html#128 `_ + + `Pcurl_lock_access`:idx: + `libcurl.html#111 `_ + + `Pcurl_lock_data`:idx: + `libcurl.html#112 `_ + + `PCURLM`:idx: + `libcurl.html#129 `_ + + `Pcurl_malloc_callback`:idx: + `libcurl.html#113 `_ + + `PCURLMcode`:idx: + `libcurl.html#130 `_ + + `PCURLMoption`:idx: + `libcurl.html#131 `_ + + `PCURLMSG`:idx: + `libcurl.html#132 `_ + + `PCURL_NETRC_OPTION`:idx: + `libcurl.html#114 `_ + + `PCURLoption`:idx: + `libcurl.html#133 `_ + + `Pcurl_proxytype`:idx: + `libcurl.html#115 `_ + + `Pcurl_realloc_callback`:idx: + `libcurl.html#116 `_ + + `PCURLSH`:idx: + `libcurl.html#134 `_ + + `PCURLSHcode`:idx: + `libcurl.html#135 `_ + + `PCURLSHoption`:idx: + `libcurl.html#136 `_ + + `Pcurl_slist`:idx: + `libcurl.html#117 `_ + + `Pcurl_socket`:idx: + `libcurl.html#118 `_ + + `PCURL_SSL_VERSION`:idx: + `libcurl.html#119 `_ + + `Pcurl_strdup_callback`:idx: + `libcurl.html#120 `_ + + `PCURL_TIMECOND`:idx: + `libcurl.html#121 `_ + + `PCURLversion`:idx: + `libcurl.html#137 `_ + + `Pcurl_version_info_data`:idx: + `libcurl.html#122 `_ + + `PDocument`:idx: + `xmldom.html#128 `_ + + `PDocumentFragment`:idx: + `xmldom.html#130 `_ + + `PDOMImplementation`:idx: + `xmldom.html#125 `_ + + `peg`:idx: + `pegs.html#155 `_ + + `PElement`:idx: + `xmldom.html#127 `_ + + `Pfd_set`:idx: + `libcurl.html#138 `_ + + `PFileStream`:idx: + `streams.html#118 `_ + + `PFloat32`:idx: + `system.html#394 `_ + + `PFloat64`:idx: + `system.html#395 `_ + + `PFont`:idx: + `graphics.html#105 `_ + + `Pgptr`:idx: + `mysql.html#104 `_ + + `PI`:idx: + `math.html#101 `_ + + `PIName`:idx: + `parsexml.html#115 `_ + + `PInt32`:idx: + `system.html#397 `_ + + `PInt64`:idx: + `system.html#396 `_ + + `PIRest`:idx: + `parsexml.html#116 `_ + + `PItem_result`:idx: + `mysql.html#256 `_ + + `PMEM_ROOT`:idx: + `mysql.html#326 `_ + + `Pmy_bool`:idx: + `mysql.html#102 `_ + + `PMY_CHARSET_INFO`:idx: + `mysql.html#353 `_ + + `Pmy_socket`:idx: + `mysql.html#106 `_ + + `PMYSQL`:idx: + `mysql.html#358 `_ + + `PMYSQL_BIND`:idx: + `mysql.html#380 `_ + + `PMYSQL_DATA`:idx: + `mysql.html#330 `_ + + `PMYSQL_FIELD`:idx: + `mysql.html#297 `_ + + `PMYSQL_FIELD_OFFSET`:idx: + `mysql.html#300 `_ + + `PMYSQL_MANAGER`:idx: + `mysql.html#371 `_ + + `PMYSQL_METHODS`:idx: + `mysql.html#367 `_ + + `PMYSQL_PARAMETERS`:idx: + `mysql.html#375 `_ + + `PMYSQL_RES`:idx: + `mysql.html#362 `_ + + `PMYSQL_ROW`:idx: + `mysql.html#298 `_ + + `PMYSQL_ROW_OFFSET`:idx: + `mysql.html#315 `_ + + `PMYSQL_ROWS`:idx: + `mysql.html#314 `_ + + `PMYSQL_STMT`:idx: + `mysql.html#364 `_ + + `Pmy_ulonglong`:idx: + `mysql.html#309 `_ + + `PNET`:idx: + `mysql.html#200 `_ + + `PNimrodNode`:idx: + `macros.html#111 `_ + + `PNimrodSymbol`:idx: + `macros.html#110 `_ + + `PNimrodType`:idx: + `macros.html#109 `_ + + `PNode`:idx: + `xmldom.html#126 `_ + + `PNonTerminal`:idx: + `pegs.html#102 `_ + + `PObject`:idx: + `system.html#137 `_ + + `pointer`:idx: + `system.html#113 `_ + + `pointers`:idx: + * `manual.html#165 `_ + * `tut1.html#120 `_ + + `pop`:idx: + `system.html#478 `_ + + `port`:idx: + `httpserver.html#104 `_ + + `Positive`:idx: + `system.html#135 `_ + + `post`:idx: + `httpclient.html#108 `_ + + `postContent`:idx: + `httpclient.html#109 `_ + + `PostgreSQL`:idx: + * `db_postgres.html#101 `_ + * `db_sqlite.html#101 `_ + + `pow`:idx: + `math.html#132 `_ + + `PPByte`:idx: + `mysql.html#108 `_ + + `PPcurl_httppost`:idx: + `libcurl.html#109 `_ + + `PPPChar`:idx: + `sqlite3.html#174 `_ + + `PProcess`:idx: + `osproc.html#101 `_ + + `PProcessingInstruction`:idx: + `xmldom.html#134 `_ + + `PPSqlite3`:idx: + `sqlite3.html#176 `_ + + `PPsqlite3_stmt`:idx: + `sqlite3.html#179 `_ + + `PPsqlite3_value`:idx: + `sqlite3.html#181 `_ + + `Prand_struct`:idx: + `mysql.html#253 `_ + + `pre`:idx: + `xmlgen.html#159 `_ + + `pred`:idx: + `system.html#170 `_ + + `prefix=`:idx: + `xmldom.html#164 `_ + + `previousSibling`:idx: + `xmldom.html#163 `_ + + `PRI_KEY_FLAG`:idx: + `mysql.html#125 `_ + + `procedural type`:idx: + * `manual.html#168 `_ + * `tut1.html#123 `_ + + `procedures`:idx: + `manual.html#208 `_ + + `processedRows`:idx: + `parsecsv.html#107 `_ + + `processID`:idx: + `osproc.html#112 `_ + + `ProcessingInstructionNode`:idx: + `xmldom.html#121 `_ + + `procvar`:idx: + `manual.html#235 `_ + + `programming by contracts`:idx: + `system.html#424 `_ + + `PRope`:idx: + `ropes.html#102 `_ + + `Psockaddr`:idx: + `mysql.html#250 `_ + + `Psqlite3`:idx: + `sqlite3.html#175 `_ + + `Psqlite3_context`:idx: + `sqlite3.html#177 `_ + + `Psqlite3_stmt`:idx: + `sqlite3.html#178 `_ + + `Psqlite3_value`:idx: + `sqlite3.html#180 `_ + + `PSqlNode`:idx: + `parsesql.html#104 `_ + + `Pst_dynamic_array`:idx: + `mysql.html#341 `_ + + `Pst_mem_root`:idx: + `mysql.html#323 `_ + + `Pst_mysql`:idx: + `mysql.html#355 `_ + + `Pst_mysql_bind`:idx: + `mysql.html#377 `_ + + `Pst_mysql_data`:idx: + `mysql.html#327 `_ + + `Pst_mysql_field`:idx: + `mysql.html#294 `_ + + `Pst_mysql_manager`:idx: + `mysql.html#368 `_ + + `Pst_mysql_methods`:idx: + `mysql.html#354 `_ + + `Pst_mysql_options`:idx: + `mysql.html#342 `_ + + `Pst_mysql_parameters`:idx: + `mysql.html#372 `_ + + `Pst_mysql_res`:idx: + `mysql.html#359 `_ + + `Pst_mysql_rows`:idx: + `mysql.html#311 `_ + + `Pst_mysql_stmt`:idx: + `mysql.html#363 `_ + + `Pst_net`:idx: + `mysql.html#197 `_ + + `PStream`:idx: + `streams.html#101 `_ + + `PStringStream`:idx: + `streams.html#115 `_ + + `PStringTable`:idx: + `strtabs.html#103 `_ + + `Pst_udf_args`:idx: + `mysql.html#257 `_ + + `Pst_udf_init`:idx: + `mysql.html#261 `_ + + `Pst_used_mem`:idx: + `mysql.html#319 `_ + + `PSurface`:idx: + `graphics.html#103 `_ + + `PText`:idx: + `xmldom.html#131 `_ + + `PUDF_ARGS`:idx: + `mysql.html#260 `_ + + `PUDF_INIT`:idx: + `mysql.html#264 `_ + + `pure`:idx: + `manual.html#240 `_ + + `PUSED_MEM`:idx: + `mysql.html#322 `_ + + `push`:idx: + `math.html#135 `_ + + `push/pop`:idx: + `manual.html#245 `_ + + `putEnv`:idx: + `os.html#149 `_ + + `PVIO`:idx: + `mysql.html#103 `_ + + `PXmlAttributes`:idx: + `xmltree.html#103 `_ + + `PXmlNode`:idx: + `xmltree.html#101 `_ + + `PZipFileStream`:idx: + `zipfiles.html#108 `_ + + `q`:idx: + `xmlgen.html#160 `_ + + `quit`:idx: + * `system.html#499 `_ + * `system.html#500 `_ + + `QuitFailure`:idx: + `system.html#498 `_ + + `QuitSuccess`:idx: + `system.html#497 `_ + + `quotation mark`:idx: + `manual.html#128 `_ + + `quoteIfContainsWhite`:idx: + `strutils.html#152 `_ + + `random`:idx: + `math.html#113 `_ + + `randominit`:idx: + `mysql.html#267 `_ + + `randomize`:idx: + `math.html#114 `_ + + `rand_struct`:idx: + `mysql.html#254 `_ + + `range`:idx: + `system.html#128 `_ + + `re`:idx: + `re.html#108 `_ + + `re-raised`:idx: + `manual.html#192 `_ + + `readBool`:idx: + `streams.html#106 `_ + + `readBuffer`:idx: + `system.html#530 `_ + + `ReadBytes`:idx: + `system.html#528 `_ + + `readChar`:idx: + * `system.html#514 `_ + * `streams.html#105 `_ + + `ReadChars`:idx: + `system.html#529 `_ + + `readData`:idx: + `cgi.html#109 `_ + + `readFile`:idx: + `system.html#516 `_ + + `readFloat32`:idx: + `streams.html#111 `_ + + `readFloat64`:idx: + `streams.html#112 `_ + + `readInt16`:idx: + `streams.html#108 `_ + + `readInt32`:idx: + `streams.html#109 `_ + + `readInt64`:idx: + `streams.html#110 `_ + + `readInt8`:idx: + `streams.html#107 `_ + + `readLine`:idx: + * `system.html#524 `_ + * `streams.html#114 `_ + + `readRow`:idx: + `parsecsv.html#108 `_ + + `readStr`:idx: + `streams.html#113 `_ + + `realloc`:idx: + `system.html#422 `_ + + `reBinary`:idx: + * `regexprs.html#116 `_ + * `re.html#130 `_ + + `Recursive module dependencies`:idx: + `manual.html#228 `_ + + `recv`:idx: + * `sockets.html#132 `_ + * `sockets.html#133 `_ + + `recvLine`:idx: + `sockets.html#131 `_ + + `reEmail`:idx: + * `regexprs.html#119 `_ + * `re.html#133 `_ + + `reFloat`:idx: + * `regexprs.html#118 `_ + * `re.html#132 `_ + + `REFRESH_DES_KEY_FILE`:idx: + `mysql.html#154 `_ + + `REFRESH_FAST`:idx: + `mysql.html#151 `_ + + `REFRESH_GRANT`:idx: + `mysql.html#142 `_ + + `REFRESH_HOSTS`:idx: + `mysql.html#145 `_ + + `REFRESH_LOG`:idx: + `mysql.html#143 `_ + + `REFRESH_MASTER`:idx: + `mysql.html#149 `_ + + `REFRESH_QUERY_CACHE`:idx: + `mysql.html#152 `_ + + `REFRESH_QUERY_CACHE_FREE`:idx: + `mysql.html#153 `_ + + `REFRESH_READ_LOCK`:idx: + `mysql.html#150 `_ + + `REFRESH_SLAVE`:idx: + `mysql.html#148 `_ + + `REFRESH_STATUS`:idx: + `mysql.html#146 `_ + + `REFRESH_TABLES`:idx: + `mysql.html#144 `_ + + `REFRESH_THREADS`:idx: + `mysql.html#147 `_ + + `REFRESH_USER_RESOURCES`:idx: + `mysql.html#155 `_ + + `register`:idx: + `manual.html#246 `_ + + `reHex`:idx: + * `regexprs.html#115 `_ + * `re.html#129 `_ + + `reIdentifier`:idx: + * `regexprs.html#112 `_ + * `re.html#126 `_ + + `reInteger`:idx: + * `regexprs.html#114 `_ + * `re.html#128 `_ + + `removeAttribute`:idx: + `xmldom.html#197 `_ + + `removeAttributeNode`:idx: + `xmldom.html#199 `_ + + `removeAttributeNS`:idx: + `xmldom.html#198 `_ + + `removeChild`:idx: + `xmldom.html#172 `_ + + `removeDir`:idx: + `os.html#158 `_ + + `removeFile`:idx: + `os.html#144 `_ + + `removeNamedItem`:idx: + `xmldom.html#179 `_ + + `removeNamedItemNS`:idx: + `xmldom.html#180 `_ + + `reNatural`:idx: + * `regexprs.html#113 `_ + * `re.html#127 `_ + + `renderSQL`:idx: + `parsesql.html#110 `_ + + `reOctal`:idx: + * `regexprs.html#117 `_ + * `re.html#131 `_ + + `repeatChar`:idx: + `strutils.html#147 `_ + + `replace`:idx: + * `strutils.html#155 `_ + * `strutils.html#156 `_ + * `re.html#120 `_ + * `pegs.html#148 `_ + + `replaceChild`:idx: + `xmldom.html#173 `_ + + `replaceStr`:idx: + * `strutils.html#122 `_ + * `strutils.html#123 `_ + + `repr`:idx: + `system.html#379 `_ + + `request`:idx: + `httpclient.html#105 `_ + + `ResetAttributes`:idx: + `terminal.html#110 `_ + + `result`:idx: + * `manual.html#199 `_ + * `manual.html#210 `_ + + `resume`:idx: + `osproc.html#109 `_ + + `return`:idx: + `manual.html#198 `_ + + `reURL`:idx: + * `regexprs.html#120 `_ + * `re.html#134 `_ + + `rgb`:idx: + `colors.html#251 `_ + + `rope`:idx: + * `ropes.html#101 `_ + * `ropes.html#104 `_ + * `ropes.html#105 `_ + * `ropes.html#106 `_ + + `round`:idx: + `math.html#121 `_ + + `Rows`:idx: + * `db_postgres.html#112 `_ + * `db_mysql.html#112 `_ + * `db_sqlite.html#112 `_ + + `run`:idx: + `httpserver.html#107 `_ + + `runeAt`:idx: + `unicode.html#109 `_ + + `runeLen`:idx: + `unicode.html#106 `_ + + `runeLenAt`:idx: + `unicode.html#107 `_ + + `runes`:idx: + `unicode.html#119 `_ + + `running`:idx: + `osproc.html#111 `_ + + `safe`:idx: + `manual.html#112 `_ + + `safecall`:idx: + `manual.html#173 `_ + + `sameFile`:idx: + `os.html#140 `_ + + `sameFileContent`:idx: + `os.html#141 `_ + + `samp`:idx: + `xmlgen.html#161 `_ + + `scope`:idx: + * `manual.html#106 `_ + * `manual.html#229 `_ + + `scramble`:idx: + `mysql.html#278 `_ + + `scramble_323`:idx: + `mysql.html#272 `_ + + `SCRAMBLED_PASSWORD_CHAR_LENGTH`:idx: + `mysql.html#122 `_ + + `SCRAMBLED_PASSWORD_CHAR_LENGTH_323`:idx: + `mysql.html#123 `_ + + `SCRAMBLE_LENGTH`:idx: + `mysql.html#120 `_ + + `SCRAMBLE_LENGTH_323`:idx: + `mysql.html#121 `_ + + `script`:idx: + `xmlgen.html#162 `_ + + `ScriptExt`:idx: + `os.html#108 `_ + + `select`:idx: + * `sockets.html#128 `_ + * `sockets.html#129 `_ + * `sockets.html#130 `_ + * `xmlgen.html#163 `_ + + `send`:idx: + * `sockets.html#135 `_ + * `sockets.html#136 `_ + + `separate compilation`:idx: + * `manual.html#226 `_ + * `tut1.html#127 `_ + + `seq`:idx: + `system.html#131 `_ + + `sequence`:idx: + `pegs.html#110 `_ + + `Sequences`:idx: + * `manual.html#160 `_ + * `tut1.html#118 `_ + + `SERVER_MORE_RESULTS_EXISTS`:idx: + `mysql.html#178 `_ + + `SERVER_QUERY_NO_GOOD_INDEX_USED`:idx: + `mysql.html#179 `_ + + `SERVER_QUERY_NO_INDEX_USED`:idx: + `mysql.html#180 `_ + + `SERVER_STATUS_AUTOCOMMIT`:idx: + `mysql.html#176 `_ + + `SERVER_STATUS_CURSOR_EXISTS`:idx: + `mysql.html#181 `_ + + `SERVER_STATUS_DB_DROPPED`:idx: + `mysql.html#183 `_ + + `SERVER_STATUS_IN_TRANS`:idx: + `mysql.html#175 `_ + + `SERVER_STATUS_LAST_ROW_SENT`:idx: + `mysql.html#182 `_ + + `SERVER_STATUS_MORE_RESULTS`:idx: + `mysql.html#177 `_ + + `SERVER_STATUS_NO_BACKSLASH_ESCAPES`:idx: + `mysql.html#184 `_ + + `SERVER_VERSION_LENGTH`:idx: + `mysql.html#113 `_ + + `set`:idx: + `system.html#132 `_ + + `set type`:idx: + * `manual.html#164 `_ + * `tut1.html#116 `_ + + `setAttribute`:idx: + `xmldom.html#202 `_ + + `setAttributeNode`:idx: + `xmldom.html#200 `_ + + `setAttributeNodeNS`:idx: + `xmldom.html#201 `_ + + `setAttributeNS`:idx: + `xmldom.html#203 `_ + + `setBackgroundColor`:idx: + `terminal.html#116 `_ + + `setCookie`:idx: + `cgi.html#145 `_ + + `setCurrentDir`:idx: + `os.html#121 `_ + + `setCursorPos`:idx: + `terminal.html#101 `_ + + `setCursorXPos`:idx: + `terminal.html#102 `_ + + `setCursorYPos`:idx: + `terminal.html#103 `_ + + `setFilePermissions`:idx: + `os.html#163 `_ + + `setFilePos`:idx: + `system.html#534 `_ + + `SET_FLAG`:idx: + `mysql.html#135 `_ + + `setForegroundColor`:idx: + `terminal.html#115 `_ + + `setLen`:idx: + * `system.html#364 `_ + * `system.html#365 `_ + + `setNamedItem`:idx: + * `xmldom.html#181 `_ + * `xmldom.html#182 `_ + + `setNamedItemNS`:idx: + * `xmldom.html#183 `_ + * `xmldom.html#184 `_ + + `setSockOptInt`:idx: + `sockets.html#126 `_ + + `setTestData`:idx: + `cgi.html#143 `_ + + `shl`:idx: + * `system.html#238 `_ + * `system.html#239 `_ + * `system.html#240 `_ + * `system.html#241 `_ + * `system.html#242 `_ + + `shr`:idx: + * `system.html#233 `_ + * `system.html#234 `_ + * `system.html#235 `_ + * `system.html#236 `_ + * `system.html#237 `_ + + `simple assertions`:idx: + * `regexprs.html#103 `_ + * `re.html#103 `_ + + `simple statements`:idx: + `manual.html#183 `_ + + `SingleTags`:idx: + `htmlparser.html#104 `_ + + `sinh`:idx: + `math.html#129 `_ + + `sizeof`:idx: + `system.html#168 `_ + + `skip`:idx: + * `sockets.html#134 `_ + * `parseutils.html#106 `_ + + `skipIgnoreCase`:idx: + `parseutils.html#107 `_ + + `skipWhitespace`:idx: + `parseutils.html#105 `_ + + `sleep`:idx: + `os.html#170 `_ + + `small`:idx: + `xmlgen.html#164 `_ + + `sockaddr`:idx: + `mysql.html#251 `_ + + `socket`:idx: + `sockets.html#116 `_ + + `span`:idx: + `xmlgen.html#165 `_ + + `specified`:idx: + `xmldom.html#186 `_ + + `split`:idx: + * `strutils.html#126 `_ + * `strutils.html#127 `_ + * `strutils.html#133 `_ + * `strutils.html#134 `_ + * `re.html#123 `_ + * `re.html#124 `_ + * `pegs.html#151 `_ + * `pegs.html#152 `_ + + `splitData`:idx: + `xmldom.html#204 `_ + + `splitFile`:idx: + `os.html#129 `_ + + `SplitFilename`:idx: + `os.html#133 `_ + + `splitLines`:idx: + * `strutils.html#128 `_ + * `strutils.html#132 `_ + + `splitLinesSeq`:idx: + `strutils.html#129 `_ + + `SplitPath`:idx: + * `os.html#125 `_ + * `os.html#126 `_ + + `splitSeq`:idx: + * `strutils.html#130 `_ + * `strutils.html#131 `_ + + `sql`:idx: + * `db_postgres.html#106 `_ + * `db_sqlite.html#106 `_ + + `sqlite3_aggregate_context`:idx: + `sqlite3.html#261 `_ + + `sqlite3_aggregate_count`:idx: + `sqlite3.html#249 `_ + + `sqlite3_bind_blob`:idx: + * `sqlite3.html#216 `_ + * `sqlite3.html#223 `_ + + `sqlite3_bind_double`:idx: + `sqlite3.html#217 `_ + + `sqlite3_bind_int`:idx: + `sqlite3.html#218 `_ + + `sqlite3_bind_int64`:idx: + `sqlite3.html#219 `_ + + `sqlite3_bind_null`:idx: + `sqlite3.html#220 `_ + + `sqlite3_bind_parameter_count`:idx: + `sqlite3.html#226 `_ + + `sqlite3_bind_parameter_index`:idx: + `sqlite3.html#228 `_ + + `sqlite3_bind_parameter_name`:idx: + `sqlite3.html#227 `_ + + `sqlite3_bind_text`:idx: + * `sqlite3.html#221 `_ + * `sqlite3.html#224 `_ + + `sqlite3_bind_text16`:idx: + * `sqlite3.html#222 `_ + * `sqlite3.html#225 `_ + + `sqlite3_busy_handler`:idx: + `sqlite3.html#198 `_ + + `sqlite3_busy_timeout`:idx: + `sqlite3.html#199 `_ + + `sqlite3_changes`:idx: + `sqlite3.html#193 `_ + + `sqlite3_close`:idx: + `sqlite3.html#190 `_ + + `sqlite3_collation_needed`:idx: + `sqlite3.html#279 `_ + + `sqlite3_collation_needed16`:idx: + `sqlite3.html#280 `_ + + `sqlite3_column_blob`:idx: + `sqlite3.html#236 `_ + + `sqlite3_column_bytes`:idx: + `sqlite3.html#237 `_ + + `sqlite3_column_bytes16`:idx: + `sqlite3.html#238 `_ + + `sqlite3_column_count`:idx: + `sqlite3.html#229 `_ + + `sqlite3_column_decltype`:idx: + `sqlite3.html#232 `_ + + `sqlite3_column_decltype16`:idx: + `sqlite3.html#233 `_ + + `sqlite3_column_double`:idx: + `sqlite3.html#239 `_ + + `sqlite3_column_int`:idx: + `sqlite3.html#240 `_ + + `sqlite3_column_int64`:idx: + `sqlite3.html#241 `_ + + `sqlite3_column_name`:idx: + `sqlite3.html#230 `_ + + `sqlite3_column_name16`:idx: + `sqlite3.html#231 `_ + + `sqlite3_column_text`:idx: + `sqlite3.html#242 `_ + + `sqlite3_column_text16`:idx: + `sqlite3.html#243 `_ + + `sqlite3_column_type`:idx: + `sqlite3.html#244 `_ + + `sqlite3_commit_hook`:idx: + `sqlite3.html#208 `_ + + `sqlite3_complete`:idx: + `sqlite3.html#196 `_ + + `sqlite3_complete16`:idx: + `sqlite3.html#197 `_ + + `sqlite3_create_collation`:idx: + `sqlite3.html#277 `_ + + `sqlite3_create_collation16`:idx: + `sqlite3.html#278 `_ + + `sqlite3_create_function`:idx: + `sqlite3.html#247 `_ + + `sqlite3_create_function16`:idx: + `sqlite3.html#248 `_ + + `sqlite3_data_count`:idx: + `sqlite3.html#235 `_ + + `sqlite3_errcode`:idx: + `sqlite3.html#211 `_ + + `sqlite3_errmsg`:idx: + `sqlite3.html#212 `_ + + `sqlite3_errmsg16`:idx: + `sqlite3.html#213 `_ + + `sqlite3_exec`:idx: + `sqlite3.html#191 `_ + + `sqlite3_finalize`:idx: + `sqlite3.html#245 `_ + + `sqlite3_free`:idx: + `sqlite3.html#203 `_ + + `sqlite3_free_table`:idx: + `sqlite3.html#201 `_ + + `sqlite3_get_auxdata`:idx: + `sqlite3.html#263 `_ + + `sqlite3_get_table`:idx: + `sqlite3.html#200 `_ + + `sqlite3_interrupt`:idx: + `sqlite3.html#195 `_ + + `sqlite3_last_insert_rowid`:idx: + `sqlite3.html#192 `_ + + `sqlite3_libversion`:idx: + `sqlite3.html#281 `_ + + `sqlite3_libversion_number`:idx: + `sqlite3.html#283 `_ + + `sqlite3_mprintf`:idx: + `sqlite3.html#202 `_ + + `sqlite3_open`:idx: + `sqlite3.html#209 `_ + + `sqlite3_open16`:idx: + `sqlite3.html#210 `_ + + `sqlite3_prepare`:idx: + `sqlite3.html#214 `_ + + `sqlite3_prepare16`:idx: + `sqlite3.html#215 `_ + + `sqlite3_progress_handler`:idx: + `sqlite3.html#207 `_ + + `sqlite3_reset`:idx: + `sqlite3.html#246 `_ + + `sqlite3_result_blob`:idx: + `sqlite3.html#265 `_ + + `sqlite3_result_double`:idx: + `sqlite3.html#266 `_ + + `sqlite3_result_error`:idx: + `sqlite3.html#267 `_ + + `sqlite3_result_error16`:idx: + `sqlite3.html#268 `_ + + `sqlite3_result_int`:idx: + `sqlite3.html#269 `_ + + `sqlite3_result_int64`:idx: + `sqlite3.html#270 `_ + + `sqlite3_result_null`:idx: + `sqlite3.html#271 `_ + + `sqlite3_result_text`:idx: + `sqlite3.html#272 `_ + + `sqlite3_result_text16`:idx: + `sqlite3.html#273 `_ + + `sqlite3_result_text16be`:idx: + `sqlite3.html#275 `_ + + `sqlite3_result_text16le`:idx: + `sqlite3.html#274 `_ + + `sqlite3_result_value`:idx: + `sqlite3.html#276 `_ + + `sqlite3_set_authorizer`:idx: + `sqlite3.html#205 `_ + + `sqlite3_set_auxdata`:idx: + `sqlite3.html#264 `_ + + `sqlite3_snprintf`:idx: + `sqlite3.html#204 `_ + + `sqlite3_step`:idx: + `sqlite3.html#234 `_ + + `SQLITE3_TEXT`:idx: + `sqlite3.html#106 `_ + + `sqlite3_total_changes`:idx: + `sqlite3.html#194 `_ + + `sqlite3_trace`:idx: + `sqlite3.html#206 `_ + + `sqlite3_user_data`:idx: + `sqlite3.html#262 `_ + + `sqlite3_value_blob`:idx: + `sqlite3.html#250 `_ + + `sqlite3_value_bytes`:idx: + `sqlite3.html#251 `_ + + `sqlite3_value_bytes16`:idx: + `sqlite3.html#252 `_ + + `sqlite3_value_double`:idx: + `sqlite3.html#253 `_ + + `sqlite3_value_int`:idx: + `sqlite3.html#254 `_ + + `sqlite3_value_int64`:idx: + `sqlite3.html#255 `_ + + `sqlite3_value_text`:idx: + `sqlite3.html#256 `_ + + `sqlite3_value_text16`:idx: + `sqlite3.html#257 `_ + + `sqlite3_value_text16be`:idx: + `sqlite3.html#259 `_ + + `sqlite3_value_text16le`:idx: + `sqlite3.html#258 `_ + + `sqlite3_value_type`:idx: + `sqlite3.html#260 `_ + + `sqlite3_version`:idx: + `sqlite3.html#282 `_ + + `SQLITE_ABORT`:idx: + `sqlite3.html#116 `_ + + `SQLITE_ALTER_TABLE`:idx: + `sqlite3.html#167 `_ + + `SQLITE_ANY`:idx: + `sqlite3.html#111 `_ + + `SQLITE_ATTACH`:idx: + `sqlite3.html#165 `_ + + `SQLITE_AUTH`:idx: + `sqlite3.html#135 `_ + + `SQLITE_BLOB`:idx: + `sqlite3.html#103 `_ + + `SQLITE_BUSY`:idx: + `sqlite3.html#117 `_ + + `SQLITE_CANTOPEN`:idx: + `sqlite3.html#126 `_ + + `SQLITE_CONSTRAINT`:idx: + `sqlite3.html#131 `_ + + `SQLITE_COPY`:idx: + `sqlite3.html#141 `_ + + `SQLITE_CORRUPT`:idx: + `sqlite3.html#123 `_ + + `SQLITE_CREATE_INDEX`:idx: + `sqlite3.html#142 `_ + + `SQLITE_CREATE_TABLE`:idx: + `sqlite3.html#143 `_ + + `SQLITE_CREATE_TEMP_INDEX`:idx: + `sqlite3.html#144 `_ + + `SQLITE_CREATE_TEMP_TABLE`:idx: + `sqlite3.html#145 `_ + + `SQLITE_CREATE_TEMP_TRIGGER`:idx: + `sqlite3.html#146 `_ + + `SQLITE_CREATE_TEMP_VIEW`:idx: + `sqlite3.html#147 `_ + + `SQLITE_CREATE_TRIGGER`:idx: + `sqlite3.html#148 `_ + + `SQLITE_CREATE_VIEW`:idx: + `sqlite3.html#149 `_ + + `SQLITE_DELETE`:idx: + `sqlite3.html#150 `_ + + `SQLITE_DENY`:idx: + `sqlite3.html#169 `_ + + `SQLITE_DETACH`:idx: + `sqlite3.html#166 `_ + + `SQLITE_DONE`:idx: + `sqlite3.html#140 `_ + + `SQLITE_DROP_INDEX`:idx: + `sqlite3.html#151 `_ + + `SQLITE_DROP_TABLE`:idx: + `sqlite3.html#152 `_ + + `SQLITE_DROP_TEMP_INDEX`:idx: + `sqlite3.html#153 `_ + + `SQLITE_DROP_TEMP_TABLE`:idx: + `sqlite3.html#154 `_ + + `SQLITE_DROP_TEMP_TRIGGER`:idx: + `sqlite3.html#155 `_ + + `SQLITE_DROP_TEMP_VIEW`:idx: + `sqlite3.html#156 `_ + + `SQLITE_DROP_TRIGGER`:idx: + `sqlite3.html#157 `_ + + `SQLITE_DROP_VIEW`:idx: + `sqlite3.html#158 `_ + + `SQLITE_EMPTY`:idx: + `sqlite3.html#128 `_ + + `SQLITE_ERROR`:idx: + `sqlite3.html#113 `_ + + `SQLITE_FLOAT`:idx: + `sqlite3.html#102 `_ + + `SQLITE_FORMAT`:idx: + `sqlite3.html#136 `_ + + `SQLITE_FULL`:idx: + `sqlite3.html#125 `_ + + `SQLITE_IGNORE`:idx: + `sqlite3.html#170 `_ + + `SQLITE_INSERT`:idx: + `sqlite3.html#159 `_ + + `sqlite_int64`:idx: + `sqlite3.html#173 `_ + + `SQLITE_INTEGER`:idx: + `sqlite3.html#101 `_ + + `SQLITE_INTERNAL`:idx: + `sqlite3.html#114 `_ + + `SQLITE_INTERRUPT`:idx: + `sqlite3.html#121 `_ + + `SQLITE_IOERR`:idx: + `sqlite3.html#122 `_ + + `SQLITE_LOCKED`:idx: + `sqlite3.html#118 `_ + + `SQLITE_MISMATCH`:idx: + `sqlite3.html#132 `_ + + `SQLITE_MISUSE`:idx: + `sqlite3.html#133 `_ + + `SQLITE_NOLFS`:idx: + `sqlite3.html#134 `_ + + `SQLITE_NOMEM`:idx: + `sqlite3.html#119 `_ + + `SQLITE_NOTADB`:idx: + `sqlite3.html#138 `_ + + `SQLITE_NOTFOUND`:idx: + `sqlite3.html#124 `_ + + `SQLITE_NULL`:idx: + `sqlite3.html#104 `_ + + `SQLITE_OK`:idx: + `sqlite3.html#112 `_ + + `SQLITE_PERM`:idx: + `sqlite3.html#115 `_ + + `SQLITE_PRAGMA`:idx: + `sqlite3.html#160 `_ + + `SQLITE_PROTOCOL`:idx: + `sqlite3.html#127 `_ + + `SQLITE_RANGE`:idx: + `sqlite3.html#137 `_ + + `SQLITE_READ`:idx: + `sqlite3.html#161 `_ + + `SQLITE_READONLY`:idx: + `sqlite3.html#120 `_ + + `SQLITE_REINDEX`:idx: + `sqlite3.html#168 `_ + + `SQLITE_ROW`:idx: + `sqlite3.html#139 `_ + + `SQLITE_SCHEMA`:idx: + `sqlite3.html#129 `_ + + `SQLITE_SELECT`:idx: + `sqlite3.html#162 `_ + + `SQLITE_STATIC`:idx: + `sqlite3.html#171 `_ + + `SQLITE_TEXT`:idx: + `sqlite3.html#105 `_ + + `SQLITE_TOOBIG`:idx: + `sqlite3.html#130 `_ + + `SQLITE_TRANSACTION`:idx: + `sqlite3.html#163 `_ + + `SQLITE_TRANSIENT`:idx: + `sqlite3.html#172 `_ + + `SQLITE_UPDATE`:idx: + `sqlite3.html#164 `_ + + `SQLITE_UTF16`:idx: + `sqlite3.html#110 `_ + + `SQLITE_UTF16BE`:idx: + `sqlite3.html#109 `_ + + `SQLITE_UTF16LE`:idx: + `sqlite3.html#108 `_ + + `SQLITE_UTF8`:idx: + `sqlite3.html#107 `_ + + `SQLSTATE_LENGTH`:idx: + `mysql.html#114 `_ + + `sqrt`:idx: + * `math.html#115 `_ + * `complex.html#109 `_ + + `stackTrace`:idx: + `nimrodc.html#104 `_ + + `standardDeviation`:idx: + `math.html#137 `_ + + `startProcess`:idx: + `osproc.html#107 `_ + + `startsWith`:idx: + * `strutils.html#148 `_ + * `re.html#118 `_ + * `pegs.html#146 `_ + + `statement macros`:idx: + `tut2.html#112 `_ + + `Statements`:idx: + `manual.html#182 `_ + + `static error`:idx: + `manual.html#109 `_ + + `static type`:idx: + `manual.html#103 `_ + + `stdcall`:idx: + `manual.html#171 `_ + + `stderr`:idx: + `system.html#506 `_ + + `stdin`:idx: + `system.html#504 `_ + + `stdout`:idx: + `system.html#505 `_ + + `st_dynamic_array`:idx: + `mysql.html#339 `_ + + `st_mem_root`:idx: + `mysql.html#324 `_ + + `stmt`:idx: + `system.html#116 `_ + + `st_mysql`:idx: + `mysql.html#356 `_ + + `st_mysql_bind`:idx: + `mysql.html#378 `_ + + `st_mysql_data`:idx: + `mysql.html#328 `_ + + `st_mysql_field`:idx: + `mysql.html#295 `_ + + `st_mysql_manager`:idx: + `mysql.html#369 `_ + + `st_mysql_methods`:idx: + `mysql.html#365 `_ + + `st_mysql_options`:idx: + `mysql.html#343 `_ + + `st_mysql_parameters`:idx: + `mysql.html#373 `_ + + `st_mysql_res`:idx: + `mysql.html#360 `_ + + `st_mysql_rows`:idx: + `mysql.html#312 `_ + + `st_mysql_stmt`:idx: + `mysql.html#381 `_ + + `st_net`:idx: + `mysql.html#198 `_ + + `string`:idx: + * `manual.html#157 `_ + * `system.html#111 `_ + + `string interpolation`:idx: + `strutils.html#108 `_ + + `String literals`:idx: + `manual.html#119 `_ + + `strip`:idx: + `strutils.html#112 `_ + + `strong`:idx: + `xmlgen.html#166 `_ + + `structured type`:idx: + `manual.html#158 `_ + + `strVal`:idx: + `macros.html#128 `_ + + `strVal=`:idx: + `macros.html#134 `_ + + `st_udf_args`:idx: + `mysql.html#258 `_ + + `st_udf_init`:idx: + `mysql.html#262 `_ + + `st_used_mem`:idx: + `mysql.html#320 `_ + + `style`:idx: + `xmlgen.html#167 `_ + + `style-insensitive`:idx: + `manual.html#118 `_ + + `sub`:idx: + `xmlgen.html#168 `_ + + `subrange`:idx: + * `manual.html#156 `_ + * `tut1.html#115 `_ + + `substitution`:idx: + `strutils.html#107 `_ + + `succ`:idx: + `system.html#169 `_ + + `sum`:idx: + `math.html#110 `_ + + `sup`:idx: + `xmlgen.html#169 `_ + + `suspend`:idx: + `osproc.html#108 `_ + + `swap`:idx: + `system.html#426 `_ + + `symAddr`:idx: + `dynlib.html#104 `_ + + `symbol`:idx: + `macros.html#125 `_ + + `symbol=`:idx: + `macros.html#131 `_ + + `syscall`:idx: + `manual.html#178 `_ + + `system`:idx: + `manual.html#230 `_ + + `table`:idx: + `xmlgen.html#170 `_ + + `tabulator`:idx: + `manual.html#125 `_ + + `TAddress`:idx: + `system.html#380 `_ + + `tag`:idx: + `xmltree.html#110 `_ + + `tagName`:idx: + `xmldom.html#188 `_ + + `tan`:idx: + `math.html#130 `_ + + `tanh`:idx: + `math.html#131 `_ + + `target`:idx: + `xmldom.html#205 `_ + + `TBackgroundColor`:idx: + `terminal.html#114 `_ + + `TBaseLexer`:idx: + `lexbase.html#103 `_ + + `Tbind_destructor_func`:idx: + `sqlite3.html#183 `_ + + `tbody`:idx: + `xmlgen.html#171 `_ + + `TCfgEvent`:idx: + `parsecfg.html#102 `_ + + `TCfgEventKind`:idx: + `parsecfg.html#101 `_ + + `TCfgParser`:idx: + `parsecfg.html#103 `_ + + `TCharSet`:idx: + `strutils.html#101 `_ + + `TCmdLineKind`:idx: + `parseopt.html#101 `_ + + `TColor`:idx: + `colors.html#101 `_ + + `TComplex`:idx: + `complex.html#101 `_ + + `Tcreate_function_final_func`:idx: + `sqlite3.html#186 `_ + + `Tcreate_function_func_func`:idx: + `sqlite3.html#185 `_ + + `Tcreate_function_step_func`:idx: + `sqlite3.html#184 `_ + + `TCsvParser`:idx: + `parsecsv.html#104 `_ + + `TCsvRow`:idx: + `parsecsv.html#103 `_ + + `TCurl`:idx: + `libcurl.html#140 `_ + + `Tcurl_calloc_callback`:idx: + `libcurl.html#153 `_ + + `Tcurl_closepolicy`:idx: + `libcurl.html#174 `_ + + `TCURLcode`:idx: + `libcurl.html#156 `_ + + `Tcurl_conv_callback`:idx: + `libcurl.html#157 `_ + + `Tcurl_debug_callback`:idx: + `libcurl.html#155 `_ + + `TCURLFORMcode`:idx: + `libcurl.html#170 `_ + + `Tcurl_formget_callback`:idx: + `libcurl.html#171 `_ + + `TCURLformoption`:idx: + `libcurl.html#168 `_ + + `Tcurl_forms`:idx: + `libcurl.html#169 `_ + + `Tcurl_free_callback`:idx: + `libcurl.html#150 `_ + + `Tcurl_ftpauth`:idx: + `libcurl.html#161 `_ + + `Tcurl_ftpmethod`:idx: + `libcurl.html#162 `_ + + `Tcurl_ftpssl`:idx: + `libcurl.html#160 `_ + + `Tcurl_httppost`:idx: + `libcurl.html#141 `_ + + `TCURL_HTTP_VERSION`:idx: + `libcurl.html#164 `_ + + `TCURLINFO`:idx: + `libcurl.html#173 `_ + + `Tcurl_infotype`:idx: + `libcurl.html#154 `_ + + `Tcurliocmd`:idx: + `libcurl.html#147 `_ + + `Tcurl_ioctl_callback`:idx: + `libcurl.html#148 `_ + + `Tcurlioerr`:idx: + `libcurl.html#146 `_ + + `Tcurl_lock_access`:idx: + `libcurl.html#176 `_ + + `Tcurl_lock_data`:idx: + `libcurl.html#175 `_ + + `Tcurl_lock_function`:idx: + `libcurl.html#177 `_ + + `TCURLM`:idx: + `libcurl.html#184 `_ + + `Tcurl_malloc_callback`:idx: + `libcurl.html#149 `_ + + `TCURLMcode`:idx: + `libcurl.html#186 `_ + + `TCURLMoption`:idx: + `libcurl.html#190 `_ + + `TCURLMsg`:idx: + `libcurl.html#188 `_ + + `TCURLMSGEnum`:idx: + `libcurl.html#187 `_ + + `TCURL_NETRC_OPTION`:idx: + `libcurl.html#165 `_ + + `TCURLoption`:idx: + `libcurl.html#163 `_ + + `Tcurl_passwd_callback`:idx: + `libcurl.html#145 `_ + + `Tcurl_progress_callback`:idx: + `libcurl.html#142 `_ + + `Tcurl_proxytype`:idx: + `libcurl.html#159 `_ + + `Tcurl_read_callback`:idx: + `libcurl.html#144 `_ + + `Tcurl_realloc_callback`:idx: + `libcurl.html#151 `_ + + `TCURLSH`:idx: + `libcurl.html#179 `_ + + `TCURLSHcode`:idx: + `libcurl.html#180 `_ + + `TCURLSHoption`:idx: + `libcurl.html#181 `_ + + `Tcurl_slist`:idx: + `libcurl.html#172 `_ + + `Tcurl_socket`:idx: + `libcurl.html#185 `_ + + `Tcurl_socket_callback`:idx: + `libcurl.html#189 `_ + + `Tcurl_ssl_ctx_callback`:idx: + `libcurl.html#158 `_ + + `TCURL_SSL_VERSION`:idx: + `libcurl.html#166 `_ + + `Tcurl_strdup_callback`:idx: + `libcurl.html#152 `_ + + `TCURL_TIMECOND`:idx: + `libcurl.html#167 `_ + + `Tcurl_unlock_function`:idx: + `libcurl.html#178 `_ + + `TCURLversion`:idx: + `libcurl.html#182 `_ + + `Tcurl_version_info_data`:idx: + `libcurl.html#183 `_ + + `Tcurl_write_callback`:idx: + `libcurl.html#143 `_ + + `td`:idx: + `xmlgen.html#172 `_ + + `TDbConn`:idx: + * `db_postgres.html#102 `_ + * `db_mysql.html#102 `_ + * `db_sqlite.html#102 `_ + + `TDomain`:idx: + `sockets.html#103 `_ + + `template`:idx: + `manual.html#220 `_ + + `TEndian`:idx: + `system.html#393 `_ + + `term`:idx: + * `pegs.html#104 `_ + * `pegs.html#107 `_ + + `termIgnoreCase`:idx: + `pegs.html#105 `_ + + `termIgnoreStyle`:idx: + `pegs.html#106 `_ + + `terminate`:idx: + `osproc.html#110 `_ + + `text`:idx: + `xmltree.html#109 `_ + + `textarea`:idx: + `xmlgen.html#173 `_ + + `textBounds`:idx: + `graphics.html#116 `_ + + `TextNode`:idx: + `xmldom.html#119 `_ + + `TFile`:idx: + `system.html#501 `_ + + `TFileHandle`:idx: + `system.html#503 `_ + + `TFileMode`:idx: + `system.html#502 `_ + + `TFilePermission`:idx: + `os.html#161 `_ + + `TFileStream`:idx: + `streams.html#119 `_ + + `TFloatClass`:idx: + `math.html#103 `_ + + `tfoot`:idx: + `xmlgen.html#174 `_ + + `TForegroundColor`:idx: + `terminal.html#113 `_ + + `TFormatFlag`:idx: + `strtabs.html#111 `_ + + `TGC_Strategy`:idx: + `system.html#483 `_ + + `th`:idx: + `xmlgen.html#175 `_ + + `THash`:idx: + `hashes.html#101 `_ + + `thead`:idx: + `xmlgen.html#176 `_ + + `Thostent`:idx: + `sockets.html#107 `_ + + `THtmlTag`:idx: + `htmlparser.html#101 `_ + + `THttpMethod`:idx: + `httpclient.html#104 `_ + + `TimeInfoToTime`:idx: + `times.html#108 `_ + + `TIMESTAMP_FLAG`:idx: + `mysql.html#134 `_ + + `title`:idx: + `xmlgen.html#177 `_ + + `TLibHandle`:idx: + `dynlib.html#101 `_ + + `TMonth`:idx: + `times.html#101 `_ + + `TNimNodeKinds`:idx: + `macros.html#103 `_ + + `TNimrodIdent`:idx: + `macros.html#108 `_ + + `TNimrodNodeKind`:idx: + `macros.html#102 `_ + + `TNimrodSymKind`:idx: + `macros.html#106 `_ + + `TNimrodTypeKind`:idx: + `macros.html#104 `_ + + `TNimSymKinds`:idx: + `macros.html#107 `_ + + `TNimTypeKinds`:idx: + `macros.html#105 `_ + + `toBiggestFloat`:idx: + `system.html#409 `_ + + `toBiggestInt`:idx: + `system.html#411 `_ + + `toBin`:idx: + `strutils.html#161 `_ + + `TObject`:idx: + `system.html#136 `_ + + `toFloat`:idx: + `system.html#408 `_ + + `toHex`:idx: + `strutils.html#140 `_ + + `toInt`:idx: + `system.html#410 `_ + + `toLower`:idx: + * `strutils.html#113 `_ + * `strutils.html#114 `_ + * `unicode.html#111 `_ + + `toOct`:idx: + `strutils.html#160 `_ + + `toOctal`:idx: + `strutils.html#125 `_ + + `TOptParser`:idx: + `parseopt.html#102 `_ + + `toString`:idx: + `strutils.html#146 `_ + + `toStrLit`:idx: + `macros.html#146 `_ + + `toTitle`:idx: + `unicode.html#113 `_ + + `toU16`:idx: + `system.html#191 `_ + + `toU32`:idx: + `system.html#192 `_ + + `toU8`:idx: + `system.html#190 `_ + + `toUpper`:idx: + * `strutils.html#115 `_ + * `strutils.html#116 `_ + * `unicode.html#112 `_ + + `toUTF8`:idx: + `unicode.html#110 `_ + + `TPathComponent`:idx: + `os.html#153 `_ + + `TPeg`:idx: + `pegs.html#103 `_ + + `TPoint`:idx: + `graphics.html#102 `_ + + `TPort`:idx: + `sockets.html#102 `_ + + `TProcessOption`:idx: + `osproc.html#102 `_ + + `TProtocol`:idx: + `sockets.html#105 `_ + + `tr`:idx: + `xmlgen.html#178 `_ + + `traced`:idx: + * `manual.html#166 `_ + * `tut1.html#121 `_ + + `transformFile`:idx: + * `re.html#122 `_ + * `pegs.html#150 `_ + + `TRect`:idx: + `graphics.html#101 `_ + + `TRegEx`:idx: + `re.html#106 `_ + + `TRegExFlag`:idx: + `re.html#105 `_ + + `TRequestMethod`:idx: + `cgi.html#105 `_ + + `TResponse`:idx: + `httpclient.html#101 `_ + + `TResult`:idx: + `system.html#167 `_ + + `TRow`:idx: + * `db_postgres.html#103 `_ + * `db_mysql.html#103 `_ + * `db_sqlite.html#103 `_ + + `trunc`:idx: + `math.html#133 `_ + + `TRune`:idx: + `unicode.html#101 `_ + + `TRune16`:idx: + `unicode.html#102 `_ + + `TRunningStat`:idx: + `math.html#134 `_ + + `try`:idx: + * `manual.html#194 `_ + * `tut2.html#108 `_ + + `TryExec`:idx: + * `db_postgres.html#108 `_ + * `db_mysql.html#108 `_ + * `db_sqlite.html#108 `_ + + `TryInsertID`:idx: + * `db_postgres.html#114 `_ + * `db_mysql.html#114 `_ + * `db_sqlite.html#114 `_ + + `TServent`:idx: + `sockets.html#106 `_ + + `TServer`:idx: + `httpserver.html#102 `_ + + `TSocket`:idx: + `sockets.html#101 `_ + + `Tsqlite3_callback`:idx: + `sqlite3.html#182 `_ + + `Tsqlite3_collation_needed_func`:idx: + `sqlite3.html#189 `_ + + `Tsqlite3_create_collation_func`:idx: + `sqlite3.html#188 `_ + + `Tsqlite3_result_func`:idx: + `sqlite3.html#187 `_ + + `TSqlLexer`:idx: + `parsesql.html#101 `_ + + `TSqlNode`:idx: + `parsesql.html#105 `_ + + `TSqlNodeKind`:idx: + `parsesql.html#102 `_ + + `TSqlParser`:idx: + `parsesql.html#106 `_ + + `TSqlQuery`:idx: + * `db_postgres.html#105 `_ + * `db_mysql.html#105 `_ + * `db_sqlite.html#105 `_ + + `TStream`:idx: + `streams.html#102 `_ + + `TStringStream`:idx: + `streams.html#116 `_ + + `TStringTable`:idx: + `strtabs.html#102 `_ + + `TStringTableMode`:idx: + `strtabs.html#101 `_ + + `TStyle`:idx: + `terminal.html#111 `_ + + `tt`:idx: + `xmlgen.html#179 `_ + + `TTime`:idx: + `times.html#103 `_ + + `TTimeInfo`:idx: + `times.html#104 `_ + + `TType`:idx: + `sockets.html#104 `_ + + `tuple`:idx: + `manual.html#161 `_ + + `tuple unpacking`:idx: + `manual.html#212 `_ + + `TWeekDay`:idx: + `times.html#102 `_ + + `TXmlError`:idx: + `parsexml.html#104 `_ + + `TXmlEventKind`:idx: + `parsexml.html#103 `_ + + `TXmlNodeKind`:idx: + `xmltree.html#102 `_ + + `TXmlParseOption`:idx: + `parsexml.html#105 `_ + + `TXmlParser`:idx: + `parsexml.html#106 `_ + + `typ`:idx: + `macros.html#127 `_ + + `typ=`:idx: + `macros.html#133 `_ + + `type`:idx: + * `manual.html#102 `_ + * `manual.html#141 `_ + * `manual.html#217 `_ + + `type casts`:idx: + `tut2.html#101 `_ + + `type conversions`:idx: + `tut2.html#102 `_ + + `type parameters`:idx: + * `manual.html#219 `_ + * `tut2.html#110 `_ + + `type suffix`:idx: + `manual.html#138 `_ + + `typeDesc`:idx: + `system.html#117 `_ + + `TZipArchive`:idx: + `zipfiles.html#101 `_ + + `UDF_ARGS`:idx: + `mysql.html#259 `_ + + `UDF_INIT`:idx: + `mysql.html#263 `_ + + `ul`:idx: + `xmlgen.html#180 `_ + + `unchecked runtime error`:idx: + `manual.html#111 `_ + + `unidecode`:idx: + `unidecode.html#102 `_ + + `UNIQUE_FLAG`:idx: + `mysql.html#140 `_ + + `UNIQUE_KEY_FLAG`:idx: + `mysql.html#126 `_ + + `units`:idx: + `manual.html#181 `_ + + `unixTimeToWinTime`:idx: + `times.html#117 `_ + + `UnixToNativePath`:idx: + `os.html#113 `_ + + `UnloadLib`:idx: + `dynlib.html#103 `_ + + `unsigned integer`:idx: + * `manual.html#143 `_ + * `tut1.html#108 `_ + + `unsigned operations`:idx: + * `manual.html#144 `_ + * `tut1.html#109 `_ + + `UNSIGNED_FLAG`:idx: + `mysql.html#129 `_ + + `untraced`:idx: + * `manual.html#167 `_ + * `tut1.html#122 `_ + + `URLdecode`:idx: + `cgi.html#102 `_ + + `URLencode`:idx: + `cgi.html#101 `_ + + `URLretrieveStream`:idx: + `web.html#101 `_ + + `URLretrieveString`:idx: + `web.html#102 `_ + + `USED_MEM`:idx: + `mysql.html#321 `_ + + `USERNAME_LENGTH`:idx: + `mysql.html#112 `_ + + `validateData`:idx: + `cgi.html#110 `_ + + `validEmailAddress`:idx: + `strutils.html#164 `_ + + `validIdentifier`:idx: + `strutils.html#165 `_ + + `Var`:idx: + `manual.html#187 `_ + + `var`:idx: + `xmlgen.html#181 `_ + + `varargs`:idx: + `manual.html#251 `_ + + `variance`:idx: + * `math.html#112 `_ + * `math.html#136 `_ + + `variant`:idx: + * `manual.html#163 `_ + * `tut2.html#103 `_ + + `verbose`:idx: + `regexprs.html#121 `_ + + `vertical tabulator`:idx: + `manual.html#126 `_ + + `volatile`:idx: + `nimrodc.html#107 `_ + + `waitForExit`:idx: + `osproc.html#113 `_ + + `walkDir`:idx: + `os.html#156 `_ + + `walkDirRec`:idx: + `os.html#157 `_ + + `walkFiles`:idx: + * `os.html#152 `_ + * `zipfiles.html#110 `_ + + `warning`:idx: + * `manual.html#232 `_ + * `manual.html#243 `_ + * `macros.html#139 `_ + + `when`:idx: + * `manual.html#191 `_ + * `tut1.html#106 `_ + + `while`:idx: + `manual.html#203 `_ + + `whitespace`:idx: + `pegs.html#131 `_ + + `Whitespace`:idx: + `strutils.html#102 `_ + + `winTimeToUnixTime`:idx: + `times.html#118 `_ + + `write`:idx: + * `system.html#517 `_ + * `system.html#518 `_ + * `system.html#519 `_ + * `system.html#520 `_ + * `system.html#521 `_ + * `system.html#522 `_ + * `system.html#523 `_ + * `streams.html#103 `_ + * `streams.html#104 `_ + * `ropes.html#118 `_ + + `writeBuffer`:idx: + `system.html#533 `_ + + `writeBytes`:idx: + `system.html#531 `_ + + `writeChars`:idx: + `system.html#532 `_ + + `writeContentType`:idx: + `cgi.html#144 `_ + + `writeln`:idx: + * `system.html#525 `_ + * `system.html#526 `_ + + `WriteStyled`:idx: + `terminal.html#112 `_ + + `writeToBMP`:idx: + `graphics.html#110 `_ + + `wwwNL`:idx: + `httpserver.html#101 `_ + + `XML`:idx: + * `parsexml.html#101 `_ + * `xmlgen.html#101 `_ + + `xmlCheckedTag`:idx: + `xmlgen.html#106 `_ + + `XMLencode`:idx: + `cgi.html#103 `_ + + `xmlHeader`:idx: + `xmltree.html#124 `_ + + `xor`:idx: + * `system.html#123 `_ + * `system.html#253 `_ + * `system.html#254 `_ + * `system.html#255 `_ + * `system.html#256 `_ + * `system.html#257 `_ + + `yield`:idx: + `manual.html#200 `_ + + `ze`:idx: + * `system.html#184 `_ + * `system.html#185 `_ + + `ze64`:idx: + * `system.html#186 `_ + * `system.html#187 `_ + * `system.html#188 `_ + * `system.html#189 `_ + + `ZEROFILL_FLAG`:idx: + `mysql.html#130 `_ + + `zeroMem`:idx: + `system.html#416 `_ \ No newline at end of file diff --git a/examples/parsecfgex.nim b/examples/parsecfgex.nim new file mode 100755 index 0000000000..618ecadd61 --- /dev/null +++ b/examples/parsecfgex.nim @@ -0,0 +1,25 @@ + +import + os, parsecfg, strutils, streams + +var f = newFileStream(paramStr(1), fmRead) +if f != nil: + var p: TCfgParser + open(p, f, paramStr(1)) + while true: + var e = next(p) + case e.kind + of cfgEof: + echo("EOF!") + break + of cfgSectionStart: ## a ``[section]`` has been parsed + echo("new section: " & e.section) + of cfgKeyValuePair: + echo("key-value-pair: " & e.key & ": " & e.value) + of cfgOption: + echo("command: " & e.key & ": " & e.value) + of cfgError: + echo(e.msg) + close(p) +else: + echo("cannot open: " & paramStr(1)) diff --git a/lib/impure/graphics.nim b/lib/impure/graphics.nim index 8590188f58..2c9f2f49ab 100755 --- a/lib/impure/graphics.nim +++ b/lib/impure/graphics.nim @@ -11,9 +11,9 @@ ## implementation uses SDL but the interface is meant to support multiple ## backends some day. -import colors +import colors, math from sdl import PSurface # Bug -from sdl_ttf import OpenFont +from sdl_ttf import OpenFont, closeFont type TRect* = tuple[x, y, width, height: int] @@ -24,7 +24,22 @@ type w, h: int s: sdl.PSurface - ESDLError = object of EBase + EGraphics* = object of EBase + + TFont {.pure, final.} = object + f: sdl_ttf.PFont + color: SDL.TColor + PFont* = ref TFont ## represents a font + +proc toSdlColor(c: TColor): Sdl.TColor = + # Convert colors.TColor to SDL.TColor + var x = c.extractRGB + result.r = toU8(x.r) + result.g = toU8(x.g) + result.b = toU8(x.b) + +proc raiseEGraphics = + raise newException(EGraphics, $SDL.GetError()) proc surfaceFinalizer(s: PSurface) = sdl.freeSurface(s.s) @@ -38,6 +53,24 @@ proc newSurface*(width, height: int): PSurface = assert(not sdl.MustLock(result.s)) +proc fontFinalizer(f: PFont) = closeFont(f.f) + +proc newFont*(name = "VeraMono.ttf", size = 9, color = colBlack): PFont = + ## Creates a new font object. Raises ``EIO`` if the font cannot be loaded. + new(result, fontFinalizer) + result.f = OpenFont(name, size) + if result.f == nil: + raise newException(EIO, "Could not open font file: " & name) + result.color = toSdlColor(color) + +var + defaultFont*: PFont ## default font that is used; this needs to initialized + ## by the client! + +proc initDefaultFont*(name = "VeraMono.ttf", size = 9, color = colBlack) = + ## initializes the `defaultFont` var. + defaultFont = newFont(name, size, color) + proc newScreenSurface(width, height: int): PSurface = ## Creates a new screen surface new(result, surfaceFinalizer) @@ -45,12 +78,6 @@ proc newScreenSurface(width, height: int): PSurface = result.h = height result.s = SDL.SetVideoMode(width, height, 0, 0) -template withEvents(surf: PSurface, event: expr, actions: stmt): stmt = - while True: - var event: SDL.TEvent - if SDL.PollEvent(addr(event)) == 1: - actions - proc writeToBMP*(sur: PSurface, filename: string) = ## Saves the contents of the surface `sur` to the file `filename` as a ## BMP file. @@ -70,28 +97,37 @@ template getPix(video, pitch, x, y: expr): expr = const ColSize = 4 -proc getPixel(sur: PSurface, x, y: Natural): colors.TColor = +proc getPixel(sur: PSurface, x, y: Natural): colors.TColor {.inline.} = + assert x <% sur.w + assert y <% sur.h result = getPix(cast[PPixels](sur.s.pixels), sur.s.pitch div ColSize, x, y) -proc setPixel(sur: PSurface, x, y: Natural, col: colors.TColor) = +proc setPixel(sur: PSurface, x, y: Natural, col: colors.TColor) {.inline.} = + assert x <% sur.w + assert y <% sur.h var pixs = cast[PPixels](sur.s.pixels) #pixs[y * (sur.s.pitch div colSize) + x] = int(col) setPix(pixs, sur.s.pitch div ColSize, x, y, col) proc `[]`*(sur: PSurface, p: TPoint): TColor = + ## get pixel at position `p`. No range checking is done! result = getPixel(sur, p.x, p.y) -#proc `[,]`*(sur: PSurface, x, y: int): TColor = -# result = setPixel(sur, x, y) +proc `[,]`*(sur: PSurface, x, y: int): TColor = + ## get pixel at position ``(x, y)``. No range checking is done! + result = getPixel(sur, x, y) proc `[]=`*(sur: PSurface, p: TPoint, col: TColor) = + ## set the pixel at position `p`. No range checking is done! setPixel(sur, p.x, p.y, col) -#proc `[,]=`*(sur: PSurface, x, y: int, col: TColor) = -# setPixel(sur, x, y, col) +proc `[,]=`*(sur: PSurface, x, y: int, col: TColor) = + ## set the pixel at position ``(x, y)``. No range checking is done! + setPixel(sur, x, y, col) -proc blitSurface*(destSurf: PSurface, destRect: TRect, srcSurf: PSurface, srcRect: TRect) = - ## Merges ``srcSurf`` into ``destSurf`` +proc blit*(destSurf: PSurface, destRect: TRect, srcSurf: PSurface, + srcRect: TRect) = + ## Copies ``srcSurf`` into ``destSurf`` var destTRect, srcTRect: SDL.TRect destTRect.x = int16(destRect.x) @@ -105,75 +141,39 @@ proc blitSurface*(destSurf: PSurface, destRect: TRect, srcSurf: PSurface, srcRec srcTRect.h = int16(srcRect.height) if SDL.blitSurface(srcSurf.s, addr(srcTRect), destSurf.s, addr(destTRect)) != 0: - raise newException(ESDLError, $SDL.GetError()) + raiseEGraphics() -proc textBounds*(font: string, fontSize: int, text: string): tuple[width, height: int] = - var fontFile = OpenFont(font, fontSize) # Open the font file - if fontFile == nil: raise newException(ESDLError, "Could not open font file") - +proc textBounds*(text: string, font = defaultFont): tuple[width, height: int] = var w, h: cint - if sdl_ttf.SizeUTF8(fontFile, text, w, h) < 0: - raise newException(ESDLError, $SDL.GetError()) - return (int(w), int(h)) + if sdl_ttf.SizeUTF8(font.f, text, w, h) < 0: raiseEGraphics() + result.width = int(w) + result.height = int(h) -proc drawText*(sur: PSurface, p: TPoint, font: string, text: string, - fg: TColor = colBlack, fontSize: int = 9) = - ## Draws text with a transparent background, at location ``p``. - ## ``font`` specifies the path to the ttf file, - ## ``fontSize`` specifies the font size in pt, and ``fg`` - ## specifies the foreground color. - var fontFile = OpenFont(font, fontSize) # Open the font file - if fontFile == nil: raise newException(ESDLError, "Could not open font file") - +proc drawText*(sur: PSurface, p: TPoint, text: string, font = defaultFont) = + ## Draws text with a transparent background, at location ``p`` with the given + ## font. var textSur: PSurface # This surface will have the text drawn on it new(textSur, surfaceFinalizer) - var RGBfg = fg.extractRGB - - # Convert colors.TColor to SDL.TColor - var SDLfg: SDL.TColor - SDLfg.r = toU8(RGBfg.r) - SDLfg.g = toU8(RGBfg.g) - SDLfg.b = toU8(RGBfg.b) - # Render the text - textSur.s = sdl_ttf.RenderTextBlended(fontFile, text, SDLfg) + textSur.s = sdl_ttf.RenderTextBlended(font.f, text, font.color) # Merge the text surface with sur - sur.blitSurface((p.x, p.y, sur.w, sur.h), textSur, (0, 0, sur.w, sur.h)) + sur.blit((p.x, p.y, sur.w, sur.h), textSur, (0, 0, sur.w, sur.h)) # Free the surface SDL.FreeSurface(sur.s) -proc drawText*(sur: PSurface, p: TPoint, font: string, text: string, - bg: TColor, fg: TColor = colBlack, fontSize: int = 9) = - ## Draws text, at location ``p``, ``font`` specifies the path to - ## the ttf file, ``fontSize`` specifies the font size in pt, and ``fg`` - ## and ``bg`` specify the foreground and background colors. - var fontFile = OpenFont(font, fontSize) # Open the font file - if fontFile == nil: raise newException(ESDLError, "Could not open font file") - +proc drawText*(sur: PSurface, p: TPoint, text: string, + bg: TColor, font = defaultFont) = + ## Draws text, at location ``p`` with font ``font``. ``bg`` + ## is the background color. var textSur: PSurface # This surface will have the text drawn on it new(textSur, surfaceFinalizer) - - var RGBfg = fg.extractRGB - var RGBbg = bg.extractRGB - - # Convert colors.TColor to SDL.TColor - var SDLfg: SDL.TColor - SDLfg.r = toU8(RGBfg.r) - SDLfg.g = toU8(RGBfg.g) - SDLfg.b = toU8(RGBfg.b) - var SDLbg: SDL.TColor - SDLbg.r = toU8(RGBbg.r) - SDLbg.g = toU8(RGBbg.g) - SDLbg.b = toU8(RGBbg.b) - - # Render the text - textSur.s = sdl_ttf.RenderTextShaded(fontFile, text, SDLfg, SDLbg) + textSur.s = sdl_ttf.RenderTextShaded(font.f, text, font.color, toSdlColor(bg)) # Merge the text surface with sur - sur.blitSurface((p.x, p.y, sur.w, sur.h), textSur, (0, 0, sur.w, sur.h)) + sur.blit((p.x, p.y, sur.w, sur.h), textSur, (0, 0, sur.w, sur.h)) # Free the surface SDL.FreeSurface(sur.s) - + proc drawCircle*(sur: PSurface, p: TPoint, r: Natural, color: TColor) = ## draws a circle with center `p` and radius `r` with the given color ## onto the surface `sur`. @@ -185,15 +185,21 @@ proc drawCircle*(sur: PSurface, p: TPoint, r: Natural, color: TColor) = var x = p.x var y = p.y while px <= py + 1: - setPix(video, pitch, x + px, y + py, color) - setPix(video, pitch, x + px, y - py, color) - setPix(video, pitch, x - px, y + py, color) - setPix(video, pitch, x - px, y - py, color) + if x+px <% sur.w: + if y+py <% sur.h: setPix(video, pitch, x+px, y+py, color) + if y-py <% sur.h: setPix(video, pitch, x+px, y-py, color) + + if x-px <% sur.w: + if y+py <% sur.h: setPix(video, pitch, x-px, y+py, color) + if y-py <% sur.h: setPix(video, pitch, x-px, y-py, color) - setPix(video, pitch, x + py, y + px, color) - setPix(video, pitch, x + py, y - px, color) - setPix(video, pitch, x - py, y + px, color) - setPix(video, pitch, x - py, y - px, color) + if x+py <% sur.w: + if y+px <% sur.h: setPix(video, pitch, x+py, y+px, color) + if y-px <% sur.h: setPix(video, pitch, x+py, y-px, color) + + if x-py <% sur.w: + if y+px <% sur.h: setPix(video, pitch, x-py, y+px, color) + if y-px <% sur.h: setPix(video, pitch, x-py, y-px, color) if a < 0: a = a + (2 * px + 3) @@ -202,16 +208,22 @@ proc drawCircle*(sur: PSurface, p: TPoint, r: Natural, color: TColor) = py = py - 1 px = px + 1 +proc `>-<`(val: int, s: PSurface): int {.inline.} = + return if val < 0: 0 elif val >= s.w: s.w-1 else: val + +proc `>|<`(val: int, s: PSurface): int {.inline.} = + return if val < 0: 0 elif val >= s.h: s.h-1 else: val + proc drawLine*(sur: PSurface, p1, p2: TPoint, color: TColor) = ## draws a line between the two points `p1` and `p2` with the given color ## onto the surface `sur`. var stepx, stepy: int = 0 - var x0: int = p1.x - var x1: int = p2.x - var y0: int = p1.y - var y1: int = p2.y - var dy: int = y1 - y0 - var dx: int = x1 - x0 + var x0 = p1.x >-< sur + var x1 = p2.x >-< sur + var y0 = p1.y >|< sur + var y1 = p2.y >|< sur + var dy = y1 - y0 + var dx = x1 - x0 if dy < 0: dy = -dy stepy = -1 @@ -247,7 +259,7 @@ proc drawLine*(sur: PSurface, p1, p2: TPoint, color: TColor) = setPix(video, pitch, x0, y0, color) proc drawHorLine*(sur: PSurface, x, y, w: Natural, Color: TColor) = - ## draws a horizontal line from (x,y) to (x+w-1, h). + ## draws a horizontal line from (x,y) to (x+w-1, y). var video = cast[PPixels](sur.s.pixels) var pitch = sur.s.pitch div ColSize @@ -264,44 +276,6 @@ proc drawVerLine*(sur: PSurface, x, y, h: Natural, Color: TColor) = for i in 0 .. min(sur.s.h-y, h-1)-1: setPix(video, pitch, x, y + i, color) -proc drawLine2*(sur: PSurface, p0, p1: TPoint, color: TColor) = - ## Draws a line from ``p0`` to ``p1``, using the Bresenham's line algorithm - var (x0, x1, y0, y1) = (p0.x, p1.x, p0.y, p1.y) - - if x0 >= sur.s.w: x0 = sur.s.w-1 - if x1 >= sur.s.w: x1 = sur.s.w-1 - if y0 >= sur.s.h: y0 = sur.s.h-1 - if y1 >= sur.s.h: y1 = sur.s.h-1 - - var video = cast[PPixels](sur.s.pixels) - var pitch = sur.s.pitch div ColSize - - var steep = abs(y1 - y0) > abs(x1 - x0) - if steep: - swap(x0, y0) - swap(x1, y1) - if x0 > x1: - swap(x0, x1) - swap(y0, y1) - - var deltax = x1 - x0 - var deltay = abs(y1 - y0) - var error = deltax div 2 - - var ystep: int - var y = y0 - if y0 < y1: ystep = 1 else: ystep = -1 - - for x in x0..x1: - if steep: - setPix(video, pitch, y, x, color) - else: - setPix(video, pitch, x, y, color) - error = error - deltay - if error < 0: - y = y + ystep - error = error + deltax - proc fillCircle*(s: PSurface, p: TPoint, r: Natural, color: TColor) = ## draws a circle with center `p` and radius `r` with the given color ## onto the surface `sur` and fills it. @@ -361,22 +335,18 @@ proc fillRect*(sur: PSurface, r: TRect, col: TColor) = proc Plot4EllipsePoints(sur: PSurface, CX, CY, X, Y: Natural, col: TColor) = var video = cast[PPixels](sur.s.pixels) var pitch = sur.s.pitch div ColSize - - if CX+X <= sur.s.w-1 and CY+Y <= sur.s.h-1: - setPix(video, pitch, CX+X, CY+Y, col) - - if CX-X <= sur.s.w-1 and CY+Y <= sur.s.h-1: - setPix(video, pitch, CX-X, CY+Y, col) - - if CX-X <= sur.s.w-1 and CY-Y <= sur.s.h-1: - setPix(video, pitch, CX-X, CY-Y, col) - - if CX+X <= sur.s.w-1 and CY-Y <= sur.s.h-1: - setPix(video, pitch, CX+X, CY-Y, col) + if CX+X <= sur.s.w-1: + if CY+Y <= sur.s.h-1: setPix(video, pitch, CX+X, CY+Y, col) + if CY-Y <= sur.s.h-1: setPix(video, pitch, CX+X, CY-Y, col) + if CX-X <= sur.s.w-1: + if CY+Y <= sur.s.h-1: setPix(video, pitch, CX-X, CY+Y, col) + if CY-Y <= sur.s.h-1: setPix(video, pitch, CX-X, CY-Y, col) -proc drawEllipse*(sur: PSurface, CX, CY, XRadius, YRadius: Natural, col: TColor) = - ## Draws an ellipse, ``CX`` and ``CY`` specify the center X and Y of the ellipse, - ## ``XRadius`` and ``YRadius`` specify half the width and height of the ellipse. +proc drawEllipse*(sur: PSurface, CX, CY, XRadius, YRadius: Natural, + col: TColor) = + ## Draws an ellipse, ``CX`` and ``CY`` specify the center X and Y of the + ## ellipse, ``XRadius`` and ``YRadius`` specify half the width and height + ## of the ellipse. var X, Y: Natural XChange, YChange: Natural @@ -438,18 +408,15 @@ proc plotAA(sur: PSurface, x, y, c: float, color: TColor) = setPix(video, pitch, x.toInt(), y.toInt(), pixColor.intensity(1.0 - c) + color.intensity(c)) -import math -proc ipart(x: float): float = - return x.trunc() -proc fpart(x: float): float = - return x - ipart(x) -proc rfpart(x: float): float = - return 1.0 - fpart(x) -proc drawLineAA(sur: PSurface, p1: TPoint, p2: TPoint, color: TColor) = - ## Draws a anti-aliased line from ``p1`` to ``p2``, using Xiaolin Wu's line algorithm +proc ipart(x: float): float = return x.trunc() +proc fpart(x: float): float = return x - ipart(x) +proc rfpart(x: float): float = return 1.0 - fpart(x) + +proc drawLineAA(sur: PSurface, p1, p2: TPoint, color: TColor) = + ## Draws a anti-aliased line from ``p1`` to ``p2``, using Xiaolin Wu's + ## line algorithm var (x1, x2, y1, y2) = (p1.x.toFloat(), p2.x.toFloat(), p1.y.toFloat(), p2.y.toFloat()) - var dx = x2 - x1 var dy = y2 - y1 if abs(dx) < abs(dy): @@ -482,27 +449,28 @@ proc drawLineAA(sur: PSurface, p1: TPoint, p2: TPoint, color: TColor) = sur.plotAA(x.toFloat(), ipart(intery), rfpart(intery), color) sur.plotAA(x.toFloat(), ipart(intery) + 1.0, fpart(intery), color) intery = intery + gradient - - -if sdl.Init(sdl.INIT_VIDEO) < 0: - echo "sdl init failed: " & $SDL.GetError() -if sdl_ttf.Init() < 0: - echo "sdl_ttf init failed: " & $SDL.GetError() +template withEvents(surf: PSurface, event: expr, actions: stmt): stmt = + while True: + var event: SDL.TEvent + if SDL.PollEvent(addr(event)) == 1: + actions + +if sdl.Init(sdl.INIT_VIDEO) < 0: raiseEGraphics() +if sdl_ttf.Init() < 0: raiseEGraphics() when isMainModule: - #var txtSurf = drawText( - var surf = newScreenSurface(800, 600) var r: TRect = (0, 0, 900, 900) # Draw the shapes surf.fillRect(r, colWhite) surf.drawLineAA((100, 170), (400, 471), colTan) - surf.drawLine2((100, 170), (400, 471), colRed) + surf.drawLine((100, 170), (400, 471), colRed) surf.drawEllipse(200, 300, 200, 30, colSeaGreen) - surf.drawHorLine(1, 300, 400, colViolet) # Check if the ellipse is the size it's suppose to be. + surf.drawHorLine(1, 300, 400, colViolet) + # Check if the ellipse is the size it's suppose to be. surf.drawVerLine(200, 300 - 30 + 1, 60, colViolet) # ^^ | i suppose it is surf.drawEllipse(400, 300, 300, 300, colOrange) @@ -512,35 +480,36 @@ when isMainModule: surf.drawVerLine(5, 60, 800, colRed) surf.drawCircle((600, 500), 60, colRed) - surf.drawText((300, 300), "VeraMono.ttf", "TEST", colMidnightBlue, 150) - var textSize = textBounds("VeraMono.ttf", 150, "TEST") - surf.drawText((300, 300 + textSize.height), "VeraMono.ttf", $textSize.width & ", " & $textSize.height, colDarkGreen, 50) + #surf.drawText((300, 300), "TEST", colMidnightBlue) + #var textSize = textBounds("TEST") + #surf.drawText((300, 300 + textSize.height), $textSize.width & ", " & + # $textSize.height, colDarkGreen) var mouseStartX = 0 var mouseStartY = 0 withEvents(surf, event): - case event.theType: + case event.kind: of SDL.QUITEV: break of SDL.KEYDOWN: - if event.key.keysym.sym == SDL.K_LEFT: - echo(event.key.keysym.sym) + if event.sym == SDL.K_LEFT: + echo(event.sym) surf.drawHorLine(395, 300, 5, colPaleGoldenRod) echo("Drawing") else: - echo(event.key.keysym.sym) + echo(event.sym) of SDL.MOUSEBUTTONDOWN: # button.x/y is F* UP! - echo("MOUSEDOWN", event.button.x) - mouseStartX = event.button.x - mouseStartY = event.button.y + echo("MOUSEDOWN ", event.x) + mouseStartX = event.x + mouseStartY = event.y of SDL.MOUSEBUTTONUP: echo("MOUSEUP ", mouseStartX) if mouseStartX != 0 and mouseStartY != 0: - echo(mouseStartX, "->", int(event.button.x)) + echo(mouseStartX, "->", int(event.x)) surf.drawLineAA((mouseStartX, MouseStartY), - (int(event.button.x), int(event.button.y)), colPaleGoldenRod) + (int(event.x), int(event.y)), colPaleGoldenRod) mouseStartX = 0 mouseStartY = 0 diff --git a/lib/oldwrappers/zip/libzip_all.c b/lib/oldwrappers/zip/libzip_all.c new file mode 100755 index 0000000000..797374b296 --- /dev/null +++ b/lib/oldwrappers/zip/libzip_all.c @@ -0,0 +1,4189 @@ +/* + zipint.h -- internal declarations. + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +/* +#ifdef _MSC_VER +#define ZIP_EXTERN __declspec(dllimport) +#endif +*/ + +/* + zip.h -- exported declarations. + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef ZIP_EXTERN +#define ZIP_EXTERN +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +/* flags for zip_open */ + +#define ZIP_CREATE 1 +#define ZIP_EXCL 2 +#define ZIP_CHECKCONS 4 + + +/* flags for zip_name_locate, zip_fopen, zip_stat, ... */ + +#define ZIP_FL_NOCASE 1 /* ignore case on name lookup */ +#define ZIP_FL_NODIR 2 /* ignore directory component */ +#define ZIP_FL_COMPRESSED 4 /* read compressed data */ +#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */ + +/* archive global flags flags */ + +#define ZIP_AFL_TORRENT 1 /* torrent zipped */ + +/* libzip error codes */ + +#define ZIP_ER_OK 0 /* N No error */ +#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */ +#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */ +#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */ +#define ZIP_ER_SEEK 4 /* S Seek error */ +#define ZIP_ER_READ 5 /* S Read error */ +#define ZIP_ER_WRITE 6 /* S Write error */ +#define ZIP_ER_CRC 7 /* N CRC error */ +#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */ +#define ZIP_ER_NOENT 9 /* N No such file */ +#define ZIP_ER_EXISTS 10 /* N File already exists */ +#define ZIP_ER_OPEN 11 /* S Can't open file */ +#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */ +#define ZIP_ER_ZLIB 13 /* Z Zlib error */ +#define ZIP_ER_MEMORY 14 /* N Malloc failure */ +#define ZIP_ER_CHANGED 15 /* N Entry has been changed */ +#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */ +#define ZIP_ER_EOF 17 /* N Premature EOF */ +#define ZIP_ER_INVAL 18 /* N Invalid argument */ +#define ZIP_ER_NOZIP 19 /* N Not a zip archive */ +#define ZIP_ER_INTERNAL 20 /* N Internal error */ +#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */ +#define ZIP_ER_REMOVE 22 /* S Can't remove file */ +#define ZIP_ER_DELETED 23 /* N Entry has been deleted */ + + +/* type of system error value */ + +#define ZIP_ET_NONE 0 /* sys_err unused */ +#define ZIP_ET_SYS 1 /* sys_err is errno */ +#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ + +/* compression methods */ + +#define ZIP_CM_DEFAULT -1 /* better of deflate or store */ +#define ZIP_CM_STORE 0 /* stored (uncompressed) */ +#define ZIP_CM_SHRINK 1 /* shrunk */ +#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */ +#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */ +#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */ +#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */ +#define ZIP_CM_IMPLODE 6 /* imploded */ +/* 7 - Reserved for Tokenizing compression algorithm */ +#define ZIP_CM_DEFLATE 8 /* deflated */ +#define ZIP_CM_DEFLATE64 9 /* deflate64 */ +#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ +/* 11 - Reserved by PKWARE */ +#define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */ +/* 13 - Reserved by PKWARE */ +#define ZIP_CM_LZMA 14 /* LZMA (EFS) */ +/* 15-17 - Reserved by PKWARE */ +#define ZIP_CM_TERSE 18 /* compressed using IBM TERSE (new) */ +#define ZIP_CM_LZ77 19 /* IBM LZ77 z Architecture (PFS) */ +#define ZIP_CM_WAVPACK 97 /* WavPack compressed data */ +#define ZIP_CM_PPMD 98 /* PPMd version I, Rev 1 */ + +/* encryption methods */ + +#define ZIP_EM_NONE 0 /* not encrypted */ +#define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */ +#if 0 /* Strong Encryption Header not parsed yet */ +#define ZIP_EM_DES 0x6601 /* strong encryption: DES */ +#define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */ +#define ZIP_EM_3DES_168 0x6603 +#define ZIP_EM_3DES_112 0x6609 +#define ZIP_EM_AES_128 0x660e +#define ZIP_EM_AES_192 0x660f +#define ZIP_EM_AES_256 0x6610 +#define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */ +#define ZIP_EM_RC4 0x6801 +#endif +#define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */ + +typedef long myoff_t; /* XXX: 64 bit support */ + +enum zip_source_cmd { + ZIP_SOURCE_OPEN, /* prepare for reading */ + ZIP_SOURCE_READ, /* read data */ + ZIP_SOURCE_CLOSE, /* reading is done */ + ZIP_SOURCE_STAT, /* get meta information */ + ZIP_SOURCE_ERROR, /* get error information */ + ZIP_SOURCE_FREE /* cleanup and free resources */ +}; + +typedef ssize_t (*zip_source_callback)(void *state, void *data, + size_t len, enum zip_source_cmd cmd); + +struct zip_stat { + const char *name; /* name of the file */ + int index; /* index within archive */ + unsigned int crc; /* crc of file data */ + time_t mtime; /* modification time */ + myoff_t size; /* size of file (uncompressed) */ + myoff_t comp_size; /* size of file (compressed) */ + unsigned short comp_method; /* compression method used */ + unsigned short encryption_method; /* encryption method used */ +}; + +struct zip; +struct zip_file; +struct zip_source; + + +ZIP_EXTERN int zip_add(struct zip *, const char *, struct zip_source *); +ZIP_EXTERN int zip_add_dir(struct zip *, const char *); +ZIP_EXTERN int zip_close(struct zip *); +ZIP_EXTERN int zip_delete(struct zip *, int); +ZIP_EXTERN void zip_error_clear(struct zip *); +ZIP_EXTERN void zip_error_get(struct zip *, int *, int *); +ZIP_EXTERN int zip_error_get_sys_type(int); +ZIP_EXTERN int zip_error_to_str(char *, size_t, int, int); +ZIP_EXTERN int zip_fclose(struct zip_file *); +ZIP_EXTERN void zip_file_error_clear(struct zip_file *); +ZIP_EXTERN void zip_file_error_get(struct zip_file *, int *, int *); +ZIP_EXTERN const char *zip_file_strerror(struct zip_file *); +ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, int); +ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, int, int); +ZIP_EXTERN ssize_t zip_fread(struct zip_file *, void *, size_t); +ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, int); +ZIP_EXTERN int zip_get_archive_flag(struct zip *, int, int); +ZIP_EXTERN const char *zip_get_file_comment(struct zip *, int, int *, int); +ZIP_EXTERN const char *zip_get_name(struct zip *, int, int); +ZIP_EXTERN int zip_get_num_files(struct zip *); +ZIP_EXTERN int zip_name_locate(struct zip *, const char *, int); +ZIP_EXTERN struct zip *zip_open(const char *, int, int *); +ZIP_EXTERN int zip_rename(struct zip *, int, const char *); +ZIP_EXTERN int zip_replace(struct zip *, int, struct zip_source *); +ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, int); +ZIP_EXTERN int zip_set_archive_flag(struct zip *, int, int); +ZIP_EXTERN int zip_set_file_comment(struct zip *, int, const char *, int); +ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *, + myoff_t, int); +ZIP_EXTERN struct zip_source *zip_source_file(struct zip *, const char *, + myoff_t, myoff_t); +ZIP_EXTERN struct zip_source *zip_source_filep(struct zip *, FILE *, + myoff_t, myoff_t); +ZIP_EXTERN void zip_source_free(struct zip_source *); +ZIP_EXTERN struct zip_source *zip_source_function(struct zip *, + zip_source_callback, void *); +ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *, + int, int, myoff_t, myoff_t); +ZIP_EXTERN int zip_stat(struct zip *, const char *, int, struct zip_stat *); +ZIP_EXTERN int zip_stat_index(struct zip *, int, int, struct zip_stat *); +ZIP_EXTERN void zip_stat_init(struct zip_stat *); +ZIP_EXTERN const char *zip_strerror(struct zip *); +ZIP_EXTERN int zip_unchange(struct zip *, int); +ZIP_EXTERN int zip_unchange_all(struct zip *); +ZIP_EXTERN int zip_unchange_archive(struct zip *); + +#ifdef __cplusplus +} +#endif + + +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. + */ +/* #undef HAVE_DECL_TZNAME */ + +#define HAVE_CONFIG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `fseeko' function. */ +#define HAVE_FSEEKO 1 + +/* Define to 1 if you have the `ftello' function. */ +#define HAVE_FTELLO 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#define HAVE_LIBZ 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `MoveFileExA' function. */ +/* #undef HAVE_MOVEFILEEXA */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if `tm_zone' is member of `struct tm'. */ +#define HAVE_STRUCT_TM_TM_ZONE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use + `HAVE_STRUCT_TM_TM_ZONE' instead. */ +#define HAVE_TM_ZONE 1 + +/* Define to 1 if you don't have `tm_zone' but do have the external array + `tzname'. */ +/* #undef HAVE_TZNAME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libzip" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "libzip@nih.at" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libzip" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libzip 0.9" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libzip" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.9" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* Version number of package */ +#define VERSION "0.9" + + +#ifndef HAVE_MKSTEMP +int _zip_mkstemp(char *); +#define mkstemp _zip_mkstemp +#endif + +#ifdef HAVE_MOVEFILEEXA +#include +#define _zip_rename(s, t) \ + (!MoveFileExA((s), (t), \ + MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) +#else +#define _zip_rename rename +#endif + +#ifndef HAVE_FSEEKO +#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) +#endif +#ifndef HAVE_FTELLO +#define ftello(s) ((long)ftell((s))) +#endif + + +#define CENTRAL_MAGIC "PK\1\2" +#define LOCAL_MAGIC "PK\3\4" +#define EOCD_MAGIC "PK\5\6" +#define DATADES_MAGIC "PK\7\8" +#define TORRENT_SIG "TORRENTZIPPED-" +#define TORRENT_SIG_LEN 14 +#define TORRENT_CRC_LEN 8 +#define TORRENT_MEM_LEVEL 8 +#define CDENTRYSIZE 46u +#define LENTRYSIZE 30 +#define MAXCOMLEN 65536 +#define EOCDLEN 22 +#define CDBUFSIZE (MAXCOMLEN+EOCDLEN) +#define BUFSIZE 8192 + + +/* state of change of a file in zip archive */ + +enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED, + ZIP_ST_ADDED, ZIP_ST_RENAMED }; + +/* constants for struct zip_file's member flags */ + +#define ZIP_ZF_EOF 1 /* EOF reached */ +#define ZIP_ZF_DECOMP 2 /* decompress data */ +#define ZIP_ZF_CRC 4 /* compute and compare CRC */ + +/* directory entry: general purpose bit flags */ + +#define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */ +#define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */ +#define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */ + +/* error information */ + +struct zip_error { + int zip_err; /* libzip error code (ZIP_ER_*) */ + int sys_err; /* copy of errno (E*) or zlib error code */ + char *str; /* string representation or NULL */ +}; + +/* zip archive, part of API */ + +struct zip { + char *zn; /* file name */ + FILE *zp; /* file */ + struct zip_error error; /* error information */ + + unsigned int flags; /* archive global flags */ + unsigned int ch_flags; /* changed archive global flags */ + + struct zip_cdir *cdir; /* central directory */ + char *ch_comment; /* changed archive comment */ + int ch_comment_len; /* length of changed zip archive + * comment, -1 if unchanged */ + int nentry; /* number of entries */ + int nentry_alloc; /* number of entries allocated */ + struct zip_entry *entry; /* entries */ + int nfile; /* number of opened files within archive */ + int nfile_alloc; /* number of files allocated */ + struct zip_file **file; /* opened files within archive */ +}; + +/* file in zip archive, part of API */ + +struct zip_file { + struct zip *za; /* zip archive containing this file */ + struct zip_error error; /* error information */ + int flags; /* -1: eof, >0: error */ + + int method; /* compression method */ + myoff_t fpos; /* position within zip file (fread/fwrite) */ + unsigned long bytes_left; /* number of bytes left to read */ + unsigned long cbytes_left; /* number of bytes of compressed data left */ + + unsigned long crc; /* CRC so far */ + unsigned long crc_orig; /* CRC recorded in archive */ + + char *buffer; + z_stream *zstr; +}; + +/* zip archive directory entry (central or local) */ + +struct zip_dirent { + unsigned short version_madeby; /* (c) version of creator */ + unsigned short version_needed; /* (cl) version needed to extract */ + unsigned short bitflags; /* (cl) general purpose bit flag */ + unsigned short comp_method; /* (cl) compression method used */ + time_t last_mod; /* (cl) time of last modification */ + unsigned int crc; /* (cl) CRC-32 of uncompressed data */ + unsigned int comp_size; /* (cl) size of commpressed data */ + unsigned int uncomp_size; /* (cl) size of uncommpressed data */ + char *filename; /* (cl) file name (NUL-terminated) */ + unsigned short filename_len; /* (cl) length of filename (w/o NUL) */ + char *extrafield; /* (cl) extra field */ + unsigned short extrafield_len; /* (cl) length of extra field */ + char *comment; /* (c) file comment */ + unsigned short comment_len; /* (c) length of file comment */ + unsigned short disk_number; /* (c) disk number start */ + unsigned short int_attrib; /* (c) internal file attributes */ + unsigned int ext_attrib; /* (c) external file attributes */ + unsigned int offset; /* (c) offset of local header */ +}; + +/* zip archive central directory */ + +struct zip_cdir { + struct zip_dirent *entry; /* directory entries */ + int nentry; /* number of entries */ + + unsigned int size; /* size of central direcotry */ + unsigned int offset; /* offset of central directory in file */ + char *comment; /* zip archive comment */ + unsigned short comment_len; /* length of zip archive comment */ +}; + + + +struct zip_source { + zip_source_callback f; + void *ud; +}; + +/* entry in zip archive directory */ + +struct zip_entry { + enum zip_state state; + struct zip_source *source; + char *ch_filename; + char *ch_comment; + int ch_comment_len; +}; + + + +extern const char * const _zip_err_str[]; +extern const int _zip_nerr_str; +extern const int _zip_err_type[]; + + + +#define ZIP_ENTRY_DATA_CHANGED(x) \ + ((x)->state == ZIP_ST_REPLACED \ + || (x)->state == ZIP_ST_ADDED) + + + +int _zip_cdir_compute_crc(struct zip *, uLong *); +void _zip_cdir_free(struct zip_cdir *); +struct zip_cdir *_zip_cdir_new(int, struct zip_error *); +int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); + +void _zip_dirent_finalize(struct zip_dirent *); +void _zip_dirent_init(struct zip_dirent *); +int _zip_dirent_read(struct zip_dirent *, FILE *, + unsigned char **, unsigned int, int, struct zip_error *); +void _zip_dirent_torrent_normalize(struct zip_dirent *); +int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); + +void _zip_entry_free(struct zip_entry *); +void _zip_entry_init(struct zip *, int); +struct zip_entry *_zip_entry_new(struct zip *); + +void _zip_error_clear(struct zip_error *); +void _zip_error_copy(struct zip_error *, struct zip_error *); +void _zip_error_fini(struct zip_error *); +void _zip_error_get(struct zip_error *, int *, int *); +void _zip_error_init(struct zip_error *); +void _zip_error_set(struct zip_error *, int, int); +const char *_zip_error_strerror(struct zip_error *); + +int _zip_file_fillbuf(void *, size_t, struct zip_file *); +unsigned int _zip_file_get_offset(struct zip *, int); + +int _zip_filerange_crc(FILE *, myoff_t, myoff_t, uLong *, struct zip_error *); + +struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *, + myoff_t, myoff_t); + +void _zip_free(struct zip *); +const char *_zip_get_name(struct zip *, int, int, struct zip_error *); +int _zip_local_header_read(struct zip *, int); +void *_zip_memdup(const void *, size_t, struct zip_error *); +int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); +struct zip *_zip_new(struct zip_error *); +unsigned short _zip_read2(unsigned char **); +unsigned int _zip_read4(unsigned char **); +int _zip_replace(struct zip *, int, const char *, struct zip_source *); +int _zip_set_name(struct zip *, int, const char *); +int _zip_unchange(struct zip *, int, int); +void _zip_unchange_data(struct zip_entry *); + + +#include +#include +#include +#include + +const char * +_zip_error_strerror(struct zip_error *err) +{ + const char *zs, *ss; + char buf[128], *s; + + _zip_error_fini(err); + + if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) { + sprintf(buf, "Unknown error %d", err->zip_err); + zs = NULL; + ss = buf; + } + else { + zs = _zip_err_str[err->zip_err]; + + switch (_zip_err_type[err->zip_err]) { + case ZIP_ET_SYS: + ss = strerror(err->sys_err); + break; + + case ZIP_ET_ZLIB: + ss = zError(err->sys_err); + break; + + default: + ss = NULL; + } + } + + if (ss == NULL) + return zs; + else { + if ((s=(char *)malloc(strlen(ss) + + (zs ? strlen(zs)+2 : 0) + 1)) == NULL) + return _zip_err_str[ZIP_ER_MEMORY]; + + sprintf(s, "%s%s%s", + (zs ? zs : ""), + (zs ? ": " : ""), + ss); + err->str = s; + + return s; + } +} + +#include + + + +void +_zip_error_clear(struct zip_error *err) +{ + err->zip_err = ZIP_ER_OK; + err->sys_err = 0; +} + + + +void +_zip_error_copy(struct zip_error *dst, struct zip_error *src) +{ + dst->zip_err = src->zip_err; + dst->sys_err = src->sys_err; +} + + + +void +_zip_error_fini(struct zip_error *err) +{ + free(err->str); + err->str = NULL; +} + + + +void +_zip_error_get(struct zip_error *err, int *zep, int *sep) +{ + if (zep) + *zep = err->zip_err; + if (sep) { + if (zip_error_get_sys_type(err->zip_err) != ZIP_ET_NONE) + *sep = err->sys_err; + else + *sep = 0; + } +} + + + +void +_zip_error_init(struct zip_error *err) +{ + err->zip_err = ZIP_ER_OK; + err->sys_err = 0; + err->str = NULL; +} + + + +void +_zip_error_set(struct zip_error *err, int ze, int se) +{ + if (err) { + err->zip_err = ze; + err->sys_err = se; + } +} + + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + + + +int +_zip_mkstemp(char *path) +{ + int fd; + char *start, *trv; + struct stat sbuf; + pid_t pid; + + /* To guarantee multiple calls generate unique names even if + the file is not created. 676 different possibilities with 7 + or more X's, 26 with 6 or less. */ + static char xtra[2] = "aa"; + int xcnt = 0; + + pid = getpid(); + + /* Move to end of path and count trailing X's. */ + for (trv = path; *trv; ++trv) + if (*trv == 'X') + xcnt++; + else + xcnt = 0; + + /* Use at least one from xtra. Use 2 if more than 6 X's. */ + if (*(trv - 1) == 'X') + *--trv = xtra[0]; + if (xcnt > 6 && *(trv - 1) == 'X') + *--trv = xtra[1]; + + /* Set remaining X's to pid digits with 0's to the left. */ + while (*--trv == 'X') { + *trv = (pid % 10) + '0'; + pid /= 10; + } + + /* update xtra for next call. */ + if (xtra[0] != 'z') + xtra[0]++; + else { + xtra[0] = 'a'; + if (xtra[1] != 'z') + xtra[1]++; + else + xtra[1] = 'a'; + } + + /* + * check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + for (start = trv + 1;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + if (stat(path, &sbuf)) + return (0); + if (!S_ISDIR(sbuf.st_mode)) { + errno = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) { + if ((fd=open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0) + return (fd); + if (errno != EEXIST) + return (0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) { + if (!*trv) + return (0); + if (*trv == 'z') + *trv++ = 'a'; + else { + if (isdigit((unsigned char)*trv)) + *trv = 'a'; + else + ++*trv; + break; + } + } + } + /*NOTREACHED*/ +} + + +#include +#include +#include +#include +#include +#include + +static time_t _zip_d2u_time(int, int); +static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *); +static char *_zip_readstr(unsigned char **, int, int, struct zip_error *); +static void _zip_u2d_time(time_t, unsigned short *, unsigned short *); +static void _zip_write2(unsigned short, FILE *); +static void _zip_write4(unsigned int, FILE *); + + + +void +_zip_cdir_free(struct zip_cdir *cd) +{ + int i; + + if (!cd) + return; + + for (i=0; inentry; i++) + _zip_dirent_finalize(cd->entry+i); + free(cd->comment); + free(cd->entry); + free(cd); +} + + + +struct zip_cdir * +_zip_cdir_new(int nentry, struct zip_error *error) +{ + struct zip_cdir *cd; + + if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry)) + == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + free(cd); + return NULL; + } + + /* entries must be initialized by caller */ + + cd->nentry = nentry; + cd->size = cd->offset = 0; + cd->comment = NULL; + cd->comment_len = 0; + + return cd; +} + + + +int +_zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) +{ + int i; + + cd->offset = ftello(fp); + + for (i=0; inentry; i++) { + if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0) + return -1; + } + + cd->size = ftello(fp) - cd->offset; + + /* clearerr(fp); */ + fwrite(EOCD_MAGIC, 1, 4, fp); + _zip_write4(0, fp); + _zip_write2((unsigned short)cd->nentry, fp); + _zip_write2((unsigned short)cd->nentry, fp); + _zip_write4(cd->size, fp); + _zip_write4(cd->offset, fp); + _zip_write2(cd->comment_len, fp); + fwrite(cd->comment, 1, cd->comment_len, fp); + + if (ferror(fp)) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +void +_zip_dirent_finalize(struct zip_dirent *zde) +{ + free(zde->filename); + zde->filename = NULL; + free(zde->extrafield); + zde->extrafield = NULL; + free(zde->comment); + zde->comment = NULL; +} + + + +void +_zip_dirent_init(struct zip_dirent *de) +{ + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 0; + de->comp_method = 0; + de->last_mod = 0; + de->crc = 0; + de->comp_size = 0; + de->uncomp_size = 0; + de->filename = NULL; + de->filename_len = 0; + de->extrafield = NULL; + de->extrafield_len = 0; + de->comment = NULL; + de->comment_len = 0; + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + de->offset = 0; +} + + + +/* _zip_dirent_read(zde, fp, bufp, left, localp, error): + Fills the zip directory entry zde. + + If bufp is non-NULL, data is taken from there and bufp is advanced + by the amount of data used; no more than left bytes are used. + Otherwise data is read from fp as needed. + + If localp != 0, it reads a local header instead of a central + directory entry. + + Returns 0 if successful. On error, error is filled in and -1 is + returned. +*/ + +int +_zip_dirent_read(struct zip_dirent *zde, FILE *fp, + unsigned char **bufp, unsigned int left, int localp, + struct zip_error *error) +{ + unsigned char buf[CDENTRYSIZE]; + unsigned char *cur; + unsigned short dostime, dosdate; + unsigned int size; + + if (localp) + size = LENTRYSIZE; + else + size = CDENTRYSIZE; + + if (bufp) { + /* use data from buffer */ + cur = *bufp; + if (left < size) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + } + else { + /* read entry from disk */ + if ((fread(buf, 1, size, fp)version_madeby = _zip_read2(&cur); + else + zde->version_madeby = 0; + zde->version_needed = _zip_read2(&cur); + zde->bitflags = _zip_read2(&cur); + zde->comp_method = _zip_read2(&cur); + + /* convert to time_t */ + dostime = _zip_read2(&cur); + dosdate = _zip_read2(&cur); + zde->last_mod = _zip_d2u_time(dostime, dosdate); + + zde->crc = _zip_read4(&cur); + zde->comp_size = _zip_read4(&cur); + zde->uncomp_size = _zip_read4(&cur); + + zde->filename_len = _zip_read2(&cur); + zde->extrafield_len = _zip_read2(&cur); + + if (localp) { + zde->comment_len = 0; + zde->disk_number = 0; + zde->int_attrib = 0; + zde->ext_attrib = 0; + zde->offset = 0; + } else { + zde->comment_len = _zip_read2(&cur); + zde->disk_number = _zip_read2(&cur); + zde->int_attrib = _zip_read2(&cur); + zde->ext_attrib = _zip_read4(&cur); + zde->offset = _zip_read4(&cur); + } + + zde->filename = NULL; + zde->extrafield = NULL; + zde->comment = NULL; + + if (bufp) { + if (left < CDENTRYSIZE + (zde->filename_len+zde->extrafield_len + +zde->comment_len)) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + if (zde->filename_len) { + zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error); + if (!zde->filename) + return -1; + } + + if (zde->extrafield_len) { + zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0, + error); + if (!zde->extrafield) + return -1; + } + + if (zde->comment_len) { + zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error); + if (!zde->comment) + return -1; + } + } + else { + if (zde->filename_len) { + zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error); + if (!zde->filename) + return -1; + } + + if (zde->extrafield_len) { + zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0, + error); + if (!zde->extrafield) + return -1; + } + + if (zde->comment_len) { + zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error); + if (!zde->comment) + return -1; + } + } + + if (bufp) + *bufp = cur; + + return 0; +} + + + +/* _zip_dirent_torrent_normalize(de); + Set values suitable for torrentzip. +*/ + +void +_zip_dirent_torrent_normalize(struct zip_dirent *de) +{ + static struct tm torrenttime; + static time_t last_mod = 0; + + if (last_mod == 0) { +#ifdef HAVE_STRUCT_TM_TM_ZONE + time_t now; + struct tm *l; +#endif + + torrenttime.tm_sec = 0; + torrenttime.tm_min = 32; + torrenttime.tm_hour = 23; + torrenttime.tm_mday = 24; + torrenttime.tm_mon = 11; + torrenttime.tm_year = 96; + torrenttime.tm_wday = 0; + torrenttime.tm_yday = 0; + torrenttime.tm_isdst = 0; + +#ifdef HAVE_STRUCT_TM_TM_ZONE + time(&now); + l = localtime(&now); + torrenttime.tm_gmtoff = l->tm_gmtoff; + torrenttime.tm_zone = l->tm_zone; +#endif + + last_mod = mktime(&torrenttime); + } + + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 2; /* maximum compression */ + de->comp_method = ZIP_CM_DEFLATE; + de->last_mod = last_mod; + + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + de->offset = 0; + + free(de->extrafield); + de->extrafield = NULL; + de->extrafield_len = 0; + free(de->comment); + de->comment = NULL; + de->comment_len = 0; +} + + + +/* _zip_dirent_write(zde, fp, localp, error): + Writes zip directory entry zde to file fp. + + If localp != 0, it writes a local header instead of a central + directory entry. + + Returns 0 if successful. On error, error is filled in and -1 is + returned. +*/ + +int +_zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, + struct zip_error *error) +{ + unsigned short dostime, dosdate; + + fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); + + if (!localp) + _zip_write2(zde->version_madeby, fp); + _zip_write2(zde->version_needed, fp); + _zip_write2(zde->bitflags, fp); + _zip_write2(zde->comp_method, fp); + + _zip_u2d_time(zde->last_mod, &dostime, &dosdate); + _zip_write2(dostime, fp); + _zip_write2(dosdate, fp); + + _zip_write4(zde->crc, fp); + _zip_write4(zde->comp_size, fp); + _zip_write4(zde->uncomp_size, fp); + + _zip_write2(zde->filename_len, fp); + _zip_write2(zde->extrafield_len, fp); + + if (!localp) { + _zip_write2(zde->comment_len, fp); + _zip_write2(zde->disk_number, fp); + _zip_write2(zde->int_attrib, fp); + _zip_write4(zde->ext_attrib, fp); + _zip_write4(zde->offset, fp); + } + + if (zde->filename_len) + fwrite(zde->filename, 1, zde->filename_len, fp); + + if (zde->extrafield_len) + fwrite(zde->extrafield, 1, zde->extrafield_len, fp); + + if (!localp) { + if (zde->comment_len) + fwrite(zde->comment, 1, zde->comment_len, fp); + } + + if (ferror(fp)) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +static time_t +_zip_d2u_time(int dtime, int ddate) +{ + struct tm *tm; + time_t now; + + now = time(NULL); + tm = localtime(&now); + /* let mktime decide if DST is in effect */ + tm->tm_isdst = -1; + + tm->tm_year = ((ddate>>9)&127) + 1980 - 1900; + tm->tm_mon = ((ddate>>5)&15) - 1; + tm->tm_mday = ddate&31; + + tm->tm_hour = (dtime>>11)&31; + tm->tm_min = (dtime>>5)&63; + tm->tm_sec = (dtime<<1)&62; + + return mktime(tm); +} + + + +unsigned short +_zip_read2(unsigned char **a) +{ + unsigned short ret; + + ret = (*a)[0]+((*a)[1]<<8); + *a += 2; + + return ret; +} + + + +unsigned int +_zip_read4(unsigned char **a) +{ + unsigned int ret; + + ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + *a += 4; + + return ret; +} + + + +static char * +_zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error) +{ + char *r, *o; + + r = (char *)malloc(nulp ? len+1 : len); + if (!r) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (fread(r, 1, len, fp)>8)&0xff, fp); + + return; +} + + + +static void +_zip_write4(unsigned int i, FILE *fp) +{ + putc(i&0xff, fp); + putc((i>>8)&0xff, fp); + putc((i>>16)&0xff, fp); + putc((i>>24)&0xff, fp); + + return; +} + + + +static void +_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate) +{ + struct tm *tm; + + tm = localtime(&time); + *ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + + tm->tm_mday; + *dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + + ((tm->tm_sec)>>1); + + return; +} + + + +ZIP_EXTERN int +zip_delete(struct zip *za, int idx) +{ + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + /* allow duplicate file names, because the file will + * be removed directly afterwards */ + if (_zip_unchange(za, idx, 1) != 0) + return -1; + + za->entry[idx].state = ZIP_ST_DELETED; + + return 0; +} + + + +ZIP_EXTERN void +zip_error_clear(struct zip *za) +{ + _zip_error_clear(&za->error); +} + + +ZIP_EXTERN int +zip_add(struct zip *za, const char *name, struct zip_source *source) +{ + if (name == NULL || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_replace(za, -1, name, source); +} + + +ZIP_EXTERN int +zip_error_get_sys_type(int ze) +{ + if (ze < 0 || ze >= _zip_nerr_str) + return 0; + + return _zip_err_type[ze]; +} + + +ZIP_EXTERN void +zip_error_get(struct zip *za, int *zep, int *sep) +{ + _zip_error_get(&za->error, zep, sep); +} + + +const char * const _zip_err_str[] = { + "No error", + "Multi-disk zip archives not supported", + "Renaming temporary file failed", + "Closing zip archive failed", + "Seek error", + "Read error", + "Write error", + "CRC error", + "Containing zip archive was closed", + "No such file", + "File already exists", + "Can't open file", + "Failure to create temporary file", + "Zlib error", + "Malloc failure", + "Entry has been changed", + "Compression method not supported", + "Premature EOF", + "Invalid argument", + "Not a zip archive", + "Internal error", + "Zip archive inconsistent", + "Can't remove file", + "Entry has been deleted", +}; + +const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); + +#define N ZIP_ET_NONE +#define S ZIP_ET_SYS +#define Z ZIP_ET_ZLIB + +const int _zip_err_type[] = { + N, + N, + S, + S, + S, + S, + S, + N, + N, + N, + N, + S, + S, + Z, + N, + N, + N, + N, + N, + N, + N, + N, + S, + N, +}; + + +struct zip_entry * +_zip_entry_new(struct zip *za) +{ + struct zip_entry *ze; + if (!za) { + ze = (struct zip_entry *)malloc(sizeof(struct zip_entry)); + if (!ze) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + } + else { + if (za->nentry >= za->nentry_alloc-1) { + za->nentry_alloc += 16; + za->entry = (struct zip_entry *)realloc(za->entry, + sizeof(struct zip_entry) + * za->nentry_alloc); + if (!za->entry) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + } + ze = za->entry+za->nentry; + } + + ze->state = ZIP_ST_UNCHANGED; + + ze->ch_filename = NULL; + ze->ch_comment = NULL; + ze->ch_comment_len = -1; + ze->source = NULL; + + if (za) + za->nentry++; + + return ze; +} + + +void +_zip_entry_free(struct zip_entry *ze) +{ + free(ze->ch_filename); + ze->ch_filename = NULL; + free(ze->ch_comment); + ze->ch_comment = NULL; + ze->ch_comment_len = -1; + + _zip_unchange_data(ze); +} + + +static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, + FILE *); +static int add_data_comp(zip_source_callback, void *, struct zip_stat *, + FILE *, struct zip_error *); +static int add_data_uncomp(struct zip *, zip_source_callback, void *, + struct zip_stat *, FILE *); +static void ch_set_error(struct zip_error *, zip_source_callback, void *); +static int copy_data(FILE *, myoff_t, FILE *, struct zip_error *); +static int write_cdir(struct zip *, struct zip_cdir *, FILE *); +static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *); +static int _zip_changed(struct zip *, int *); +static char *_zip_create_temp_output(struct zip *, FILE **); +static int _zip_torrentzip_cmp(const void *, const void *); + + + +struct filelist { + int idx; + const char *name; +}; + + + +ZIP_EXTERN int +zip_close(struct zip *za) +{ + int survivors; + int i, j, error; + char *temp; + FILE *out; + mode_t mask; + struct zip_cdir *cd; + struct zip_dirent de; + struct filelist *filelist; + int reopen_on_error; + int new_torrentzip; + + reopen_on_error = 0; + + if (za == NULL) + return -1; + + if (!_zip_changed(za, &survivors)) { + _zip_free(za); + return 0; + } + + /* don't create zip files with no entries */ + if (survivors == 0) { + if (za->zn && za->zp) { + if (remove(za->zn) != 0) { + _zip_error_set(&za->error, ZIP_ER_REMOVE, errno); + return -1; + } + } + _zip_free(za); + return 0; + } + + if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors)) + == NULL) + return -1; + + if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) { + free(filelist); + return -1; + } + + for (i=0; ientry[i]); + + /* archive comment is special for torrentzip */ + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) { + cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX", + TORRENT_SIG_LEN + TORRENT_CRC_LEN, + &za->error); + if (cd->comment == NULL) { + _zip_cdir_free(cd); + free(filelist); + return -1; + } + cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN; + } + else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) { + if (_zip_cdir_set_comment(cd, za) == -1) { + _zip_cdir_free(cd); + free(filelist); + return -1; + } + } + + if ((temp=_zip_create_temp_output(za, &out)) == NULL) { + _zip_cdir_free(cd); + return -1; + } + + + /* create list of files with index into original archive */ + for (i=j=0; inentry; i++) { + if (za->entry[i].state == ZIP_ST_DELETED) + continue; + + filelist[j].idx = i; + filelist[j].name = zip_get_name(za, i, 0); + j++; + } + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + qsort(filelist, survivors, sizeof(filelist[0]), + _zip_torrentzip_cmp); + + new_torrentzip = (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 1 + && zip_get_archive_flag(za, ZIP_AFL_TORRENT, + ZIP_FL_UNCHANGED) == 0); + error = 0; + for (j=0; jentry+i) || new_torrentzip) { + _zip_dirent_init(&de); + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(&de); + + /* use it as central directory entry */ + memcpy(cd->entry+j, &de, sizeof(cd->entry[j])); + + /* set/update file name */ + if (za->entry[i].ch_filename == NULL) { + if (za->entry[i].state == ZIP_ST_ADDED) { + de.filename = strdup("-"); + de.filename_len = 1; + cd->entry[j].filename = "-"; + } + else { + de.filename = strdup(za->cdir->entry[i].filename); + de.filename_len = strlen(de.filename); + cd->entry[j].filename = za->cdir->entry[i].filename; + cd->entry[j].filename_len = de.filename_len; + } + } + } + else { + /* copy existing directory entries */ + if (fseeko(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + error = 1; + break; + } + if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) { + error = 1; + break; + } + if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { + de.crc = za->cdir->entry[i].crc; + de.comp_size = za->cdir->entry[i].comp_size; + de.uncomp_size = za->cdir->entry[i].uncomp_size; + de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; + } + memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j])); + } + + if (za->entry[i].ch_filename) { + free(de.filename); + if ((de.filename=strdup(za->entry[i].ch_filename)) == NULL) { + error = 1; + break; + } + de.filename_len = strlen(de.filename); + cd->entry[j].filename = za->entry[i].ch_filename; + cd->entry[j].filename_len = de.filename_len; + } + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0 + && za->entry[i].ch_comment_len != -1) { + /* as the rest of cd entries, its malloc/free is done by za */ + cd->entry[j].comment = za->entry[i].ch_comment; + cd->entry[j].comment_len = za->entry[i].ch_comment_len; + } + + cd->entry[j].offset = ftello(out); + + if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { + struct zip_source *zs; + + zs = NULL; + if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { + if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) + == NULL) { + error = 1; + break; + } + } + + if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) { + error = 1; + break; + } + cd->entry[j].last_mod = de.last_mod; + cd->entry[j].comp_method = de.comp_method; + cd->entry[j].comp_size = de.comp_size; + cd->entry[j].uncomp_size = de.uncomp_size; + cd->entry[j].crc = de.crc; + } + else { + if (_zip_dirent_write(&de, out, 1, &za->error) < 0) { + error = 1; + break; + } + /* we just read the local dirent, file is at correct position */ + if (copy_data(za->zp, cd->entry[j].comp_size, out, + &za->error) < 0) { + error = 1; + break; + } + } + + _zip_dirent_finalize(&de); + } + + if (!error) { + if (write_cdir(za, cd, out) < 0) + error = 1; + } + + /* pointers in cd entries are owned by za */ + cd->nentry = 0; + _zip_cdir_free(cd); + + if (error) { + _zip_dirent_finalize(&de); + fclose(out); + remove(temp); + free(temp); + return -1; + } + + if (fclose(out) != 0) { + _zip_error_set(&za->error, ZIP_ER_CLOSE, errno); + remove(temp); + free(temp); + return -1; + } + + if (za->zp) { + fclose(za->zp); + za->zp = NULL; + reopen_on_error = 1; + } + if (_zip_rename(temp, za->zn) != 0) { + _zip_error_set(&za->error, ZIP_ER_RENAME, errno); + remove(temp); + free(temp); + if (reopen_on_error) { + /* ignore errors, since we're already in an error case */ + za->zp = fopen(za->zn, "rb"); + } + return -1; + } + mask = umask(0); + umask(mask); + chmod(za->zn, 0666&~mask); + + _zip_free(za); + free(temp); + + return 0; +} + + + +static int +add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft) +{ + myoff_t offstart, offend; + zip_source_callback cb; + void *ud; + struct zip_stat st; + + cb = zs->f; + ud = zs->ud; + + if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) { + ch_set_error(&za->error, cb, ud); + return -1; + } + + if (cb(ud, NULL, 0, ZIP_SOURCE_OPEN) < 0) { + ch_set_error(&za->error, cb, ud); + return -1; + } + + offstart = ftello(ft); + + if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + return -1; + + if (st.comp_method != ZIP_CM_STORE) { + if (add_data_comp(cb, ud, &st, ft, &za->error) < 0) + return -1; + } + else { + if (add_data_uncomp(za, cb, ud, &st, ft) < 0) + return -1; + } + + if (cb(ud, NULL, 0, ZIP_SOURCE_CLOSE) < 0) { + ch_set_error(&za->error, cb, ud); + return -1; + } + + offend = ftello(ft); + + if (fseeko(ft, offstart, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + + de->last_mod = st.mtime; + de->comp_method = st.comp_method; + de->crc = st.crc; + de->uncomp_size = st.size; + de->comp_size = st.comp_size; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(de); + + if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + return -1; + + if (fseeko(ft, offend, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + return 0; +} + + + +static int +add_data_comp(zip_source_callback cb, void *ud, struct zip_stat *st,FILE *ft, + struct zip_error *error) +{ + char buf[BUFSIZE]; + ssize_t n; + + st->comp_size = 0; + while ((n=cb(ud, buf, sizeof(buf), ZIP_SOURCE_READ)) > 0) { + if (fwrite(buf, 1, n, ft) != (size_t)n) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + st->comp_size += n; + } + if (n < 0) { + ch_set_error(error, cb, ud); + return -1; + } + + return 0; +} + + + +static int +add_data_uncomp(struct zip *za, zip_source_callback cb, void *ud, + struct zip_stat *st, FILE *ft) +{ + char b1[BUFSIZE], b2[BUFSIZE]; + int end, flush, ret; + ssize_t n; + size_t n2; + z_stream zstr; + int mem_level; + + st->comp_method = ZIP_CM_DEFLATE; + st->comp_size = st->size = 0; + st->crc = crc32(0, NULL, 0); + + zstr.zalloc = Z_NULL; + zstr.zfree = Z_NULL; + zstr.opaque = NULL; + zstr.avail_in = 0; + zstr.avail_out = 0; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + mem_level = TORRENT_MEM_LEVEL; + else + mem_level = MAX_MEM_LEVEL; + + /* -MAX_WBITS: undocumented feature of zlib to _not_ write a zlib header */ + deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, mem_level, + Z_DEFAULT_STRATEGY); + + zstr.next_out = (Bytef *)b2; + zstr.avail_out = sizeof(b2); + zstr.avail_in = 0; + + flush = 0; + end = 0; + while (!end) { + if (zstr.avail_in == 0 && !flush) { + if ((n=cb(ud, b1, sizeof(b1), ZIP_SOURCE_READ)) < 0) { + ch_set_error(&za->error, cb, ud); + deflateEnd(&zstr); + return -1; + } + if (n > 0) { + zstr.avail_in = n; + zstr.next_in = (Bytef *)b1; + st->size += n; + st->crc = crc32(st->crc, (Bytef *)b1, n); + } + else + flush = Z_FINISH; + } + + ret = deflate(&zstr, flush); + if (ret != Z_OK && ret != Z_STREAM_END) { + _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); + return -1; + } + + if (zstr.avail_out != sizeof(b2)) { + n2 = sizeof(b2) - zstr.avail_out; + + if (fwrite(b2, 1, n2, ft) != n2) { + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); + return -1; + } + + zstr.next_out = (Bytef *)b2; + zstr.avail_out = sizeof(b2); + st->comp_size += n2; + } + + if (ret == Z_STREAM_END) { + deflateEnd(&zstr); + end = 1; + } + } + + return 0; +} + + + +static void +ch_set_error(struct zip_error *error, zip_source_callback cb, void *ud) +{ + int e[2]; + + if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (ssize_t)sizeof(e)) { + error->zip_err = ZIP_ER_INTERNAL; + error->sys_err = 0; + } + else { + error->zip_err = e[0]; + error->sys_err = e[1]; + } +} + + + +static int +copy_data(FILE *fs, myoff_t len, FILE *ft, struct zip_error *error) +{ + char buf[BUFSIZE]; + int n, nn; + + if (len == 0) + return 0; + + while (len > 0) { + nn = len > sizeof(buf) ? sizeof(buf) : len; + if ((n=fread(buf, 1, nn, fs)) < 0) { + _zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + else if (n == 0) { + _zip_error_set(error, ZIP_ER_EOF, 0); + return -1; + } + + if (fwrite(buf, 1, n, ft) != (size_t)n) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + len -= n; + } + + return 0; +} + + + +static int +write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) +{ + myoff_t offset; + uLong crc; + char buf[TORRENT_CRC_LEN+1]; + + if (_zip_cdir_write(cd, out, &za->error) < 0) + return -1; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0) + return 0; + + + /* fix up torrentzip comment */ + + offset = ftello(out); + + if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0) + return -1; + + snprintf(buf, sizeof(buf), "%08lX", (long)crc); + + if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fwrite(buf, TORRENT_CRC_LEN, 1, out) != 1) { + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +static int +_zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src) +{ + if (src->ch_comment_len != -1) { + dest->comment = _zip_memdup(src->ch_comment, + src->ch_comment_len, &src->error); + if (dest->comment == NULL) + return -1; + dest->comment_len = src->ch_comment_len; + } else { + if (src->cdir && src->cdir->comment) { + dest->comment = _zip_memdup(src->cdir->comment, + src->cdir->comment_len, &src->error); + if (dest->comment == NULL) + return -1; + dest->comment_len = src->cdir->comment_len; + } + } + + return 0; +} + + + +static int +_zip_changed(struct zip *za, int *survivorsp) +{ + int changed, i, survivors; + + changed = survivors = 0; + + if (za->ch_comment_len != -1 + || za->ch_flags != za->flags) + changed = 1; + + for (i=0; inentry; i++) { + if ((za->entry[i].state != ZIP_ST_UNCHANGED) + || (za->entry[i].ch_comment_len != -1)) + changed = 1; + if (za->entry[i].state != ZIP_ST_DELETED) + survivors++; + } + + *survivorsp = survivors; + + return changed; +} + + + +static char * +_zip_create_temp_output(struct zip *za, FILE **outp) +{ + char *temp; + int tfd; + FILE *tfp; + + if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + sprintf(temp, "%s.XXXXXX", za->zn); + + if ((tfd=mkstemp(temp)) == -1) { + _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return NULL; + } + + if ((tfp=fdopen(tfd, "r+b")) == NULL) { + _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); + close(tfd); + remove(temp); + free(temp); + return NULL; + } + + *outp = tfp; + return temp; +} + + + +static int +_zip_torrentzip_cmp(const void *a, const void *b) +{ + return strcasecmp(((const struct filelist *)a)->name, + ((const struct filelist *)b)->name); +} + + + +ZIP_EXTERN int +zip_add_dir(struct zip *za, const char *name) +{ + int len, ret; + char *s; + struct zip_source *source; + + if (name == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + s = NULL; + len = strlen(name); + + if (name[len-1] != '/') { + if ((s=(char *)malloc(len+2)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + strcpy(s, name); + s[len] = '/'; + s[len+1] = '\0'; + } + + if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) { + free(s); + return -1; + } + + ret = _zip_replace(za, -1, s ? s : name, source); + + free(s); + if (ret < 0) + zip_source_free(source); + + return ret; +} + + +ZIP_EXTERN int +zip_error_to_str(char *buf, size_t len, int ze, int se) +{ + const char *zs, *ss; + + if (ze < 0 || ze >= _zip_nerr_str) + return snprintf(buf, len, "Unknown error %d", ze); + + zs = _zip_err_str[ze]; + + switch (_zip_err_type[ze]) { + case ZIP_ET_SYS: + ss = strerror(se); + break; + + case ZIP_ET_ZLIB: + ss = zError(se); + break; + + default: + ss = NULL; + } + + return snprintf(buf, len, "%s%s%s", + zs, (ss ? ": " : ""), (ss ? ss : "")); +} + + +ZIP_EXTERN void +zip_file_error_clear(struct zip_file *zf) +{ + _zip_error_clear(&zf->error); +} + + +ZIP_EXTERN int +zip_fclose(struct zip_file *zf) +{ + int i, ret; + + if (zf->zstr) + inflateEnd(zf->zstr); + free(zf->buffer); + free(zf->zstr); + + for (i=0; iza->nfile; i++) { + if (zf->za->file[i] == zf) { + zf->za->file[i] = zf->za->file[zf->za->nfile-1]; + zf->za->nfile--; + break; + } + } + + ret = 0; + if (zf->error.zip_err) + ret = zf->error.zip_err; + else if ((zf->flags & ZIP_ZF_CRC) && (zf->flags & ZIP_ZF_EOF)) { + /* if EOF, compare CRC */ + if (zf->crc_orig != zf->crc) + ret = ZIP_ER_CRC; + } + + free(zf); + return ret; +} + + +int +_zip_filerange_crc(FILE *fp, myoff_t start, myoff_t len, uLong *crcp, + struct zip_error *errp) +{ + Bytef buf[BUFSIZE]; + size_t n; + + *crcp = crc32(0L, Z_NULL, 0); + + if (fseeko(fp, start, SEEK_SET) != 0) { + _zip_error_set(errp, ZIP_ER_SEEK, errno); + return -1; + } + + while (len > 0) { + n = len > BUFSIZE ? BUFSIZE : len; + if ((n=fread(buf, 1, n, fp)) <= 0) { + _zip_error_set(errp, ZIP_ER_READ, errno); + return -1; + } + + *crcp = crc32(*crcp, buf, n); + + len-= n; + } + + return 0; +} + + +ZIP_EXTERN const char * +zip_file_strerror(struct zip_file *zf) +{ + return _zip_error_strerror(&zf->error); +} + + +/* _zip_file_get_offset(za, ze): + Returns the offset of the file data for entry ze. + + On error, fills in za->error and returns 0. +*/ + +unsigned int +_zip_file_get_offset(struct zip *za, int idx) +{ + struct zip_dirent de; + unsigned int offset; + + offset = za->cdir->entry[idx].offset; + + if (fseeko(za->zp, offset, SEEK_SET) != 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return 0; + } + + if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) + return 0; + + offset += LENTRYSIZE + de.filename_len + de.extrafield_len; + + _zip_dirent_finalize(&de); + + return offset; +} + + +ZIP_EXTERN void +zip_file_error_get(struct zip_file *zf, int *zep, int *sep) +{ + _zip_error_get(&zf->error, zep, sep); +} + + +static struct zip_file *_zip_file_new(struct zip *za); + + + +ZIP_EXTERN struct zip_file * +zip_fopen_index(struct zip *za, int fileno, int flags) +{ + int len, ret; + int zfflags; + struct zip_file *zf; + + if ((fileno < 0) || (fileno >= za->nentry)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (fileno >= za->cdir->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + zfflags = 0; + switch (za->cdir->entry[fileno].comp_method) { + case ZIP_CM_STORE: + zfflags |= ZIP_ZF_CRC; + break; + + case ZIP_CM_DEFLATE: + if ((flags & ZIP_FL_COMPRESSED) == 0) + zfflags |= ZIP_ZF_CRC | ZIP_ZF_DECOMP; + break; + default: + if ((flags & ZIP_FL_COMPRESSED) == 0) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return NULL; + } + break; + } + + zf = _zip_file_new(za); + + zf->flags = zfflags; + /* zf->name = za->cdir->entry[fileno].filename; */ + zf->method = za->cdir->entry[fileno].comp_method; + zf->bytes_left = za->cdir->entry[fileno].uncomp_size; + zf->cbytes_left = za->cdir->entry[fileno].comp_size; + zf->crc_orig = za->cdir->entry[fileno].crc; + + if ((zf->fpos=_zip_file_get_offset(za, fileno)) == 0) { + zip_fclose(zf); + return NULL; + } + + if ((zf->flags & ZIP_ZF_DECOMP) == 0) + zf->bytes_left = zf->cbytes_left; + else { + if ((zf->buffer=(char *)malloc(BUFSIZE)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_fclose(zf); + return NULL; + } + + len = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf); + if (len <= 0) { + _zip_error_copy(&za->error, &zf->error); + zip_fclose(zf); + return NULL; + } + + if ((zf->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_fclose(zf); + return NULL; + } + zf->zstr->zalloc = Z_NULL; + zf->zstr->zfree = Z_NULL; + zf->zstr->opaque = NULL; + zf->zstr->next_in = (Bytef *)zf->buffer; + zf->zstr->avail_in = len; + + /* negative value to tell zlib that there is no header */ + if ((ret=inflateInit2(zf->zstr, -MAX_WBITS)) != Z_OK) { + _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); + zip_fclose(zf); + return NULL; + } + } + + return zf; +} + + + +int +_zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf) +{ + int i, j; + + if (zf->error.zip_err != ZIP_ER_OK) + return -1; + + if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0) + return 0; + + if (fseeko(zf->za->zp, zf->fpos, SEEK_SET) < 0) { + _zip_error_set(&zf->error, ZIP_ER_SEEK, errno); + return -1; + } + if (buflen < zf->cbytes_left) + i = buflen; + else + i = zf->cbytes_left; + + j = fread(buf, 1, i, zf->za->zp); + if (j == 0) { + _zip_error_set(&zf->error, ZIP_ER_EOF, 0); + j = -1; + } + else if (j < 0) + _zip_error_set(&zf->error, ZIP_ER_READ, errno); + else { + zf->fpos += j; + zf->cbytes_left -= j; + } + + return j; +} + + + +static struct zip_file * +_zip_file_new(struct zip *za) +{ + struct zip_file *zf, **file; + int n; + + if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (za->nfile >= za->nfile_alloc-1) { + n = za->nfile_alloc + 10; + file = (struct zip_file **)realloc(za->file, + n*sizeof(struct zip_file *)); + if (file == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + free(zf); + return NULL; + } + za->nfile_alloc = n; + za->file = file; + } + + za->file[za->nfile++] = zf; + + zf->za = za; + _zip_error_init(&zf->error); + zf->flags = 0; + zf->crc = crc32(0L, Z_NULL, 0); + zf->crc_orig = 0; + zf->method = -1; + zf->bytes_left = zf->cbytes_left = 0; + zf->fpos = 0; + zf->buffer = NULL; + zf->zstr = NULL; + + return zf; +} + + +ZIP_EXTERN struct zip_file * +zip_fopen(struct zip *za, const char *fname, int flags) +{ + int idx; + + if ((idx=zip_name_locate(za, fname, flags)) < 0) + return NULL; + + return zip_fopen_index(za, idx, flags); +} + + +ZIP_EXTERN int +zip_set_file_comment(struct zip *za, int idx, const char *comment, int len) +{ + char *tmpcom; + + if (idx < 0 || idx >= za->nentry + || len < 0 || len > MAXCOMLEN + || (len > 0 && comment == NULL)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) + return -1; + } + else + tmpcom = NULL; + + free(za->entry[idx].ch_comment); + za->entry[idx].ch_comment = tmpcom; + za->entry[idx].ch_comment_len = len; + + return 0; +} + + +ZIP_EXTERN struct zip_source * +zip_source_file(struct zip *za, const char *fname, myoff_t start, myoff_t len) +{ + if (za == NULL) + return NULL; + + if (fname == NULL || start < 0 || len < -1) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + return _zip_source_file_or_p(za, fname, NULL, start, len); +} + + +struct read_data { + const char *buf, *data, *end; + time_t mtime; + int freep; +}; + +static ssize_t read_data(void *state, void *data, size_t len, + enum zip_source_cmd cmd); + + + +ZIP_EXTERN struct zip_source * +zip_source_buffer(struct zip *za, const void *data, myoff_t len, int freep) +{ + struct read_data *f; + struct zip_source *zs; + + if (za == NULL) + return NULL; + + if (len < 0 || (data == NULL && len > 0)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((f=(struct read_data *)malloc(sizeof(*f))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + f->data = (const char *)data; + f->end = ((const char *)data)+len; + f->freep = freep; + f->mtime = time(NULL); + + if ((zs=zip_source_function(za, read_data, f)) == NULL) { + free(f); + return NULL; + } + + return zs; +} + + + +static ssize_t +read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd) +{ + struct read_data *z; + char *buf; + size_t n; + + z = (struct read_data *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + z->buf = z->data; + return 0; + + case ZIP_SOURCE_READ: + n = z->end - z->buf; + if (n > len) + n = len; + + if (n) { + memcpy(buf, z->buf, n); + z->buf += n; + } + + return n; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: + { + struct zip_stat *st; + + if (len < sizeof(*st)) + return -1; + + st = (struct zip_stat *)data; + + zip_stat_init(st); + st->mtime = z->mtime; + st->size = z->end - z->data; + + return sizeof(*st); + } + + case ZIP_SOURCE_ERROR: + { + int *e; + + if (len < sizeof(int)*2) + return -1; + + e = (int *)data; + e[0] = e[1] = 0; + } + return sizeof(int)*2; + + case ZIP_SOURCE_FREE: + if (z->freep) { + free((void *)z->data); + z->data = NULL; + } + free(z); + return 0; + + default: + ; + } + + return -1; +} + + +int +_zip_set_name(struct zip *za, int idx, const char *name) +{ + char *s; + int i; + + if (idx < 0 || idx >= za->nentry || name == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) { + _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; + } + + /* no effective name change */ + if (i == idx) + return 0; + + if ((s=strdup(name)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (za->entry[idx].state == ZIP_ST_UNCHANGED) + za->entry[idx].state = ZIP_ST_RENAMED; + + free(za->entry[idx].ch_filename); + za->entry[idx].ch_filename = s; + + return 0; +} + + +ZIP_EXTERN int +zip_set_archive_flag(struct zip *za, int flag, int value) +{ + if (value) + za->ch_flags |= flag; + else + za->ch_flags &= ~flag; + + return 0; +} + + +void +_zip_unchange_data(struct zip_entry *ze) +{ + if (ze->source) { + (void)ze->source->f(ze->source->ud, NULL, 0, ZIP_SOURCE_FREE); + free(ze->source); + ze->source = NULL; + } + + ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED; +} + + +ZIP_EXTERN int +zip_unchange_archive(struct zip *za) +{ + free(za->ch_comment); + za->ch_comment = NULL; + za->ch_comment_len = -1; + + za->ch_flags = za->flags; + + return 0; +} + +ZIP_EXTERN int +zip_unchange(struct zip *za, int idx) +{ + return _zip_unchange(za, idx, 0); +} + + + +int +_zip_unchange(struct zip *za, int idx, int allow_duplicates) +{ + int i; + + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (za->entry[idx].ch_filename) { + if (!allow_duplicates) { + i = _zip_name_locate(za, + _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), + 0, NULL); + if (i != -1 && i != idx) { + _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; + } + } + + free(za->entry[idx].ch_filename); + za->entry[idx].ch_filename = NULL; + } + + free(za->entry[idx].ch_comment); + za->entry[idx].ch_comment = NULL; + za->entry[idx].ch_comment_len = -1; + + _zip_unchange_data(za->entry+idx); + + return 0; +} + +ZIP_EXTERN int +zip_unchange_all(struct zip *za) +{ + int ret, i; + + ret = 0; + for (i=0; inentry; i++) + ret |= _zip_unchange(za, i, 1); + + ret |= zip_unchange_archive(za); + + return ret; +} + + +ZIP_EXTERN int +zip_set_archive_comment(struct zip *za, const char *comment, int len) +{ + char *tmpcom; + + if (len < 0 || len > MAXCOMLEN + || (len > 0 && comment == NULL)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) + return -1; + } + else + tmpcom = NULL; + + free(za->ch_comment); + za->ch_comment = tmpcom; + za->ch_comment_len = len; + + return 0; +} + + +ZIP_EXTERN int +zip_replace(struct zip *za, int idx, struct zip_source *source) +{ + if (idx < 0 || idx >= za->nentry || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_replace(za, idx, NULL, source) == -1) + return -1; + + return 0; +} + + + + +int +_zip_replace(struct zip *za, int idx, const char *name, + struct zip_source *source) +{ + if (idx == -1) { + if (_zip_entry_new(za) == NULL) + return -1; + + idx = za->nentry - 1; + } + + _zip_unchange_data(za->entry+idx); + + if (name && _zip_set_name(za, idx, name) != 0) + return -1; + + za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry) + ? ZIP_ST_ADDED : ZIP_ST_REPLACED); + za->entry[idx].source = source; + + return idx; +} + + +ZIP_EXTERN int +zip_rename(struct zip *za, int idx, const char *name) +{ + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || idx < 0 || name[0] == '\0') { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((old_name=zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name[strlen(name)-1] == '/'); + old_is_dir = (old_name[strlen(old_name)-1] == '/'); + + if (new_is_dir != old_is_dir) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_set_name(za, idx, name); +} + +#include +#include +#include +#include +#include +#include + +static void set_error(int *, struct zip_error *, int); +static struct zip *_zip_allocate_new(const char *, int *); +static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); +static void _zip_check_torrentzip(struct zip *); +static struct zip_cdir *_zip_find_central_dir(FILE *, int, int *, myoff_t); +static int _zip_file_exists(const char *, int, int *); +static int _zip_headercomp(struct zip_dirent *, int, + struct zip_dirent *, int); +static unsigned char *_zip_memmem(const unsigned char *, int, + const unsigned char *, int); +static struct zip_cdir *_zip_readcdir(FILE *, unsigned char *, unsigned char *, + int, int, struct zip_error *); + + + +ZIP_EXTERN struct zip * +zip_open(const char *fn, int flags, int *zep) +{ + FILE *fp; + struct zip *za; + struct zip_cdir *cdir; + int i; + myoff_t len; + + switch (_zip_file_exists(fn, flags, zep)) { + case -1: + return NULL; + case 0: + return _zip_allocate_new(fn, zep); + default: + break; + } + + if ((fp=fopen(fn, "rb")) == NULL) { + set_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + + fseeko(fp, 0, SEEK_END); + len = ftello(fp); + + /* treat empty files as empty archives */ + if (len == 0) { + if ((za=_zip_allocate_new(fn, zep)) == NULL) + fclose(fp); + else + za->zp = fp; + return za; + } + + cdir = _zip_find_central_dir(fp, flags, zep, len); + if (cdir == NULL) { + fclose(fp); + return NULL; + } + + if ((za=_zip_allocate_new(fn, zep)) == NULL) { + _zip_cdir_free(cdir); + fclose(fp); + return NULL; + } + + za->cdir = cdir; + za->zp = fp; + + if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry)) + * cdir->nentry)) == NULL) { + set_error(zep, NULL, ZIP_ER_MEMORY); + _zip_free(za); + return NULL; + } + for (i=0; inentry; i++) + _zip_entry_new(za); + + _zip_check_torrentzip(za); + za->ch_flags = za->flags; + + return za; +} + + + +static void +set_error(int *zep, struct zip_error *err, int ze) +{ + int se; + + if (err) { + _zip_error_get(err, &ze, &se); + if (zip_error_get_sys_type(ze) == ZIP_ET_SYS) + errno = se; + } + + if (zep) + *zep = ze; +} + + + +/* _zip_readcdir: + tries to find a valid end-of-central-directory at the beginning of + buf, and then the corresponding central directory entries. + Returns a struct zip_cdir which contains the central directory + entries, or NULL if unsuccessful. */ + +static struct zip_cdir * +_zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, + int flags, struct zip_error *error) +{ + struct zip_cdir *cd; + unsigned char *cdp, **bufp; + int i, comlen, nentry; + + comlen = buf + buflen - eocd - EOCDLEN; + if (comlen < 0) { + /* not enough bytes left for comment */ + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + /* check for end-of-central-dir magic */ + if (memcmp(eocd, EOCD_MAGIC, 4) != 0) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + if (memcmp(eocd+4, "\0\0\0\0", 4) != 0) { + _zip_error_set(error, ZIP_ER_MULTIDISK, 0); + return NULL; + } + + cdp = eocd + 8; + /* number of cdir-entries on this disk */ + i = _zip_read2(&cdp); + /* number of cdir-entries */ + nentry = _zip_read2(&cdp); + + if ((cd=_zip_cdir_new(nentry, error)) == NULL) + return NULL; + + cd->size = _zip_read4(&cdp); + cd->offset = _zip_read4(&cdp); + cd->comment = NULL; + cd->comment_len = _zip_read2(&cdp); + + if ((comlen < cd->comment_len) || (cd->nentry != i)) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + free(cd); + return NULL; + } + if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + free(cd); + return NULL; + } + + if (cd->comment_len) { + if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN, + cd->comment_len, error)) + == NULL) { + free(cd); + return NULL; + } + } + + cdp = eocd; + if (cd->size < (unsigned int)(eocd-buf)) { + /* if buffer already read in, use it */ + cdp = eocd - cd->size; + bufp = &cdp; + } + else { + /* go to start of cdir and read it entry by entry */ + bufp = NULL; + clearerr(fp); + fseeko(fp, cd->offset, SEEK_SET); + /* possible consistency check: cd->offset = + len-(cd->size+cd->comment_len+EOCDLEN) ? */ + if (ferror(fp) || ((unsigned long)ftello(fp) != cd->offset)) { + /* seek error or offset of cdir wrong */ + if (ferror(fp)) + _zip_error_set(error, ZIP_ER_SEEK, errno); + else + _zip_error_set(error, ZIP_ER_NOZIP, 0); + free(cd); + return NULL; + } + } + + for (i=0; inentry; i++) { + if ((_zip_dirent_read(cd->entry+i, fp, bufp, eocd-cdp, 0, + error)) < 0) { + cd->nentry = i; + _zip_cdir_free(cd); + return NULL; + } + } + + return cd; +} + + + +/* _zip_checkcons: + Checks the consistency of the central directory by comparing central + directory entries with local headers and checking for plausible + file and header offsets. Returns -1 if not plausible, else the + difference between the lowest and the highest fileposition reached */ + +static int +_zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) +{ + int i; + unsigned int min, max, j; + struct zip_dirent temp; + + if (cd->nentry) { + max = cd->entry[0].offset; + min = cd->entry[0].offset; + } + else + min = max = 0; + + for (i=0; inentry; i++) { + if (cd->entry[i].offset < min) + min = cd->entry[i].offset; + if (min > cd->offset) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + j = cd->entry[i].offset + cd->entry[i].comp_size + + cd->entry[i].filename_len + LENTRYSIZE; + if (j > max) + max = j; + if (max > cd->offset) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + if (fseeko(fp, cd->entry[i].offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, 0); + return -1; + } + + if (_zip_dirent_read(&temp, fp, NULL, 0, 1, error) == -1) + return -1; + + if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_dirent_finalize(&temp); + return -1; + } + _zip_dirent_finalize(&temp); + } + + return max - min; +} + + + +/* _zip_check_torrentzip: + check wether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ + +static void +_zip_check_torrentzip(struct zip *za) +{ + uLong crc_got, crc_should; + char buf[8+1]; + char *end; + + if (za->zp == NULL || za->cdir == NULL) + return; + + if (za->cdir->comment_len != TORRENT_SIG_LEN+8 + || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0) + return; + + memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8); + buf[8] = '\0'; + errno = 0; + crc_should = strtoul(buf, &end, 16); + if ((crc_should == UINT_MAX && errno != 0) || (end && *end)) + return; + + if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size, + &crc_got, NULL) < 0) + return; + + if (crc_got == crc_should) + za->flags |= ZIP_AFL_TORRENT; +} + + + + +/* _zip_headercomp: + compares two headers h1 and h2; if they are local headers, set + local1p or local2p respectively to 1, else 0. Return 0 if they + are identical, -1 if not. */ + +static int +_zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, + int local2p) +{ + if ((h1->version_needed != h2->version_needed) +#if 0 + /* some zip-files have different values in local + and global headers for the bitflags */ + || (h1->bitflags != h2->bitflags) +#endif + || (h1->comp_method != h2->comp_method) + || (h1->last_mod != h2->last_mod) + || (h1->filename_len != h2->filename_len) + || !h1->filename || !h2->filename + || strcmp(h1->filename, h2->filename)) + return -1; + + /* check that CRC and sizes are zero if data descriptor is used */ + if ((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local1p + && (h1->crc != 0 + || h1->comp_size != 0 + || h1->uncomp_size != 0)) + return -1; + if ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local2p + && (h2->crc != 0 + || h2->comp_size != 0 + || h2->uncomp_size != 0)) + return -1; + + /* check that CRC and sizes are equal if no data descriptor is used */ + if (((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local1p == 0) + && ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local2p == 0)) { + if ((h1->crc != h2->crc) + || (h1->comp_size != h2->comp_size) + || (h1->uncomp_size != h2->uncomp_size)) + return -1; + } + + if ((local1p == local2p) + && ((h1->extrafield_len != h2->extrafield_len) + || (h1->extrafield_len && h2->extrafield + && memcmp(h1->extrafield, h2->extrafield, + h1->extrafield_len)))) + return -1; + + /* if either is local, nothing more to check */ + if (local1p || local2p) + return 0; + + if ((h1->version_madeby != h2->version_madeby) + || (h1->disk_number != h2->disk_number) + || (h1->int_attrib != h2->int_attrib) + || (h1->ext_attrib != h2->ext_attrib) + || (h1->offset != h2->offset) + || (h1->comment_len != h2->comment_len) + || (h1->comment_len && h2->comment + && memcmp(h1->comment, h2->comment, h1->comment_len))) + return -1; + + return 0; +} + + + +static struct zip * +_zip_allocate_new(const char *fn, int *zep) +{ + struct zip *za; + struct zip_error error; + + if ((za=_zip_new(&error)) == NULL) { + set_error(zep, &error, 0); + return NULL; + } + + za->zn = strdup(fn); + if (!za->zn) { + _zip_free(za); + set_error(zep, NULL, ZIP_ER_MEMORY); + return NULL; + } + return za; +} + + + +static int +_zip_file_exists(const char *fn, int flags, int *zep) +{ + struct stat st; + + if (fn == NULL) { + set_error(zep, NULL, ZIP_ER_INVAL); + return -1; + } + + if (stat(fn, &st) != 0) { + if (flags & ZIP_CREATE) + return 0; + else { + set_error(zep, NULL, ZIP_ER_OPEN); + return -1; + } + } + else if ((flags & ZIP_EXCL)) { + set_error(zep, NULL, ZIP_ER_EXISTS); + return -1; + } + /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL, + just like open() */ + + return 1; +} + + + +static struct zip_cdir * +_zip_find_central_dir(FILE *fp, int flags, int *zep, myoff_t len) +{ + struct zip_cdir *cdir, *cdirnew; + unsigned char *buf, *match; + int a, best, buflen, i; + struct zip_error zerr; + + i = fseeko(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END); + if (i == -1 && errno != EFBIG) { + /* seek before start of file on my machine */ + set_error(zep, NULL, ZIP_ER_SEEK); + return NULL; + } + + /* 64k is too much for stack */ + if ((buf=(unsigned char *)malloc(CDBUFSIZE)) == NULL) { + set_error(zep, NULL, ZIP_ER_MEMORY); + return NULL; + } + + clearerr(fp); + buflen = fread(buf, 1, CDBUFSIZE, fp); + + if (ferror(fp)) { + set_error(zep, NULL, ZIP_ER_READ); + free(buf); + return NULL; + } + + best = -1; + cdir = NULL; + match = buf; + _zip_error_set(&zerr, ZIP_ER_NOZIP, 0); + + while ((match=_zip_memmem(match, buflen-(match-buf)-18, + (const unsigned char *)EOCD_MAGIC, 4))!=NULL) { + /* found match -- check, if good */ + /* to avoid finding the same match all over again */ + match++; + if ((cdirnew=_zip_readcdir(fp, buf, match-1, buflen, flags, + &zerr)) == NULL) + continue; + + if (cdir) { + if (best <= 0) + best = _zip_checkcons(fp, cdir, &zerr); + a = _zip_checkcons(fp, cdirnew, &zerr); + if (best < a) { + _zip_cdir_free(cdir); + cdir = cdirnew; + best = a; + } + else + _zip_cdir_free(cdirnew); + } + else { + cdir = cdirnew; + if (flags & ZIP_CHECKCONS) + best = _zip_checkcons(fp, cdir, &zerr); + else + best = 0; + } + cdirnew = NULL; + } + + free(buf); + + if (best < 0) { + set_error(zep, &zerr, 0); + _zip_cdir_free(cdir); + return NULL; + } + + return cdir; +} + + + +static unsigned char * +_zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, + int littlelen) +{ + const unsigned char *p; + + if ((biglen < littlelen) || (littlelen == 0)) + return NULL; + p = big-1; + while ((p=(const unsigned char *) + memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1))) + != NULL) { + if (memcmp(p+1, little+1, littlelen-1)==0) + return (unsigned char *)p; + } + + return NULL; +} + + +/* _zip_new: + creates a new zipfile struct, and sets the contents to zero; returns + the new struct. */ + +struct zip * +_zip_new(struct zip_error *error) +{ + struct zip *za; + + za = (struct zip *)malloc(sizeof(struct zip)); + if (!za) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + za->zn = NULL; + za->zp = NULL; + _zip_error_init(&za->error); + za->cdir = NULL; + za->ch_comment = NULL; + za->ch_comment_len = -1; + za->nentry = za->nentry_alloc = 0; + za->entry = NULL; + za->nfile = za->nfile_alloc = 0; + za->file = NULL; + za->flags = za->ch_flags = 0; + + return za; +} + + +void * +_zip_memdup(const void *mem, size_t len, struct zip_error *error) +{ + void *ret; + + ret = malloc(len); + if (!ret) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + memcpy(ret, mem, len); + + return ret; +} + + +ZIP_EXTERN int +zip_get_num_files(struct zip *za) +{ + if (za == NULL) + return -1; + + return za->nentry; +} + +ZIP_EXTERN const char * +zip_get_name(struct zip *za, int idx, int flags) +{ + return _zip_get_name(za, idx, flags, &za->error); +} + + + +const char * +_zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error) +{ + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0) { + if (za->entry[idx].state == ZIP_ST_DELETED) { + _zip_error_set(error, ZIP_ER_DELETED, 0); + return NULL; + } + if (za->entry[idx].ch_filename) + return za->entry[idx].ch_filename; + } + + if (za->cdir == NULL || idx >= za->cdir->nentry) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return za->cdir->entry[idx].filename; +} + + +ZIP_EXTERN const char * +zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags) +{ + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) + || (za->entry[idx].ch_comment_len == -1)) { + if (lenp != NULL) + *lenp = za->cdir->entry[idx].comment_len; + return za->cdir->entry[idx].comment; + } + + if (lenp != NULL) + *lenp = za->entry[idx].ch_comment_len; + return za->entry[idx].ch_comment; +} + + +ZIP_EXTERN int +zip_get_archive_flag(struct zip *za, int flag, int flags) +{ + int fl; + + fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; + + return (fl & flag) ? 1 : 0; +} + + +ZIP_EXTERN const char * +zip_get_archive_comment(struct zip *za, int *lenp, int flags) +{ + if ((flags & ZIP_FL_UNCHANGED) + || (za->ch_comment_len == -1)) { + if (za->cdir) { + if (lenp != NULL) + *lenp = za->cdir->comment_len; + return za->cdir->comment; + } + else { + if (lenp != NULL) + *lenp = -1; + return NULL; + } + } + + if (lenp != NULL) + *lenp = za->ch_comment_len; + return za->ch_comment; +} + + +/* _zip_free: + frees the space allocated to a zipfile struct, and closes the + corresponding file. */ + +void +_zip_free(struct zip *za) +{ + int i; + + if (za == NULL) + return; + + if (za->zn) + free(za->zn); + + if (za->zp) + fclose(za->zp); + + _zip_cdir_free(za->cdir); + + if (za->entry) { + for (i=0; inentry; i++) { + _zip_entry_free(za->entry+i); + } + free(za->entry); + } + + for (i=0; infile; i++) { + if (za->file[i]->error.zip_err == ZIP_ER_OK) { + _zip_error_set(&za->file[i]->error, ZIP_ER_ZIPCLOSED, 0); + za->file[i]->za = NULL; + } + } + + free(za->file); + + free(za); + + return; +} + + +ZIP_EXTERN ssize_t +zip_fread(struct zip_file *zf, void *outbuf, size_t toread) +{ + int ret; + size_t out_before, len; + int i; + + if (!zf) + return -1; + + if (zf->error.zip_err != 0) + return -1; + + if ((zf->flags & ZIP_ZF_EOF) || (toread == 0)) + return 0; + + if (zf->bytes_left == 0) { + zf->flags |= ZIP_ZF_EOF; + if (zf->flags & ZIP_ZF_CRC) { + if (zf->crc != zf->crc_orig) { + _zip_error_set(&zf->error, ZIP_ER_CRC, 0); + return -1; + } + } + return 0; + } + + if ((zf->flags & ZIP_ZF_DECOMP) == 0) { + ret = _zip_file_fillbuf(outbuf, toread, zf); + if (ret > 0) { + if (zf->flags & ZIP_ZF_CRC) + zf->crc = crc32(zf->crc, (Bytef *)outbuf, ret); + zf->bytes_left -= ret; + } + return ret; + } + + zf->zstr->next_out = (Bytef *)outbuf; + zf->zstr->avail_out = toread; + out_before = zf->zstr->total_out; + + /* endless loop until something has been accomplished */ + for (;;) { + ret = inflate(zf->zstr, Z_SYNC_FLUSH); + + switch (ret) { + case Z_OK: + case Z_STREAM_END: + /* all ok */ + /* Z_STREAM_END probably won't happen, since we didn't + have a header */ + len = zf->zstr->total_out - out_before; + if (len >= zf->bytes_left || len >= toread) { + if (zf->flags & ZIP_ZF_CRC) + zf->crc = crc32(zf->crc, (Bytef *)outbuf, len); + zf->bytes_left -= len; + return len; + } + break; + + case Z_BUF_ERROR: + if (zf->zstr->avail_in == 0) { + i = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf); + if (i == 0) { + _zip_error_set(&zf->error, ZIP_ER_INCONS, 0); + return -1; + } + else if (i < 0) + return -1; + zf->zstr->next_in = (Bytef *)zf->buffer; + zf->zstr->avail_in = i; + continue; + } + /* fallthrough */ + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_STREAM_ERROR: + case Z_MEM_ERROR: + _zip_error_set(&zf->error, ZIP_ER_ZLIB, ret); + return -1; + } + } +} + + +ZIP_EXTERN const char * +zip_strerror(struct zip *za) +{ + return _zip_error_strerror(&za->error); +} + + +ZIP_EXTERN void +zip_stat_init(struct zip_stat *st) +{ + st->name = NULL; + st->index = -1; + st->crc = 0; + st->mtime = (time_t)-1; + st->size = -1; + st->comp_size = -1; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; +} + + +ZIP_EXTERN int +zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st) +{ + const char *name; + + if (index < 0 || index >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((name=zip_get_name(za, index, flags)) == NULL) + return -1; + + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && ZIP_ENTRY_DATA_CHANGED(za->entry+index)) { + if (za->entry[index].source->f(za->entry[index].source->ud, + st, sizeof(*st), ZIP_SOURCE_STAT) < 0) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return -1; + } + } + else { + if (za->cdir == NULL || index >= za->cdir->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + st->crc = za->cdir->entry[index].crc; + st->size = za->cdir->entry[index].uncomp_size; + st->mtime = za->cdir->entry[index].last_mod; + st->comp_size = za->cdir->entry[index].comp_size; + st->comp_method = za->cdir->entry[index].comp_method; + if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) { + if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { + /* XXX */ + st->encryption_method = ZIP_EM_UNKNOWN; + } + else + st->encryption_method = ZIP_EM_TRAD_PKWARE; + } + else + st->encryption_method = ZIP_EM_NONE; + /* st->bitflags = za->cdir->entry[index].bitflags; */ + } + + st->index = index; + st->name = name; + + return 0; +} + + +ZIP_EXTERN int +zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st) +{ + int idx; + + if ((idx=zip_name_locate(za, fname, flags)) < 0) + return -1; + + return zip_stat_index(za, idx, flags, st); +} + + +struct read_zip { + struct zip_file *zf; + struct zip_stat st; + myoff_t off, len; +}; + +static ssize_t read_zip(void *st, void *data, size_t len, + enum zip_source_cmd cmd); + + + +ZIP_EXTERN struct zip_source * +zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, + myoff_t start, myoff_t len) +{ + struct zip_error error; + struct zip_source *zs; + struct read_zip *p; + + /* XXX: ZIP_FL_RECOMPRESS */ + + if (za == NULL) + return NULL; + + if (srcza == NULL || start < 0 || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (len == 0) + len = -1; + + if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0) + flags |= ZIP_FL_COMPRESSED; + else + flags &= ~ZIP_FL_COMPRESSED; + + if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + _zip_error_copy(&error, &srcza->error); + + if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0 + || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) { + free(p); + _zip_error_copy(&za->error, &srcza->error); + _zip_error_copy(&srcza->error, &error); + + return NULL; + } + p->off = start; + p->len = len; + + if ((flags & ZIP_FL_COMPRESSED) == 0) { + p->st.size = p->st.comp_size = len; + p->st.comp_method = ZIP_CM_STORE; + p->st.crc = 0; + } + + if ((zs=zip_source_function(za, read_zip, p)) == NULL) { + free(p); + return NULL; + } + + return zs; +} + + + +static ssize_t +read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd) +{ + struct read_zip *z; + char b[8192], *buf; + int i, n; + + z = (struct read_zip *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + for (n=0; noff; n+= i) { + i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n); + if ((i=zip_fread(z->zf, b, i)) < 0) { + zip_fclose(z->zf); + z->zf = NULL; + return -1; + } + } + return 0; + + case ZIP_SOURCE_READ: + if (z->len != -1) + n = len > z->len ? z->len : len; + else + n = len; + + + if ((i=zip_fread(z->zf, buf, n)) < 0) + return -1; + + if (z->len != -1) + z->len -= i; + + return i; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: + if (len < sizeof(z->st)) + return -1; + len = sizeof(z->st); + + memcpy(data, &z->st, len); + return len; + + case ZIP_SOURCE_ERROR: + { + int *e; + + if (len < sizeof(int)*2) + return -1; + + e = (int *)data; + zip_file_error_get(z->zf, e, e+1); + } + return sizeof(int)*2; + + case ZIP_SOURCE_FREE: + zip_fclose(z->zf); + free(z); + return 0; + + default: + ; + } + + return -1; +} + + +ZIP_EXTERN struct zip_source * +zip_source_function(struct zip *za, zip_source_callback zcb, void *ud) +{ + struct zip_source *zs; + + if (za == NULL) + return NULL; + + if ((zs=(struct zip_source *)malloc(sizeof(*zs))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + zs->f = zcb; + zs->ud = ud; + + return zs; +} + + +ZIP_EXTERN void +zip_source_free(struct zip_source *source) +{ + if (source == NULL) + return; + + (void)source->f(source->ud, NULL, 0, ZIP_SOURCE_FREE); + + free(source); +} + + +struct read_file { + char *fname; /* name of file to copy from */ + FILE *f; /* file to copy from */ + myoff_t off; /* start offset of */ + myoff_t len; /* lengt of data to copy */ + myoff_t remain; /* bytes remaining to be copied */ + int e[2]; /* error codes */ +}; + +static ssize_t read_file(void *state, void *data, size_t len, + enum zip_source_cmd cmd); + + + +ZIP_EXTERN struct zip_source * +zip_source_filep(struct zip *za, FILE *file, myoff_t start, myoff_t len) +{ + if (za == NULL) + return NULL; + + if (file == NULL || start < 0 || len < -1) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + return _zip_source_file_or_p(za, NULL, file, start, len); +} + + + +struct zip_source * +_zip_source_file_or_p(struct zip *za, const char *fname, FILE *file, + myoff_t start, myoff_t len) +{ + struct read_file *f; + struct zip_source *zs; + + if (file == NULL && fname == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + f->fname = NULL; + if (fname) { + if ((f->fname=strdup(fname)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + free(f); + return NULL; + } + } + f->f = file; + f->off = start; + f->len = (len ? len : -1); + + if ((zs=zip_source_function(za, read_file, f)) == NULL) { + free(f); + return NULL; + } + + return zs; +} + + + +static ssize_t +read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) +{ + struct read_file *z; + char *buf; + int i, n; + + z = (struct read_file *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + if (z->fname) { + if ((z->f=fopen(z->fname, "rb")) == NULL) { + z->e[0] = ZIP_ER_OPEN; + z->e[1] = errno; + return -1; + } + } + + if (fseeko(z->f, z->off, SEEK_SET) < 0) { + z->e[0] = ZIP_ER_SEEK; + z->e[1] = errno; + return -1; + } + z->remain = z->len; + return 0; + + case ZIP_SOURCE_READ: + if (z->remain != -1) + n = len > z->remain ? z->remain : len; + else + n = len; + + if ((i=fread(buf, 1, n, z->f)) < 0) { + z->e[0] = ZIP_ER_READ; + z->e[1] = errno; + return -1; + } + + if (z->remain != -1) + z->remain -= i; + + return i; + + case ZIP_SOURCE_CLOSE: + if (z->fname) { + fclose(z->f); + z->f = NULL; + } + return 0; + + case ZIP_SOURCE_STAT: + { + struct zip_stat *st; + struct stat fst; + int err; + + if (len < sizeof(*st)) + return -1; + + if (z->f) + err = fstat(fileno(z->f), &fst); + else + err = stat(z->fname, &fst); + + if (err != 0) { + z->e[0] = ZIP_ER_READ; /* best match */ + z->e[1] = errno; + return -1; + } + + st = (struct zip_stat *)data; + + zip_stat_init(st); + st->mtime = fst.st_mtime; + if (z->len != -1) + st->size = z->len; + else if ((fst.st_mode&S_IFMT) == S_IFREG) + st->size = fst.st_size; + + return sizeof(*st); + } + + case ZIP_SOURCE_ERROR: + if (len < sizeof(int)*2) + return -1; + + memcpy(data, z->e, sizeof(int)*2); + return sizeof(int)*2; + + case ZIP_SOURCE_FREE: + free(z->fname); + if (z->f) + fclose(z->f); + free(z); + return 0; + + default: + ; + } + + return -1; +} + + +ZIP_EXTERN int +zip_name_locate(struct zip *za, const char *fname, int flags) +{ + return _zip_name_locate(za, fname, flags, &za->error); +} + + + +int +_zip_name_locate(struct zip *za, const char *fname, int flags, + struct zip_error *error) +{ + int (*cmp)(const char *, const char *); + const char *fn, *p; + int i, n; + + if (fname == NULL) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; + + n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; + for (i=0; icdir->entry[i].filename; + else + fn = _zip_get_name(za, i, flags, error); + + /* newly added (partially filled) entry */ + if (fn == NULL) + continue; + + if (flags & ZIP_FL_NODIR) { + p = strrchr(fn, '/'); + if (p) + fn = p+1; + } + + if (cmp(fname, fn) == 0) + return i; + } + + _zip_error_set(error, ZIP_ER_NOENT, 0); + return -1; +} + diff --git a/lib/pure/htmlparser.nim b/lib/pure/htmlparser.nim index 278bf9b907..892534ce1b 100755 --- a/lib/pure/htmlparser.nim +++ b/lib/pure/htmlparser.nim @@ -20,7 +20,7 @@ ## ## Every tag in the resulting tree is in lower case. ## -## **Note:** The resulting ``PXmlNode``s already use the ``clientData`` field, +## **Note:** The resulting ``PXmlNode`` already use the ``clientData`` field, ## so it cannot be used by clients of this library. import strutils, streams, parsexml, xmltree, unicode, strtabs @@ -418,4 +418,4 @@ when isMainModule: f.close() else: quit("cannot write test.txt") - \ No newline at end of file + diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 0f90548739..c02a7a6e71 100755 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -284,14 +284,14 @@ proc post*(url: string, extraHeaders = "", body = "", ## | POST's ``body`` to the ``url`` and returns a ``TResponse`` object. ## | This proc adds the necessary Content-Length header. ## | This proc also handles redirection. - extraHeaders.add("Content-Length: " & $len(body) & "\c\L") - result = request(url, httpPOST, extraHeaders, body) + var xh = extraHeaders & "Content-Length: " & $len(body) & "\c\L" + result = request(url, httpPOST, xh, body) for i in 1..maxRedirects: if result.status.redirection(): var locationHeader = result.headers["Location"] if locationHeader == "": httpError("location header expected") var meth = if result.status != "307": httpGet else: httpPost - result = request(locationHeader, meth, extraHeaders, body) + result = request(locationHeader, meth, xh, body) proc postContent*(url: string, extraHeaders = "", body = ""): string = ## | POST's ``body`` to ``url`` and returns the response's body as a string diff --git a/lib/pure/macros.nim b/lib/pure/macros.nim index 677469ed28..7f5dda1e53 100755 --- a/lib/pure/macros.nim +++ b/lib/pure/macros.nim @@ -108,7 +108,8 @@ type # Nodes should be reference counted to make the `copy` operation very fast! # However, this is difficult to achieve: modify(n[0][1]) should propagate to -# its father. How to do this without back references? +# its father. How to do this without back references? Hm, BS, it works without +# them. proc `[]`* (n: PNimrodNode, i: int): PNimrodNode {.magic: "NChild".} ## get `n`'s `i`'th child. diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 399d62e8b0..f807c39f5d 100755 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -319,12 +319,12 @@ proc JoinPath*(head, tail: string): string {.noSideEffect.} = ## ## For example on Unix: ## - ## ..code-block:: nimrod + ## .. code-block:: nimrod ## JoinPath("usr", "lib") ## ## results in: ## - ## ..code-block:: nimrod + ## .. code-block:: nimrod ## "usr/lib" ## ## If head is the empty string, tail is returned. @@ -375,6 +375,7 @@ proc SplitPath*(path: string): tuple[head, tail: string] {.noSideEffect.} = ## ``JoinPath(head, tail) == path``. ## ## Examples: + ## ## .. code-block:: nimrod ## SplitPath("usr/local/bin") -> ("usr/local", "bin") ## SplitPath("usr/local/bin/") -> ("usr/local/bin", "") @@ -399,8 +400,8 @@ proc parentDir*(path: string): string {.noSideEffect.} = ## ## This is often the same as the ``head`` result of ``splitPath``. ## If there is no parent, ``path`` is returned. - ## Example: ``parentDir("/usr/local/bin") == "/usr/local"``. - ## Example: ``parentDir("/usr/local/bin/") == "/usr/local"``. + ## | Example: ``parentDir("/usr/local/bin") == "/usr/local"``. + ## | Example: ``parentDir("/usr/local/bin/") == "/usr/local"``. var sepPos = -1 q = 1 @@ -834,7 +835,7 @@ iterator walkDir*(dir: string): tuple[kind: TPathComponent, path: string] = ## for kind, path in walkDir("dirA"): ## echo(path) ## - ## produces this output (though not necessarily in this order!):: + ## produces this output (but not necessarily in this order!):: ## dirA/dirB ## dirA/dirC ## dirA/fileA1.txt diff --git a/lib/pure/parsecfg.nim b/lib/pure/parsecfg.nim index c26dab0993..4f8f5347fa 100755 --- a/lib/pure/parsecfg.nim +++ b/lib/pure/parsecfg.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2010 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -17,11 +17,11 @@ ## ## .. include:: doc/mytest.cfg ## :literal: -## The file ``tests/tparscfg.nim`` demonstrates how to use the +## The file ``examples/parsecfgex.nim`` demonstrates how to use the ## configuration file parser: ## ## .. code-block:: nimrod -## :file: tests/tparscfg.nim +## :file: examples/parsecfgex.nim import diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim index e5a655b2ea..969ff8106f 100755 --- a/lib/pure/pegs.nim +++ b/lib/pure/pegs.nim @@ -1190,7 +1190,7 @@ proc eat(p: var TPegParser, kind: TTokKind) = proc parseExpr(p: var TPegParser): TPeg -proc getNonTerminal(p: TPegParser, name: string): PNonTerminal = +proc getNonTerminal(p: var TPegParser, name: string): PNonTerminal = for i in 0..high(p.nonterms): result = p.nonterms[i] if cmpIgnoreStyle(result.name, name) == 0: return diff --git a/lib/pure/strtabs.nim b/lib/pure/strtabs.nim index 8ea59637a8..38be1e9835 100755 --- a/lib/pure/strtabs.nim +++ b/lib/pure/strtabs.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2008 Andreas Rumpf +# (c) Copyright 2010 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -36,7 +36,7 @@ proc newStringTable*(keyValuePairs: openarray[string], ## var mytab = newStringTable("key1", "val1", "key2", "val2", ## modeCaseInsensitive) -proc newStringTable*(mode: TStringTableMode = modeCaseSensitive): PStringTable +proc newStringTable*(mode: TStringTableMode): PStringTable ## creates a new string table that is empty. proc `[]=`*(t: PStringTable, key, val: string) @@ -79,7 +79,7 @@ const growthFactor = 2 startSize = 64 -proc newStringTable(mode: TStringTableMode = modeCaseSensitive): PStringTable = +proc newStringTable(mode: TStringTableMode): PStringTable = new(result) result.mode = mode result.counter = 0 diff --git a/lib/pure/unidecode/unidecode.nim b/lib/pure/unidecode/unidecode.nim index a665dd73e2..52f9b6b1a2 100755 --- a/lib/pure/unidecode/unidecode.nim +++ b/lib/pure/unidecode/unidecode.nim @@ -10,7 +10,7 @@ ## This module is based on Python's Unidecode module by Tomaz Solc, ## which in turn is based on the ``Text::Unidecode`` Perl module by ## Sean M. Burke -## (http://search.cpan.org/~sburke/Text-Unidecode-0.04/lib/Text/Unidecode.pm). +## (http://search.cpan.org/~sburke/Text-Unidecode-0.04/lib/Text/Unidecode.pm ). ## ## It provides a single proc that does Unicode to ASCII transliterations: ## It finds the sequence of ASCII characters that is the closest approximation @@ -47,7 +47,7 @@ proc unidecode*(s: string): string = ## Example: ## ## ..code-block:: nimrod - ## unidecode("\x53\x17\x4E\xB0") + ## unidecode("\\x53\\x17\\x4E\\xB0") ## ## Results in: "Bei Jing" ## diff --git a/lib/pure/xmltree.nim b/lib/pure/xmltree.nim index c79b9ad407..8604078fb0 100755 --- a/lib/pure/xmltree.nim +++ b/lib/pure/xmltree.nim @@ -12,9 +12,9 @@ import macros, strtabs type - PXmlNode* = ref TXmlNode ## an XML tree consists of ``PXmlNode``s. + PXmlNode* = ref TXmlNode ## an XML tree consists of ``PXmlNode``'s. - TXmlNodeKind* = enum ## different kinds of ``PXmlNode``s + TXmlNodeKind* = enum ## different kinds of ``PXmlNode``'s xnText, ## a text element xnElement, ## an element with 0 or more children xnCData, ## a CDATA node @@ -39,7 +39,7 @@ proc newXmlNode(kind: TXmlNodeKind): PXmlNode = result.k = kind proc newElement*(tag: string): PXmlNode = - ## creates a new ``PXmlNode``. of kind ``xnText`` with the given `tag`. + ## creates a new ``PXmlNode`` of kind ``xnText`` with the given `tag`. result = newXmlNode(xnElement) result.fTag = tag result.s = @[] @@ -208,9 +208,14 @@ proc add*(result: var string, n: PXmlNode, indent = 0, indWidth = 2) = result.add(n.fText) result.add(';') +const + xmlHeader* = "\n" + ## header to use for complete XML output + proc `$`*(n: PXmlNode): string = - ## converts `n` into its string representation. - result = "\n" + ## converts `n` into its string representation. No ``<$xml ...$>`` declaration + ## is produced, so that the produced XML fragments are composable. + result = "" result.add(n) proc newXmlTree*(tag: string, children: openArray[PXmlNode], @@ -227,16 +232,21 @@ proc xmlConstructor(e: PNimrodNode): PNimrodNode {.compileTime.} = var a = e[1] if a.kind == nnkCall: result = newCall("newXmlTree", toStrLit(a[0])) - var attrs = newCall("newStringTable", []) - var bracket = newNimNode(nnkBracket, a) + var attrs = newNimNode(nnkBracket, a) + var newStringTabCall = newCall("newStringTable", attrs, + newIdentNode("modeCaseSensitive")) + var elements = newNimNode(nnkBracket, a) for i in 1..a.len-1: - if a[i].kind == nnkExprEqExpr: + if a[i].kind == nnkExprEqExpr: attrs.add(toStrLit(a[i][0])) attrs.add(a[i][1]) + echo repr(attrs) else: - bracket.add(a[i]) - result.add(bracket) - if attrs.len > 1: result.add(attrs) + elements.add(a[i]) + result.add(elements) + if attrs.len > 1: + echo repr(newStringTabCall) + result.add(newStringTabCall) else: result = newCall("newXmlTree", toStrLit(a)) @@ -252,5 +262,3 @@ macro `<>`*(x: expr): expr = ## result = xmlConstructor(x) - - diff --git a/lib/wrappers/gtk/libglade2.nim b/lib/wrappers/gtk/libglade2.nim index c3ddb111a3..844f055a03 100755 --- a/lib/wrappers/gtk/libglade2.nim +++ b/lib/wrappers/gtk/libglade2.nim @@ -85,9 +85,6 @@ proc gnome_init*() = proc bonobo_init*() = init() -proc xml_new*(fname: cstring, root: cstring, domain: cstring): PXML = - result = xml_new(fname, root, domain) - proc xml_new_from_memory*(buffer: cstring, size: int32, root: cstring, domain: cstring): PXML = result = xml_new_from_buffer(buffer, size, root, domain) diff --git a/lib/wrappers/sdl/sdl.nim b/lib/wrappers/sdl/sdl.nim index a144a3a84d..a4c8273b8b 100755 --- a/lib/wrappers/sdl/sdl.nim +++ b/lib/wrappers/sdl/sdl.nim @@ -799,9 +799,6 @@ type here*: ptr byte stop*: ptr byte - TUnknown*{.final.} = object # first declare the pointer type - data1*: Pointer - PRWops* = ptr TRWops # now the pointer to function types TSeek* = proc (context: PRWops, offset: int, whence: int): int{.cdecl.} TRead* = proc (context: PRWops, thePtr: Pointer, size: int, maxnum: int): int{. @@ -809,23 +806,14 @@ type TWrite* = proc (context: PRWops, thePtr: Pointer, size: int, num: int): int{. cdecl.} TClose* = proc (context: PRWops): int{.cdecl.} # the variant record itself - trange010 = range[0..2] TRWops*{.final.} = object seek*: TSeek read*: TRead write*: TWrite closeFile*: TClose # a keyword as name is not allowed # be warned! structure alignment may arise at this point - case theType*: trange010 - of trange010(0): - stdio*: TStdio - - of trange010(1): - mem*: TMem - - of trange010(2): - unknown*: TUnknown - + theType*: cint + mem*: TMem RWops* = TRWops # SDL_timer.h types # Function prototype for the timer callback function @@ -1014,20 +1002,21 @@ type TJoyButtonEvent*{.final.} = object # SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP # The "window resized" event - # When you get this event, you are responsible for setting a new video - # mode with the new width and height. + # When you get this event, you are + # responsible for setting a new video + # mode with the new width and height. which*: byte # The joystick device index button*: byte # The joystick button index state*: byte # SDL_PRESSED or SDL_RELEASED TResizeEvent*{.final.} = object # SDL_VIDEORESIZE # A user-defined event type - w*: int # New width - h*: int # New height + w*: cint # New width + h*: cint # New height PUserEvent* = ptr TUserEvent TUserEvent*{.final.} = object # SDL_USEREVENT through SDL_NUMEVENTS-1 - code*: int # User defined event code + code*: cint # User defined event code data1*: Pointer # User defined data pointer data2*: Pointer # User defined data pointer @@ -1096,7 +1085,7 @@ elif defined(Unix): X11*: TX11 else: - type # The generic custom window manager information structure + type # The generic custom window manager information structure PSysWMinfo* = ptr TSysWMinfo TSysWMinfo*{.final.} = object version*: Tversion @@ -1108,46 +1097,59 @@ type msg*: PSysWMmsg PEvent* = ptr TEvent - TEvent*{.final.} = object # This function sets up a filter to process all events before they - # change internal state and are posted to the internal event queue. - # - # The filter is protypted as: - case theType*: TEventKind # SDL_NOEVENT, SDL_QUITEV: (); + TEvent*{.final.} = object + # This function sets up a filter to process all events before they + # change internal state and are posted to the internal event queue. + # The filter is protypted as: + case kind*: TEventKind # SDL_NOEVENT, SDL_QUITEV: (); of ACTIVEEVENT: - active*: TActiveEvent - + gain*: byte # Whether given states were gained or lost (1/0) + state*: byte # A mask of the focus states of KEYDOWN, KEYUP: - key*: TKeyboardEvent - + keystate*: byte # SDL_PRESSED or SDL_RELEASED + scancode*: byte # hardware specific scancode + sym*: TKey # SDL virtual keysym + modifier*: TMod # current key modifiers + unicode*: UInt16 # translated character of MOUSEMOTION: - motion*: TMouseMotionEvent - + motionState*: byte # The current button state + motionX*, motionY*: UInt16 # The X/Y coordinates of the mouse + xrel*: int16 # The relative motion in the X direction + yrel*: int16 # The relative motion in the Y direction of MOUSEBUTTONDOWN, MOUSEBUTTONUP: - button*: TMouseButtonEvent - + button*: byte # The mouse button index + buttonState*: byte # SDL_PRESSED or SDL_RELEASED + align: byte + x*: UInt16 # The X coordinates of the mouse at press time + y*: UInt16 # The Y coordinates of the mouse at press time of JOYAXISMOTION: - jaxis*: TJoyAxisEvent - + axis*: byte # The joystick axis index + value*: int16 # The axis value (range: -32768 to 32767) of JOYBALLMOTION: - jball*: TJoyBallEvent - + ball*: byte # The joystick trackball index + joyXrel*: int16 # The relative motion in the X direction + joyYrel*: int16 # The relative motion in the Y direction + of JOYHATMOTION: - jhat*: TJoyHatEvent + hat*: byte # The joystick hat index + hatValue*: byte # The hat position value: + # 8 1 2 + # 7 0 3 + # 6 5 4 + # Note that zero means the POV is centered. of JOYBUTTONDOWN, JOYBUTTONUP: - jbutton*: TJoyButtonEvent - + joybutton*: byte # The joystick button index + joyState*: byte # SDL_PRESSED or SDL_RELEASED + of VIDEORESIZE: - resize*: TResizeEvent - + w*: cint # New width + h*: cint # New height of USEREVENT: - user*: TUserEvent - - of SYSWMEVENT: - syswm*: TSysWMEvent - - else: - nil + code*: cint # User defined event code + data1*: Pointer # User defined data pointer + data2*: Pointer # User defined data pointer + else: nil TEventFilter* = proc (event: PEvent): int{.cdecl.} # SDL_video.h types @@ -1209,8 +1211,8 @@ type dst*: PPixelFormat PSurface* = ptr TSurface - TBlit* = proc (src: PSurface, srcrect: PRect, dst: PSurface, dstrect: PRect): int{. - cdecl.} + TBlit* = proc (src: PSurface, srcrect: PRect, + dst: PSurface, dstrect: PRect): int{.cdecl.} TSurface*{.final.} = object # Useful for determining the video hardware capabilities flags*: int32 # Read-only format*: PPixelFormat # Read-only @@ -1302,12 +1304,12 @@ type # This is the system-independent thread info struc PWordArray* = ptr TWordArray TWordArray* = array[0..16383, int16] # Generic procedure pointer TProcedure* = proc () #------------------------------------------------------------------------------ - # initialization - #------------------------------------------------------------------------------ - # This function loads the SDL dynamically linked library and initializes - # the subsystems specified by 'flags' (and those satisfying dependencies) - # Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup - # signal handlers for some commonly ignored fatal signals (like SIGSEGV) +# initialization +#------------------------------------------------------------------------------ +# This function loads the SDL dynamically linked library and initializes +# the subsystems specified by 'flags' (and those satisfying dependencies) +# Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup +# signal handlers for some commonly ignored fatal signals (like SIGSEGV) proc Init*(flags: int32): int{.cdecl, importc: "SDL_Init", dynlib: LibName.} # This function initializes specific SDL subsystems diff --git a/lib/wrappers/sdl/sdl_ttf.nim b/lib/wrappers/sdl/sdl_ttf.nim index 796a20f547..ca4b56f5af 100755 --- a/lib/wrappers/sdl/sdl_ttf.nim +++ b/lib/wrappers/sdl/sdl_ttf.nim @@ -178,9 +178,11 @@ const type PFont* = ptr Tfont - TFont*{.final.} = object # This macro can be used to fill a version structure with the compile-time - # version of the SDL_ttf library. - + TFont{.final.} = object + + +# This macro can be used to fill a version structure with the compile-time +# version of the SDL_ttf library. proc Linked_Version*(): sdl.Pversion{.cdecl, importc: "TTF_Linked_Version", dynlib: ttfLibName.} diff --git a/lib/wrappers/zip/libzip_all.c b/lib/wrappers/zip/libzip_all.c new file mode 100755 index 0000000000..797374b296 --- /dev/null +++ b/lib/wrappers/zip/libzip_all.c @@ -0,0 +1,4189 @@ +/* + zipint.h -- internal declarations. + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +/* +#ifdef _MSC_VER +#define ZIP_EXTERN __declspec(dllimport) +#endif +*/ + +/* + zip.h -- exported declarations. + Copyright (C) 1999-2008 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifndef ZIP_EXTERN +#define ZIP_EXTERN +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +/* flags for zip_open */ + +#define ZIP_CREATE 1 +#define ZIP_EXCL 2 +#define ZIP_CHECKCONS 4 + + +/* flags for zip_name_locate, zip_fopen, zip_stat, ... */ + +#define ZIP_FL_NOCASE 1 /* ignore case on name lookup */ +#define ZIP_FL_NODIR 2 /* ignore directory component */ +#define ZIP_FL_COMPRESSED 4 /* read compressed data */ +#define ZIP_FL_UNCHANGED 8 /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16 /* force recompression of data */ + +/* archive global flags flags */ + +#define ZIP_AFL_TORRENT 1 /* torrent zipped */ + +/* libzip error codes */ + +#define ZIP_ER_OK 0 /* N No error */ +#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */ +#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */ +#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */ +#define ZIP_ER_SEEK 4 /* S Seek error */ +#define ZIP_ER_READ 5 /* S Read error */ +#define ZIP_ER_WRITE 6 /* S Write error */ +#define ZIP_ER_CRC 7 /* N CRC error */ +#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */ +#define ZIP_ER_NOENT 9 /* N No such file */ +#define ZIP_ER_EXISTS 10 /* N File already exists */ +#define ZIP_ER_OPEN 11 /* S Can't open file */ +#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */ +#define ZIP_ER_ZLIB 13 /* Z Zlib error */ +#define ZIP_ER_MEMORY 14 /* N Malloc failure */ +#define ZIP_ER_CHANGED 15 /* N Entry has been changed */ +#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */ +#define ZIP_ER_EOF 17 /* N Premature EOF */ +#define ZIP_ER_INVAL 18 /* N Invalid argument */ +#define ZIP_ER_NOZIP 19 /* N Not a zip archive */ +#define ZIP_ER_INTERNAL 20 /* N Internal error */ +#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */ +#define ZIP_ER_REMOVE 22 /* S Can't remove file */ +#define ZIP_ER_DELETED 23 /* N Entry has been deleted */ + + +/* type of system error value */ + +#define ZIP_ET_NONE 0 /* sys_err unused */ +#define ZIP_ET_SYS 1 /* sys_err is errno */ +#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ + +/* compression methods */ + +#define ZIP_CM_DEFAULT -1 /* better of deflate or store */ +#define ZIP_CM_STORE 0 /* stored (uncompressed) */ +#define ZIP_CM_SHRINK 1 /* shrunk */ +#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */ +#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */ +#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */ +#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */ +#define ZIP_CM_IMPLODE 6 /* imploded */ +/* 7 - Reserved for Tokenizing compression algorithm */ +#define ZIP_CM_DEFLATE 8 /* deflated */ +#define ZIP_CM_DEFLATE64 9 /* deflate64 */ +#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ +/* 11 - Reserved by PKWARE */ +#define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */ +/* 13 - Reserved by PKWARE */ +#define ZIP_CM_LZMA 14 /* LZMA (EFS) */ +/* 15-17 - Reserved by PKWARE */ +#define ZIP_CM_TERSE 18 /* compressed using IBM TERSE (new) */ +#define ZIP_CM_LZ77 19 /* IBM LZ77 z Architecture (PFS) */ +#define ZIP_CM_WAVPACK 97 /* WavPack compressed data */ +#define ZIP_CM_PPMD 98 /* PPMd version I, Rev 1 */ + +/* encryption methods */ + +#define ZIP_EM_NONE 0 /* not encrypted */ +#define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */ +#if 0 /* Strong Encryption Header not parsed yet */ +#define ZIP_EM_DES 0x6601 /* strong encryption: DES */ +#define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */ +#define ZIP_EM_3DES_168 0x6603 +#define ZIP_EM_3DES_112 0x6609 +#define ZIP_EM_AES_128 0x660e +#define ZIP_EM_AES_192 0x660f +#define ZIP_EM_AES_256 0x6610 +#define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */ +#define ZIP_EM_RC4 0x6801 +#endif +#define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */ + +typedef long myoff_t; /* XXX: 64 bit support */ + +enum zip_source_cmd { + ZIP_SOURCE_OPEN, /* prepare for reading */ + ZIP_SOURCE_READ, /* read data */ + ZIP_SOURCE_CLOSE, /* reading is done */ + ZIP_SOURCE_STAT, /* get meta information */ + ZIP_SOURCE_ERROR, /* get error information */ + ZIP_SOURCE_FREE /* cleanup and free resources */ +}; + +typedef ssize_t (*zip_source_callback)(void *state, void *data, + size_t len, enum zip_source_cmd cmd); + +struct zip_stat { + const char *name; /* name of the file */ + int index; /* index within archive */ + unsigned int crc; /* crc of file data */ + time_t mtime; /* modification time */ + myoff_t size; /* size of file (uncompressed) */ + myoff_t comp_size; /* size of file (compressed) */ + unsigned short comp_method; /* compression method used */ + unsigned short encryption_method; /* encryption method used */ +}; + +struct zip; +struct zip_file; +struct zip_source; + + +ZIP_EXTERN int zip_add(struct zip *, const char *, struct zip_source *); +ZIP_EXTERN int zip_add_dir(struct zip *, const char *); +ZIP_EXTERN int zip_close(struct zip *); +ZIP_EXTERN int zip_delete(struct zip *, int); +ZIP_EXTERN void zip_error_clear(struct zip *); +ZIP_EXTERN void zip_error_get(struct zip *, int *, int *); +ZIP_EXTERN int zip_error_get_sys_type(int); +ZIP_EXTERN int zip_error_to_str(char *, size_t, int, int); +ZIP_EXTERN int zip_fclose(struct zip_file *); +ZIP_EXTERN void zip_file_error_clear(struct zip_file *); +ZIP_EXTERN void zip_file_error_get(struct zip_file *, int *, int *); +ZIP_EXTERN const char *zip_file_strerror(struct zip_file *); +ZIP_EXTERN struct zip_file *zip_fopen(struct zip *, const char *, int); +ZIP_EXTERN struct zip_file *zip_fopen_index(struct zip *, int, int); +ZIP_EXTERN ssize_t zip_fread(struct zip_file *, void *, size_t); +ZIP_EXTERN const char *zip_get_archive_comment(struct zip *, int *, int); +ZIP_EXTERN int zip_get_archive_flag(struct zip *, int, int); +ZIP_EXTERN const char *zip_get_file_comment(struct zip *, int, int *, int); +ZIP_EXTERN const char *zip_get_name(struct zip *, int, int); +ZIP_EXTERN int zip_get_num_files(struct zip *); +ZIP_EXTERN int zip_name_locate(struct zip *, const char *, int); +ZIP_EXTERN struct zip *zip_open(const char *, int, int *); +ZIP_EXTERN int zip_rename(struct zip *, int, const char *); +ZIP_EXTERN int zip_replace(struct zip *, int, struct zip_source *); +ZIP_EXTERN int zip_set_archive_comment(struct zip *, const char *, int); +ZIP_EXTERN int zip_set_archive_flag(struct zip *, int, int); +ZIP_EXTERN int zip_set_file_comment(struct zip *, int, const char *, int); +ZIP_EXTERN struct zip_source *zip_source_buffer(struct zip *, const void *, + myoff_t, int); +ZIP_EXTERN struct zip_source *zip_source_file(struct zip *, const char *, + myoff_t, myoff_t); +ZIP_EXTERN struct zip_source *zip_source_filep(struct zip *, FILE *, + myoff_t, myoff_t); +ZIP_EXTERN void zip_source_free(struct zip_source *); +ZIP_EXTERN struct zip_source *zip_source_function(struct zip *, + zip_source_callback, void *); +ZIP_EXTERN struct zip_source *zip_source_zip(struct zip *, struct zip *, + int, int, myoff_t, myoff_t); +ZIP_EXTERN int zip_stat(struct zip *, const char *, int, struct zip_stat *); +ZIP_EXTERN int zip_stat_index(struct zip *, int, int, struct zip_stat *); +ZIP_EXTERN void zip_stat_init(struct zip_stat *); +ZIP_EXTERN const char *zip_strerror(struct zip *); +ZIP_EXTERN int zip_unchange(struct zip *, int); +ZIP_EXTERN int zip_unchange_all(struct zip *); +ZIP_EXTERN int zip_unchange_archive(struct zip *); + +#ifdef __cplusplus +} +#endif + + +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. + */ +/* #undef HAVE_DECL_TZNAME */ + +#define HAVE_CONFIG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `fseeko' function. */ +#define HAVE_FSEEKO 1 + +/* Define to 1 if you have the `ftello' function. */ +#define HAVE_FTELLO 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#define HAVE_LIBZ 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `MoveFileExA' function. */ +/* #undef HAVE_MOVEFILEEXA */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if `tm_zone' is member of `struct tm'. */ +#define HAVE_STRUCT_TM_TM_ZONE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use + `HAVE_STRUCT_TM_TM_ZONE' instead. */ +#define HAVE_TM_ZONE 1 + +/* Define to 1 if you don't have `tm_zone' but do have the external array + `tzname'. */ +/* #undef HAVE_TZNAME */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Name of package */ +#define PACKAGE "libzip" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "libzip@nih.at" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libzip" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libzip 0.9" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libzip" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.9" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* Version number of package */ +#define VERSION "0.9" + + +#ifndef HAVE_MKSTEMP +int _zip_mkstemp(char *); +#define mkstemp _zip_mkstemp +#endif + +#ifdef HAVE_MOVEFILEEXA +#include +#define _zip_rename(s, t) \ + (!MoveFileExA((s), (t), \ + MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING)) +#else +#define _zip_rename rename +#endif + +#ifndef HAVE_FSEEKO +#define fseeko(s, o, w) (fseek((s), (long int)(o), (w))) +#endif +#ifndef HAVE_FTELLO +#define ftello(s) ((long)ftell((s))) +#endif + + +#define CENTRAL_MAGIC "PK\1\2" +#define LOCAL_MAGIC "PK\3\4" +#define EOCD_MAGIC "PK\5\6" +#define DATADES_MAGIC "PK\7\8" +#define TORRENT_SIG "TORRENTZIPPED-" +#define TORRENT_SIG_LEN 14 +#define TORRENT_CRC_LEN 8 +#define TORRENT_MEM_LEVEL 8 +#define CDENTRYSIZE 46u +#define LENTRYSIZE 30 +#define MAXCOMLEN 65536 +#define EOCDLEN 22 +#define CDBUFSIZE (MAXCOMLEN+EOCDLEN) +#define BUFSIZE 8192 + + +/* state of change of a file in zip archive */ + +enum zip_state { ZIP_ST_UNCHANGED, ZIP_ST_DELETED, ZIP_ST_REPLACED, + ZIP_ST_ADDED, ZIP_ST_RENAMED }; + +/* constants for struct zip_file's member flags */ + +#define ZIP_ZF_EOF 1 /* EOF reached */ +#define ZIP_ZF_DECOMP 2 /* decompress data */ +#define ZIP_ZF_CRC 4 /* compute and compare CRC */ + +/* directory entry: general purpose bit flags */ + +#define ZIP_GPBF_ENCRYPTED 0x0001 /* is encrypted */ +#define ZIP_GPBF_DATA_DESCRIPTOR 0x0008 /* crc/size after file data */ +#define ZIP_GPBF_STRONG_ENCRYPTION 0x0040 /* uses strong encryption */ + +/* error information */ + +struct zip_error { + int zip_err; /* libzip error code (ZIP_ER_*) */ + int sys_err; /* copy of errno (E*) or zlib error code */ + char *str; /* string representation or NULL */ +}; + +/* zip archive, part of API */ + +struct zip { + char *zn; /* file name */ + FILE *zp; /* file */ + struct zip_error error; /* error information */ + + unsigned int flags; /* archive global flags */ + unsigned int ch_flags; /* changed archive global flags */ + + struct zip_cdir *cdir; /* central directory */ + char *ch_comment; /* changed archive comment */ + int ch_comment_len; /* length of changed zip archive + * comment, -1 if unchanged */ + int nentry; /* number of entries */ + int nentry_alloc; /* number of entries allocated */ + struct zip_entry *entry; /* entries */ + int nfile; /* number of opened files within archive */ + int nfile_alloc; /* number of files allocated */ + struct zip_file **file; /* opened files within archive */ +}; + +/* file in zip archive, part of API */ + +struct zip_file { + struct zip *za; /* zip archive containing this file */ + struct zip_error error; /* error information */ + int flags; /* -1: eof, >0: error */ + + int method; /* compression method */ + myoff_t fpos; /* position within zip file (fread/fwrite) */ + unsigned long bytes_left; /* number of bytes left to read */ + unsigned long cbytes_left; /* number of bytes of compressed data left */ + + unsigned long crc; /* CRC so far */ + unsigned long crc_orig; /* CRC recorded in archive */ + + char *buffer; + z_stream *zstr; +}; + +/* zip archive directory entry (central or local) */ + +struct zip_dirent { + unsigned short version_madeby; /* (c) version of creator */ + unsigned short version_needed; /* (cl) version needed to extract */ + unsigned short bitflags; /* (cl) general purpose bit flag */ + unsigned short comp_method; /* (cl) compression method used */ + time_t last_mod; /* (cl) time of last modification */ + unsigned int crc; /* (cl) CRC-32 of uncompressed data */ + unsigned int comp_size; /* (cl) size of commpressed data */ + unsigned int uncomp_size; /* (cl) size of uncommpressed data */ + char *filename; /* (cl) file name (NUL-terminated) */ + unsigned short filename_len; /* (cl) length of filename (w/o NUL) */ + char *extrafield; /* (cl) extra field */ + unsigned short extrafield_len; /* (cl) length of extra field */ + char *comment; /* (c) file comment */ + unsigned short comment_len; /* (c) length of file comment */ + unsigned short disk_number; /* (c) disk number start */ + unsigned short int_attrib; /* (c) internal file attributes */ + unsigned int ext_attrib; /* (c) external file attributes */ + unsigned int offset; /* (c) offset of local header */ +}; + +/* zip archive central directory */ + +struct zip_cdir { + struct zip_dirent *entry; /* directory entries */ + int nentry; /* number of entries */ + + unsigned int size; /* size of central direcotry */ + unsigned int offset; /* offset of central directory in file */ + char *comment; /* zip archive comment */ + unsigned short comment_len; /* length of zip archive comment */ +}; + + + +struct zip_source { + zip_source_callback f; + void *ud; +}; + +/* entry in zip archive directory */ + +struct zip_entry { + enum zip_state state; + struct zip_source *source; + char *ch_filename; + char *ch_comment; + int ch_comment_len; +}; + + + +extern const char * const _zip_err_str[]; +extern const int _zip_nerr_str; +extern const int _zip_err_type[]; + + + +#define ZIP_ENTRY_DATA_CHANGED(x) \ + ((x)->state == ZIP_ST_REPLACED \ + || (x)->state == ZIP_ST_ADDED) + + + +int _zip_cdir_compute_crc(struct zip *, uLong *); +void _zip_cdir_free(struct zip_cdir *); +struct zip_cdir *_zip_cdir_new(int, struct zip_error *); +int _zip_cdir_write(struct zip_cdir *, FILE *, struct zip_error *); + +void _zip_dirent_finalize(struct zip_dirent *); +void _zip_dirent_init(struct zip_dirent *); +int _zip_dirent_read(struct zip_dirent *, FILE *, + unsigned char **, unsigned int, int, struct zip_error *); +void _zip_dirent_torrent_normalize(struct zip_dirent *); +int _zip_dirent_write(struct zip_dirent *, FILE *, int, struct zip_error *); + +void _zip_entry_free(struct zip_entry *); +void _zip_entry_init(struct zip *, int); +struct zip_entry *_zip_entry_new(struct zip *); + +void _zip_error_clear(struct zip_error *); +void _zip_error_copy(struct zip_error *, struct zip_error *); +void _zip_error_fini(struct zip_error *); +void _zip_error_get(struct zip_error *, int *, int *); +void _zip_error_init(struct zip_error *); +void _zip_error_set(struct zip_error *, int, int); +const char *_zip_error_strerror(struct zip_error *); + +int _zip_file_fillbuf(void *, size_t, struct zip_file *); +unsigned int _zip_file_get_offset(struct zip *, int); + +int _zip_filerange_crc(FILE *, myoff_t, myoff_t, uLong *, struct zip_error *); + +struct zip_source *_zip_source_file_or_p(struct zip *, const char *, FILE *, + myoff_t, myoff_t); + +void _zip_free(struct zip *); +const char *_zip_get_name(struct zip *, int, int, struct zip_error *); +int _zip_local_header_read(struct zip *, int); +void *_zip_memdup(const void *, size_t, struct zip_error *); +int _zip_name_locate(struct zip *, const char *, int, struct zip_error *); +struct zip *_zip_new(struct zip_error *); +unsigned short _zip_read2(unsigned char **); +unsigned int _zip_read4(unsigned char **); +int _zip_replace(struct zip *, int, const char *, struct zip_source *); +int _zip_set_name(struct zip *, int, const char *); +int _zip_unchange(struct zip *, int, int); +void _zip_unchange_data(struct zip_entry *); + + +#include +#include +#include +#include + +const char * +_zip_error_strerror(struct zip_error *err) +{ + const char *zs, *ss; + char buf[128], *s; + + _zip_error_fini(err); + + if (err->zip_err < 0 || err->zip_err >= _zip_nerr_str) { + sprintf(buf, "Unknown error %d", err->zip_err); + zs = NULL; + ss = buf; + } + else { + zs = _zip_err_str[err->zip_err]; + + switch (_zip_err_type[err->zip_err]) { + case ZIP_ET_SYS: + ss = strerror(err->sys_err); + break; + + case ZIP_ET_ZLIB: + ss = zError(err->sys_err); + break; + + default: + ss = NULL; + } + } + + if (ss == NULL) + return zs; + else { + if ((s=(char *)malloc(strlen(ss) + + (zs ? strlen(zs)+2 : 0) + 1)) == NULL) + return _zip_err_str[ZIP_ER_MEMORY]; + + sprintf(s, "%s%s%s", + (zs ? zs : ""), + (zs ? ": " : ""), + ss); + err->str = s; + + return s; + } +} + +#include + + + +void +_zip_error_clear(struct zip_error *err) +{ + err->zip_err = ZIP_ER_OK; + err->sys_err = 0; +} + + + +void +_zip_error_copy(struct zip_error *dst, struct zip_error *src) +{ + dst->zip_err = src->zip_err; + dst->sys_err = src->sys_err; +} + + + +void +_zip_error_fini(struct zip_error *err) +{ + free(err->str); + err->str = NULL; +} + + + +void +_zip_error_get(struct zip_error *err, int *zep, int *sep) +{ + if (zep) + *zep = err->zip_err; + if (sep) { + if (zip_error_get_sys_type(err->zip_err) != ZIP_ET_NONE) + *sep = err->sys_err; + else + *sep = 0; + } +} + + + +void +_zip_error_init(struct zip_error *err) +{ + err->zip_err = ZIP_ER_OK; + err->sys_err = 0; + err->str = NULL; +} + + + +void +_zip_error_set(struct zip_error *err, int ze, int se) +{ + if (err) { + err->zip_err = ze; + err->sys_err = se; + } +} + + +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + + + +int +_zip_mkstemp(char *path) +{ + int fd; + char *start, *trv; + struct stat sbuf; + pid_t pid; + + /* To guarantee multiple calls generate unique names even if + the file is not created. 676 different possibilities with 7 + or more X's, 26 with 6 or less. */ + static char xtra[2] = "aa"; + int xcnt = 0; + + pid = getpid(); + + /* Move to end of path and count trailing X's. */ + for (trv = path; *trv; ++trv) + if (*trv == 'X') + xcnt++; + else + xcnt = 0; + + /* Use at least one from xtra. Use 2 if more than 6 X's. */ + if (*(trv - 1) == 'X') + *--trv = xtra[0]; + if (xcnt > 6 && *(trv - 1) == 'X') + *--trv = xtra[1]; + + /* Set remaining X's to pid digits with 0's to the left. */ + while (*--trv == 'X') { + *trv = (pid % 10) + '0'; + pid /= 10; + } + + /* update xtra for next call. */ + if (xtra[0] != 'z') + xtra[0]++; + else { + xtra[0] = 'a'; + if (xtra[1] != 'z') + xtra[1]++; + else + xtra[1] = 'a'; + } + + /* + * check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + for (start = trv + 1;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + if (stat(path, &sbuf)) + return (0); + if (!S_ISDIR(sbuf.st_mode)) { + errno = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) { + if ((fd=open(path, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600)) >= 0) + return (fd); + if (errno != EEXIST) + return (0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) { + if (!*trv) + return (0); + if (*trv == 'z') + *trv++ = 'a'; + else { + if (isdigit((unsigned char)*trv)) + *trv = 'a'; + else + ++*trv; + break; + } + } + } + /*NOTREACHED*/ +} + + +#include +#include +#include +#include +#include +#include + +static time_t _zip_d2u_time(int, int); +static char *_zip_readfpstr(FILE *, unsigned int, int, struct zip_error *); +static char *_zip_readstr(unsigned char **, int, int, struct zip_error *); +static void _zip_u2d_time(time_t, unsigned short *, unsigned short *); +static void _zip_write2(unsigned short, FILE *); +static void _zip_write4(unsigned int, FILE *); + + + +void +_zip_cdir_free(struct zip_cdir *cd) +{ + int i; + + if (!cd) + return; + + for (i=0; inentry; i++) + _zip_dirent_finalize(cd->entry+i); + free(cd->comment); + free(cd->entry); + free(cd); +} + + + +struct zip_cdir * +_zip_cdir_new(int nentry, struct zip_error *error) +{ + struct zip_cdir *cd; + + if ((cd=(struct zip_cdir *)malloc(sizeof(*cd))) == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if ((cd->entry=(struct zip_dirent *)malloc(sizeof(*(cd->entry))*nentry)) + == NULL) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + free(cd); + return NULL; + } + + /* entries must be initialized by caller */ + + cd->nentry = nentry; + cd->size = cd->offset = 0; + cd->comment = NULL; + cd->comment_len = 0; + + return cd; +} + + + +int +_zip_cdir_write(struct zip_cdir *cd, FILE *fp, struct zip_error *error) +{ + int i; + + cd->offset = ftello(fp); + + for (i=0; inentry; i++) { + if (_zip_dirent_write(cd->entry+i, fp, 0, error) != 0) + return -1; + } + + cd->size = ftello(fp) - cd->offset; + + /* clearerr(fp); */ + fwrite(EOCD_MAGIC, 1, 4, fp); + _zip_write4(0, fp); + _zip_write2((unsigned short)cd->nentry, fp); + _zip_write2((unsigned short)cd->nentry, fp); + _zip_write4(cd->size, fp); + _zip_write4(cd->offset, fp); + _zip_write2(cd->comment_len, fp); + fwrite(cd->comment, 1, cd->comment_len, fp); + + if (ferror(fp)) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +void +_zip_dirent_finalize(struct zip_dirent *zde) +{ + free(zde->filename); + zde->filename = NULL; + free(zde->extrafield); + zde->extrafield = NULL; + free(zde->comment); + zde->comment = NULL; +} + + + +void +_zip_dirent_init(struct zip_dirent *de) +{ + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 0; + de->comp_method = 0; + de->last_mod = 0; + de->crc = 0; + de->comp_size = 0; + de->uncomp_size = 0; + de->filename = NULL; + de->filename_len = 0; + de->extrafield = NULL; + de->extrafield_len = 0; + de->comment = NULL; + de->comment_len = 0; + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + de->offset = 0; +} + + + +/* _zip_dirent_read(zde, fp, bufp, left, localp, error): + Fills the zip directory entry zde. + + If bufp is non-NULL, data is taken from there and bufp is advanced + by the amount of data used; no more than left bytes are used. + Otherwise data is read from fp as needed. + + If localp != 0, it reads a local header instead of a central + directory entry. + + Returns 0 if successful. On error, error is filled in and -1 is + returned. +*/ + +int +_zip_dirent_read(struct zip_dirent *zde, FILE *fp, + unsigned char **bufp, unsigned int left, int localp, + struct zip_error *error) +{ + unsigned char buf[CDENTRYSIZE]; + unsigned char *cur; + unsigned short dostime, dosdate; + unsigned int size; + + if (localp) + size = LENTRYSIZE; + else + size = CDENTRYSIZE; + + if (bufp) { + /* use data from buffer */ + cur = *bufp; + if (left < size) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + } + else { + /* read entry from disk */ + if ((fread(buf, 1, size, fp)version_madeby = _zip_read2(&cur); + else + zde->version_madeby = 0; + zde->version_needed = _zip_read2(&cur); + zde->bitflags = _zip_read2(&cur); + zde->comp_method = _zip_read2(&cur); + + /* convert to time_t */ + dostime = _zip_read2(&cur); + dosdate = _zip_read2(&cur); + zde->last_mod = _zip_d2u_time(dostime, dosdate); + + zde->crc = _zip_read4(&cur); + zde->comp_size = _zip_read4(&cur); + zde->uncomp_size = _zip_read4(&cur); + + zde->filename_len = _zip_read2(&cur); + zde->extrafield_len = _zip_read2(&cur); + + if (localp) { + zde->comment_len = 0; + zde->disk_number = 0; + zde->int_attrib = 0; + zde->ext_attrib = 0; + zde->offset = 0; + } else { + zde->comment_len = _zip_read2(&cur); + zde->disk_number = _zip_read2(&cur); + zde->int_attrib = _zip_read2(&cur); + zde->ext_attrib = _zip_read4(&cur); + zde->offset = _zip_read4(&cur); + } + + zde->filename = NULL; + zde->extrafield = NULL; + zde->comment = NULL; + + if (bufp) { + if (left < CDENTRYSIZE + (zde->filename_len+zde->extrafield_len + +zde->comment_len)) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + if (zde->filename_len) { + zde->filename = _zip_readstr(&cur, zde->filename_len, 1, error); + if (!zde->filename) + return -1; + } + + if (zde->extrafield_len) { + zde->extrafield = _zip_readstr(&cur, zde->extrafield_len, 0, + error); + if (!zde->extrafield) + return -1; + } + + if (zde->comment_len) { + zde->comment = _zip_readstr(&cur, zde->comment_len, 0, error); + if (!zde->comment) + return -1; + } + } + else { + if (zde->filename_len) { + zde->filename = _zip_readfpstr(fp, zde->filename_len, 1, error); + if (!zde->filename) + return -1; + } + + if (zde->extrafield_len) { + zde->extrafield = _zip_readfpstr(fp, zde->extrafield_len, 0, + error); + if (!zde->extrafield) + return -1; + } + + if (zde->comment_len) { + zde->comment = _zip_readfpstr(fp, zde->comment_len, 0, error); + if (!zde->comment) + return -1; + } + } + + if (bufp) + *bufp = cur; + + return 0; +} + + + +/* _zip_dirent_torrent_normalize(de); + Set values suitable for torrentzip. +*/ + +void +_zip_dirent_torrent_normalize(struct zip_dirent *de) +{ + static struct tm torrenttime; + static time_t last_mod = 0; + + if (last_mod == 0) { +#ifdef HAVE_STRUCT_TM_TM_ZONE + time_t now; + struct tm *l; +#endif + + torrenttime.tm_sec = 0; + torrenttime.tm_min = 32; + torrenttime.tm_hour = 23; + torrenttime.tm_mday = 24; + torrenttime.tm_mon = 11; + torrenttime.tm_year = 96; + torrenttime.tm_wday = 0; + torrenttime.tm_yday = 0; + torrenttime.tm_isdst = 0; + +#ifdef HAVE_STRUCT_TM_TM_ZONE + time(&now); + l = localtime(&now); + torrenttime.tm_gmtoff = l->tm_gmtoff; + torrenttime.tm_zone = l->tm_zone; +#endif + + last_mod = mktime(&torrenttime); + } + + de->version_madeby = 0; + de->version_needed = 20; /* 2.0 */ + de->bitflags = 2; /* maximum compression */ + de->comp_method = ZIP_CM_DEFLATE; + de->last_mod = last_mod; + + de->disk_number = 0; + de->int_attrib = 0; + de->ext_attrib = 0; + de->offset = 0; + + free(de->extrafield); + de->extrafield = NULL; + de->extrafield_len = 0; + free(de->comment); + de->comment = NULL; + de->comment_len = 0; +} + + + +/* _zip_dirent_write(zde, fp, localp, error): + Writes zip directory entry zde to file fp. + + If localp != 0, it writes a local header instead of a central + directory entry. + + Returns 0 if successful. On error, error is filled in and -1 is + returned. +*/ + +int +_zip_dirent_write(struct zip_dirent *zde, FILE *fp, int localp, + struct zip_error *error) +{ + unsigned short dostime, dosdate; + + fwrite(localp ? LOCAL_MAGIC : CENTRAL_MAGIC, 1, 4, fp); + + if (!localp) + _zip_write2(zde->version_madeby, fp); + _zip_write2(zde->version_needed, fp); + _zip_write2(zde->bitflags, fp); + _zip_write2(zde->comp_method, fp); + + _zip_u2d_time(zde->last_mod, &dostime, &dosdate); + _zip_write2(dostime, fp); + _zip_write2(dosdate, fp); + + _zip_write4(zde->crc, fp); + _zip_write4(zde->comp_size, fp); + _zip_write4(zde->uncomp_size, fp); + + _zip_write2(zde->filename_len, fp); + _zip_write2(zde->extrafield_len, fp); + + if (!localp) { + _zip_write2(zde->comment_len, fp); + _zip_write2(zde->disk_number, fp); + _zip_write2(zde->int_attrib, fp); + _zip_write4(zde->ext_attrib, fp); + _zip_write4(zde->offset, fp); + } + + if (zde->filename_len) + fwrite(zde->filename, 1, zde->filename_len, fp); + + if (zde->extrafield_len) + fwrite(zde->extrafield, 1, zde->extrafield_len, fp); + + if (!localp) { + if (zde->comment_len) + fwrite(zde->comment, 1, zde->comment_len, fp); + } + + if (ferror(fp)) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +static time_t +_zip_d2u_time(int dtime, int ddate) +{ + struct tm *tm; + time_t now; + + now = time(NULL); + tm = localtime(&now); + /* let mktime decide if DST is in effect */ + tm->tm_isdst = -1; + + tm->tm_year = ((ddate>>9)&127) + 1980 - 1900; + tm->tm_mon = ((ddate>>5)&15) - 1; + tm->tm_mday = ddate&31; + + tm->tm_hour = (dtime>>11)&31; + tm->tm_min = (dtime>>5)&63; + tm->tm_sec = (dtime<<1)&62; + + return mktime(tm); +} + + + +unsigned short +_zip_read2(unsigned char **a) +{ + unsigned short ret; + + ret = (*a)[0]+((*a)[1]<<8); + *a += 2; + + return ret; +} + + + +unsigned int +_zip_read4(unsigned char **a) +{ + unsigned int ret; + + ret = ((((((*a)[3]<<8)+(*a)[2])<<8)+(*a)[1])<<8)+(*a)[0]; + *a += 4; + + return ret; +} + + + +static char * +_zip_readfpstr(FILE *fp, unsigned int len, int nulp, struct zip_error *error) +{ + char *r, *o; + + r = (char *)malloc(nulp ? len+1 : len); + if (!r) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (fread(r, 1, len, fp)>8)&0xff, fp); + + return; +} + + + +static void +_zip_write4(unsigned int i, FILE *fp) +{ + putc(i&0xff, fp); + putc((i>>8)&0xff, fp); + putc((i>>16)&0xff, fp); + putc((i>>24)&0xff, fp); + + return; +} + + + +static void +_zip_u2d_time(time_t time, unsigned short *dtime, unsigned short *ddate) +{ + struct tm *tm; + + tm = localtime(&time); + *ddate = ((tm->tm_year+1900-1980)<<9) + ((tm->tm_mon+1)<<5) + + tm->tm_mday; + *dtime = ((tm->tm_hour)<<11) + ((tm->tm_min)<<5) + + ((tm->tm_sec)>>1); + + return; +} + + + +ZIP_EXTERN int +zip_delete(struct zip *za, int idx) +{ + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + /* allow duplicate file names, because the file will + * be removed directly afterwards */ + if (_zip_unchange(za, idx, 1) != 0) + return -1; + + za->entry[idx].state = ZIP_ST_DELETED; + + return 0; +} + + + +ZIP_EXTERN void +zip_error_clear(struct zip *za) +{ + _zip_error_clear(&za->error); +} + + +ZIP_EXTERN int +zip_add(struct zip *za, const char *name, struct zip_source *source) +{ + if (name == NULL || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_replace(za, -1, name, source); +} + + +ZIP_EXTERN int +zip_error_get_sys_type(int ze) +{ + if (ze < 0 || ze >= _zip_nerr_str) + return 0; + + return _zip_err_type[ze]; +} + + +ZIP_EXTERN void +zip_error_get(struct zip *za, int *zep, int *sep) +{ + _zip_error_get(&za->error, zep, sep); +} + + +const char * const _zip_err_str[] = { + "No error", + "Multi-disk zip archives not supported", + "Renaming temporary file failed", + "Closing zip archive failed", + "Seek error", + "Read error", + "Write error", + "CRC error", + "Containing zip archive was closed", + "No such file", + "File already exists", + "Can't open file", + "Failure to create temporary file", + "Zlib error", + "Malloc failure", + "Entry has been changed", + "Compression method not supported", + "Premature EOF", + "Invalid argument", + "Not a zip archive", + "Internal error", + "Zip archive inconsistent", + "Can't remove file", + "Entry has been deleted", +}; + +const int _zip_nerr_str = sizeof(_zip_err_str)/sizeof(_zip_err_str[0]); + +#define N ZIP_ET_NONE +#define S ZIP_ET_SYS +#define Z ZIP_ET_ZLIB + +const int _zip_err_type[] = { + N, + N, + S, + S, + S, + S, + S, + N, + N, + N, + N, + S, + S, + Z, + N, + N, + N, + N, + N, + N, + N, + N, + S, + N, +}; + + +struct zip_entry * +_zip_entry_new(struct zip *za) +{ + struct zip_entry *ze; + if (!za) { + ze = (struct zip_entry *)malloc(sizeof(struct zip_entry)); + if (!ze) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + } + else { + if (za->nentry >= za->nentry_alloc-1) { + za->nentry_alloc += 16; + za->entry = (struct zip_entry *)realloc(za->entry, + sizeof(struct zip_entry) + * za->nentry_alloc); + if (!za->entry) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + } + ze = za->entry+za->nentry; + } + + ze->state = ZIP_ST_UNCHANGED; + + ze->ch_filename = NULL; + ze->ch_comment = NULL; + ze->ch_comment_len = -1; + ze->source = NULL; + + if (za) + za->nentry++; + + return ze; +} + + +void +_zip_entry_free(struct zip_entry *ze) +{ + free(ze->ch_filename); + ze->ch_filename = NULL; + free(ze->ch_comment); + ze->ch_comment = NULL; + ze->ch_comment_len = -1; + + _zip_unchange_data(ze); +} + + +static int add_data(struct zip *, struct zip_source *, struct zip_dirent *, + FILE *); +static int add_data_comp(zip_source_callback, void *, struct zip_stat *, + FILE *, struct zip_error *); +static int add_data_uncomp(struct zip *, zip_source_callback, void *, + struct zip_stat *, FILE *); +static void ch_set_error(struct zip_error *, zip_source_callback, void *); +static int copy_data(FILE *, myoff_t, FILE *, struct zip_error *); +static int write_cdir(struct zip *, struct zip_cdir *, FILE *); +static int _zip_cdir_set_comment(struct zip_cdir *, struct zip *); +static int _zip_changed(struct zip *, int *); +static char *_zip_create_temp_output(struct zip *, FILE **); +static int _zip_torrentzip_cmp(const void *, const void *); + + + +struct filelist { + int idx; + const char *name; +}; + + + +ZIP_EXTERN int +zip_close(struct zip *za) +{ + int survivors; + int i, j, error; + char *temp; + FILE *out; + mode_t mask; + struct zip_cdir *cd; + struct zip_dirent de; + struct filelist *filelist; + int reopen_on_error; + int new_torrentzip; + + reopen_on_error = 0; + + if (za == NULL) + return -1; + + if (!_zip_changed(za, &survivors)) { + _zip_free(za); + return 0; + } + + /* don't create zip files with no entries */ + if (survivors == 0) { + if (za->zn && za->zp) { + if (remove(za->zn) != 0) { + _zip_error_set(&za->error, ZIP_ER_REMOVE, errno); + return -1; + } + } + _zip_free(za); + return 0; + } + + if ((filelist=(struct filelist *)malloc(sizeof(filelist[0])*survivors)) + == NULL) + return -1; + + if ((cd=_zip_cdir_new(survivors, &za->error)) == NULL) { + free(filelist); + return -1; + } + + for (i=0; ientry[i]); + + /* archive comment is special for torrentzip */ + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) { + cd->comment = _zip_memdup(TORRENT_SIG "XXXXXXXX", + TORRENT_SIG_LEN + TORRENT_CRC_LEN, + &za->error); + if (cd->comment == NULL) { + _zip_cdir_free(cd); + free(filelist); + return -1; + } + cd->comment_len = TORRENT_SIG_LEN + TORRENT_CRC_LEN; + } + else if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, ZIP_FL_UNCHANGED) == 0) { + if (_zip_cdir_set_comment(cd, za) == -1) { + _zip_cdir_free(cd); + free(filelist); + return -1; + } + } + + if ((temp=_zip_create_temp_output(za, &out)) == NULL) { + _zip_cdir_free(cd); + return -1; + } + + + /* create list of files with index into original archive */ + for (i=j=0; inentry; i++) { + if (za->entry[i].state == ZIP_ST_DELETED) + continue; + + filelist[j].idx = i; + filelist[j].name = zip_get_name(za, i, 0); + j++; + } + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + qsort(filelist, survivors, sizeof(filelist[0]), + _zip_torrentzip_cmp); + + new_torrentzip = (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 1 + && zip_get_archive_flag(za, ZIP_AFL_TORRENT, + ZIP_FL_UNCHANGED) == 0); + error = 0; + for (j=0; jentry+i) || new_torrentzip) { + _zip_dirent_init(&de); + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(&de); + + /* use it as central directory entry */ + memcpy(cd->entry+j, &de, sizeof(cd->entry[j])); + + /* set/update file name */ + if (za->entry[i].ch_filename == NULL) { + if (za->entry[i].state == ZIP_ST_ADDED) { + de.filename = strdup("-"); + de.filename_len = 1; + cd->entry[j].filename = "-"; + } + else { + de.filename = strdup(za->cdir->entry[i].filename); + de.filename_len = strlen(de.filename); + cd->entry[j].filename = za->cdir->entry[i].filename; + cd->entry[j].filename_len = de.filename_len; + } + } + } + else { + /* copy existing directory entries */ + if (fseeko(za->zp, za->cdir->entry[i].offset, SEEK_SET) != 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + error = 1; + break; + } + if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) { + error = 1; + break; + } + if (de.bitflags & ZIP_GPBF_DATA_DESCRIPTOR) { + de.crc = za->cdir->entry[i].crc; + de.comp_size = za->cdir->entry[i].comp_size; + de.uncomp_size = za->cdir->entry[i].uncomp_size; + de.bitflags &= ~ZIP_GPBF_DATA_DESCRIPTOR; + } + memcpy(cd->entry+j, za->cdir->entry+i, sizeof(cd->entry[j])); + } + + if (za->entry[i].ch_filename) { + free(de.filename); + if ((de.filename=strdup(za->entry[i].ch_filename)) == NULL) { + error = 1; + break; + } + de.filename_len = strlen(de.filename); + cd->entry[j].filename = za->entry[i].ch_filename; + cd->entry[j].filename_len = de.filename_len; + } + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0 + && za->entry[i].ch_comment_len != -1) { + /* as the rest of cd entries, its malloc/free is done by za */ + cd->entry[j].comment = za->entry[i].ch_comment; + cd->entry[j].comment_len = za->entry[i].ch_comment_len; + } + + cd->entry[j].offset = ftello(out); + + if (ZIP_ENTRY_DATA_CHANGED(za->entry+i) || new_torrentzip) { + struct zip_source *zs; + + zs = NULL; + if (!ZIP_ENTRY_DATA_CHANGED(za->entry+i)) { + if ((zs=zip_source_zip(za, za, i, ZIP_FL_RECOMPRESS, 0, -1)) + == NULL) { + error = 1; + break; + } + } + + if (add_data(za, zs ? zs : za->entry[i].source, &de, out) < 0) { + error = 1; + break; + } + cd->entry[j].last_mod = de.last_mod; + cd->entry[j].comp_method = de.comp_method; + cd->entry[j].comp_size = de.comp_size; + cd->entry[j].uncomp_size = de.uncomp_size; + cd->entry[j].crc = de.crc; + } + else { + if (_zip_dirent_write(&de, out, 1, &za->error) < 0) { + error = 1; + break; + } + /* we just read the local dirent, file is at correct position */ + if (copy_data(za->zp, cd->entry[j].comp_size, out, + &za->error) < 0) { + error = 1; + break; + } + } + + _zip_dirent_finalize(&de); + } + + if (!error) { + if (write_cdir(za, cd, out) < 0) + error = 1; + } + + /* pointers in cd entries are owned by za */ + cd->nentry = 0; + _zip_cdir_free(cd); + + if (error) { + _zip_dirent_finalize(&de); + fclose(out); + remove(temp); + free(temp); + return -1; + } + + if (fclose(out) != 0) { + _zip_error_set(&za->error, ZIP_ER_CLOSE, errno); + remove(temp); + free(temp); + return -1; + } + + if (za->zp) { + fclose(za->zp); + za->zp = NULL; + reopen_on_error = 1; + } + if (_zip_rename(temp, za->zn) != 0) { + _zip_error_set(&za->error, ZIP_ER_RENAME, errno); + remove(temp); + free(temp); + if (reopen_on_error) { + /* ignore errors, since we're already in an error case */ + za->zp = fopen(za->zn, "rb"); + } + return -1; + } + mask = umask(0); + umask(mask); + chmod(za->zn, 0666&~mask); + + _zip_free(za); + free(temp); + + return 0; +} + + + +static int +add_data(struct zip *za, struct zip_source *zs, struct zip_dirent *de, FILE *ft) +{ + myoff_t offstart, offend; + zip_source_callback cb; + void *ud; + struct zip_stat st; + + cb = zs->f; + ud = zs->ud; + + if (cb(ud, &st, sizeof(st), ZIP_SOURCE_STAT) < (ssize_t)sizeof(st)) { + ch_set_error(&za->error, cb, ud); + return -1; + } + + if (cb(ud, NULL, 0, ZIP_SOURCE_OPEN) < 0) { + ch_set_error(&za->error, cb, ud); + return -1; + } + + offstart = ftello(ft); + + if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + return -1; + + if (st.comp_method != ZIP_CM_STORE) { + if (add_data_comp(cb, ud, &st, ft, &za->error) < 0) + return -1; + } + else { + if (add_data_uncomp(za, cb, ud, &st, ft) < 0) + return -1; + } + + if (cb(ud, NULL, 0, ZIP_SOURCE_CLOSE) < 0) { + ch_set_error(&za->error, cb, ud); + return -1; + } + + offend = ftello(ft); + + if (fseeko(ft, offstart, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + + de->last_mod = st.mtime; + de->comp_method = st.comp_method; + de->crc = st.crc; + de->uncomp_size = st.size; + de->comp_size = st.comp_size; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + _zip_dirent_torrent_normalize(de); + + if (_zip_dirent_write(de, ft, 1, &za->error) < 0) + return -1; + + if (fseeko(ft, offend, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + return 0; +} + + + +static int +add_data_comp(zip_source_callback cb, void *ud, struct zip_stat *st,FILE *ft, + struct zip_error *error) +{ + char buf[BUFSIZE]; + ssize_t n; + + st->comp_size = 0; + while ((n=cb(ud, buf, sizeof(buf), ZIP_SOURCE_READ)) > 0) { + if (fwrite(buf, 1, n, ft) != (size_t)n) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + st->comp_size += n; + } + if (n < 0) { + ch_set_error(error, cb, ud); + return -1; + } + + return 0; +} + + + +static int +add_data_uncomp(struct zip *za, zip_source_callback cb, void *ud, + struct zip_stat *st, FILE *ft) +{ + char b1[BUFSIZE], b2[BUFSIZE]; + int end, flush, ret; + ssize_t n; + size_t n2; + z_stream zstr; + int mem_level; + + st->comp_method = ZIP_CM_DEFLATE; + st->comp_size = st->size = 0; + st->crc = crc32(0, NULL, 0); + + zstr.zalloc = Z_NULL; + zstr.zfree = Z_NULL; + zstr.opaque = NULL; + zstr.avail_in = 0; + zstr.avail_out = 0; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0)) + mem_level = TORRENT_MEM_LEVEL; + else + mem_level = MAX_MEM_LEVEL; + + /* -MAX_WBITS: undocumented feature of zlib to _not_ write a zlib header */ + deflateInit2(&zstr, Z_BEST_COMPRESSION, Z_DEFLATED, -MAX_WBITS, mem_level, + Z_DEFAULT_STRATEGY); + + zstr.next_out = (Bytef *)b2; + zstr.avail_out = sizeof(b2); + zstr.avail_in = 0; + + flush = 0; + end = 0; + while (!end) { + if (zstr.avail_in == 0 && !flush) { + if ((n=cb(ud, b1, sizeof(b1), ZIP_SOURCE_READ)) < 0) { + ch_set_error(&za->error, cb, ud); + deflateEnd(&zstr); + return -1; + } + if (n > 0) { + zstr.avail_in = n; + zstr.next_in = (Bytef *)b1; + st->size += n; + st->crc = crc32(st->crc, (Bytef *)b1, n); + } + else + flush = Z_FINISH; + } + + ret = deflate(&zstr, flush); + if (ret != Z_OK && ret != Z_STREAM_END) { + _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); + return -1; + } + + if (zstr.avail_out != sizeof(b2)) { + n2 = sizeof(b2) - zstr.avail_out; + + if (fwrite(b2, 1, n2, ft) != n2) { + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); + return -1; + } + + zstr.next_out = (Bytef *)b2; + zstr.avail_out = sizeof(b2); + st->comp_size += n2; + } + + if (ret == Z_STREAM_END) { + deflateEnd(&zstr); + end = 1; + } + } + + return 0; +} + + + +static void +ch_set_error(struct zip_error *error, zip_source_callback cb, void *ud) +{ + int e[2]; + + if ((cb(ud, e, sizeof(e), ZIP_SOURCE_ERROR)) < (ssize_t)sizeof(e)) { + error->zip_err = ZIP_ER_INTERNAL; + error->sys_err = 0; + } + else { + error->zip_err = e[0]; + error->sys_err = e[1]; + } +} + + + +static int +copy_data(FILE *fs, myoff_t len, FILE *ft, struct zip_error *error) +{ + char buf[BUFSIZE]; + int n, nn; + + if (len == 0) + return 0; + + while (len > 0) { + nn = len > sizeof(buf) ? sizeof(buf) : len; + if ((n=fread(buf, 1, nn, fs)) < 0) { + _zip_error_set(error, ZIP_ER_READ, errno); + return -1; + } + else if (n == 0) { + _zip_error_set(error, ZIP_ER_EOF, 0); + return -1; + } + + if (fwrite(buf, 1, n, ft) != (size_t)n) { + _zip_error_set(error, ZIP_ER_WRITE, errno); + return -1; + } + + len -= n; + } + + return 0; +} + + + +static int +write_cdir(struct zip *za, struct zip_cdir *cd, FILE *out) +{ + myoff_t offset; + uLong crc; + char buf[TORRENT_CRC_LEN+1]; + + if (_zip_cdir_write(cd, out, &za->error) < 0) + return -1; + + if (zip_get_archive_flag(za, ZIP_AFL_TORRENT, 0) == 0) + return 0; + + + /* fix up torrentzip comment */ + + offset = ftello(out); + + if (_zip_filerange_crc(out, cd->offset, cd->size, &crc, &za->error) < 0) + return -1; + + snprintf(buf, sizeof(buf), "%08lX", (long)crc); + + if (fseeko(out, offset-TORRENT_CRC_LEN, SEEK_SET) < 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return -1; + } + + if (fwrite(buf, TORRENT_CRC_LEN, 1, out) != 1) { + _zip_error_set(&za->error, ZIP_ER_WRITE, errno); + return -1; + } + + return 0; +} + + + +static int +_zip_cdir_set_comment(struct zip_cdir *dest, struct zip *src) +{ + if (src->ch_comment_len != -1) { + dest->comment = _zip_memdup(src->ch_comment, + src->ch_comment_len, &src->error); + if (dest->comment == NULL) + return -1; + dest->comment_len = src->ch_comment_len; + } else { + if (src->cdir && src->cdir->comment) { + dest->comment = _zip_memdup(src->cdir->comment, + src->cdir->comment_len, &src->error); + if (dest->comment == NULL) + return -1; + dest->comment_len = src->cdir->comment_len; + } + } + + return 0; +} + + + +static int +_zip_changed(struct zip *za, int *survivorsp) +{ + int changed, i, survivors; + + changed = survivors = 0; + + if (za->ch_comment_len != -1 + || za->ch_flags != za->flags) + changed = 1; + + for (i=0; inentry; i++) { + if ((za->entry[i].state != ZIP_ST_UNCHANGED) + || (za->entry[i].ch_comment_len != -1)) + changed = 1; + if (za->entry[i].state != ZIP_ST_DELETED) + survivors++; + } + + *survivorsp = survivors; + + return changed; +} + + + +static char * +_zip_create_temp_output(struct zip *za, FILE **outp) +{ + char *temp; + int tfd; + FILE *tfp; + + if ((temp=(char *)malloc(strlen(za->zn)+8)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + sprintf(temp, "%s.XXXXXX", za->zn); + + if ((tfd=mkstemp(temp)) == -1) { + _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); + free(temp); + return NULL; + } + + if ((tfp=fdopen(tfd, "r+b")) == NULL) { + _zip_error_set(&za->error, ZIP_ER_TMPOPEN, errno); + close(tfd); + remove(temp); + free(temp); + return NULL; + } + + *outp = tfp; + return temp; +} + + + +static int +_zip_torrentzip_cmp(const void *a, const void *b) +{ + return strcasecmp(((const struct filelist *)a)->name, + ((const struct filelist *)b)->name); +} + + + +ZIP_EXTERN int +zip_add_dir(struct zip *za, const char *name) +{ + int len, ret; + char *s; + struct zip_source *source; + + if (name == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + s = NULL; + len = strlen(name); + + if (name[len-1] != '/') { + if ((s=(char *)malloc(len+2)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + strcpy(s, name); + s[len] = '/'; + s[len+1] = '\0'; + } + + if ((source=zip_source_buffer(za, NULL, 0, 0)) == NULL) { + free(s); + return -1; + } + + ret = _zip_replace(za, -1, s ? s : name, source); + + free(s); + if (ret < 0) + zip_source_free(source); + + return ret; +} + + +ZIP_EXTERN int +zip_error_to_str(char *buf, size_t len, int ze, int se) +{ + const char *zs, *ss; + + if (ze < 0 || ze >= _zip_nerr_str) + return snprintf(buf, len, "Unknown error %d", ze); + + zs = _zip_err_str[ze]; + + switch (_zip_err_type[ze]) { + case ZIP_ET_SYS: + ss = strerror(se); + break; + + case ZIP_ET_ZLIB: + ss = zError(se); + break; + + default: + ss = NULL; + } + + return snprintf(buf, len, "%s%s%s", + zs, (ss ? ": " : ""), (ss ? ss : "")); +} + + +ZIP_EXTERN void +zip_file_error_clear(struct zip_file *zf) +{ + _zip_error_clear(&zf->error); +} + + +ZIP_EXTERN int +zip_fclose(struct zip_file *zf) +{ + int i, ret; + + if (zf->zstr) + inflateEnd(zf->zstr); + free(zf->buffer); + free(zf->zstr); + + for (i=0; iza->nfile; i++) { + if (zf->za->file[i] == zf) { + zf->za->file[i] = zf->za->file[zf->za->nfile-1]; + zf->za->nfile--; + break; + } + } + + ret = 0; + if (zf->error.zip_err) + ret = zf->error.zip_err; + else if ((zf->flags & ZIP_ZF_CRC) && (zf->flags & ZIP_ZF_EOF)) { + /* if EOF, compare CRC */ + if (zf->crc_orig != zf->crc) + ret = ZIP_ER_CRC; + } + + free(zf); + return ret; +} + + +int +_zip_filerange_crc(FILE *fp, myoff_t start, myoff_t len, uLong *crcp, + struct zip_error *errp) +{ + Bytef buf[BUFSIZE]; + size_t n; + + *crcp = crc32(0L, Z_NULL, 0); + + if (fseeko(fp, start, SEEK_SET) != 0) { + _zip_error_set(errp, ZIP_ER_SEEK, errno); + return -1; + } + + while (len > 0) { + n = len > BUFSIZE ? BUFSIZE : len; + if ((n=fread(buf, 1, n, fp)) <= 0) { + _zip_error_set(errp, ZIP_ER_READ, errno); + return -1; + } + + *crcp = crc32(*crcp, buf, n); + + len-= n; + } + + return 0; +} + + +ZIP_EXTERN const char * +zip_file_strerror(struct zip_file *zf) +{ + return _zip_error_strerror(&zf->error); +} + + +/* _zip_file_get_offset(za, ze): + Returns the offset of the file data for entry ze. + + On error, fills in za->error and returns 0. +*/ + +unsigned int +_zip_file_get_offset(struct zip *za, int idx) +{ + struct zip_dirent de; + unsigned int offset; + + offset = za->cdir->entry[idx].offset; + + if (fseeko(za->zp, offset, SEEK_SET) != 0) { + _zip_error_set(&za->error, ZIP_ER_SEEK, errno); + return 0; + } + + if (_zip_dirent_read(&de, za->zp, NULL, 0, 1, &za->error) != 0) + return 0; + + offset += LENTRYSIZE + de.filename_len + de.extrafield_len; + + _zip_dirent_finalize(&de); + + return offset; +} + + +ZIP_EXTERN void +zip_file_error_get(struct zip_file *zf, int *zep, int *sep) +{ + _zip_error_get(&zf->error, zep, sep); +} + + +static struct zip_file *_zip_file_new(struct zip *za); + + + +ZIP_EXTERN struct zip_file * +zip_fopen_index(struct zip *za, int fileno, int flags) +{ + int len, ret; + int zfflags; + struct zip_file *zf; + + if ((fileno < 0) || (fileno >= za->nentry)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && ZIP_ENTRY_DATA_CHANGED(za->entry+fileno)) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (fileno >= za->cdir->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + zfflags = 0; + switch (za->cdir->entry[fileno].comp_method) { + case ZIP_CM_STORE: + zfflags |= ZIP_ZF_CRC; + break; + + case ZIP_CM_DEFLATE: + if ((flags & ZIP_FL_COMPRESSED) == 0) + zfflags |= ZIP_ZF_CRC | ZIP_ZF_DECOMP; + break; + default: + if ((flags & ZIP_FL_COMPRESSED) == 0) { + _zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0); + return NULL; + } + break; + } + + zf = _zip_file_new(za); + + zf->flags = zfflags; + /* zf->name = za->cdir->entry[fileno].filename; */ + zf->method = za->cdir->entry[fileno].comp_method; + zf->bytes_left = za->cdir->entry[fileno].uncomp_size; + zf->cbytes_left = za->cdir->entry[fileno].comp_size; + zf->crc_orig = za->cdir->entry[fileno].crc; + + if ((zf->fpos=_zip_file_get_offset(za, fileno)) == 0) { + zip_fclose(zf); + return NULL; + } + + if ((zf->flags & ZIP_ZF_DECOMP) == 0) + zf->bytes_left = zf->cbytes_left; + else { + if ((zf->buffer=(char *)malloc(BUFSIZE)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_fclose(zf); + return NULL; + } + + len = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf); + if (len <= 0) { + _zip_error_copy(&za->error, &zf->error); + zip_fclose(zf); + return NULL; + } + + if ((zf->zstr = (z_stream *)malloc(sizeof(z_stream))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + zip_fclose(zf); + return NULL; + } + zf->zstr->zalloc = Z_NULL; + zf->zstr->zfree = Z_NULL; + zf->zstr->opaque = NULL; + zf->zstr->next_in = (Bytef *)zf->buffer; + zf->zstr->avail_in = len; + + /* negative value to tell zlib that there is no header */ + if ((ret=inflateInit2(zf->zstr, -MAX_WBITS)) != Z_OK) { + _zip_error_set(&za->error, ZIP_ER_ZLIB, ret); + zip_fclose(zf); + return NULL; + } + } + + return zf; +} + + + +int +_zip_file_fillbuf(void *buf, size_t buflen, struct zip_file *zf) +{ + int i, j; + + if (zf->error.zip_err != ZIP_ER_OK) + return -1; + + if ((zf->flags & ZIP_ZF_EOF) || zf->cbytes_left <= 0 || buflen <= 0) + return 0; + + if (fseeko(zf->za->zp, zf->fpos, SEEK_SET) < 0) { + _zip_error_set(&zf->error, ZIP_ER_SEEK, errno); + return -1; + } + if (buflen < zf->cbytes_left) + i = buflen; + else + i = zf->cbytes_left; + + j = fread(buf, 1, i, zf->za->zp); + if (j == 0) { + _zip_error_set(&zf->error, ZIP_ER_EOF, 0); + j = -1; + } + else if (j < 0) + _zip_error_set(&zf->error, ZIP_ER_READ, errno); + else { + zf->fpos += j; + zf->cbytes_left -= j; + } + + return j; +} + + + +static struct zip_file * +_zip_file_new(struct zip *za) +{ + struct zip_file *zf, **file; + int n; + + if ((zf=(struct zip_file *)malloc(sizeof(struct zip_file))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + if (za->nfile >= za->nfile_alloc-1) { + n = za->nfile_alloc + 10; + file = (struct zip_file **)realloc(za->file, + n*sizeof(struct zip_file *)); + if (file == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + free(zf); + return NULL; + } + za->nfile_alloc = n; + za->file = file; + } + + za->file[za->nfile++] = zf; + + zf->za = za; + _zip_error_init(&zf->error); + zf->flags = 0; + zf->crc = crc32(0L, Z_NULL, 0); + zf->crc_orig = 0; + zf->method = -1; + zf->bytes_left = zf->cbytes_left = 0; + zf->fpos = 0; + zf->buffer = NULL; + zf->zstr = NULL; + + return zf; +} + + +ZIP_EXTERN struct zip_file * +zip_fopen(struct zip *za, const char *fname, int flags) +{ + int idx; + + if ((idx=zip_name_locate(za, fname, flags)) < 0) + return NULL; + + return zip_fopen_index(za, idx, flags); +} + + +ZIP_EXTERN int +zip_set_file_comment(struct zip *za, int idx, const char *comment, int len) +{ + char *tmpcom; + + if (idx < 0 || idx >= za->nentry + || len < 0 || len > MAXCOMLEN + || (len > 0 && comment == NULL)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) + return -1; + } + else + tmpcom = NULL; + + free(za->entry[idx].ch_comment); + za->entry[idx].ch_comment = tmpcom; + za->entry[idx].ch_comment_len = len; + + return 0; +} + + +ZIP_EXTERN struct zip_source * +zip_source_file(struct zip *za, const char *fname, myoff_t start, myoff_t len) +{ + if (za == NULL) + return NULL; + + if (fname == NULL || start < 0 || len < -1) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + return _zip_source_file_or_p(za, fname, NULL, start, len); +} + + +struct read_data { + const char *buf, *data, *end; + time_t mtime; + int freep; +}; + +static ssize_t read_data(void *state, void *data, size_t len, + enum zip_source_cmd cmd); + + + +ZIP_EXTERN struct zip_source * +zip_source_buffer(struct zip *za, const void *data, myoff_t len, int freep) +{ + struct read_data *f; + struct zip_source *zs; + + if (za == NULL) + return NULL; + + if (len < 0 || (data == NULL && len > 0)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((f=(struct read_data *)malloc(sizeof(*f))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + f->data = (const char *)data; + f->end = ((const char *)data)+len; + f->freep = freep; + f->mtime = time(NULL); + + if ((zs=zip_source_function(za, read_data, f)) == NULL) { + free(f); + return NULL; + } + + return zs; +} + + + +static ssize_t +read_data(void *state, void *data, size_t len, enum zip_source_cmd cmd) +{ + struct read_data *z; + char *buf; + size_t n; + + z = (struct read_data *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + z->buf = z->data; + return 0; + + case ZIP_SOURCE_READ: + n = z->end - z->buf; + if (n > len) + n = len; + + if (n) { + memcpy(buf, z->buf, n); + z->buf += n; + } + + return n; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: + { + struct zip_stat *st; + + if (len < sizeof(*st)) + return -1; + + st = (struct zip_stat *)data; + + zip_stat_init(st); + st->mtime = z->mtime; + st->size = z->end - z->data; + + return sizeof(*st); + } + + case ZIP_SOURCE_ERROR: + { + int *e; + + if (len < sizeof(int)*2) + return -1; + + e = (int *)data; + e[0] = e[1] = 0; + } + return sizeof(int)*2; + + case ZIP_SOURCE_FREE: + if (z->freep) { + free((void *)z->data); + z->data = NULL; + } + free(z); + return 0; + + default: + ; + } + + return -1; +} + + +int +_zip_set_name(struct zip *za, int idx, const char *name) +{ + char *s; + int i; + + if (idx < 0 || idx >= za->nentry || name == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) { + _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; + } + + /* no effective name change */ + if (i == idx) + return 0; + + if ((s=strdup(name)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return -1; + } + + if (za->entry[idx].state == ZIP_ST_UNCHANGED) + za->entry[idx].state = ZIP_ST_RENAMED; + + free(za->entry[idx].ch_filename); + za->entry[idx].ch_filename = s; + + return 0; +} + + +ZIP_EXTERN int +zip_set_archive_flag(struct zip *za, int flag, int value) +{ + if (value) + za->ch_flags |= flag; + else + za->ch_flags &= ~flag; + + return 0; +} + + +void +_zip_unchange_data(struct zip_entry *ze) +{ + if (ze->source) { + (void)ze->source->f(ze->source->ud, NULL, 0, ZIP_SOURCE_FREE); + free(ze->source); + ze->source = NULL; + } + + ze->state = ze->ch_filename ? ZIP_ST_RENAMED : ZIP_ST_UNCHANGED; +} + + +ZIP_EXTERN int +zip_unchange_archive(struct zip *za) +{ + free(za->ch_comment); + za->ch_comment = NULL; + za->ch_comment_len = -1; + + za->ch_flags = za->flags; + + return 0; +} + +ZIP_EXTERN int +zip_unchange(struct zip *za, int idx) +{ + return _zip_unchange(za, idx, 0); +} + + + +int +_zip_unchange(struct zip *za, int idx, int allow_duplicates) +{ + int i; + + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (za->entry[idx].ch_filename) { + if (!allow_duplicates) { + i = _zip_name_locate(za, + _zip_get_name(za, idx, ZIP_FL_UNCHANGED, NULL), + 0, NULL); + if (i != -1 && i != idx) { + _zip_error_set(&za->error, ZIP_ER_EXISTS, 0); + return -1; + } + } + + free(za->entry[idx].ch_filename); + za->entry[idx].ch_filename = NULL; + } + + free(za->entry[idx].ch_comment); + za->entry[idx].ch_comment = NULL; + za->entry[idx].ch_comment_len = -1; + + _zip_unchange_data(za->entry+idx); + + return 0; +} + +ZIP_EXTERN int +zip_unchange_all(struct zip *za) +{ + int ret, i; + + ret = 0; + for (i=0; inentry; i++) + ret |= _zip_unchange(za, i, 1); + + ret |= zip_unchange_archive(za); + + return ret; +} + + +ZIP_EXTERN int +zip_set_archive_comment(struct zip *za, const char *comment, int len) +{ + char *tmpcom; + + if (len < 0 || len > MAXCOMLEN + || (len > 0 && comment == NULL)) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (len > 0) { + if ((tmpcom=(char *)_zip_memdup(comment, len, &za->error)) == NULL) + return -1; + } + else + tmpcom = NULL; + + free(za->ch_comment); + za->ch_comment = tmpcom; + za->ch_comment_len = len; + + return 0; +} + + +ZIP_EXTERN int +zip_replace(struct zip *za, int idx, struct zip_source *source) +{ + if (idx < 0 || idx >= za->nentry || source == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if (_zip_replace(za, idx, NULL, source) == -1) + return -1; + + return 0; +} + + + + +int +_zip_replace(struct zip *za, int idx, const char *name, + struct zip_source *source) +{ + if (idx == -1) { + if (_zip_entry_new(za) == NULL) + return -1; + + idx = za->nentry - 1; + } + + _zip_unchange_data(za->entry+idx); + + if (name && _zip_set_name(za, idx, name) != 0) + return -1; + + za->entry[idx].state = ((za->cdir == NULL || idx >= za->cdir->nentry) + ? ZIP_ST_ADDED : ZIP_ST_REPLACED); + za->entry[idx].source = source; + + return idx; +} + + +ZIP_EXTERN int +zip_rename(struct zip *za, int idx, const char *name) +{ + const char *old_name; + int old_is_dir, new_is_dir; + + if (idx >= za->nentry || idx < 0 || name[0] == '\0') { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((old_name=zip_get_name(za, idx, 0)) == NULL) + return -1; + + new_is_dir = (name[strlen(name)-1] == '/'); + old_is_dir = (old_name[strlen(old_name)-1] == '/'); + + if (new_is_dir != old_is_dir) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + return _zip_set_name(za, idx, name); +} + +#include +#include +#include +#include +#include +#include + +static void set_error(int *, struct zip_error *, int); +static struct zip *_zip_allocate_new(const char *, int *); +static int _zip_checkcons(FILE *, struct zip_cdir *, struct zip_error *); +static void _zip_check_torrentzip(struct zip *); +static struct zip_cdir *_zip_find_central_dir(FILE *, int, int *, myoff_t); +static int _zip_file_exists(const char *, int, int *); +static int _zip_headercomp(struct zip_dirent *, int, + struct zip_dirent *, int); +static unsigned char *_zip_memmem(const unsigned char *, int, + const unsigned char *, int); +static struct zip_cdir *_zip_readcdir(FILE *, unsigned char *, unsigned char *, + int, int, struct zip_error *); + + + +ZIP_EXTERN struct zip * +zip_open(const char *fn, int flags, int *zep) +{ + FILE *fp; + struct zip *za; + struct zip_cdir *cdir; + int i; + myoff_t len; + + switch (_zip_file_exists(fn, flags, zep)) { + case -1: + return NULL; + case 0: + return _zip_allocate_new(fn, zep); + default: + break; + } + + if ((fp=fopen(fn, "rb")) == NULL) { + set_error(zep, NULL, ZIP_ER_OPEN); + return NULL; + } + + fseeko(fp, 0, SEEK_END); + len = ftello(fp); + + /* treat empty files as empty archives */ + if (len == 0) { + if ((za=_zip_allocate_new(fn, zep)) == NULL) + fclose(fp); + else + za->zp = fp; + return za; + } + + cdir = _zip_find_central_dir(fp, flags, zep, len); + if (cdir == NULL) { + fclose(fp); + return NULL; + } + + if ((za=_zip_allocate_new(fn, zep)) == NULL) { + _zip_cdir_free(cdir); + fclose(fp); + return NULL; + } + + za->cdir = cdir; + za->zp = fp; + + if ((za->entry=(struct zip_entry *)malloc(sizeof(*(za->entry)) + * cdir->nentry)) == NULL) { + set_error(zep, NULL, ZIP_ER_MEMORY); + _zip_free(za); + return NULL; + } + for (i=0; inentry; i++) + _zip_entry_new(za); + + _zip_check_torrentzip(za); + za->ch_flags = za->flags; + + return za; +} + + + +static void +set_error(int *zep, struct zip_error *err, int ze) +{ + int se; + + if (err) { + _zip_error_get(err, &ze, &se); + if (zip_error_get_sys_type(ze) == ZIP_ET_SYS) + errno = se; + } + + if (zep) + *zep = ze; +} + + + +/* _zip_readcdir: + tries to find a valid end-of-central-directory at the beginning of + buf, and then the corresponding central directory entries. + Returns a struct zip_cdir which contains the central directory + entries, or NULL if unsuccessful. */ + +static struct zip_cdir * +_zip_readcdir(FILE *fp, unsigned char *buf, unsigned char *eocd, int buflen, + int flags, struct zip_error *error) +{ + struct zip_cdir *cd; + unsigned char *cdp, **bufp; + int i, comlen, nentry; + + comlen = buf + buflen - eocd - EOCDLEN; + if (comlen < 0) { + /* not enough bytes left for comment */ + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + /* check for end-of-central-dir magic */ + if (memcmp(eocd, EOCD_MAGIC, 4) != 0) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return NULL; + } + + if (memcmp(eocd+4, "\0\0\0\0", 4) != 0) { + _zip_error_set(error, ZIP_ER_MULTIDISK, 0); + return NULL; + } + + cdp = eocd + 8; + /* number of cdir-entries on this disk */ + i = _zip_read2(&cdp); + /* number of cdir-entries */ + nentry = _zip_read2(&cdp); + + if ((cd=_zip_cdir_new(nentry, error)) == NULL) + return NULL; + + cd->size = _zip_read4(&cdp); + cd->offset = _zip_read4(&cdp); + cd->comment = NULL; + cd->comment_len = _zip_read2(&cdp); + + if ((comlen < cd->comment_len) || (cd->nentry != i)) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + free(cd); + return NULL; + } + if ((flags & ZIP_CHECKCONS) && comlen != cd->comment_len) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + free(cd); + return NULL; + } + + if (cd->comment_len) { + if ((cd->comment=(char *)_zip_memdup(eocd+EOCDLEN, + cd->comment_len, error)) + == NULL) { + free(cd); + return NULL; + } + } + + cdp = eocd; + if (cd->size < (unsigned int)(eocd-buf)) { + /* if buffer already read in, use it */ + cdp = eocd - cd->size; + bufp = &cdp; + } + else { + /* go to start of cdir and read it entry by entry */ + bufp = NULL; + clearerr(fp); + fseeko(fp, cd->offset, SEEK_SET); + /* possible consistency check: cd->offset = + len-(cd->size+cd->comment_len+EOCDLEN) ? */ + if (ferror(fp) || ((unsigned long)ftello(fp) != cd->offset)) { + /* seek error or offset of cdir wrong */ + if (ferror(fp)) + _zip_error_set(error, ZIP_ER_SEEK, errno); + else + _zip_error_set(error, ZIP_ER_NOZIP, 0); + free(cd); + return NULL; + } + } + + for (i=0; inentry; i++) { + if ((_zip_dirent_read(cd->entry+i, fp, bufp, eocd-cdp, 0, + error)) < 0) { + cd->nentry = i; + _zip_cdir_free(cd); + return NULL; + } + } + + return cd; +} + + + +/* _zip_checkcons: + Checks the consistency of the central directory by comparing central + directory entries with local headers and checking for plausible + file and header offsets. Returns -1 if not plausible, else the + difference between the lowest and the highest fileposition reached */ + +static int +_zip_checkcons(FILE *fp, struct zip_cdir *cd, struct zip_error *error) +{ + int i; + unsigned int min, max, j; + struct zip_dirent temp; + + if (cd->nentry) { + max = cd->entry[0].offset; + min = cd->entry[0].offset; + } + else + min = max = 0; + + for (i=0; inentry; i++) { + if (cd->entry[i].offset < min) + min = cd->entry[i].offset; + if (min > cd->offset) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + j = cd->entry[i].offset + cd->entry[i].comp_size + + cd->entry[i].filename_len + LENTRYSIZE; + if (j > max) + max = j; + if (max > cd->offset) { + _zip_error_set(error, ZIP_ER_NOZIP, 0); + return -1; + } + + if (fseeko(fp, cd->entry[i].offset, SEEK_SET) != 0) { + _zip_error_set(error, ZIP_ER_SEEK, 0); + return -1; + } + + if (_zip_dirent_read(&temp, fp, NULL, 0, 1, error) == -1) + return -1; + + if (_zip_headercomp(cd->entry+i, 0, &temp, 1) != 0) { + _zip_error_set(error, ZIP_ER_INCONS, 0); + _zip_dirent_finalize(&temp); + return -1; + } + _zip_dirent_finalize(&temp); + } + + return max - min; +} + + + +/* _zip_check_torrentzip: + check wether ZA has a valid TORRENTZIP comment, i.e. is torrentzipped */ + +static void +_zip_check_torrentzip(struct zip *za) +{ + uLong crc_got, crc_should; + char buf[8+1]; + char *end; + + if (za->zp == NULL || za->cdir == NULL) + return; + + if (za->cdir->comment_len != TORRENT_SIG_LEN+8 + || strncmp(za->cdir->comment, TORRENT_SIG, TORRENT_SIG_LEN) != 0) + return; + + memcpy(buf, za->cdir->comment+TORRENT_SIG_LEN, 8); + buf[8] = '\0'; + errno = 0; + crc_should = strtoul(buf, &end, 16); + if ((crc_should == UINT_MAX && errno != 0) || (end && *end)) + return; + + if (_zip_filerange_crc(za->zp, za->cdir->offset, za->cdir->size, + &crc_got, NULL) < 0) + return; + + if (crc_got == crc_should) + za->flags |= ZIP_AFL_TORRENT; +} + + + + +/* _zip_headercomp: + compares two headers h1 and h2; if they are local headers, set + local1p or local2p respectively to 1, else 0. Return 0 if they + are identical, -1 if not. */ + +static int +_zip_headercomp(struct zip_dirent *h1, int local1p, struct zip_dirent *h2, + int local2p) +{ + if ((h1->version_needed != h2->version_needed) +#if 0 + /* some zip-files have different values in local + and global headers for the bitflags */ + || (h1->bitflags != h2->bitflags) +#endif + || (h1->comp_method != h2->comp_method) + || (h1->last_mod != h2->last_mod) + || (h1->filename_len != h2->filename_len) + || !h1->filename || !h2->filename + || strcmp(h1->filename, h2->filename)) + return -1; + + /* check that CRC and sizes are zero if data descriptor is used */ + if ((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local1p + && (h1->crc != 0 + || h1->comp_size != 0 + || h1->uncomp_size != 0)) + return -1; + if ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) && local2p + && (h2->crc != 0 + || h2->comp_size != 0 + || h2->uncomp_size != 0)) + return -1; + + /* check that CRC and sizes are equal if no data descriptor is used */ + if (((h1->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local1p == 0) + && ((h2->bitflags & ZIP_GPBF_DATA_DESCRIPTOR) == 0 || local2p == 0)) { + if ((h1->crc != h2->crc) + || (h1->comp_size != h2->comp_size) + || (h1->uncomp_size != h2->uncomp_size)) + return -1; + } + + if ((local1p == local2p) + && ((h1->extrafield_len != h2->extrafield_len) + || (h1->extrafield_len && h2->extrafield + && memcmp(h1->extrafield, h2->extrafield, + h1->extrafield_len)))) + return -1; + + /* if either is local, nothing more to check */ + if (local1p || local2p) + return 0; + + if ((h1->version_madeby != h2->version_madeby) + || (h1->disk_number != h2->disk_number) + || (h1->int_attrib != h2->int_attrib) + || (h1->ext_attrib != h2->ext_attrib) + || (h1->offset != h2->offset) + || (h1->comment_len != h2->comment_len) + || (h1->comment_len && h2->comment + && memcmp(h1->comment, h2->comment, h1->comment_len))) + return -1; + + return 0; +} + + + +static struct zip * +_zip_allocate_new(const char *fn, int *zep) +{ + struct zip *za; + struct zip_error error; + + if ((za=_zip_new(&error)) == NULL) { + set_error(zep, &error, 0); + return NULL; + } + + za->zn = strdup(fn); + if (!za->zn) { + _zip_free(za); + set_error(zep, NULL, ZIP_ER_MEMORY); + return NULL; + } + return za; +} + + + +static int +_zip_file_exists(const char *fn, int flags, int *zep) +{ + struct stat st; + + if (fn == NULL) { + set_error(zep, NULL, ZIP_ER_INVAL); + return -1; + } + + if (stat(fn, &st) != 0) { + if (flags & ZIP_CREATE) + return 0; + else { + set_error(zep, NULL, ZIP_ER_OPEN); + return -1; + } + } + else if ((flags & ZIP_EXCL)) { + set_error(zep, NULL, ZIP_ER_EXISTS); + return -1; + } + /* ZIP_CREATE gets ignored if file exists and not ZIP_EXCL, + just like open() */ + + return 1; +} + + + +static struct zip_cdir * +_zip_find_central_dir(FILE *fp, int flags, int *zep, myoff_t len) +{ + struct zip_cdir *cdir, *cdirnew; + unsigned char *buf, *match; + int a, best, buflen, i; + struct zip_error zerr; + + i = fseeko(fp, -(len < CDBUFSIZE ? len : CDBUFSIZE), SEEK_END); + if (i == -1 && errno != EFBIG) { + /* seek before start of file on my machine */ + set_error(zep, NULL, ZIP_ER_SEEK); + return NULL; + } + + /* 64k is too much for stack */ + if ((buf=(unsigned char *)malloc(CDBUFSIZE)) == NULL) { + set_error(zep, NULL, ZIP_ER_MEMORY); + return NULL; + } + + clearerr(fp); + buflen = fread(buf, 1, CDBUFSIZE, fp); + + if (ferror(fp)) { + set_error(zep, NULL, ZIP_ER_READ); + free(buf); + return NULL; + } + + best = -1; + cdir = NULL; + match = buf; + _zip_error_set(&zerr, ZIP_ER_NOZIP, 0); + + while ((match=_zip_memmem(match, buflen-(match-buf)-18, + (const unsigned char *)EOCD_MAGIC, 4))!=NULL) { + /* found match -- check, if good */ + /* to avoid finding the same match all over again */ + match++; + if ((cdirnew=_zip_readcdir(fp, buf, match-1, buflen, flags, + &zerr)) == NULL) + continue; + + if (cdir) { + if (best <= 0) + best = _zip_checkcons(fp, cdir, &zerr); + a = _zip_checkcons(fp, cdirnew, &zerr); + if (best < a) { + _zip_cdir_free(cdir); + cdir = cdirnew; + best = a; + } + else + _zip_cdir_free(cdirnew); + } + else { + cdir = cdirnew; + if (flags & ZIP_CHECKCONS) + best = _zip_checkcons(fp, cdir, &zerr); + else + best = 0; + } + cdirnew = NULL; + } + + free(buf); + + if (best < 0) { + set_error(zep, &zerr, 0); + _zip_cdir_free(cdir); + return NULL; + } + + return cdir; +} + + + +static unsigned char * +_zip_memmem(const unsigned char *big, int biglen, const unsigned char *little, + int littlelen) +{ + const unsigned char *p; + + if ((biglen < littlelen) || (littlelen == 0)) + return NULL; + p = big-1; + while ((p=(const unsigned char *) + memchr(p+1, little[0], (size_t)(big-(p+1)+biglen-littlelen+1))) + != NULL) { + if (memcmp(p+1, little+1, littlelen-1)==0) + return (unsigned char *)p; + } + + return NULL; +} + + +/* _zip_new: + creates a new zipfile struct, and sets the contents to zero; returns + the new struct. */ + +struct zip * +_zip_new(struct zip_error *error) +{ + struct zip *za; + + za = (struct zip *)malloc(sizeof(struct zip)); + if (!za) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + za->zn = NULL; + za->zp = NULL; + _zip_error_init(&za->error); + za->cdir = NULL; + za->ch_comment = NULL; + za->ch_comment_len = -1; + za->nentry = za->nentry_alloc = 0; + za->entry = NULL; + za->nfile = za->nfile_alloc = 0; + za->file = NULL; + za->flags = za->ch_flags = 0; + + return za; +} + + +void * +_zip_memdup(const void *mem, size_t len, struct zip_error *error) +{ + void *ret; + + ret = malloc(len); + if (!ret) { + _zip_error_set(error, ZIP_ER_MEMORY, 0); + return NULL; + } + + memcpy(ret, mem, len); + + return ret; +} + + +ZIP_EXTERN int +zip_get_num_files(struct zip *za) +{ + if (za == NULL) + return -1; + + return za->nentry; +} + +ZIP_EXTERN const char * +zip_get_name(struct zip *za, int idx, int flags) +{ + return _zip_get_name(za, idx, flags, &za->error); +} + + + +const char * +_zip_get_name(struct zip *za, int idx, int flags, struct zip_error *error) +{ + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0) { + if (za->entry[idx].state == ZIP_ST_DELETED) { + _zip_error_set(error, ZIP_ER_DELETED, 0); + return NULL; + } + if (za->entry[idx].ch_filename) + return za->entry[idx].ch_filename; + } + + if (za->cdir == NULL || idx >= za->cdir->nentry) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return NULL; + } + + return za->cdir->entry[idx].filename; +} + + +ZIP_EXTERN const char * +zip_get_file_comment(struct zip *za, int idx, int *lenp, int flags) +{ + if (idx < 0 || idx >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) + || (za->entry[idx].ch_comment_len == -1)) { + if (lenp != NULL) + *lenp = za->cdir->entry[idx].comment_len; + return za->cdir->entry[idx].comment; + } + + if (lenp != NULL) + *lenp = za->entry[idx].ch_comment_len; + return za->entry[idx].ch_comment; +} + + +ZIP_EXTERN int +zip_get_archive_flag(struct zip *za, int flag, int flags) +{ + int fl; + + fl = (flags & ZIP_FL_UNCHANGED) ? za->flags : za->ch_flags; + + return (fl & flag) ? 1 : 0; +} + + +ZIP_EXTERN const char * +zip_get_archive_comment(struct zip *za, int *lenp, int flags) +{ + if ((flags & ZIP_FL_UNCHANGED) + || (za->ch_comment_len == -1)) { + if (za->cdir) { + if (lenp != NULL) + *lenp = za->cdir->comment_len; + return za->cdir->comment; + } + else { + if (lenp != NULL) + *lenp = -1; + return NULL; + } + } + + if (lenp != NULL) + *lenp = za->ch_comment_len; + return za->ch_comment; +} + + +/* _zip_free: + frees the space allocated to a zipfile struct, and closes the + corresponding file. */ + +void +_zip_free(struct zip *za) +{ + int i; + + if (za == NULL) + return; + + if (za->zn) + free(za->zn); + + if (za->zp) + fclose(za->zp); + + _zip_cdir_free(za->cdir); + + if (za->entry) { + for (i=0; inentry; i++) { + _zip_entry_free(za->entry+i); + } + free(za->entry); + } + + for (i=0; infile; i++) { + if (za->file[i]->error.zip_err == ZIP_ER_OK) { + _zip_error_set(&za->file[i]->error, ZIP_ER_ZIPCLOSED, 0); + za->file[i]->za = NULL; + } + } + + free(za->file); + + free(za); + + return; +} + + +ZIP_EXTERN ssize_t +zip_fread(struct zip_file *zf, void *outbuf, size_t toread) +{ + int ret; + size_t out_before, len; + int i; + + if (!zf) + return -1; + + if (zf->error.zip_err != 0) + return -1; + + if ((zf->flags & ZIP_ZF_EOF) || (toread == 0)) + return 0; + + if (zf->bytes_left == 0) { + zf->flags |= ZIP_ZF_EOF; + if (zf->flags & ZIP_ZF_CRC) { + if (zf->crc != zf->crc_orig) { + _zip_error_set(&zf->error, ZIP_ER_CRC, 0); + return -1; + } + } + return 0; + } + + if ((zf->flags & ZIP_ZF_DECOMP) == 0) { + ret = _zip_file_fillbuf(outbuf, toread, zf); + if (ret > 0) { + if (zf->flags & ZIP_ZF_CRC) + zf->crc = crc32(zf->crc, (Bytef *)outbuf, ret); + zf->bytes_left -= ret; + } + return ret; + } + + zf->zstr->next_out = (Bytef *)outbuf; + zf->zstr->avail_out = toread; + out_before = zf->zstr->total_out; + + /* endless loop until something has been accomplished */ + for (;;) { + ret = inflate(zf->zstr, Z_SYNC_FLUSH); + + switch (ret) { + case Z_OK: + case Z_STREAM_END: + /* all ok */ + /* Z_STREAM_END probably won't happen, since we didn't + have a header */ + len = zf->zstr->total_out - out_before; + if (len >= zf->bytes_left || len >= toread) { + if (zf->flags & ZIP_ZF_CRC) + zf->crc = crc32(zf->crc, (Bytef *)outbuf, len); + zf->bytes_left -= len; + return len; + } + break; + + case Z_BUF_ERROR: + if (zf->zstr->avail_in == 0) { + i = _zip_file_fillbuf(zf->buffer, BUFSIZE, zf); + if (i == 0) { + _zip_error_set(&zf->error, ZIP_ER_INCONS, 0); + return -1; + } + else if (i < 0) + return -1; + zf->zstr->next_in = (Bytef *)zf->buffer; + zf->zstr->avail_in = i; + continue; + } + /* fallthrough */ + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_STREAM_ERROR: + case Z_MEM_ERROR: + _zip_error_set(&zf->error, ZIP_ER_ZLIB, ret); + return -1; + } + } +} + + +ZIP_EXTERN const char * +zip_strerror(struct zip *za) +{ + return _zip_error_strerror(&za->error); +} + + +ZIP_EXTERN void +zip_stat_init(struct zip_stat *st) +{ + st->name = NULL; + st->index = -1; + st->crc = 0; + st->mtime = (time_t)-1; + st->size = -1; + st->comp_size = -1; + st->comp_method = ZIP_CM_STORE; + st->encryption_method = ZIP_EM_NONE; +} + + +ZIP_EXTERN int +zip_stat_index(struct zip *za, int index, int flags, struct zip_stat *st) +{ + const char *name; + + if (index < 0 || index >= za->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + if ((name=zip_get_name(za, index, flags)) == NULL) + return -1; + + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && ZIP_ENTRY_DATA_CHANGED(za->entry+index)) { + if (za->entry[index].source->f(za->entry[index].source->ud, + st, sizeof(*st), ZIP_SOURCE_STAT) < 0) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return -1; + } + } + else { + if (za->cdir == NULL || index >= za->cdir->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return -1; + } + + st->crc = za->cdir->entry[index].crc; + st->size = za->cdir->entry[index].uncomp_size; + st->mtime = za->cdir->entry[index].last_mod; + st->comp_size = za->cdir->entry[index].comp_size; + st->comp_method = za->cdir->entry[index].comp_method; + if (za->cdir->entry[index].bitflags & ZIP_GPBF_ENCRYPTED) { + if (za->cdir->entry[index].bitflags & ZIP_GPBF_STRONG_ENCRYPTION) { + /* XXX */ + st->encryption_method = ZIP_EM_UNKNOWN; + } + else + st->encryption_method = ZIP_EM_TRAD_PKWARE; + } + else + st->encryption_method = ZIP_EM_NONE; + /* st->bitflags = za->cdir->entry[index].bitflags; */ + } + + st->index = index; + st->name = name; + + return 0; +} + + +ZIP_EXTERN int +zip_stat(struct zip *za, const char *fname, int flags, struct zip_stat *st) +{ + int idx; + + if ((idx=zip_name_locate(za, fname, flags)) < 0) + return -1; + + return zip_stat_index(za, idx, flags, st); +} + + +struct read_zip { + struct zip_file *zf; + struct zip_stat st; + myoff_t off, len; +}; + +static ssize_t read_zip(void *st, void *data, size_t len, + enum zip_source_cmd cmd); + + + +ZIP_EXTERN struct zip_source * +zip_source_zip(struct zip *za, struct zip *srcza, int srcidx, int flags, + myoff_t start, myoff_t len) +{ + struct zip_error error; + struct zip_source *zs; + struct read_zip *p; + + /* XXX: ZIP_FL_RECOMPRESS */ + + if (za == NULL) + return NULL; + + if (srcza == NULL || start < 0 || len < -1 || srcidx < 0 || srcidx >= srcza->nentry) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((flags & ZIP_FL_UNCHANGED) == 0 + && ZIP_ENTRY_DATA_CHANGED(srcza->entry+srcidx)) { + _zip_error_set(&za->error, ZIP_ER_CHANGED, 0); + return NULL; + } + + if (len == 0) + len = -1; + + if (start == 0 && len == -1 && (flags & ZIP_FL_RECOMPRESS) == 0) + flags |= ZIP_FL_COMPRESSED; + else + flags &= ~ZIP_FL_COMPRESSED; + + if ((p=(struct read_zip *)malloc(sizeof(*p))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + _zip_error_copy(&error, &srcza->error); + + if (zip_stat_index(srcza, srcidx, flags, &p->st) < 0 + || (p->zf=zip_fopen_index(srcza, srcidx, flags)) == NULL) { + free(p); + _zip_error_copy(&za->error, &srcza->error); + _zip_error_copy(&srcza->error, &error); + + return NULL; + } + p->off = start; + p->len = len; + + if ((flags & ZIP_FL_COMPRESSED) == 0) { + p->st.size = p->st.comp_size = len; + p->st.comp_method = ZIP_CM_STORE; + p->st.crc = 0; + } + + if ((zs=zip_source_function(za, read_zip, p)) == NULL) { + free(p); + return NULL; + } + + return zs; +} + + + +static ssize_t +read_zip(void *state, void *data, size_t len, enum zip_source_cmd cmd) +{ + struct read_zip *z; + char b[8192], *buf; + int i, n; + + z = (struct read_zip *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + for (n=0; noff; n+= i) { + i = (z->off-n > sizeof(b) ? sizeof(b) : z->off-n); + if ((i=zip_fread(z->zf, b, i)) < 0) { + zip_fclose(z->zf); + z->zf = NULL; + return -1; + } + } + return 0; + + case ZIP_SOURCE_READ: + if (z->len != -1) + n = len > z->len ? z->len : len; + else + n = len; + + + if ((i=zip_fread(z->zf, buf, n)) < 0) + return -1; + + if (z->len != -1) + z->len -= i; + + return i; + + case ZIP_SOURCE_CLOSE: + return 0; + + case ZIP_SOURCE_STAT: + if (len < sizeof(z->st)) + return -1; + len = sizeof(z->st); + + memcpy(data, &z->st, len); + return len; + + case ZIP_SOURCE_ERROR: + { + int *e; + + if (len < sizeof(int)*2) + return -1; + + e = (int *)data; + zip_file_error_get(z->zf, e, e+1); + } + return sizeof(int)*2; + + case ZIP_SOURCE_FREE: + zip_fclose(z->zf); + free(z); + return 0; + + default: + ; + } + + return -1; +} + + +ZIP_EXTERN struct zip_source * +zip_source_function(struct zip *za, zip_source_callback zcb, void *ud) +{ + struct zip_source *zs; + + if (za == NULL) + return NULL; + + if ((zs=(struct zip_source *)malloc(sizeof(*zs))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + zs->f = zcb; + zs->ud = ud; + + return zs; +} + + +ZIP_EXTERN void +zip_source_free(struct zip_source *source) +{ + if (source == NULL) + return; + + (void)source->f(source->ud, NULL, 0, ZIP_SOURCE_FREE); + + free(source); +} + + +struct read_file { + char *fname; /* name of file to copy from */ + FILE *f; /* file to copy from */ + myoff_t off; /* start offset of */ + myoff_t len; /* lengt of data to copy */ + myoff_t remain; /* bytes remaining to be copied */ + int e[2]; /* error codes */ +}; + +static ssize_t read_file(void *state, void *data, size_t len, + enum zip_source_cmd cmd); + + + +ZIP_EXTERN struct zip_source * +zip_source_filep(struct zip *za, FILE *file, myoff_t start, myoff_t len) +{ + if (za == NULL) + return NULL; + + if (file == NULL || start < 0 || len < -1) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + return _zip_source_file_or_p(za, NULL, file, start, len); +} + + + +struct zip_source * +_zip_source_file_or_p(struct zip *za, const char *fname, FILE *file, + myoff_t start, myoff_t len) +{ + struct read_file *f; + struct zip_source *zs; + + if (file == NULL && fname == NULL) { + _zip_error_set(&za->error, ZIP_ER_INVAL, 0); + return NULL; + } + + if ((f=(struct read_file *)malloc(sizeof(struct read_file))) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + return NULL; + } + + f->fname = NULL; + if (fname) { + if ((f->fname=strdup(fname)) == NULL) { + _zip_error_set(&za->error, ZIP_ER_MEMORY, 0); + free(f); + return NULL; + } + } + f->f = file; + f->off = start; + f->len = (len ? len : -1); + + if ((zs=zip_source_function(za, read_file, f)) == NULL) { + free(f); + return NULL; + } + + return zs; +} + + + +static ssize_t +read_file(void *state, void *data, size_t len, enum zip_source_cmd cmd) +{ + struct read_file *z; + char *buf; + int i, n; + + z = (struct read_file *)state; + buf = (char *)data; + + switch (cmd) { + case ZIP_SOURCE_OPEN: + if (z->fname) { + if ((z->f=fopen(z->fname, "rb")) == NULL) { + z->e[0] = ZIP_ER_OPEN; + z->e[1] = errno; + return -1; + } + } + + if (fseeko(z->f, z->off, SEEK_SET) < 0) { + z->e[0] = ZIP_ER_SEEK; + z->e[1] = errno; + return -1; + } + z->remain = z->len; + return 0; + + case ZIP_SOURCE_READ: + if (z->remain != -1) + n = len > z->remain ? z->remain : len; + else + n = len; + + if ((i=fread(buf, 1, n, z->f)) < 0) { + z->e[0] = ZIP_ER_READ; + z->e[1] = errno; + return -1; + } + + if (z->remain != -1) + z->remain -= i; + + return i; + + case ZIP_SOURCE_CLOSE: + if (z->fname) { + fclose(z->f); + z->f = NULL; + } + return 0; + + case ZIP_SOURCE_STAT: + { + struct zip_stat *st; + struct stat fst; + int err; + + if (len < sizeof(*st)) + return -1; + + if (z->f) + err = fstat(fileno(z->f), &fst); + else + err = stat(z->fname, &fst); + + if (err != 0) { + z->e[0] = ZIP_ER_READ; /* best match */ + z->e[1] = errno; + return -1; + } + + st = (struct zip_stat *)data; + + zip_stat_init(st); + st->mtime = fst.st_mtime; + if (z->len != -1) + st->size = z->len; + else if ((fst.st_mode&S_IFMT) == S_IFREG) + st->size = fst.st_size; + + return sizeof(*st); + } + + case ZIP_SOURCE_ERROR: + if (len < sizeof(int)*2) + return -1; + + memcpy(data, z->e, sizeof(int)*2); + return sizeof(int)*2; + + case ZIP_SOURCE_FREE: + free(z->fname); + if (z->f) + fclose(z->f); + free(z); + return 0; + + default: + ; + } + + return -1; +} + + +ZIP_EXTERN int +zip_name_locate(struct zip *za, const char *fname, int flags) +{ + return _zip_name_locate(za, fname, flags, &za->error); +} + + + +int +_zip_name_locate(struct zip *za, const char *fname, int flags, + struct zip_error *error) +{ + int (*cmp)(const char *, const char *); + const char *fn, *p; + int i, n; + + if (fname == NULL) { + _zip_error_set(error, ZIP_ER_INVAL, 0); + return -1; + } + + cmp = (flags & ZIP_FL_NOCASE) ? strcasecmp : strcmp; + + n = (flags & ZIP_FL_UNCHANGED) ? za->cdir->nentry : za->nentry; + for (i=0; icdir->entry[i].filename; + else + fn = _zip_get_name(za, i, flags, error); + + /* newly added (partially filled) entry */ + if (fn == NULL) + continue; + + if (flags & ZIP_FL_NODIR) { + p = strrchr(fn, '/'); + if (p) + fn = p+1; + } + + if (cmp(fname, fn) == 0) + return i; + } + + _zip_error_set(error, ZIP_ER_NOENT, 0); + return -1; +} + diff --git a/rod/ccgexprs.nim b/rod/ccgexprs.nim index ecff707aed..6eae842f2a 100755 --- a/rod/ccgexprs.nim +++ b/rod/ccgexprs.nim @@ -1093,15 +1093,16 @@ proc genRepr(p: BProc, e: PNode, d: var TLoc) = ropef("reprSet($1, $2)", [rdLoc(a), genTypeInfo(p.module, t)])) of tyOpenArray: useMagic(p.module, "reprOpenArray") + var b: TLoc case a.t.kind - of tyOpenArray: putIntoDest(p, d, e.typ, ropef("$1, $1Len0", [rdLoc(a)])) + of tyOpenArray: putIntoDest(p, b, e.typ, rdLoc(a)) of tyString, tySequence: - putIntoDest(p, d, e.typ, ropef("$1->data, $1->Sup.len", [rdLoc(a)])) + putIntoDest(p, b, e.typ, ropef("$1->data, $1->Sup.len", [rdLoc(a)])) of tyArray, tyArrayConstr: - putIntoDest(p, d, e.typ, + putIntoDest(p, b, e.typ, ropef("$1, $2", [rdLoc(a), toRope(lengthOrd(a.t))])) else: InternalError(e.sons[0].info, "genRepr()") - putIntoDest(p, d, e.typ, ropef("reprOpenArray($1, $2)", [rdLoc(d), + putIntoDest(p, d, e.typ, ropef("reprOpenArray($1, $2)", [rdLoc(b), genTypeInfo(p.module, elemType(t))])) of tyCString, tyArray, tyArrayConstr, tyRef, tyPtr, tyPointer, tyNil, tySequence: diff --git a/rod/evals.nim b/rod/evals.nim index b3fa08a0b2..79428e60f2 100755 --- a/rod/evals.nim +++ b/rod/evals.nim @@ -259,6 +259,10 @@ proc evalCall(c: PEvalContext, n: PNode): PNode = if n.typ != nil: result = d.params[0] popStackFrame(c) +proc aliasNeeded(n: PNode, flags: TEvalFlags): bool = + result = efLValue in flags or n.typ == nil or + n.typ.kind in {tyExpr, tyStmt, tyTypeDesc} + proc evalVariable(c: PStackFrame, sym: PSym, flags: TEvalFlags): PNode = # We need to return a node to the actual value, # which can be modified. @@ -269,7 +273,7 @@ proc evalVariable(c: PStackFrame, sym: PSym, flags: TEvalFlags): PNode = if result == nil: result = emptyNode return result = IdNodeTableGet(x.mapping, sym) - if efLValue notin flags: result = copyTree(result) + if not aliasNeeded(result, flags): result = copyTree(result) if result != nil: return x = x.next result = emptyNode @@ -286,7 +290,7 @@ proc evalArrayAccess(c: PEvalContext, n: PNode, flags: TEvalFlags): PNode = of nkBracket, nkPar, nkMetaNode: if (idx >= 0) and (idx < sonsLen(x)): result = x.sons[int(idx)] else: stackTrace(c, n, errIndexOutOfBounds) - if efLValue notin flags: result = copyTree(result) + if not aliasNeeded(result, flags): result = copyTree(result) of nkStrLit..nkTripleStrLit: if efLValue in flags: InternalError(n.info, "cannot evaluate write access to char") @@ -313,7 +317,7 @@ proc evalFieldAccess(c: PEvalContext, n: PNode, flags: TEvalFlags): PNode = InternalError(n.info, "evalFieldAccess") if x.sons[i].sons[0].sym.name.id == field.id: result = x.sons[i].sons[1] - if efLValue in flags: result = copyTree(result) + if not aliasNeeded(result, flags): result = copyTree(result) return stackTrace(c, n, errFieldXNotFound, field.name.s) result = emptyNode @@ -705,7 +709,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = of mAppendStrStr: result = evalAppendStrStr(c, n) of mAppendSeqElem: result = evalAppendSeqElem(c, n) of mNLen: - result = evalAux(c, n.sons[1], {}) + result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result result = newNodeIT(nkIntLit, n.info, n.typ) @@ -714,10 +718,10 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = nil else: result.intVal = sonsLen(a) of mNChild: - result = evalAux(c, n.sons[1], {}) + result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return var k = getOrdValue(result) if not (a.kind in {nkEmpty..nkNilLit}) and (k >= 0) and (k < sonsLen(a)): @@ -730,10 +734,10 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return var b = result - result = evalAux(c, n.sons[3], {}) + result = evalAux(c, n.sons[3], {efLValue}) if isSpecial(result): return var k = getOrdValue(b) if (k >= 0) and (k < sonsLen(a)) and not (a.kind in {nkEmpty..nkNilLit}): @@ -746,7 +750,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return addSon(a, result) result = emptyNode @@ -754,7 +758,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return for i in countup(0, sonsLen(result) - 1): addSon(a, result.sons[i]) result = emptyNode @@ -762,10 +766,10 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return var b = result - result = evalAux(c, n.sons[3], {}) + result = evalAux(c, n.sons[3], {efLValue}) if isSpecial(result): return for i in countup(0, int(getOrdValue(result)) - 1): delSon(a, int(getOrdValue(b))) @@ -793,7 +797,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = of nkFloatLit..nkFloat64Lit: result.floatVal = a.floatVal else: InternalError(n.info, "no float value") of mNSymbol: - result = evalAux(c, n.sons[1], {}) + result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return if result.kind != nkSym: InternalError(n.info, "no symbol") of mNIdent: @@ -829,7 +833,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return a.sym = result.sym # XXX: exception handling? result = emptyNode @@ -837,7 +841,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return a.ident = result.ident # XXX: exception handling? result = emptyNode @@ -845,7 +849,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return a.typ = result.typ # XXX: exception handling? result = emptyNode @@ -861,7 +865,7 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = evalAux(c, n.sons[1], {}) if isSpecial(result): return var k = getOrdValue(result) - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if result.kind == nkExceptBranch: return var a = result if (k < 0) or (k > ord(high(TNodeKind))): @@ -869,11 +873,11 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = result = newNodeI(TNodeKind(int(k)), if a.kind == nkNilLit: n.info else: a.info) of mNCopyNimNode: - result = evalAux(c, n.sons[1], {}) + result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return result = copyNode(result) of mNCopyNimTree: - result = evalAux(c, n.sons[1], {}) + result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return result = copyTree(result) of mStrToIdent: @@ -902,10 +906,10 @@ proc evalMagicOrCall(c: PEvalContext, n: PNode): PNode = if (a.kind == nkIdent) and (b.kind == nkIdent): if a.ident.id == b.ident.id: result.intVal = 1 of mEqNimrodNode: - result = evalAux(c, n.sons[1], {}) + result = evalAux(c, n.sons[1], {efLValue}) if isSpecial(result): return var a = result - result = evalAux(c, n.sons[2], {}) + result = evalAux(c, n.sons[2], {efLValue}) if isSpecial(result): return var b = result result = newNodeIT(nkIntLit, n.info, n.typ) @@ -966,16 +970,18 @@ proc evalAux(c: PEvalContext, n: PNode, flags: TEvalFlags): PNode = of nkCall, nkHiddenCallConv, nkMacroStmt, nkCommand, nkCallStrLit: result = evalMagicOrCall(c, n) of nkCurly, nkBracket, nkRange: + # flags need to be passed here for mNAddMultiple :-( + # XXX this is not correct in every case! var a = copyNode(n) for i in countup(0, sonsLen(n) - 1): - result = evalAux(c, n.sons[i], {}) + result = evalAux(c, n.sons[i], flags) if isSpecial(result): return addSon(a, result) result = a of nkPar: var a = copyTree(n) for i in countup(0, sonsLen(n) - 1): - result = evalAux(c, n.sons[i].sons[1], {}) + result = evalAux(c, n.sons[i].sons[1], flags) if isSpecial(result): return a.sons[i].sons[1] = result result = a diff --git a/rod/extccomp.nim b/rod/extccomp.nim index 990466e1bb..563434e0fc 100755 --- a/rod/extccomp.nim +++ b/rod/extccomp.nim @@ -283,7 +283,7 @@ proc NameToCC(name: string): TSystemCC = result = ccNone proc addOpt(dest: var string, src: string) = - if (len(dest) == 0) or (dest[len(dest) - 1 + 0] != ' '): add(dest, " ") + if len(dest) == 0 or dest[len(dest) - 1 + 0] != ' ': add(dest, " ") add(dest, src) proc addCompileOption(option: string) = @@ -308,7 +308,7 @@ proc addFileToLink(filename: string) = proc execExternalProgram(cmd: string) = if (optListCmd in gGlobalOptions) or (gVerbosity > 0): MessageOut(cmd) - if execCmd(cmd) != 0: rawMessage(errExecutionOfProgramFailed) + if execCmd(cmd) != 0: rawMessage(errExecutionOfProgramFailed, "") proc generateScript(projectFile: string, script: PRope) = var (dir, name, ext) = splitFile(projectFile) @@ -425,7 +425,7 @@ proc CallCCompiler(projectfile: string) = else: res = execProcesses(cmds, {poUseShell, poParentStreams}, gNumberOfProcessors) - if res != 0: rawMessage(errExecutionOfProgramFailed) + if res != 0: rawMessage(errExecutionOfProgramFailed, []) if not (optNoLinking in gGlobalOptions): # call the linker: var linkerExe = getConfigVar(cc[c].name & ".linkerexe") diff --git a/rod/msgs.nim b/rod/msgs.nim index ca3a5c1e59..01852e0ba2 100755 --- a/rod/msgs.nim +++ b/rod/msgs.nim @@ -323,7 +323,7 @@ const # this format is understood by many text editors: it is the same that RawHintFormat* = "Hint: $1" proc MessageOut*(s: string) -proc rawMessage*(msg: TMsgKind, arg: string = "") +proc rawMessage*(msg: TMsgKind, arg: string) proc rawMessage*(msg: TMsgKind, args: openarray[string]) proc liMessage*(info: TLineInfo, msg: TMsgKind, arg: string = "") proc InternalError*(info: TLineInfo, errMsg: string) @@ -475,7 +475,7 @@ proc rawMessage(msg: TMsgKind, args: openarray[string]) = MessageOut(`%`(frmt, `%`(msgKindToString(msg), args))) handleError(msg) -proc rawMessage(msg: TMsgKind, arg: string = "") = +proc rawMessage(msg: TMsgKind, arg: string) = rawMessage(msg, [arg]) proc liMessage(info: TLineInfo, msg: TMsgKind, arg: string = "") = diff --git a/rod/nimrod.ini b/rod/nimrod.ini index 7c0e8c565f..1574721f1b 100755 --- a/rod/nimrod.ini +++ b/rod/nimrod.ini @@ -72,13 +72,18 @@ Files: "lib/wrappers/x11/*.nim" Files: "lib/wrappers/zip/*.nim" Files: "lib/wrappers/zip/libzip_all.c" -Files: "lib/newwrap/*.nim" +Files: "lib/oldwrappers/*.nim" -Files: "lib/newwrap/cairo/*.nim" -Files: "lib/newwrap/gtk/*.nim" -Files: "lib/newwrap/lua/*.nim" -Files: "lib/newwrap/sdl/*.nim" -Files: "lib/newwrap/x11/*.nim" +Files: "lib/oldwrappers/cairo/*.nim" +Files: "lib/oldwrappers/gtk/*.nim" +Files: "lib/oldwrappers/lua/*.nim" +Files: "lib/oldwrappers/opengl/*.nim" +Files: "lib/oldwrappers/pcre/*.nim" +Files: "lib/oldwrappers/pcre/pcre_all.c" +Files: "lib/oldwrappers/sdl/*.nim" +Files: "lib/oldwrappers/x11/*.nim" +Files: "lib/oldwrappers/zip/*.nim" +Files: "lib/oldwrappers/zip/libzip_all.c" Files: "lib/windows/*.nim" Files: "lib/posix/*.nim" @@ -90,7 +95,9 @@ Files: "tests/*.html" Files: "tests/*.txt" Files: "tests/*.cfg" Files: "tests/*.tmpl" -Files: "tests/gtk/*.nim" +Files: "tests/accept/run/*.nim" +Files: "tests/accept/compile/*.nim" +Files: "tests/reject/*.nim" Files: "examples/*.nim" Files: "examples/*.html" diff --git a/rod/nimrod.nim b/rod/nimrod.nim index 8f83aa5cdf..a6f3365c25 100755 --- a/rod/nimrod.nim +++ b/rod/nimrod.nim @@ -42,7 +42,7 @@ proc ProcessCmdLine(pass: TCmdLinePass, command, filename: var string) = if pass == passCmd2: arguments = cmdLineRest(p) if not (optRun in gGlobalOptions) and (arguments != ""): - rawMessage(errArgsNeedRunOption) + rawMessage(errArgsNeedRunOption, []) proc HandleCmdLine() = var start = getTime() diff --git a/rod/nversion.nim b/rod/nversion.nim index 2aa7babf77..8d7c5b263a 100755 --- a/rod/nversion.nim +++ b/rod/nversion.nim @@ -15,6 +15,6 @@ const defaultAsmMarkerSymbol* = '!' VersionMajor* = 0 VersionMinor* = 8 - VersionPatch* = 7 + VersionPatch* = 8 VersionAsString* = $VersionMajor & "." & $VersionMinor & "." & $VersionPatch diff --git a/rod/passes.nim b/rod/passes.nim index 7ae642ed4f..e35f4d0455 100755 --- a/rod/passes.nim +++ b/rod/passes.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2009 Andreas Rumpf +# (c) Copyright 2010 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -18,36 +18,16 @@ import type TPassContext* = object of TObject # the pass's context PPassContext* = ref TPassContext - TPass* = tuple[open: proc (module: PSym, filename: string): PPassContext, - openCached: proc (module: PSym, filename: string, rd: PRodReader): PPassContext, - close: proc (p: PPassContext, n: PNode): PNode, - process: proc (p: PPassContext, topLevelStmt: PNode): PNode] # a - # pass is a - # tuple of - # procedure - # vars - # - # ``TPass.close`` - # may - # produce - # additional - # nodes. - # These - # are - # passed to - # the - # other - # - # close - # procedures. - # This - # mechanism is - # needed - # for - # the - # instantiation of - # - # generics. + TPass* = tuple[ + open: proc (module: PSym, filename: string): PPassContext, + openCached: proc (module: PSym, filename: string, + rd: PRodReader): PPassContext, + close: proc (p: PPassContext, n: PNode): PNode, + process: proc (p: PPassContext, topLevelStmt: PNode): PNode] + +# a pass is a tuple of procedure vars ``TPass.close`` may produce additional +# nodes. These are passed to the other close procedures. +# This mechanism is needed for the instantiation of generics. proc registerPass*(p: TPass) proc initPass*(p: var TPass) @@ -62,7 +42,8 @@ proc astNeeded*(s: PSym): bool # needs to be stored. The passes manager frees s.sons[codePos] when # appropriate to free the procedure body's memory. This is important # to keep memory usage down. - # the semantic checker needs these: + +# the semantic checker needs these: var gImportModule*: proc (filename: string): PSym gIncludeFile*: proc (filename: string): PNode @@ -105,29 +86,25 @@ proc openPassesCached(a: var TPassContextArray, module: PSym, filename: string, a[i] = nil proc closePasses(a: var TPassContextArray) = - var m: PNode - m = nil + var m: PNode = nil for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].close): m = gPasses[i].close(a[i], m) a[i] = nil # free the memory here proc processTopLevelStmt(n: PNode, a: var TPassContextArray) = - var m: PNode # this implements the code transformation pipeline - m = n + var m = n for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].process): m = gPasses[i].process(a[i], m) proc processTopLevelStmtCached(n: PNode, a: var TPassContextArray) = - var m: PNode # this implements the code transformation pipeline - m = n + var m = n for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].openCached): m = gPasses[i].process(a[i], m) proc closePassesCached(a: var TPassContextArray) = - var m: PNode - m = nil + var m: PNode = nil for i in countup(0, gPassesLen - 1): if not isNil(gPasses[i].openCached) and not isNil(gPasses[i].close): m = gPasses[i].close(a[i], m) @@ -157,7 +134,8 @@ proc processModule(module: PSym, filename: string, stream: PLLStream, processTopLevelStmt(n, a) closeParsers(p) if s.kind != llsStdIn: break - closePasses(a) # id synchronization point for more consistent code generation: + closePasses(a) + # id synchronization point for more consistent code generation: IDsynchronizationPoint(1000) else: openPassesCached(a, module, filename, rd) diff --git a/rod/semexprs.nim b/rod/semexprs.nim index 0a3c6e2ee2..61823df327 100755 --- a/rod/semexprs.nim +++ b/rod/semexprs.nim @@ -388,7 +388,12 @@ proc analyseIfAddressTakenInCall(c: PContext, n: PNode) = checkMinSonsLen(n, 1) var t = n.sons[0].typ if (n.sons[0].kind == nkSym) and (n.sons[0].sym.magic in FakeVarParams): - return + # BUGFIX: check for L-Value still needs to be done for the arguments! + for i in countup(1, sonsLen(n) - 1): + if i < sonsLen(t) and skipTypes(t.sons[i], abstractInst).kind == tyVar: + if isAssignable(n.sons[i]) != arLValue: + liMessage(n.sons[i].info, errVarForOutParamNeeded) + return for i in countup(1, sonsLen(n) - 1): if (i < sonsLen(t)) and (skipTypes(t.sons[i], abstractInst).kind == tyVar): @@ -781,7 +786,7 @@ proc semArrayAccess(c: PContext, n: PNode, flags: TExprFlags): PNode = proc semIfExpr(c: PContext, n: PNode): PNode = result = n - checkSonsLen(n, 2) + checkMinSonsLen(n, 2) var typ: PType = nil for i in countup(0, sonsLen(n) - 1): var it = n.sons[i] diff --git a/rod/sigmatch.nim b/rod/sigmatch.nim index 2db387b951..b6f82f5c69 100755 --- a/rod/sigmatch.nim +++ b/rod/sigmatch.nim @@ -117,29 +117,26 @@ proc concreteType(mapping: TIdTable, t: PType): PType = result = t # Note: empty is valid here proc handleRange(f, a: PType, min, max: TTypeKind): TTypeRelation = - var k: TTypeKind if a.kind == f.kind: result = isEqual else: - k = skipTypes(a, {tyRange}).kind + var k = skipTypes(a, {tyRange}).kind if k == f.kind: result = isSubtype elif (f.kind == tyInt) and (k in {tyInt..tyInt32}): result = isIntConv elif (k >= min) and (k <= max): result = isConvertible else: result = isNone proc handleFloatRange(f, a: PType): TTypeRelation = - var k: TTypeKind if a.kind == f.kind: result = isEqual else: - k = skipTypes(a, {tyRange}).kind + var k = skipTypes(a, {tyRange}).kind if k == f.kind: result = isSubtype elif (k >= tyFloat) and (k <= tyFloat128): result = isConvertible else: result = isNone proc isObjectSubtype(a, f: PType): bool = - var t: PType - t = a + var t = a while (t != nil) and (t.id != f.id): t = base(t) result = t != nil @@ -148,14 +145,11 @@ proc minRel(a, b: TTypeRelation): TTypeRelation = else: result = b proc tupleRel(mapping: var TIdTable, f, a: PType): TTypeRelation = - var - x, y: PSym - m: TTypeRelation result = isNone if sonsLen(a) == sonsLen(f): result = isEqual for i in countup(0, sonsLen(f) - 1): - m = typeRel(mapping, f.sons[i], a.sons[i]) + var m = typeRel(mapping, f.sons[i], a.sons[i]) if m < isSubtype: return isNone result = minRel(result, m) @@ -164,8 +158,8 @@ proc tupleRel(mapping: var TIdTable, f, a: PType): TTypeRelation = # check field names: if f.n.sons[i].kind != nkSym: InternalError(f.n.info, "tupleRel") if a.n.sons[i].kind != nkSym: InternalError(a.n.info, "tupleRel") - x = f.n.sons[i].sym - y = a.n.sons[i].sym + var x = f.n.sons[i].sym + var y = a.n.sons[i].sym if x.name.id != y.name.id: return isNone @@ -438,8 +432,7 @@ proc typeRel(mapping: var TIdTable, f, a: PType): TTypeRelation = case a.kind of tyExpr, tyStmt, tyTypeDesc: result = isGeneric of tyNil: result = isSubtype - else: - nil + else: nil else: internalError("typeRel(" & $f.kind & ')') proc cmpTypes(f, a: PType): TTypeRelation = @@ -522,10 +515,6 @@ proc ParamTypesMatchAux(c: PContext, m: var TCandidate, f, a: PType, proc ParamTypesMatch(c: PContext, m: var TCandidate, f, a: PType, arg: PNode): PNode = - var - cmp, best: int - x, y, z: TCandidate - r: TTypeRelation if (arg == nil) or (arg.kind != nkSymChoice): result = ParamTypesMatchAux(c, m, f, a, arg) else: @@ -533,18 +522,19 @@ proc ParamTypesMatch(c: PContext, m: var TCandidate, f, a: PType, # incorrect to simply use the first fitting match. However, to implement # this correctly is inefficient. We have to copy `m` here to be able to # roll back the side effects of the unification algorithm. + var x, y, z: TCandidate initCandidate(x, m.callee) initCandidate(y, m.callee) initCandidate(z, m.callee) x.calleeSym = m.calleeSym y.calleeSym = m.calleeSym z.calleeSym = m.calleeSym - best = - 1 + var best = - 1 for i in countup(0, sonsLen(arg) - 1): # iterators are not first class yet, so ignore them if arg.sons[i].sym.kind in {skProc, skMethod, skConverter}: copyCandidate(z, m) - r = typeRel(z.bindings, f, arg.sons[i].typ) + var r = typeRel(z.bindings, f, arg.sons[i].typ) if r != isNone: case x.state of csEmpty, csNoMatch: @@ -552,7 +542,7 @@ proc ParamTypesMatch(c: PContext, m: var TCandidate, f, a: PType, best = i x.state = csMatch of csMatch: - cmp = cmpCandidates(x, z) + var cmp = cmpCandidates(x, z) if cmp < 0: best = i x = z @@ -658,7 +648,7 @@ proc matches(c: PContext, n: PNode, m: var TCandidate) = return m.baseTypeMatch = false var arg = ParamTypesMatch(c, m, formal.typ, n.sons[a].typ, n.sons[a]) - if (arg == nil): + if arg == nil: m.state = csNoMatch return if m.baseTypeMatch: @@ -677,9 +667,14 @@ proc matches(c: PContext, n: PNode, m: var TCandidate) = formal = m.callee.n.sons[f].sym if not IntSetContainsOrIncl(marker, formal.position): if formal.ast == nil: - # no default value - m.state = csNoMatch - break + if formal.typ.kind == tyOpenArray: + container = newNodeI(nkBracket, n.info) + addSon(m.call, implicitConv(nkHiddenStdConv, formal.typ, + container, m, c)) + else: + # no default value + m.state = csNoMatch + break else: # use default value: setSon(m.call, formal.position + 1, copyTree(formal.ast)) diff --git a/rod/syntaxes.nim b/rod/syntaxes.nim index b8e4c1837a..d757ad9f68 100755 --- a/rod/syntaxes.nim +++ b/rod/syntaxes.nim @@ -1,7 +1,7 @@ # # # The Nimrod Compiler -# (c) Copyright 2009 Andreas Rumpf +# (c) Copyright 2010 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -142,9 +142,9 @@ proc applyFilter(p: var TParsers, n: PNode, filename: string, stdin: PLLStream): result = filterReplace(stdin, filename, n) if f != filtNone: if gVerbosity >= 2: - rawMessage(hintCodeBegin) + rawMessage(hintCodeBegin, []) messageOut(result.s) - rawMessage(hintCodeEnd) + rawMessage(hintCodeEnd, []) proc evalPipe(p: var TParsers, n: PNode, filename: string, start: PLLStream): PLLStream = result = start diff --git a/tests/accept/compile/tconvcolors.nim b/tests/accept/compile/tconvcolors.nim new file mode 100755 index 0000000000..07e829550f --- /dev/null +++ b/tests/accept/compile/tconvcolors.nim @@ -0,0 +1,5 @@ + +import colors + +echo int32(colWhite), 'A' + diff --git a/tests/accept/compile/tdialogs.nim b/tests/accept/compile/tdialogs.nim index 90f241cdfa..d161a976de 100755 --- a/tests/accept/compile/tdialogs.nim +++ b/tests/accept/compile/tdialogs.nim @@ -2,7 +2,7 @@ import dialogs, gtk2 -gtk_nimrod_init() +gtk2.nimrod_init() var x = ChooseFilesToOpen(nil) for a in items(x): diff --git a/tests/accept/compile/tgtk.nim b/tests/accept/compile/tgtk.nim index cd9254e4f1..7febb0ab84 100755 --- a/tests/accept/compile/tgtk.nim +++ b/tests/accept/compile/tgtk.nim @@ -3,10 +3,10 @@ import gtk2, glib2, atk, gdk2, gdk2pixbuf, libglade2, pango, pangoutils -proc hello(widget: PGtkWidget, data: pointer) {.cdecl.} = +proc hello(widget: PWidget, data: pointer) {.cdecl.} = write(stdout, "Hello World\n") -proc delete_event(widget: PGtkWidget, event: PGdkEvent, +proc delete_event(widget: PWidget, event: PEvent, data: pointer): bool {.cdecl.} = # If you return FALSE in the "delete_event" signal handler, # GTK will emit the "destroy" signal. Returning TRUE means @@ -19,43 +19,33 @@ proc delete_event(widget: PGtkWidget, event: PGdkEvent, return false # Another callback -proc destroy(widget: PGtkWidget, data: pointer) {.cdecl.} = - gtk_main_quit() +proc mydestroy(widget: PWidget, data: pointer) {.cdecl.} = + gtk2.main_quit() -proc main() = +proc mymain() = # GtkWidget is the storage type for widgets - var - window: PGtkWindow - button: PGtkButton - - gtk_nimrod_init() - window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)) + gtk2.nimrod_init() + var window = window_new(gtk2.WINDOW_TOPLEVEL) discard g_signal_connect(window, "delete_event", Gcallback(delete_event), nil) - discard g_signal_connect(window, "destroy", Gcallback(destroy), nil) + discard g_signal_connect(window, "destroy", Gcallback(mydestroy), nil) # Sets the border width of the window. - gtk_container_set_border_width(window, 10) + set_border_width(window, 10) # Creates a new button with the label "Hello World". - button = GTK_BUTTON(gtk_button_new_with_label("Hello World")) + var button = button_new("Hello World") discard g_signal_connect(button, "clicked", Gcallback(hello), nil) - # This will cause the window to be destroyed by calling - # gtk_widget_destroy(window) when "clicked". Again, the destroy - # signal could come from here, or the window manager. - discard g_signal_connect_swapped(button, "clicked", - Gcallback(gtk_widget_destroy), window) - # This packs the button into the window (a gtk container). - gtk_container_add(window, button) + add(window, button) # The final step is to display this newly created widget. - gtk_widget_show(button) + show(button) # and the window - gtk_widget_show(window) + show(window) - gtk_main() + gtk2.main() -main() +mymain() diff --git a/tests/accept/compile/tlexer.nim b/tests/accept/compile/tlexer.nim index fe784280c0..f0fac8ec4e 100755 --- a/tests/accept/compile/tlexer.nim +++ b/tests/accept/compile/tlexer.nim @@ -18,7 +18,7 @@ proc splitText(txt: string): seq[string] # splits a text into several lines # the comment continues here # this is not easy to parse! -proc anotherSplit(txt: string): list[string] = +proc anotherSplit(txt: string): seq[string] = # the comment should belong to `anotherSplit`! # another problem: comments are statements! diff --git a/tests/accept/compile/tlibs.nim b/tests/accept/compile/tlibs.nim index e3b6bd4c33..990d6e58de 100755 --- a/tests/accept/compile/tlibs.nim +++ b/tests/accept/compile/tlibs.nim @@ -12,7 +12,10 @@ import cairowin32, cairoxlib, odbcsql, gl, glut, glu, glx, glext, wingl, - lua, lualib, lauxlib, mysql, sqlite3, python, tcl + lua, lualib, lauxlib, mysql, sqlite3, python, tcl, + db_postgres, db_mysql, db_sqlite, ropes, sockets, browsers, httpserver, + httpclient, parseutils, unidecode, xmldom, xmldomparser, xmltree, xmlparser, + htmlparser, re, graphics, colors when defined(linux): import diff --git a/tests/accept/compile/tnoargopenarray.nim b/tests/accept/compile/tnoargopenarray.nim new file mode 100644 index 0000000000..872ec86d2e --- /dev/null +++ b/tests/accept/compile/tnoargopenarray.nim @@ -0,0 +1,7 @@ + +import db_sqlite + +var db: TDbConn +Exec(db, sql"create table blabla()") + + diff --git a/tests/accept/run/spec.csv b/tests/accept/run/spec.csv index 0dc9a4baaa..d537c139f3 100755 --- a/tests/accept/run/spec.csv +++ b/tests/accept/run/spec.csv @@ -11,6 +11,7 @@ tbintree.nim;halloworld99110223 tbug499771.nim;TSubRange: 5 from 1 to 10 tbug511622.nim;3 tcasestm.nim;ayyy +tcgbug.nim; tclosure.nim;2 4 6 8 10 tcnstseq.nim;AngelikaAnneAnnaAnkaAnja tconstr2.nim;69 diff --git a/tests/accept/run/tcgbug.nim b/tests/accept/run/tcgbug.nim new file mode 100644 index 0000000000..320821fb61 --- /dev/null +++ b/tests/accept/run/tcgbug.nim @@ -0,0 +1,17 @@ + +type + TObj = object + x, y: int + PObj = ref TObj + +proc p(a: PObj) = + a.x = 0 + +proc q(a: var PObj) = + a.p() + +var + a: PObj +new(a) +q(a) + diff --git a/tests/accept/run/txmlgen.nim b/tests/accept/run/txmlgen.nim new file mode 100755 index 0000000000..56ca42d53c --- /dev/null +++ b/tests/accept/run/txmlgen.nim @@ -0,0 +1,6 @@ +import xmlgen + +var nim = "Nimrod" +echo h1(a(href="http://force7.de/nimrod", nim)) + + diff --git a/tests/accept/run/txmltree.nim b/tests/accept/run/txmltree.nim index efd7b07af7..2e5f525760 100755 --- a/tests/accept/run/txmltree.nim +++ b/tests/accept/run/txmltree.nim @@ -1,7 +1,7 @@ -import xmltree +import xmltree, strtabs -var x = <>a(href="nimrod.de", "www.nimrod-test.de") +var x = <>a(href="nimrod.de", newText("www.nimrod-test.de")) -echo x == "www.nimrod-test.de" +echo($x == "www.nimrod-test.de") diff --git a/tests/reject/spec.csv b/tests/reject/spec.csv index b01844a59a..c5e62354e6 100755 --- a/tests/reject/spec.csv +++ b/tests/reject/spec.csv @@ -5,11 +5,11 @@ tambsym2.nim;4;undeclared identifier: 'CreateRGBSurface' tambsym3.nim;6;ambiguous identifier tatomic.nim;2;identifier expected, but found 'atomic' tbind2.nim;7;ambiguous call -tbind4.nim;4;instantiation from here +tbind4.nim;4;undeclared identifier: 'lastId' tblock1.nim;9;undeclared identifier: 'ha' tconstr1.nim;20;type mismatch tillrec.nim;8;illegal recursion in type 'TIllegal' -tinc.nim;3;to var type a variable needs to be passed +tinc.nim;3;for a 'var' type a variable needs to be passed tinout.nim;7;for a 'var' type a variable needs to be passed tinvalidnewseq.nim;10;type mismatch: got (array[0..6, string], int) tinvwhen.nim;6;invalid indentation diff --git a/tests/reject/tambsym2.nim b/tests/reject/tambsym2.nim new file mode 100755 index 0000000000..d89cfb2dee --- /dev/null +++ b/tests/reject/tambsym2.nim @@ -0,0 +1,6 @@ + +from sdl import PSurface + +discard SDL.CreateRGBSurface(SDL.SWSURFACE, 23, 34, + 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xff000000) + diff --git a/tests/reject/tinc.nim b/tests/reject/tinc.nim index 3a27b50269..26fe32a416 100755 --- a/tests/reject/tinc.nim +++ b/tests/reject/tinc.nim @@ -1,5 +1,5 @@ var x = 0 -inc(x+1) #ERROR_MSG to var type a variable needs to be passed +inc(x+1) diff --git a/tests/tester.nim b/tests/tester.nim index eb7a7670df..be8f3b0ac8 100755 --- a/tests/tester.nim +++ b/tests/tester.nim @@ -23,7 +23,6 @@ type msg: string, err: bool] TOutp = tuple[file, outp: string] - TResult = tuple[test, expected, given: string, success: bool] TResults = object total, passed: int data: string @@ -100,7 +99,7 @@ proc colorBool(b: bool): string = const TableHeader4 = "" & "\n" - TableHeader3 = "
TestExpectedGivenSuccess
" & + TableHeader3 = "
TestExpected
" & "\n" TableFooter = "
TestGivenSuccess
\n" @@ -149,8 +148,6 @@ proc reject(r: var TResults, dir, options: string) = var expected = findSpec(specs, t) var given = callCompiler(test, options) cmpMsgs(r, specs[expected], given, t) - - if r.total > 3: break proc compile(r: var TResults, pattern, options: string) = for test in os.walkFiles(pattern): @@ -159,7 +156,6 @@ proc compile(r: var TResults, pattern, options: string) = var given = callCompiler(test, options) r.addResult(t, given.msg, not given.err) if not given.err: inc(r.passed) - if r.total > 3: break proc run(r: var TResults, dir, options: string) = var specs = parseRunData(dir) @@ -179,7 +175,6 @@ proc run(r: var TResults, dir, options: string) = r.addResult(t, expected.outp, buf, success) else: r.addResult(t, expected.outp, "executable not found", false) - if r.total > 3: break var options = "" var rejectRes = initResults() diff --git a/tools/sunset.tmpl b/tools/sunset.tmpl index 18f8b74d54..faa40a2953 100755 --- a/tools/sunset.tmpl +++ b/tools/sunset.tmpl @@ -65,7 +65,7 @@