analog-6.0/0000755000175000017500000000000010161303532012730 5ustar sret1sret100000000000000analog-6.0/docs/0000755000175000017500000000000010161303544013663 5ustar sret1sret100000000000000analog-6.0/docs/LicBSD.txt0000644000175000017500000000341210161303531015460 0ustar sret1sret100000000000000The function memmove() in utils.c is derived from the FreeBSD 2.2.6 source, and comes with the following copyright notice: /* * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * * 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. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ analog-6.0/docs/Licbzip2.txt0000644000175000017500000000331210161303531016075 0ustar sret1sret100000000000000This program, "bzip2" and associated library "libbzip2", are copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0.2 of 30 December 2001 analog-6.0/docs/Licgd.txt0000644000175000017500000000431410161303531015444 0ustar sret1sret100000000000000 In order to resolve any possible confusion regarding the authorship of gd, the following copyright statement covers all of the authors who have required such a statement. _If you are aware of any oversights in this copyright notice, please contact Thomas Boutell who will be pleased to correct them._ COPYRIGHT STATEMENT FOLLOWS THIS LINE Portions copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000 by Cold Spring Harbor Laboratory. Funded under Grant P41-RR02188 by the National Institutes of Health. Portions copyright 1996, 1997, 1998, 1999, 2000 by Boutell.Com, Inc. Portions relating to GD2 format copyright 1999, 2000 Philip Warner. Portions relating to PNG copyright 1999, 2000 Greg Roelofs. Portions relating to libttf copyright 1999, 2000 John Ellson (ellson@lucent.com). Portions relating to JPEG copyright 2000, Doug Becker and copyright (C) 1994-1998, Thomas G. Lane. This software is based in part on the work of the Independent JPEG Group. Portions relating to WBMP copyright 2000 Maurice Szmurlo. _Permission has been granted to copy, distribute and modify gd in any context without fee, including a commercial application, provided that this notice is present in user-accessible supporting documentation._ This does not affect your ownership of the derived work itself, and the intent is to assure proper credit for the authors of gd, not to interfere with your productive use of gd. If you have questions, ask. "Derived works" includes all programs that utilize the library. Credit must be given in user-accessible documentation. _This software is provided "AS IS."_ The copyright holders disclaim all warranties, either express or implied, including but not limited to implied warranties of merchantability and fitness for a particular purpose, with respect to this code and accompanying documentation. Although their code does not appear in gd 1.8.1, the authors wish to thank David Koblas, David Rowley, and Hutchison Avenue Software Corporation for their prior contributions. END OF COPYRIGHT STATEMENT analog-6.0/docs/Licpcre.txt0000644000175000017500000000202410161303531015777 0ustar sret1sret100000000000000Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- analog-6.0/docs/Licpng.txt0000644000175000017500000000455510161303531015645 0ustar sret1sret100000000000000COPYRIGHT NOTICE: Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. (libpng versions 0.5, May 1995, through 0.89c, May 1996) Copyright (c) 1996, 1997 Andreas Dilger (libpng versions 0.90, December 1996, through 0.96, May 1997) Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson (libpng versions 0.97, January 1998, through 1.0.6, March 21, 2000) For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: John Bowler Kevin Bracey Sam Bushell Andreas Dilger Magnus Holmgren Tom Lane Dave Martindale Glenn Randers-Pehrson Eric S. Raymond Greg Roelofs Guy Eric Schalnat Paul Schmidt Tom Tanner Willem van Schaik Tim Wegner The PNG Reference Library is supplied "AS IS". The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: 1. The origin of this source code must not be misrepresented. 2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. 3. This Copyright notice may not be removed or altered from any source or altered source distribution. The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. A "png_get_copyright" function is available, for convenient use in "about" boxes and the like: printf("%s",png_get_copyright(NULL)); Also, the PNG logo (in PNG format, of course) is supplied in the file "pngnow.png". Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a certification mark of the Open Source Initiative. Glenn Randers-Pehrson randeg@alum.rpi.edu March 21, 2000 analog-6.0/docs/Licunzip.txt0000644000175000017500000000245310161303531016221 0ustar sret1sret100000000000000 Copyright (C) 1998-2003 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Encryption and multi volume ZipFile (span) are not supported. Old compressions used by old PKZip 1.x are not supported I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. analog-6.0/docs/Liczlib.txt0000644000175000017500000000327110161303531016013 0ustar sret1sret100000000000000Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2002 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. analog-6.0/docs/Readme.html0000644000175000017500000000703610161303531015750 0ustar sret1sret100000000000000 Readme for analog -- introduction [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Introduction


Analog is a program which analyses logfiles from WWW servers. It works on almost any operating system. It is designed to be fast and to produce accurate and attractive statistics: and combined with Report Magic, you can generate even prettier reports. It's free software.

Although analog is free software, its distribution and modification are covered by the terms of the GNU General Public License. You are not required to accept this licence, but nothing else gives you permission to modify or distribute the program. Analog comes with no warranty.

Although analog is free, if you like it, please consider making a donation towards its development. Thank you.

This Readme describes analog 6.0. For the latest version of analog, see the analog home page. For examples of the output see

This Readme is split into several pages. Beginners should start with the licence followed by the section on Starting to use analog.

You can navigate through the Readme by using the links within each page or the choices at the top and bottom of each page. There is also a map showing the layout of the whole Readme, and an index page. For reading off line, or for printing, you can find a one-page version of the Readme on my site. (NB It's over 450kb long!)

You might also find the How-To's helpful; these are descriptions by other authors of how to use analog for particular tasks.

Now you can go to


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/acknow.html0000644000175000017500000002032610161303531016032 0ustar sret1sret100000000000000 Readme for analog -- acknowledgements [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Acknowledgements


Many people have helped me with analog, and I can't thank them all specifically. But I do appreciate everyone who's given me feedback or sent me bug reports.

Thanks are due to the author of getstats, Kevin Hughes. In the days before analog there were only three serious logfile analysis programs, and only one of them, getstats, had attractive output. I wrote analog when getstats stopped being able to cope with the size of our logfile, but my output was based on his, and still shows its parentage.

Thanks are also due to all those who helped in the early stages of writing this program, and gave me the encouragement to continue with analog and to release it publicly. Those who made helpful suggestions during the first few weeks of the program are numerous, but I must mention particularly Dan Anderson, Martyn Johnson, Joe Ramey, Chris Ritson, Quentin Stafford-Fraser and Dave Stanworth. Above all Gareth McCaughan gave me lots of programming advice. The early versions of the program would have run much more slowly without him.

My employer, ClickTracks, kindly let me continue to develop analog while I am working for them. More than that -- they even let me incorporate some code developed for ClickTracks into analog!

For six years, analog's home page was at my previous employer, the University of Cambridge Statistical Laboratory. Now it is provided by SourceForge. niccx.com donated the address analog.cx, and Takayuki Matsuki of Tokyo Kasei University and Peter Gradwell of gradwell dot com ltd provide DNS services.

meer.net very kindly provide the mailing lists for analog, as well as a mailbox for the analog-author mail. Thank you too to Aengus for administering the mailing lists, GMane for turning them into newsgroups, and all the services who provide list archives.

Thanks to Ian Jackson for providing official FTP and rsync sites for analog, and for hosting the old versions of the documentation. Many other people have provided mirror sites for analog, starting with Dave Stanworth (again!). The full list of mirror sites is listed elsewhere; thanks to all of them.

Mark Roedel first suggested porting analog to different platforms, and made the original DOS port. Shortly afterwards, Jason Linhart made the Mac port, and has continued to contribute lots of extra code for that platform and for the program in general. The Mac version also includes code contributed by Stephan Somogyi and Nigel Perry. Later ports were made by Dave Jones, Martin Zinser & Rick Dyson (OpenVMS), Magnus Hagander (Win32), Ivan Martinez (OS/2), Nick Smith & Stefan Bellon (RISC OS), Scott Tadman & Rob Judd (BeOS), Thomas Engel (NeXTSTEP), Martin Kraemer & Holger Schranz (BS2000/OSD, including EBCDIC support), and Hideyuki Yahagi (AS/400). Thank you also to the people who make precompiled versions available for various platforms.

The regular expression parsing is taken from Philip Hazel's PCRE library. The graphics use Thomas Boutell's gd library, the libpng library, and the zlib library by Jean-loup Gailly & Mark Adler. Logfile decompression uses the zlib library, Gilles Vollant's unzip library and Julian Seward's bzip2 library. Each of these libraries is subject to its own copyright and licensing conditions: PCRE licence, gd licence, libpng licence, zlib licence, unzip licence, bzip2 licence. If NEED_MEMMOVE is defined at compile time, then this product includes software developed by the University of California, Berkeley and its contributors (licence).

The XML output style was written by Per Jessen. The form interface is based on an idea by James Dean Palmer. The code to expand wildcards in directory names under Unix is by Owen Cliffe. Thanks to all the other people who have contributed bits of code too: I apologise for not having room to name all of them.

Thanks also to those who have written helper applications, for making analog more usable, and to those who have written How-To's, for sharing their experience of how to use analog in practical situations. And thanks to Alexander Toth for the Unix man page.

Many people have volunteered to translate analog into their own languages. Many thanks to the following who have contributed in this way over the years: Tigran Nazarian (Armenian), Jon Otegi (Basque), Emir Alikadic (Bosnian), Luchezar Georgiev (Bulgarian), Francesc Rocher, M. Mercè Llauge, Francesc Burrull i Mestres & Jordi Vidal (Catalan), Yang Meng & Che Dong (Simplified Chinese), Andrew Choi & Tzu-hsien Yu (Traditional Chinese), Tomo Sombolac (Croatian), Jan Simek & Karel Fajkus (Czech), Adrian Price (Danish), Ferry van het Groenewoud, Joost Baaij, Dimitry Smagghe, Bert Hiddink & Frank Fesevur (Dutch), Henrik Huhtinen, Steve Kelly, Andrew Staples, Mikko Silvonen, Juha Ojaniemi & Markus Peuhkuri (Finnish), Patrice Lafont, Lucien Vieira, Jean-Marc Coursimault, Lionel Delaude & Gordon Macpherson (French), Mario Ellebrecht, Martin Kraemer, Holger Schranz, Thomas Jacob, Thomas Frings, Georg Schwarz, Ralf Döring & Gustaf Mossakowski (German), Dimitris Xenakis (Greek), Laszlo Nemeth & Andras Kemeny (Hungarian), Gustaf Gustafsson & Valberg Larusson (Icelandic), Haris Hasanudin (Indonesian), Furio Ercolessi, Luca Andreucci, Alessio Bragadini & Marco Bernardini (Italian), Takayuki Matsuki, Stephen Obenski, Motonobu Takahashi, Kaori Chikenji & Kazuto Ishigaki (Japanese), Byungkwan Kim & InChang Oh (Korean), Jurijs Turjanskis & Anda Bimbere (Latvian), Ingrid (Lithuanian), Jan-Aage Bruvoll, Espen Bjarnø & Pål Løberg (Norwegian Bokmål), Magni Onsøien & Trond Øksendal (Norwegian Nynorsk), Wlodek Lapot, Tomek Wozniak & Marcin Sochacki (Polish), Ivan Martinez, Paulino Michelazzo & Ronan Lucio Pereira (Brazilian Portuguese), Jaime Carvalho e Silva (European Portuguese), Alex Mihaila (Romanian), San Sanych Timofeev, Boris Litvinenko, Vyacheslav Nikitich, Oleg Philon & Denis Zhukov (Russian), Mile Peric (Serbian), Stefan Billik & Dusan Zervan (Slovak), Andrej Zizmond & Dalibor Cvijetinoviè (Slovene), Javier Solis, Alexander Velasquez, Alfredo Sola, Martin Perez, Nelson Tactuk, Javier Kohan & J. L. García (Spanish), Björn Malmberg, Frank Osterberg, Wesley Schaal & Christian Rose (Swedish), Nezih Erkman & Dikran Diragormacioglu (Turkish), and Yaroslav Boychuk (Ukrainian).

Finally, thanks to all of you for using the program!


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/alias.html0000644000175000017500000002426510161303531015647 0ustar sret1sret100000000000000 Readme for analog -- aliases [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Aliases


After analog has read each logfile entry, it then applies aliases to each of the items. First, if you have a case insensitive filesystem, analog converts the filename to lower case. Usually analog assumes that Unix and BeOS filesystems are case sensitive and other systems are case insensitive. You might want to override its choice, if, for example, you have transferred files from one machine to another, so as to use the convention on the original machine. You can do this by the commands
CASE INSENSITIVE
CASE SENSITIVE
There are similar commands for usernames, if your logfile records these. By default, usernames are always case insensitive, but you can specify
USERCASE SENSITIVE
to override this.
Next it applies built-in aliases to each item. For example, it knows that %7E in a filename or referrer is equivalent to ~ and translates it accordingly. It also strips off the directory suffix from any filenames which have it. This suffix is normally index.html, but you can specify another one instead with a command such as
DIRSUFFIX default.htm
(You can only have one DIRSUFFIX.) There are other built-in aliases for other items: for example, hostnames are converted to lower case at this point.
After this, it applies user-specified aliases to each item. These aliases are useful if, for example, you know that two filenames correspond to the same file, or if you want to translate local hostnames to their internet equivalents. You specify aliases by commands like
FILEALIAS /football.html /soccer.html
HOSTALIAS lion lion.statslab.cam.ac.uk
There is also the special command FILEALIAS none, which cancels any other file aliases which might have been specified.

The alias commands for the other items are called BROWALIAS, REFALIAS, USERALIAS and VHOSTALIAS. Only one alias is ever applied to any item. So after

FILEALIAS /football.html /soccer.html
FILEALIAS /soccer.html /brazil.html
the file /soccer.html would get translated to /brazil.html, but /football.html would only get translated to /soccer.html and would not see the second alias.

You can also use wildcards in ALIAS commands: ? matches any one character and * matches any number of characters (including none). And on the right-hand side, you can use $1, $2 etc. to represent the parts of the original name matched by the *'s. As a special abbreviation, if there is exactly one * on the left-hand side, then a * on the right-hand side can be used to represent $1. So, for example,

FILEALIAS /*/football/* /soccer/
would translate /sport/football/rules.html to just /soccer/, but either of
FILEALIAS /*/football/* /$1/soccer/$2         # or
FILEALIAS /sport/football/* /sport/soccer/*
would translate /sport/football/rules.html to /sport/soccer/rules.html.

You can use $$ to get an actual $ on the right-hand side. Or you can prefix the right-hand side with "PLAIN:" to treat any $'s and *'s on the right-hand side literally. For example

FILEALIAS /*/football/* PLAIN:/$1/soccer/$2
would translate /sport/football/rules.html to exactly /$1/soccer/$2

Analog's *'s are un-greedy: if there are two possible ways of matching, the part of the expression on the left matches as little as possible. This is more often what you want. But it contrasts with Perl's regular expressions, for example. (Oh, two consecutive *'s are completely useless, but if you try it they are collapsed into one before counting the $1, $2, etc.)

The behaviour of FILEALIAS and REFALIAS can be slightly unintuitive if the file has search arguments.

A warning to Unix users: if you put an ALIAS command on the command line with +C, the shell may try and expand $1 etc., which is not what you want. To stop the shell doing this, put the command in single quotes instead of double quotes.


There is another set of alias commands, called output aliases. They don't alias items, but individual lines from particular reports (and they never combine lines, even if two lines end up with the same name). For example, the command
TYPEALIAS .txt ".txt (Plain text files)"
would provide an explanation of that line in the File Type Report.

There can be some confusion between some normal alias and output alias commands. For example, what is the difference between FILEALIAS and REQALIAS? In fact, there are several differences because of the different things the aliases are doing. FILEALIAS applies to the files themselves, but REQALIAS only applies to the lines in the Request Report. This means that FILEALIAS also affects the other reports which use the filenames, such as the Directory Report, whereas REQALIAS only affects the Request Report.

Another difference is that REQALIAS applies separately to each line of the Request Report. This means that if two separate files translate to the same thing in a FILEALIAS command, they will become one file for all the reports. But if you were to use the same REQALIAS command, they would still be two files, and would still be listed on separate lines in the Request Report, but with the same name.

So in summary, when should you use each command? FILEALIAS should be used if a single file has two different names; i.e., if your web server returns the same file for two different URLs. REQALIAS, on the other hand, would typically be used to annotate or clarify the Request Report. Sometimes it's useful to use both; first combine some files with FILEALIAS, and then annotate them in the Request Report with REQALIAS.

The full list of output aliases is REQALIAS, REDIRALIAS, FAILALIAS, TYPEALIAS, DIRALIAS, HOSTREPALIAS, REDIRHOSTALIAS, FAILHOSTALIAS, DOMALIAS, ORGALIAS, REFREPALIAS, REFSITEALIAS, REDIRREFALIAS, FAILREFALIAS, BROWREPALIAS, BROWSUMALIAS, OSALIAS, VHOSTREPALIAS, REDIRVHOSTREPALIAS, FAILVHOSTREPALIAS, USERREPALIAS, REDIRUSERALIAS and FAILUSERALIAS.

There is one known bug with the output aliases. The report is sorted before the alias is applied. This means that if the SORTBY for the report is set to ALPHABETICAL, then the report will not be sorted correctly.


You can also use regular expressions in the ALIAS commands. Sorry, I'm not going to teach you how to use regular expressions here if you don't already know: if you're on Unix try typing man perlre or man regex or man grep. There are lots of implementations of regular expressions. The ones which analog uses are Perl-syntax regular expressions. In general, these are a superset of the extended regular expressions used by Unix egrep or GNU grep -E.

You include regular expressions in an ALIAS command by prefixing the left-hand side of the alias with "REGEXP:". Or you can specify a case-insensitive match, like Perl m//i or Unix egrep -i, by using "REGEXPI:". (It's automatically case-insensitive for many items, such as hostnames, or filenames if you have specified CASE INSENSITIVE.)

On the right-hand side of the alias you can use $1, $2 etc. to represent the first, second etc. bracketed expression on the left-hand side, counting in order of the left brackets. (Again, you can't put $1, $2 etc. on the command line unless you put them in single quotes.)

Regular expressions match if they match just part of the string. If you want them to have to match the whole of the string, you have to anchor them to the ends of the string with ^ and $.

For example,

REQALIAS REGEXP:^(/~(.+?)/.*) "[$2] $1"
would translate
/~sret1/backgammon/rules.html
to
[sret1] /~sret1/backgammon/rules.html
in the Request Report. Or
HOSTALIAS REGEXP:^([^.]*)$ $1.mycompany.com
would add .mycompany.com to all hostnames not containing a dot. (See the FAQ for a discussion about whether this is a good idea.)

Regular expressions are greedy: if there are two possible ways of matching, the part of the expression on the left matches as much as possible.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/analogo.gif0000644000175000017500000000106710161303531015772 0ustar sret1sret100000000000000GIF89a66ٿ!,66X0JԼ82`p'YzEp,` `/E. P $SR}l(# 9}q7ڸ<.پ["HExvhv@z#QaVFCYwhxAPUaS}Qk7OTc>xu7]<}Gsi:cB~LYwn|lmSƙ䘼GMpLjޟռ⍚ߠSjCl%TK>wE'f\#aH(aPuuGkk%!E&*&+`9Up R8wShsKd ;^]*YjLb(m`vآM"B+n@9i1RUc )LW}sv.}(Wy"OH [g_О':ߧ.vXm{Ц7hR ~Lg'L2RMZwUwO7Tx@Ͼ{$FO</;analog-6.0/docs/anlgdocs.css0000644000175000017500000000022310161303531016160 0ustar sret1sret100000000000000body { background-color: white; color: black } h1, h2, h3, h4, h5, h6 { font-family: Arial, Helvetica, sans-serif } /* Last updated 08-Jul-2000 */ analog-6.0/docs/args.html0000644000175000017500000002241410161303531015504 0ustar sret1sret100000000000000 Readme for analog -- search arguments [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Search arguments


Sometimes a URL contains arguments after a question mark. For example, the URL
/cgi-bin/script.pl?x=1&y=2
runs the /cgi-bin/script.pl program with arguments x=1 and y=2. (Sometimes the server records these arguments in a separate field in the logfile, but if so you can use the %q field in the LOGFORMAT command, and analog will translate the filename to the above format).

You can tell analog either to read or to ignore the arguments using the commands ARGSINCLUDE and ARGSEXCLUDE which we'll discuss in a minute. But by default, all arguments are read, and as this is usually what you want, you don't usually need those commands.

You don't always see the arguments in the reports, even if they're being read, because analog doesn't show them if there aren't enough of them. In order to see them, you have to set the corresponding ARGSFLOOR parameter low enough.

Also note that within a report, the search arguments are listed immediately under the file to which they refer. This temporarily interrupts the normal order of the files. It may be clearer if you turn the N column on.


Assuming that the arguments are being read, analog treats the file /cgi-bin/script.pl?x=1&y=2 as a different file from /cgi-bin/script.pl (or from /cgi-bin/script.pl?y=2&x=1 for that matter). It doesn't look like that in the Request Report because you see a grand total for /cgi-bin/script.pl with all its different arguments. But it matters if you want to do inclusions and exclusions or aliases on the file.

The reason is that, for example, the command

FILEINCLUDE /cgi-bin/script.pl
doesn't match the file /cgi-bin/script.pl?x=1&y=2. To match that, you would have to use something like
FILEINCLUDE /cgi-bin/script.pl*
instead. Similarly
FILEALIAS /cgi-bin/script.pl /script.pl
will change /cgi-bin/script.pl itself, but not /cgi-bin/script.pl?x=1&y=2. You might want to use something like
FILEALIAS /cgi-bin/script.pl?* /script.pl?$1
as well. (However, PAGEINCLUDE and PAGEEXCLUDE always refer to the part of the filename before the question mark.)

Conversely, because in the Request Report files with arguments are only included if their parent file is included, you can't just

REQINCLUDE /cgi-bin/script.pl?*x=1*
or you will end up with nothing listed. You have to
REQINCLUDE /cgi-bin/script.pl
as well.
The alternative is to tell analog not to read the search arguments. There are commands called ARGSINCLUDE and ARGSEXCLUDE, and REFARGSINCLUDE and REFARGSEXCLUDE, to do this. They work the same as the other INCLUDE and EXCLUDE commands which we discussed in the previous section. So, for example, if the command
ARGSEXCLUDE /cgi-bin/script.pl
were given, analog would ignore the arguments to that file, and so read /cgi-bin/script.pl?x=1&y=2 as just /cgi-bin/script.pl. On the other hand, if
ARGSINCLUDE /cgi-bin/script.pl
were specified, analog would read the arguments, and so treat /cgi-bin/script.pl?x=1&y=2 as a different file from /cgi-bin/script.pl. REFARGSINCLUDE and REFARGSEXCLUDE are the same for referrers.

Technical note: the check for whether the arguments should be included happens before the filename has been subject to either built-in or user-specified aliases. So you have to use the unaliased name, exactly as it occurs in the logfile. For example, ARGSINCLUDE /~sret1/script.pl won't match /%7Esret1/script.pl even though they are really the same file. It also means that you can't use "pages" in the ARGSINCLUDE or ARGSEXCLUDE command, because we don't know whether a file is a page until after it's been aliased.


There are related commands called SEARCHENGINE and INTSEARCHENGINE. If you have referrers with search arguments, usually from search engines, you can tell analog which field corresponds to the search term. It uses this information to compile the Search Query Report and the Search Word Report. For example, consider the referrer
http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&q=carrot+cake
The search term is in the field q= so the appropriate SEARCHENGINE command is
SEARCHENGINE http://www.altavista.com/cgi-bin/query q
(or even better
SEARCHENGINE http://*altavista.*/* q
to allow for all their mirror sites in different countries.)

The command INTSEARCHENGINE is the same for search engines, or other scripts which take arguments, within your site. For example, you might have requests for files like

/cgi-bin/search?trm=chocolate+cake
in which case you would specify
INTSEARCHENGINE /cgi-bin/search trm
and (assuming you haven't done an ARGSEXCLUDE for that file) "chocolate cake" would then appear in your Internal Search Query Report.

Sometimes a search engine has two or more possible fields for the search term. In that case you can list all of them separated by commas, like this:

SEARCHENGINE http://*webcrawler.*/* search,searchText

The rest of this section is a bit technical, and you usually don't need to worry about it. On a first reading, you probably want to skip it.

I said previously that %7E in a URL is automatically converted to ~, etc. In fact this is only done to the ASCII-printable characters %20-%7E, because these are the only characters that are the same in every character set. (In fact, even that isn't true. Experts might want to know that ?, &, ; and = aren't converted either, to distinguish them from query-string delimiters: an encoded ?, &, ; or = is one that is not intended to be a delimiter. Also % isn't converted, to avoid confusing %25nm with %nm.)

But in the Search Query Report and Search Word Report it is useful to be able to convert non-ASCII characters too, so that you can see the actual words people typed, rather than get the %nm codes in place of all accented letters. So in these reports analog also converts characters %A0-%FF (if you are using an ISO-8859-* character set) or %80-%FF (for most other character sets).

However, there are reasons why you might not want this feature, and you can turn it off with the command

SEARCHCHARCONVERT OFF
These reasons include:
  1. The character set in which the query was submitted to the search engine may not be the same as that in which the page reached was written, or that in which the analog output page is being written. So converting to the character set of the analog output page may give garbage anyway. This is particularly a problem with languages, such as Russian, which have two or more characters sets in common use. It is also a problem for sites which host resources in many languages.
  2. Not all of the character positions correspond to printable characters in every character set. Analog knows that %80-%9F are non-printable in the ISO-8859-* character sets, but apart from that it converts everything in %80-%FF. So you may end up with non-printable characters in your output.
SEARCHCHARCONVERT is always turned off if the output is in ASCII; and it defaults to off if the output is in a multibyte character set because it doesn't work well in that case.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/bara8.gif0000644000175000017500000000006210161303531015341 0ustar sret1sret100000000000000GIF87a@33,@ڋ޼;analog-6.0/docs/barb1.gif0000644000175000017500000000010310161303531015327 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,N)譋^;analog-6.0/docs/barb32.gif0000644000175000017500000000024510161303531015422 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,r0I8ͻ_A(dihlp,t- x|pH,Ȥr ШtJZجvzx %zn|N\~ ;analog-6.0/docs/barb8.gif0000644000175000017500000000014410161303531015343 0ustar sret1sret100000000000000GIF87a@xxXXFF3300&&,@108;`(di9lp,2ax|pH,$2;analog-6.0/docs/barc8.gif0000644000175000017500000000022110161303531015340 0ustar sret1sret100000000000000GIF87a@xxXXFF3300&&,@^P59e|evbI LǶP9#$Oett2vr^B7?cY08΃t*BT;Fx,Nf2VgwP~|~w{y ;analog-6.0/docs/barh8.gif0000644000175000017500000000030210161303531015345 0ustar sret1sret100000000000000GIF87a@xxFXX0FF j33[00P&&Bf,@w T8,:mW}8骶t}AmR(7ax& Df27rz,d6@.%Ao@#{ w~{  ;analog-6.0/docs/bari8.gif0000644000175000017500000000014710161303531015355 0ustar sret1sret100000000000000GIF87a@33XXxxЉ&&,@408;`(di9lp,rj8|OPH(Ȥrl2;analog-6.0/docs/barj8.gif0000644000175000017500000000027110161303531015354 0ustar sret1sret100000000000000GIF87a@33[XX0xxF&&Bf,@n)RW`栮*{«z>?cY08΃t*BT;F%YL4& n8NNH;^O ;analog-6.0/docs/basiccmd.html0000644000175000017500000001760410161303531016322 0ustar sret1sret100000000000000 Readme for analog -- basic commands [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Basic commands


Here is a list of basic configuration commands to get you started with analog. These commands should be added to your configuration file, analog.cfg, as explained in the section on Starting to use analog. We'll see all the possible configuration commands in later sections. Or you can read a summary of the commands which control each report in the section on Analog's reports.
Analog reads logfiles produced by your web server, and produces an output file based on the data in them. So you need to know how to specify which logfile to read, and which file to send the output to. The relevant commands look like
LOGFILE my_logfile
OUTFILE output.html
where, of course, you should substitute the names of the files you want to use. The logfile must be stored locally -- analog won't use FTP or HTTP to fetch it from the internet, so you may have to fetch it yourself first. You can read several logfiles by giving several logfile commands, or by giving a comma-separated list, or by using wildcards in the logfile name. So, for example, if you use the commands
LOGFILE new1.log,old*.log
LOGFILE new2.log
analog will analyse the logfiles new1.log, new2.log, and all the old logfiles. Analog will recognise logfiles in several different formats. You can read more about this in the section on Choosing a logfile.
There are a couple of other commands you need to know right at the beginning, not because they're particularly important in themselves, but because the output will look silly if you don't know them. First, you need to know how to put your own organisation's name and URL at the top of the output. For this, you need two commands such as
HOSTNAME "Spam Widgets Inc."
HOSTURL http://www.spam-widgets.com/

If you have broken images in the output instead of graphs, you need to say in which directory on your server the images are stored. You do this by a command like

IMAGEDIR /analog/images/
(This is just put in the <img> tags in the output page, so it's the URL of a directory, not the name of the directory on your disk. The images are distributed with the program - you will have to move them to whichever directory you choose.)
Next you will want to know how to turn individual reports on and off. Analog can produce up to 44 different reports if your web server has been configured to record the necessary data in your logfiles, but here are the most important ones. Try them and see what happens. You can turn each report on with an ON command, or off with an OFF command. You can also use the commands ALL ON and ALL OFF to turn all reports on or off.
MONTHLY ON       # one line for each month
WEEKLY ON        # one line for each week
DAILYREP ON      # one line for each day
DAILYSUM ON      # one line for each day of the week
HOURLYREP ON     # one line for each hour of the day
GENERAL ON       # the General Summary at the top
REQUEST ON       # which files were requested
FAILURE ON       # which files were not found
DIRECTORY ON     # Directory Report
HOST ON          # which computers requested files
ORGANISATION ON  # which organisations they were from
DOMAIN ON        # which countries they were in
REFERRER ON      # where people followed links from
FAILREF ON       # where people followed broken links from
SEARCHQUERY ON   # the phrases and words they used...
SEARCHWORD ON    # ...to find you from search engines
BROWSERSUM ON    # which browser types people were using
OSREP ON         # and which operating systems
FILETYPE ON      # types of file requested
SIZE ON          # sizes of files requested
STATUS ON        # number of each type of success and failure
The full list of reports is in the section on Configuring the output. Some reports, for example the Referrer, Browser and Operating System Reports, will only appear if your web server has been configured to record the necessary data in its logfiles.

You can configure lots of other things about each report, such as how many rows are listed, which columns are included, and how the reports are sorted. For example, the command

REQINCLUDE pages
tells analog only to list pages, rather than all files, in the Request Report, and
REQFLOOR 10r
tells analog to include in the Request Report all files with at least 10 requests. You can read a summary of all the reports and the commands which control them in the section on Analog's reports.
You can have the output in several different languages, by using a LANGUAGE command. For example, the command
LANGUAGE FRENCH
will give you the output in French. The available languages at the moment include ARMENIAN, BASQUE, BULGARIAN, CATALAN, SIMP-CHINESE (GB2312), TRAD-CHINESE (Big5), CZECH, DANISH, DUTCH, ENGLISH, US-ENGLISH, FINNISH, FRENCH, GERMAN, HUNGARIAN, INDONESIAN, ITALIAN, JAPANESE, KOREAN, LATVIAN, NORWEGIAN (Bokmål), NYNORSK, POLISH, PORTUGUESE, BR-PORTUGUESE, RUSSIAN, SERBIAN, SLOVAK, SLOVENE, SPANISH, SWEDISH, TURKISH and UKRAINIAN.

The following languages were available for previous versions of analog, but have not yet been translated for version 5: BOSNIAN, CROATIAN, GREEK, ICELANDIC, LITHUANIAN and ROMANIAN. As and when they are translated, they will be added to the analog home page. See the section on Configuring the output for how to download, or even translate, new languages.


Two other common things you might want to do are to alias files or hosts (for example, to tell analog that two different filenames are really the same file), or to include or exclude certain files, hosts or dates (to ignore accesses from your site, for example, or to do an analysis only of a certain subdirectory or a certain time period). For these, see the later sections on Aliases and Inclusions and exclusions.

As I said, these are only a few of the commands available. To find out about all the commands, you'll have to read the remaining sections of the Readme, starting with a short section on the syntax of configuration commands.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/cache.html0000644000175000017500000002300610161303531015611 0ustar sret1sret100000000000000 Readme for analog -- cache files [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Cache files


Analog has the ability to archive some of the data in your logfile into a cache file so that the logfile can be thrown away without losing the most important data. (This is sometimes known as incremental processing.)

For most people, the cache file will not be needed: compressing the logfile using a standard compression utility such as gzip will be sufficient. Compressing a logfile is very efficient owing to the large number of repeated strings: I find about 12 times compression in practice. That in itself may solve your filespace problems, without needing to throw away any information.

The cache file is also not the best format for post-processing the data or feeding it into a spreadsheet. For that you should use the computer-readable output style.

Many people have trouble using the cache file, and end up accidentally recording corrupt data. You do need to understand what you're doing before you throw away your logfiles. See the discussion on Procedures below.

If you are going to use the cache file feature, it is also very important that you understand what is and what is not recorded. The summary is that all INCLUDE and EXCLUDE commands, including FROM and TO, and any ALIASes and LOGTIMEOFFSETs, must be applied when you create the cache file, not when you read it later. If you want different sets of options, you must create several cache files from the same logfile.

The reason for this is that it is not possible to reconstruct everything of interest in the logfile from the cache file. The cache file does contain information about the total number of requests for each host and each file, but not about, for example, which files were read by which hosts. (To do so would take up as much disk space as the compressed logfile.) So you cannot later look at only one file and see which hosts read that file.

Another way to look at this: if you do, for example, a HOSTEXCLUDE when reading the cache file, you are not doing a genuine HOSTEXCLUDE because files that that host read will still be included. You are only excluding those hosts from the Host Report, Organisation Report and Domain Report. This is why you must do all the inclusions and exclusions you want when you create the cache file.

When analog reads in a cache file, it does not apply any more aliases to the items. This is to avoid double-aliasing. So you must do any aliases you want at the time you create the cache file. Similarly, it does not obey the LOGTIMEOFFSET variable, to avoid double-offsetting, so any offset you want must be applied at cache-creation time too.

Also, the cache file does not contain data about the number of requests for each item in the last seven days: it can't, because the figures will be different by the time they are wanted.

Finally, times are only recorded to five-minute resolution.


You can create a cache file by setting the CACHEOUTFILE to be the file you want the cache to live in. Set
CACHEOUTFILE none
to turn it off again. You will still get the regular output as well as the cache output, unless you request OUTPUT NONE. To avoid overwriting, you cannot set the CACHEOUTFILE to be a file which already exists. (Disclaimer: on some systems, race conditions may very occasionally thwart this check. Also on a few systems, making the file writeable but not readable will allow it to be overwritten). You can include the date in the name of the CACHEFILE and CACHEOUTFILE in the same way as described earlier for the LOGFILE and OUTFILE.

You can read in a previously-made cache file with the CACHEFILE command, or with the +U command line option. This works exactly the same as the LOGFILE command, so you can use commas and wildcards to read in several cache files, and read compressed cache files using the UNCOMPRESS mechanism.

If the name of the CACHEFILE or the CACHEOUTFILE doesn't include a directory, it will be looked for, or written to, wherever analog expects to find its cache files. (This location is built in when the program is compiled.) For example, on Windows it would be in the same folder as the analog executable. But a cache file specified in a +U command line option is within the current directory.

It is possible (and useful) to analyse some CACHEFILEs and some LOGFILEs together. LOGFILE and CACHEFILE commands are basically cumulative, except that any logfiles and cache files in the mandatory configuration file or configuration files loaded from there override any on the command line or in configuration files specified on the command line, which themselves override any in the default configuration file or configuration files loaded from there, which in turn override compile-time options. Usually you don't need to worry about this, and it will do what you expect.

Sometimes you don't want to record all the types of item in the cache file. You might want to forget about which hosts had accessed your web site, for example, and only remember how many times each file was requested. You can choose not to include one type of item in the cache file by setting its LOWMEM to 3; for example, specify

HOSTLOWMEM 3
to exclude hosts from the cache file. Because this is a serious step, analog will produce a warning if you do this. You can even set all six LOWMEMs to 3 if you just want to remember the pattern of requests over time, not even which files were requested.

Procedures

Many people have trouble when they try and use cache files, and end up omitting data or double-counting. You have to be careful to make sure that each piece of data is recorded in exactly one cache file. One very common mistake is to use all the old cache files when making each new cache file. Because each piece of data is then in all of the cache files, when you make a new cache file, it will record each piece of data several times over. If analog gives you a "double-counting" warning when you create a cache file, you have probably done something of this sort wrong.

Here is one way to use the cache files correctly. It's not the only correct way, but I think it's conceptually the simplest. The idea is that whenever you start a new logfile, you make a cache file out of the old logfile. So each cache file contains all the data from one, and only one, logfile. You never use old cache files to make new ones: so you never have a CACHEFILE and a CACHEOUTFILE command in the same configuration file.

Here is the procedure.

  1. Rotate your logs: that means, archive the old logfile, and restart the server with a fresh logfile. (There are several standard tools to do this: or see your server documentation.)
  2. Make both a cache file and an ordinary report from the old logfile. You can do this simultaneously by using one LOGFILE command, one OUTFILE command, and one CACHEOUTFILE command.
  3. Make a test report from the cache file (using CACHEFILE and OUTFILE but no LOGFILE) and compare it against the report from the logfile to check it works. (This step really is worth doing!)
  4. Now you can throw away the old logfile, if you've really understood what data you're losing by doing so. (But please remember that I can take no responsibility if something goes wrong: see the licence.)
  5. When you want to make the main report, you can now use all your cache files and the current (not-yet-cached) logfile.
As explained above, all INCLUDE and EXCLUDE commands, including FROM and TO, and any ALIASes and LOGTIMEOFFSETs, must be applied when you create the cache file, not when you read it later. So you may want to create several cache files from each logfile with different sets of options. Of course, in this case, you musn't later mix cache files made with different options.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/compout.html0000644000175000017500000001422410161303532016237 0ustar sret1sret100000000000000 Readme for analog -- computer output style [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Computer-readable output style


This section describes the computer-readable output style. You can select this style by the command
OUTPUT COMPUTER
This style is designed to be easy to read into spreadsheets, or post-process with graphics creation tools, for example. You can find some programs which use this style on the helper applications page. However, the computer-readable output style is not suitable for reading back into analog to create later reports: for that job, use the cache files described in the next section.

Each line in the output is separated into fields by means of a special string. You can specify this string by means of the COMPSEP command; for example, you could use

COMPSEP ,
for CSV (comma separated value) format. Or you can use
COMPSEP \t
to separate fields with a tab. Make sure not to use anything that might occur in the output: for example, a single or double space would not be suitable.
Each line in the preformatted output begins with a letter indicating which report the line is part of. (The code letters for the reports are listed in the section on Configuring the Output.)

After that, there follows a field indicating the remaining columns in the report (using the letters RrSsPpQqBbCcDdEeN as usual). In hierarchical reports (including the reports which can show search arguments) there is an additional column l at the beginning, indicating the level in the hierarchy.

Finally there are the numerical data for each column and then the name of the item. Times actually take up several fields: year, month, date, hour & minute, or as many of those as are necessary to identify the time. (Year and quarter in the case of the Quarterly Report).

So here is an example line from the Domain Report, showing the third-level domain cam.ac.uk with 43 requests and 3.516% of the bytes.

o     lRb     3     43     3.516     cam.ac.uk

The last line of most time reports indicates the busiest time period. After the report letter comes *BT, followed by the letter R, P or B for the GRAPH method, followed by the number of requests, pages or bytes respectively for the busiest time period, followed by the time period itself.

The first lines of non-time reports can also contain overall information about the report. First, if the REPORTSPAN for the report is wanted, it will be listed in lines with *FR and *LR instead of the normal column letters. Then there is a line listing the floor and sortby for the report. It has *f instead of the normal column letters, followed by the floor in the form it would be written for a FLOOR command, followed by the SORTBY using the code letters

r
REQUESTS
s
REQUESTS
p
PAGES
q
PAGES
b
BYTES
c
BYTES
d
DATE
a
ALPHABETICAL
x
RANDOM

The general summary is a bit different. After an initial x, there is a two-character code saying what the line contains. The possible codes are
VE
Version of analog
HN
HOSTNAME
HU
HOSTURL
PS
Program start time
FR
Time of first request
LR
Time of last request
E7
Time last 7 days ends
SR
Total successful requests
S7
Total successful requests in last 7 days
PR
Total successful requests for pages
P7
Total successful requests for pages in last 7 days
FL
Total failed requests
F7
Total failed requests in last 7 days
RR
Total redirected requests
R7
Total redirected requests in last 7 days
NC
Logfile lines without status code
C7
Lines without status code in last 7 days
NF
Number of distinct files requested
N7
Number of distinct files requested in last 7 days
NH
Number of distinct hosts served
H7
Number of distinct hosts served in last 7 days
CL
Number of corrupt lines in the logfile
UL
Number of unwanted lines in the logfile
BT
Total number of bytes transferred
B7
Total number of bytes transferred in last 7 days
Which lines are listed is still controlled by the GENSUMLINES command. This implies that if you turn a line off, you turn off its "last 7 days" version too.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/custom.html0000644000175000017500000000534310161303532016065 0ustar sret1sret100000000000000 Readme for analog -- customising analog [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Customising analog


This is the bulk of the Readme. It tells you all the commands you can give to analog, and what they all do. First there's a list of which is as much as beginners need to read, until they want to do something which isn't listed there, or are curious to find out what they could do.

The following section is a technical (i.e., dull but important) one on the

Then there's documentation on all the configuration commands in the following categories. Analog has over 200 configuration commands and over 40 command line options, so sometimes these sections turn into lists of commands. But here's where you find out everything you can do with analog.

Later there's an index of all the commands and topics, and also a quick reference containing the syntax of all the commands and examples.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/debug.html0000644000175000017500000001567410161303532015651 0ustar sret1sret100000000000000 Readme for analog -- debugging [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Debugging


This section lists commands to help you debug analog, if you think it's going wrong. There's another section later which lists all the errors and warnings which analog can generate, and what they all mean, and another section which tells you how to report bugs.

First, remember the option we mentioned before, to list the current settings of all of analog's variables. To get this, just put -settings on the command line, or SETTINGS ON in one of your configuration files, along with your other commands. Then analog will produce the list of settings instead of running in the normal way.


There are commands which control how much debugging information and warning information analog gives out while it is running. By default you get all the warnings and no debugging, but you can change this by means of the commands DEBUG and WARNINGS. If you say
DEBUG ON
you get all the debugging. (And DEBUG OFF turns it all off.) You can also get just certain categories of debugging. The categories are
C
list all corrupt logfile lines
D
information about DNS lookups
F
information about file opening and closing
S
summary information about each logfile when it's closed
U
list unknown domains
V
list hosts without a domain (i.e., without a dot)
So, for example, the command
DEBUG FS
would give you information about file opening and closing, and what was in each logfile, but none of the other sorts of debugging. Each line of debugging information is prepended with its code letter. You can also specify
DEBUG +CD
to add C and D category debugging to whatever you've already got, and
DEBUG -CD
to remove those two categories.

There is also a command line abbreviation for this command. Use +V (for ON), -V (for OFF), +VFS (to select exactly options FS), +V+FS (to add those options), and +V-FS (to remove them).

The C messages actually come on two lines. The first line gives the logfile line which was corrupt. The second line indicates where analog first noticed a problem. (This is usually, but not always, close to where the problem actually was!) In fact, each "line" of the message may spread over more than one line on your screen, and you have to be careful to take that into account when trying to find out where the logfile line was corrupt.


The WARNINGS command acts similarly to the DEBUG command (see the syntax above). By default all warnings are on. As well as WARNINGS ON and WARNINGS OFF, you can turn warnings on and off in the following categories.
C
invalid configuration specified
D
dubious configuration specified
E
ERRFILE command used (see below)
F
files missing or corrupt
L
apparent problems in logfiles
M
possible problems in logfiles
R
turning off empty reports
See the section on Errors and warnings for more details about the various categories. Again, warnings are printed with their code letters.

Warnings range from the probably harmless to the usually serious. So it is generally not a good idea to turn all warnings off, or you might miss some important information. If you want to ignore a particular warning, turn just its category off.

There is also a command line version of the WARNINGS command, looking like +q, -q, +q<options>, +q+<options> or +q-<options>. (The syntax is the same as the +V command above.)


By default all these messages go to standard error, which is normally just the screen. But you can change that by means of a command like
ERRFILE newfile
If you do this, analog will warn you that it's redirecting the messages, just so that you don't miss any. To change back to standard error, use
ERRFILE stderr
The ERRFILE command will also erase any previous contents of that file. (So don't use the same ERRFILE command twice, or you may lose messages!) If the name of the ERRFILE doesn't include a directory, it will be put in whichever directory was specified for that purpose when the program was compiled. For example, on Windows it would be in the same folder as the analog executable.
There is a command called ERRLINELENGTH to tell analog the width of screen you want these messages to fit in. As a special case,
ERRLINELENGTH 0
specifies an unlimited screen width.
There is one more command which is useful when trying to debug analog. If you give the command
PROGRESSFREQ 20000  # say
then analog will produce a little message after every 20,000 lines it reads from the logfile. (This message is sent to the screen and to the ERRFILE.) This is useful to determine whether the program has really stopped or (as is more likely) is just being slow for some reason (such as using DNS lookups).
There is just one more section about analog's configuration commands and command line arguments, but it's a rather long one, on the form interface. (This is a way of running analog by selecting options from a web page.) You might prefer to go straight onto the section on What the results mean.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/defns.html0000644000175000017500000001641110161303532015650 0ustar sret1sret100000000000000 Readme for analog -- analog's definitions [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Analog's definitions


This section describes how analog defines its terms, and exactly what is counted in each category. It gets a bit technical at times -- if you're just trying to understand the output, I recommend you read the section on Analog's reports first.

We start with some basic definitions. The host is the computer which has asked you for a file (often called the "client"). The file might be a page (i.e., an HTML document) or it might be something else, such as an image. By default filenames ending in (case insensitive) .html, .htm, or / count as pages, but you can tell analog to count any file as a page with the PAGEINCLUDE command.

The total requests counts all the files which have been requested, including pages, graphics, etc. (Some people call this the number of hits, but that word is also used in other ways by other people, so I avoid it). The requests for pages obviously only counts pages. One user can generate many requests by requesting lots of different files, or the same file many times.

The referrer for a request is the place that the user (or his computer) heard about your file from. If he followed a link to reach a page, it will be the previous page. In the case of a graphic on a page, the referrer will be the page containing the graphic.

Analog's kilobytes are 1024 bytes. (If you prefer to call these kibibytes, you can do so by editing your language file.)


Analog recognises four categories of request, based on the HTTP status code of the request. You can see the total number of requests for each status code, and what the codes mean, in the Status Code Report. (Or see the HTTP spec for a detailed description.)

First, successful requests are those with HTTP status codes in the 200's (where the document was returned) or with code 304 (where the document was requested but was not needed because it had not been recently modified and the user could use a cached copy). (Actually, you can configure code 304 to be a redirected request instead of a successful request with the 304ISSUCCESS command.) Successful requests for pages refers to those lines on which the file requested was named and was a page.

Redirected requests are those with other codes in the 300's, indicating that the user was directed to a different file instead. The most common cause of these requests is that the user has incorrectly requested a directory name without the trailing slash. The server replies with a redirection ("you probably mean the following") and the user then makes a second connection to get the correct document (although usually the browser does it automatically without the user's intervention or knowledge). The other common cause of redirected requests is their use as "click-thru" advertising banners.

Failed requests are those with codes in the 400's (error in request) or 500's (server error). They come about for a variety of reasons, but the most common are when the requested file is not found or is read-protected.

Finally, requests returning informational status code are those with status codes in the 100's. These are very rare at the moment.

There are a few other types of logfile lines listed in the General Summary. Lines without status code refers to those logfile lines without a status code, and the successful requests in the General Summary only counts the ones with a status code: except if the line contains the name of the file requested, and the filename is being counted (not starred in the LOGFORMAT), then it's counted as a success. Unwanted logfile entries are ones which you have explicitly excluded. Finally, corrupt logfile lines are those which analog didn't manage to parse. (The number given is the number of unparseable lines in the whole logfile, even if the rest of the analysis is restricted to a small part of the logfile, because analog doesn't know whether a line would have been wanted if it couldn't parse it! You can list all the corrupt lines by turning debugging on.)


Most reports only include successful requests in calculating the number of requests, requests for pages, bytes, and last date: unless, of course, the report is a redirection or failure report. There is a further restriction on the time reports, the Status Code Report, the Processing Time Report, the File Size Report, and the bytes lines in the General Summary: the logfile line must also contain the name of the file requested, and the filename must be being counted. This is necessary to stop double counting if the server uses separate logs.

The "not listed" line at the bottom of each of the non-time reports represents those items which were not listed because they were below the floor for the report. (It doesn't include items which you've explicitly excluded.)

The figures in parentheses in the General Summary are for the last seven days: either the seven days before the TO time, or if no TO time is given, the seven days before the time of the program start. (It would be nicer to use the seven days before the last time in the logfile, but we don't know when this is until we've read the whole logfile, and by then it's too late.) The figures for the last seven days are not included if all, or none, of the requests fall in the last seven days.

In the Domain Report, "domain not given" means that the hostname did not contain a dot. "Unknown domain" means that it did contain a dot, but that the domain name was not in the domains file (or that the domains file could not be read). The hosts and domains concerned can be listed by turning debugging on.

In the Operating System Report, which browsers count as robots is controlled by the ROBOTINCLUDE and ROBOTEXCLUDE commands.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/dns.html0000644000175000017500000001456010161303532015340 0ustar sret1sret100000000000000 Readme for analog -- DNS lookups [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: DNS lookups


Sometimes a logfile contains numerical IP addresses - like 131.111.20.59 - for the computers that have visited you, instead of names like lion.statslab.cam.ac.uk. This section describes how you can get analog to do so-called DNS lookups to translate these numbers into names. This relies on you having a suitably configured system: DNS lookups are not possible on some systems.

First a note. Because analog's DNS lookups use only standard, platform-independent code, they are slower than lookups optimised for particular platforms. (This is especially true on platforms without the DNSTIMEOUT command described below.) So if you are doing DNS lookups regularly, you will probably be better off using one of the many specialist DNS lookup programs which you can find on the helper applications page.


DNS lookups are typically rather slow, because your computer has to ask across the network to find out the names of the hosts. For this reason, analog saves the addresses it has looked up in a file, so that you don't have to look them up again next time. The file is specified by a command like
DNSFILE dnscache
You will still need to use one of the commands in the next paragraph in order to actually use the file. If the name of the DNSFILE doesn't include a directory, it will be looked for wherever analog expects to find its DNS files. (This location is built in when the program is compiled.) For example, on Windows it would be in the same folder as the analog executable.

There are four possible levels of DNS activity. If you specify DNS NONE, no numerical addresses will be resolved. If you specify DNS READ, then analog will read the DNS file for old lookups, but no new lookups will take place. This mode is suitable if you are running analog while not connected to the internet. The third level is DNS WRITE. This reads the old file, looks up new addresses, and adds them to the file. (The first time you use DNS WRITE, you will get a missing-file warning as it tries to read the old file, but it will exist the next time.) The final level is DNS LOOKUP. This reads the old file and looks up new addresses, but doesn't add the new addresses to the file, so that they will not be remembered for next time. This is not normally a level that the user wants to specify, but analog will switch to this the behaviour if DNS WRITE fails for some reason.

If you are using a HOSTEXCLUDE command, you need to exclude the numerical IP address if it can't be resolved, or the name if it can. In other words, exclude whatever the host is known as in the Host Report.


If two copies of analog were allowed to write to the DNS file at the same time, the file could become corrupted. So when analog is running in DNS WRITE mode, it creates a lock file which tells other copies of analog to back off to DNS LOOKUP. You can change the location of that file with the command
DNSLOCKFILE filename
Of course you should make sure that all copies of analog use the same lock file, at least if they have the same DNS file! Again, if the name of the DNSLOCKFILE doesn't include a directory, it will put in a canonical location, specified when the program was compiled.

If analog crashes, it may not clear up the lock file, so in that case you may have to delete it yourself. (Disclaimer: on some systems, race conditions may occasionally thwart this mechanism, but this is very unlikely.)

Analog never deletes anything from the DNS file: this means that the DNS file will grow, and can become quite large. You should delete the top of it every so often. There is a program on the helper applications page to help you do this more systematically.

There are two parameters which say how long to trust old lookups for. If you set

DNSGOODHOURS 672
for example, then successful lookups will be checked again after 672 hours (4 weeks). You can also set the DNSBADHOURS similarly, to check failed lookups again after a certain time. By default the DNSBADHOURS is 336 (2 weeks) and the DNSGOODHOURS is a very large number (so that successful lookups are never rechecked, as long as they remain in the DNS file).

On some platforms (maybe only Unix) you can set a parameter called DNSTIMEOUT. If the DNS server still hasn't returned a reply within this many seconds, then the lookup will be aborted. However, this feature is off by default, because it breaks DNS lookups on many platforms. (The symptom is that the first few lookups succeed, but after a while, all lookups fail). If you try it, monitor it, and turn it off again if it causes problems.

Finally, there is a debugging command, DEBUG +D to show all the DNS lookups that analog is making.


Normally you need never write a DNS file: you should rely on analog to do it for you. But in case you need to know, the format of the file is
timestamp IP_address name
where the timestamp is the number of minutes since the beginning of 1970, GMT (i.e., "Unix time" divided by 60), and the name is just * if the address couldn't be resolved.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/domfile.html0000644000175000017500000001024610161303532016170 0ustar sret1sret100000000000000 Readme for analog -- the domains file [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: The domains file


The domains file tells analog which country is represented by each domain. You can tell analog where to find your domains file with a command like
DOMAINSFILE mydomains.tab
Normally you don't need this command, because if there is a domains file in your language, it should be selected automatically. But the DOMAINSFILE command can be useful if you want to use a domains file in a new language, for example. If the name of the file doesn't include a directory, it will be looked for wherever analog normally expects to find its language files.

You should have got a domains file with the program, but if you've lost it, you can download one from http://www.analog.cx/ukdom.tab. It should contain on each line a domain code, followed by a number, followed by its location, like this:

ad  2  Andorra
ae  3  United Arab Emirates
[...]
It does not need to be in alphabetical order, though humans may prefer it that way. Subdomains do not go in the domains file: you can list them in the Domain Report using the SUBDOMAIN command.
The number beside each domain represents how many levels deep an "organisation" is considered to be, for the purposes of the Organisation Report. For example, consider the hostname www.sta.ad. The organisation is sta.ad, at the second level, so Andorra has a 2 in the above list. But in the UAE, a host looks like www.economy.gov.ae. There is an extra level in the hierarchy, so the UAE has its organisations at level 3.

There are some problems with this. A few countries have organisations at both levels 2 and 3 (for example asaspace.at and univie.ac.at). In those cases I've favoured false negatives over false positives by using the bigger number. (Also there is a correction which will make most of them right again: the first component is always removed from a hostname of three or more components.) For other countries, I don't have enough information to tell what the level should be. I've just given those a 1. Do let me know if you have any more information, or corrections, for the numbers.

For numerical addresses, the organisation is considered to be at level 2 if the first component is 24, 61-68, 80-81 or 128-255; and otherwise at level 1. Again this is only an approximation -- for example, many organisations use two adjacent blocks of numbers, or subdivided blocks -- but it's the best we can do without looking up every address we come across. (Note that you can always see more detail using the SUBORG command).


Only domains which occur in the domains file will get their own line in the Domain Report: the rest are probably spurious, and will be accumulated together as "unknown domains". If analog couldn't find the domains file, then all the domains will be unknown. If you have debugging turned on, you can see which domains were unknown.

Lines starting with a hash (#) in the domains file are considered to be comments.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/errors.html0000644000175000017500000004033710161303532016071 0ustar sret1sret100000000000000 Readme for analog -- errors and warnings [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Errors and warnings


This section lists all the errors and warnings which analog can produce, together with a short explanation.

First, you should understand the difference between a crash, an error, a warning, and a debugging message. First, a crash is when analog exits prematurely, without producing the whole output file. The system might give a message, but analog will not give one of its own messages. Analog should never crash. If it does crash, please tell me about it.

An error is something which stops analog finishing its job. Whenever an error is detected, analog gives a message starting something like analog: Fatal error: and will then tell you what type of thing went wrong before quitting.

A warning is a problem which is not fatal to analog: it will keep on with its processing. These vary from the possibly serious, such as files which could not be found, to purely informational. They produce a message starting analog: Warning. You can turn warnings off using the WARNINGS command.

Finally, a debugging message gives information on the state of the program. They just begin with a single code letter followed by a colon. You don't get any debugging messages unless you've asked for them.

If you want to send these messages to a file instead of to the screen, you can use the ERRFILE command. To tell analog the width of your screen for these messages, you can use the ERRLINELENGTH command.

Now I shall describe all the possible errors and warnings in detail.


Errors

Ran out of memory: cannot continue
Analog ran out of memory. Try increasing the memory available to the process, if your operating system will allow it, or using the LOWMEM commands.
Cannot ignore mandatory configuration file
See the section in the Readme on the mandatory configuration file.
Can't find language file
Language file too short
Language file too long
Language file contains excessively long lines
Analog can't run without a well-formed language file. See the documentation on language files.
Attempted to read more than 50 configuration files
The most likely explanation for this is that you have accidentally created a loop using the CONFIGFILE command, for example if a configuration file includes itself.
Incorrect default given in anlghead.h
Default given in anlghead.h too short
If you've compiled your own version, and you've specified an incorrect configuration in the file anlghead.h, analog gives up to allow you to fix it.
Failed to open output file for writing
Analog couldn't create, or couldn't write to, the output file you specified.
Cache output file already exists: won't overwrite
Analog won't overwrite an old cache file. You must move or delete it yourself first.
OUTFILE and CACHEOUTFILE are the same
OUTFILE and CACHEOUTFILE both set to stdout
This can't be what you wanted, because one would overwrite the other.
OUTPUT NONE and CACHEOUTFILE none selected
You requested no output.
OUTPUT LATEX only available with US-ASCII, ISO-8859-1 and ISO-8859-2 character sets
The LaTeX output style only works with certain European languages because the standard LaTeX distribution doesn't contain the characters for other languages.

Warnings

Remember that warnings are not fatal: in fact some are rarely even serious. You can turn them off using the WARNINGS command. The possible warnings come in several different categories, shown by a letter in the warning message. The categories are as follows.
C
invalid configuration specified
D
dubious configuration specified
E
ERRFILE command used
F
files missing or corrupt
G
corrupt lines in support files
L
apparent problems in logfiles
M
possible problems in logfiles
R
turning off empty reports

Category C

This category indicates an incorrect configuration. Analog will either ignore what you said, or try and do the best it can with it. There are too many warnings in this category to list completely. You will have to consult the documentation for the particular configuration command that gave an error. If you get an error for a command which used to work in a previous version of analog, have a look in the section Updating from older versions.

Category D

This is for configurations which might be intended, but which look suspicious. Analog will not override what you've specified in this case.
LOGFORMAT with no subsequent logfile
You have specified a LOGFORMAT command, but no subsequent logfile to which it could be applied. Most likely you put the LOGFORMAT after the LOGFILE command. You must put the LOGFORMAT before the LOGFILE command or use DEFAULTLOGFORMAT instead. See the section on Specifying a log format for more details.
Offset not a multiple of 30
Offset more than 25 hours
The time offsets are meant to be for correcting between differences in time zones. These differences are usually multiples of 30 minutes between -25 and +25 hours. Maybe you specified the offset in hours instead of minutes by mistake, or something like that.
FROM time is later than the present
Usually this will mean that no entries are counted. Analog doesn't try and correct it in case the clock on your computer or your server is wrong -- but you would be better using TIMEOFFSET or LOGTIMEOFFSET to correct those clocks.
SORTBY doesn't match FLOOR
SORTBY doesn't match SUBSORTBY (or FLOOR/SUBFLOOR)
SORTBY (or FLOOR or GRAPH) isn't included in COLS
Within one report, it's helpful to your readers to have the sort methods and the floors compatible, and all included in the COLS. (See the section on Non-time reports).
Column N with SORTBY ALPHABETICAL/RANDOM
Numbering off the items when they're not in order of busyness is probably a mistake.
Time reports have not all got same value of BACK
It's usually helpful to have all the time reports running in the same direction.
Report contains no COLS
You've got an empty COLS list for one report, so you'll just get a list of names, not any information about them.
LOWMEM 3 prevents that item being cached
You're making a cache file, but one item is not being recorded because of a LOWMEM command, and will therefore not be saved in the cache file.

Category E

There is only one warning in this category.
Redirecting future diagnostic messages
You've used an ERRFILE command to change the destination of errors, warnings, debugging and PROGRESSFREQ diagnostics. This is just warning you so that you don't miss any messages.

Category F

This category is for diagnosing files which couldn't be opened or read successfully. These can be serious, but most of the messages should be self-explanatory. There are a few worth mentioning specifically.
Can't auto-detect format of logfile
The LOGFORMAT is set to automatic detection, but the first line of the logfile is not in any of the standard formats. This error can often be generated when you try and specify your own LOGFORMAT but put it after the LOGFILE command so that it is not in effect for that logfile.
Logfile with ambiguous dates
Some servers, notably IIS and WebSite, record dates in their logfiles according to local conventions. Then if analog encounters 2/1/99, for example, it doesn't know whether it's the 2nd January or 1st February. This problem, and what to do about it, is described in more detail in the section on Choosing a logfile.
Logfile seems to be in Microsoft format
The most common cause of this message is that your IIS logfile uses local conventions for listing dates which analog doesn't know about -- e.g. 25.12.98 instead of 25/12/98. Again, see the section on Choosing a logfile for help.
Ignoring corrupt format line in logfile
The format line within a W3 extended log, Netscape log or WebSTAR log is invalid in some way. Analog will always tell you what's wrong with it. The most common problem is that the date only appears at the top of the logfile, not on every line, which is not allowed. The reason for this, and what to do about it, are in the section on Choosing a logfile.
Failed to open domains file
In this case, all domains will be counted as "unknown domains".
Failed to open DNS input file
The first time you use DNS lookups, you don't have a DNS cache file, so you get this warning. Assuming you are using DNS WRITE, the message will go away next time you run analog.
DNS lock file already exists
To stop two copies of analog trying to write the DNS file at the same time, an empty "lock file" is created, which tells the second copy of analog to use DNS LOOKUP instead of DNS WRITE. If analog crashes, it may not delete its lock file. So if you get the "already exists" message even though no other copy of analog is running, you may need to delete the lock file yourself.

Category G

This category is used when there is a bad line in the DNS file, domains file or report descriptions file. Analog will still use the rest of the file. All the messages should be self-explanatory.

Category L

When analog finishes reading a logfile, it checks whether there might have been something wrong with it.
Large number of corrupt lines
This could indicate a problem with the logfile, or with the LOGFORMAT specification. The possible causes are described in the section on Choosing a logfile. If you specify DEBUG ON, analog will report where each line was corrupt.
Logfiles overlap: possible double counting
This means that two logfiles which were counting the same type of item overlapped in time. Because it's only based on the time period of the logfiles, not the actual entries, this may or may not indicate a genuine problem. It is a problem if you read the same logfile twice. Or maybe you used the cache file feature incorrectly. Or maybe your web server produces several logfiles, and your LOGFORMAT specification should have told analog to ignore some of the items in some of the logfiles. It is not a problem if the logfiles are in fact completely disjoint; for example if you analyse logfiles from two different virtual hosts. In this case, the statistics produced will still be correct.

Category M

This category is for warnings about logfile formats which might make analog produce unexpected results.
Logfile contains lines with no [whatevers], which are being filtered
This is usually harmless. It is perhaps best explained by example. Suppose you are excluding certain files from the analysis, but that you are also analysing a browser log which just contains information about the browsers used, not which files they read. Then we can't exclude the browsers which read the excluded files, because we don't know which they were, so all browsers will be included.
Logfile contains lines with no file names (or bytes): page (or byte) counts may be low
If a logfile line doesn't contain a file name, analog will assume that the request wasn't for a page. Similarly, if it doesn't give the number of bytes transferred, analog will make the bytes zero. So the number of page requests or bytes credited to the other items on that line will then be too low.
Old-style cache file doesn't contain data on first-request times of items; so these may be overestimated
Cache files now contain the first-request time of each item. But if you read a cache file from an older version of analog, this data will not have been recorded, and so the last-request time will be used instead.
Cache file doesn't contain last-seven-day statistics
It is impossible for cache files to record the number of requests in the last 7 days, because the data would be wrong at the time the cache file was read.

Category R

This is used when analog turns off an empty report. This could be because none of the relevant items were included in any of the logfiles, or perhaps beacause a LOWMEM command stopped them being recorded. It is also used when analog turns off a pie chart which would have contained only one wedge.

Broken Pipe

This warning is not generated by analog, but it can occur when analog decides that it doesn't need a logfile which it's uncompressing, and so doesn't finish reading it. It's harmless.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/faq.html0000644000175000017500000014324610161303532015327 0ustar sret1sret100000000000000 Readme for analog -- FAQ [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Frequently asked questions


This list is divided into six sections:
  1. Getting Started
  2. Basic Configuration
  3. Understanding the Output
  4. Advanced Usage
  5. Form Interface
  6. Design Decisions

List of Questions

  1. Getting Started
    See also Starting to use analog.
    1. Analog doesn't have a setup.exe.
    2. Analog just flashes up a DOS window and then quits.
    3. When I try and edit analog.cfg, Windows asks me which program I want to use to open that file.
    4. When I try and compile analog, it gives me an error (e.g. on SunOS 5).
    5. Analog didn't write the logfile when I ran it.
    6. Analog won't read extended logfiles generated by IIS.
      or What does "time without date" mean?
    7. What does "Logfile with ambiguous dates" mean?
    8. I tried to analyse a logfile, but I just got "Large number of corrupt lines."
    9. Analog won't read logfiles bigger than 2GB.
    10. What does this error message mean?
    11. I tried to run analog from my browser, but it didn't work.

  2. Basic Configuration
    1. I want to analyse several logfiles together.
    2. I want to make several different statistics pages. Do I have to install several copies of analog?
    3. My analog.cfg included lots of CONFIGFILE commands, but only one output page was produced.
    4. Why does the Daily Report only show the last six weeks?
    5. Why do the time reports all list 0 requests?
      or Why are there no bar charts in the time reports?
    6. How do I get the Request Report to list files with fewer than 20 requests?
    7. How do I ignore accesses from my site?
    8. How do I ignore internal referrers in the Referrer Report?
    9. How do I get information on just my pages, not everybody's?
    10. How do I list subdirectories not just top-level directories in the Directory Report?
    11. How do I list minor browser versions in the Browser Summary?
    12. I want to see the full hostnames in the Organisation Report.
    13. I used the command "DIREXCLUDE /mydir/", but files in that directory were still listed.
    14. I used the command "FILEEXCLUDE /cgi-bin/script.pl", but that file was still listed in the Request Report.
    15. I used the command "IMAGEDIR C:\analog\images\", but I only got broken images.
    16. I want to put several output pages in the same directory, but the pie charts overwrite each other.
    17. I want a configuration file with all of the possible configuration commands in it.
    18. I want to see your configuration file.
    19. Does the order of the commands matter in the configuration file?
    20. Why are my browser and referrer reports empty?
    21. Why isn't the Referrer Report sorted properly?
    22. I want to list (or not to list) referrers with their search arguments in the Referrer Report.
    23. Why are my click-thru's (or CGI scripts) not listed in the Request Report?
    24. I can't find /script.pl?q=1 in the Request Report.
    25. Why can't I have P in the REQCOLS, REQSORTBY or REQFLOOR?
    26. Can I find out which files each referrer pointed to?
      or Can I find out which files each host has read?
      or Can I find out which hosts have read each file?
      or Can I find out the number of hosts visiting on each day?
      or lots of similar questions.
    27. Can SETTINGS ON produce a configuration file instead of an English list of settings?
    28. I get the message "logfiles overlap" even though the two logfiles contain completely separate requests.
    29. Can I count the individual visitors, or visits, to my site?
      or Can I see how long visitors spend on my site?
    30. Can I change the way dates are formatted in the output?
      or Can I change some of the phrases in the output?
    31. How can I change the background colour of my output?
      or How can I make the output prettier?

  3. Understanding the Output
    See also What the results mean.
    1. How do I find out the number of hits from your data?
    2. Why are there so many referrers from my own site?
    3. The analysis covers exactly a week, but the figures for the last seven days don't agree with the totals.
    4. I only have 240 requests in total. Why does analog think there are 840 requests per week?
    5. The pie charts don't agree with the figures in the tables.
    6. Why doesn't analog agree with the counter on my page?
    7. Why doesn't analog agree with grepping the logfile?
    8. Why doesn't analog agree with my other logfile analysis program?
    9. Why do I only get "unresolved numerical addresses" in the Domain Report?
    10. Why are directories listed in the Request Report?
    11. When someone reads one of my PDF files, it scores dozens of hits.
    12. Kilobytes should be 1000 bytes, not 1024 bytes.
    13. The Organisation Report doesn't identify organisations correctly.
    14. "Organization" isn't spelled correctly.

  4. Advanced Usage
    1. How can I do such-and-such with a command line option?
    2. I want a list of all command line arguments.
    3. How do I list all numerical subdomains to depth 2 in the Domain Report?
    4. I want to be able to count requests with status code 301 and 302 as successes, so that they appear in the Request Report.
    5. I want to report on a field analog doesn't know about.
    6. Can analog analyse Squid proxy logfiles?
    7. Can analog analyse FTP logfiles?
      or Can analog analyse streaming media logfiles?
    8. Can analog analyse other logfiles, such as mail logs, or the syslog?
    9. How can I run analog automatically every day?
    10. How can I automatically email the results to myself or someone else?
    11. I'm setting up IIS. Which logfile format should I use?
    12. I host lots of virtual domains. How should I set up analog?
    13. Can I make several output pages with just one run of analog?
    14. I ran out of memory when trying to run analog. What can I do?
    15. You're processing 20,000,000 requests in under 10 minutes. Why is mine much slower?
      or Analog appears to stall.
    16. How do I make a link on my page that runs analog?
    17. Do I have to save all my old logfiles?
      or Can analog make statistics from old reports instead of reading the whole logfile again?
    18. Can analog write to a database or spreadsheet?

  5. Form Interface
    See also Form troubleshooting.
    1. I couldn't make the form run.
    2. How can I specify different logfiles from the form interface?
    3. My browser showed me anlgform.pl, rather than running it.
    4. Why does the form interface give "Document Returned no Data"?
    5. The images don't appear when running analog from the form interface.
    6. Why do I get some reports that weren't requested on the form?
    7. How do I make a link to anlgform.pl without using anlgform.html?
    8. Is there a form interface not using Perl (e.g. ASP or .exe)?

  6. Design Decisions
    1. Why doesn't the HEADERFILE replace the whole <head> of the output file?
    2. Why don't you just use one image, and scale it with the width and height attributes?
    3. In the XHTML output, why not just put a class= on each <COL> instead of on each cell?
    4. Why doesn't the OUTFILE command automatically create the directory for the output file?
    5. Why not automatically spot robots by whether they request /robots.txt?
    6. Why not just do DNS resolution of the hosts that actually make it into the Host Report?
    7. Couldn't you do the DNS lookups faster with threads?
    8. Why doesn't analog analyse the error_log?
    9. My server lists local names in the logfile. Can you put a common suffix on them automatically?
    10. Can you extrapolate from the current month's partial data to produce a prediction for the whole month, based on the rate so far?
    11. Can you extend the Domain Report to say which US states people visited from?
    12. Please distinguish between the different BSDs in the Operating System Report.
    13. Why not use language codes instead of country codes for the names of the language files?
    14. Why doesn't analog produce statistics on "visits"?
    15. Why don't you sell analog?

A. Getting Started

Most questions in this category are answered in the section entitled Starting to use analog. If you can't get analog running you should look there.
  1. Analog doesn't have a setup.exe.
    No, and it doesn't need one. It's already ready to run! See Starting to use analog under Windows.
  2. Analog just flashes up a DOS window and then quits.
    This is the correct behaviour. It should have created an output page called Report.html. See Starting to use analog under Windows.
  3. When I try and edit analog.cfg, Windows asks me which program I want to use to open that file.
    Use Notepad, or any other plain text editor.
  4. When I try and compile analog, it gives me an error (e.g. on SunOS 5).
    Maybe you need to edit the Makefile. There are some platform-specific notes in the section Starting to use analog on other platforms, and in the Makefile itself.
  5. Analog didn't write the logfile when I ran it.
    Analog doesn't write the logfiles. Your web server writes the logfiles, and analog just reads them. See Starting to use analog.
  6. Analog won't read extended logfiles generated by IIS.
    or What does "time without date" mean?
    By default, IIS writes the date only at the top of the logfile, not on every line. But it doesn't write a new date if the date changes during the logfile, so analog can't tell which date later entries in the log occurred on. More details, and what to do about it, are in the section on Choosing a logfile.
  7. What does "Logfile with ambiguous dates" mean?
    See the section on Errors and warnings.
  8. I tried to analyse a logfile, but I just got "Large number of corrupt lines."
    There are lots of possible reasons for this. You can find them described in the section on Choosing a logfile.
  9. Analog won't read logfiles bigger than 2GB.
    Analog doesn't have any limitation, but there may be a limitation in your OS and/or compiler. Try adding CFLAGS=-D_FILE_OFFSET_BITS=64 to the Makefile before compiling.
  10. What does this error message mean?
    Again, see the section on Errors and warnings.
  11. I tried to run analog from my browser, but it didn't work.
    Analog should not be run as a CGI program, or even put in the folder with your CGI programs, for security reasons. You should use the special CGI program instead.

B. Basic Configuration

Analog has lots of configuration commands, all of which are in the section on Customising analog. Here are some of the most common questions. If your question isn't answered here, you could also try looking in the index.
  1. I want to analyse several logfiles together.
    Just use several LOGFILE commands, or wildcards in the logfile name.
  2. I want to make several different statistics pages. Do I have to install several copies of analog?
    No. Just install it once, and run it with different configuration files. (You do have to run it once per output page though.)
  3. My analog.cfg included lots of CONFIGFILE commands, but only one output page was produced.
    Analog can only produce one output page per run. To produce several reports, you have to run it several times.
  4. Why does the Daily Report only show the last six weeks?
    This is controlled by the DAYREPROWS command.
  5. Why do the time reports all list 0 requests?
    or Why are there no bar charts in the time reports?
    They probably only list 0 requests for pages. Maybe you need to use PAGEINCLUDE to count more files as pages.
  6. How do I get the Request Report to list files with fewer than 20 requests?
    Use the REQFLOOR command, e.g., REQFLOOR 10r to list down to 10 requests. Also, if you want to list all the files not just pages, you may need to use the command REQINCLUDE *
  7. How do I ignore accesses from my site?
    Use the HOSTEXCLUDE command.
  8. How do I ignore internal referrers in the Referrer Report?
    Use the REFREPEXCLUDE command.
  9. How do I get information on just my pages, not everybody's?
    Use the FILEINCLUDE command.
  10. How do I list subdirectories not just top-level directories in the Directory Report?
    SUBDIR */*
  11. How do I list minor browser versions in the Browser Summary?
    Use SUBBROW */*.* (Note that they then appear in the Browser Summary, not the Browser Report).
  12. I want to see the full hostnames in the Organisation Report.
    The full hostnames are listed in the Host Report.
  13. I used the command "DIREXCLUDE /mydir/", but files in that directory were still listed.
    DIREXCLUDE only affects the Directory Report, not the other reports. You want "FILEEXCLUDE /mydir/*" instead.
  14. I used the command "FILEEXCLUDE /cgi-bin/script.pl", but that file was still listed in the Request Report.
    If the file has search arguments, you have to be a bit careful with FILEEXCLUDE. This is described in the section about search arguments.
  15. I used the command "IMAGEDIR C:\analog\images\", but I only got broken images.
    The IMAGEDIR command has to be a URL, not a directory on your disk. (It's just inserted into the <img> tags in the output: have a look at the output and you'll see.) Also this means that the images have to be put in the part of your filespace that has your web files.
  16. I want to put several output pages in the same directory, but the pie charts overwrite each other.
    You have to set the CHARTDIR and LOCALCHARTDIR to be different for each output. (You can still have all the charts in the same directory if the CHARTDIR and LOCALCHARTDIR don't end with slashes.)
  17. I want a configuration file with all of the possible configuration commands in it.
    One is already distributed with the program, in the examples folder.
  18. I want to see your configuration file.
    This is also included in the examples folder in the distribution.
  19. Does the order of the commands matter in the configuration file?
    Only occasionally. If you have two of one command, the later one will generally override the earlier one. Apart from that, commands can come in any order, except that LOGFORMAT and LOGTIMEOFFSET commands must come before the LOGFILE to which they refer.
  20. Why are my browser and referrer reports empty?
    Maybe your logfile doesn't contain any browser and referrer information?
  21. Why isn't the Referrer Report sorted properly?
    It is sorted properly. But search arguments are also listed under the file they belong to, and this interrupts the ordering. If you set the REFARGSFLOOR high enough you won't see the search arguments. Or you can include the N column to make the ordering more obvious.
  22. I want to list (or not to list) referrers with their search arguments in the Referrer Report.
    To see the search arguments you may need to set the REFARGSFLOOR lower. To avoid seeing them, you could set the REFARGSFLOOR higher, or alternatively use the REFARGSEXCLUDE command to ignore them either for all files or just for particular files.
  23. Why are my click-thru's (or CGI scripts) not listed in the Request Report?
    If they cause a redirection to another page, they will be listed in the Redirection Report, rather than the Request Report.
  24. I can't find /script.pl?q=1 in the Request Report.
    If it causes a redirection, it will be in the Redirection Report not the Request Report. But also, you may need to set the REQARGSFLOOR or REDIRARGSFLOOR lower to actually see it.
  25. Why can't I have P in the REQCOLS, REQSORTBY or REQFLOOR?
    The number of page requests doesn't make sense in the Request Report because it's either the same as the number of requests (if the file is a page) or zero (if it isn't). If you want to list only pages in this report, use REQINCLUDE pages instead.
  26. Can I find out which files each referrer pointed to?
    or Can I find out which files each host has read?
    or Can I find out which hosts have read each file?
    or Can I find out the number of hosts visiting on each day?
    or lots of similar questions.
    There are lots of questions like this. They all want analog to cross-reference two sorts of item (e.g. files and referrers in the first example above, or hosts and dates in the last).
    The solution is to use the *INCLUDE commands. For example, to find out which files a particular referrer pointed to, restrict the analysis to just the referrer you're interested in with the REFINCLUDE command. The Request Report will then just list the files reached from that referrer. Similarly, if you're interested in a particular time period, you can focus on just that time by using the FROM and TO commands.
    You do have to run analog once for each report generated. So for the example of referrers, you would have to run it once for each referrer you're interested in. Of course, it would be useful to be able to cross-refererence all the files and referrers at once. But it is fundamental to analog's speed and minimal memory requirement that it only records statistics for each type of item individually, and doesn't record enough information to cross-reference them afterwards.
  27. Can SETTINGS ON produce a configuration file instead of an English list of settings?
    No. But it does tell you which configuration files it read, so you can just get the commands out of them. Or if you want a list of all configuration commands, there is one in the examples directory.
  28. I get the message "logfiles overlap" even though the two logfiles contain completely separate requests.
    This message is based only on the dates of the files, not the contents. If you're sure there is no problem, you can turn it off with the command WARNINGS -L.
  29. Can I count the individual visitors, or visits, to my site?
    or Can I see how long visitors spend on my site?
    No, it's not technically possible, and don't believe any program which tells you it is. See the section on How the web works for details.
  30. Can I change the way dates are formatted in the output?
    or Can I change some of the phrases in the output?
    Yes, by editing the language file.
  31. How can I change the background colour of my output?
    or How can I make the output prettier?
    You can change almost any aspect of the design using a style sheet. There are also some programs on the helper applications page to make completely different output from the analog data.

C. Understanding the Output

Most of the questions in this category are answered in the section on What the results mean, which I really recommend you read if you want to understand what analog is telling you.
  1. How do I find out the number of hits from your data?
    I don't use the word hits, because people use it in different ways, so it's misleading. I use requests for the number of transfers of any type of file (text, graphics, ...), and page requests for the number of transfers of HTML pages. See the section on Analog's definitions for more information.
  2. Why are there so many referrers from my own site?
    These come from all the internal links on your site, and all the graphics on your pages. See the section on How the web works for more information. If you don't want to see them, you can use REFREPEXCLUDE to exclude them.
  3. The analysis covers exactly a week, but the figures for the last seven days don't agree with the totals.
    The figures in parentheses are for the seven days before the time the program was run, unless there is a TO command. They are never for the seven days before the end of the logfile. (Although if you know that the logfile only contains entries up to a certain time, you may want to include a TO command for that time to get the last seven days' data right.)
  4. I only have 240 requests in total. Why does analog think there are 840 requests per week?
    If you have 240 requests in two days, that's a rate of 840 requests per week. Just like if you drove 28 miles in 20 minutes, you'd have driven at 84 miles per hour.
  5. The pie charts don't agree with the figures in the tables.
    Possibly you are looking at out-of-date images. Make sure to reload the images as well as the text. Also, if you are running analog several times, make sure to use CHARTDIR and LOCALCHARTDIR to stop the images for the different runs overwriting each other.
  6. Why doesn't analog agree with the counter on my page?
    There are lots of possible reasons. Do they both start from the same date? Are you just looking at requests for that one page with analog, not for all your other pages and graphics? Also, analog will record all requests to that page; if it's a graphic, your counter will only measure requests from people on graphical browsers that reached that place on the page.
  7. Why doesn't analog agree with grepping the logfile?
    Have you understood what analog includes in its counts? In particular, most reports only list "successful" requests (HTTP status codes 200-209 & 304). A naïve grep would count failures too.
  8. Why doesn't analog agree with my other logfile analysis program?
    Small differences can be put down to different parsing. But if you are seeing large differences, you have to understand what analog counts, and what the other program counts. For example, some programs count HTTP status codes 301 & 302 as successes, whereas I think that to do so gives extremely misleading results.
  9. Why do I only get "unresolved numerical addresses" in the Domain Report?
    Your server only records the numerical IP address of the hosts that contact you, not their names. Read the section about DNS lookups, or turn DNS resolution on in your server.
  10. Why are directories listed in the Request Report?
    They are not directories, they are pages with the same name as the directory. For example, I have both a directory called /analog/ and a page called /analog/ (which happens to be the same as /analog/index.html).
  11. When someone reads one of my PDF files, it scores dozens of hits.
    PDF reading software often downloads a file in small parts, and each part counts as a separate request. This is unavoidable: analog has no way of knowing how many downloads constituted a single document in the reader's mind. The parts may be pages, or some larger amount, and sometimes the software may download the whole document at once. In addition, the user may only want to read part of the document, and so never download the whole thing. As usual, we can only reliably report how many requests there were at the server, not guess what the user did with the file later.
  12. Kilobytes should be 1000 bytes, not 1024 bytes.
    Personally I think that whatever 1024 bytes should have been called originally, it's stupid to try and change half a century of established usage now. But we don't need to argue about it. Analog's kilobytes are 1024 bytes, but if you prefer to call them kibibytes, you can do so by editing your language file.
  13. The Organisation Report doesn't identify organisations correctly.
    The rules I use are described in the section on The domains file. I admit they aren't perfect, but this is because in domains in which organisations aren't all at the same level in the domain hierarchy, there is no way to identify them perfectly without long lists.
  14. "Organization" isn't spelled correctly.
    Yes it is. If you want American spellings, you have to specify
    LANGUAGE US-ENGLISH
    in your configuration file.

D. Advanced Usage

  1. How can I do such-and-such with a command line option?
    Use the +C option to put any configuration command on the command line.
  2. I want a list of all command line arguments.
    There is a list in the index.
  3. How do I list all numerical subdomains to depth 2 in the Domain Report?
    SUBDOMAIN *.* deliberately only lists the top-level numerical subdomains to avoid cluttering the output. SUBDOMAIN *.*.* will work but will list everything else to depth 3. So the best solution is
    SUBDOMAIN 1*.*,2*.*,3*.*,...
  4. I want to be able to count requests with status code 301 and 302 as successes, so that they appear in the Request Report.
    No, you really don't, because that would lead to double counting when a request for /dir (code 301) is redirected to /dir/ (code 200). For CGI scripts etc. look in the Redirection Report instead of the Request Report.
  5. I want to report on a field analog doesn't know about.
    Use the following kludge. Write a LOGFORMAT to declare the field to be a virtual host or a user (whichever you aren't already using). Then edit your language file so that the right text is output.
  6. Can analog analyse Squid proxy logfiles?
    It can analyse Squid's common log format, although Squid uses some extra HTTP status codes which will be rejected as corrupt by analog. But really you want to know different statistics from a proxy log, such as percentage of requests retrieved from cache, and you might be better to use Squid's native format and a tool specifically designed to analyse it such as Calamaris.
  7. Can analog analyse FTP logfiles?
    or Can analog analyse streaming media logfiles?
    Yes. There are some configuration files in the examples directory giving sample LOGFORMAT commands. If you have a server which isn't covered there, you will have to write your own LOGFORMAT.
  8. Can analog analyse other logfiles, such as mail logs, or the syslog?
    Yes and no. Analog is primarily designed as an HTTP logfile analyser. For mail logs, there is a program on the helper applications page to help you. For other logs, you can get some results out by writing your own LOGFORMAT. But analog does make some assumptions about the sort of information it expects on a logfile line, and the further these assumptions are from being met, the harder it will be!
  9. How can I run analog automatically every day?
    This depends on your particular machine. On Unix, you need to run analog as a cron job (see "man cron"). This is my cron command to run it at 1:50am every day:
    50 1 * * * $HOME/bin/analog
    On Windows NT you can do the same with the at command. (It's probably easiest to put it in a batch job; also only an administrator can run at.) On Windows 98, it should be possible with the Task Scheduler, although I haven't tried it. On Windows 95 it's not possible as far as I know.
    On Mac, there are programs called Cron or CronoTask to do this.
  10. How can I automatically email the results to myself or someone else?
    Again, this depends on your operating system. On Unix, it's easy:
    analog +a +O- | mailx -s"Subject" someuser@somewhere.com
    I don't know about other operating systems, but at the worst, you can write the output to a temporary file, and then mail that file.
  11. I'm setting up IIS. Which logfile format should I use?
    The W3C format is probably best. You can turn fields on and off in this format. And it contains all the possible fields which can be logged, which the other formats do not. However, it is important to turn the date field on (it's off by default), not just to log the date once at the top: see the section on problems with logfile formats for why.
  12. I host lots of virtual domains. How should I set up analog?
    There's a How-To which discusses this issue. There's also a file in the examples directory.
  13. Can I make several output pages with just one run of analog?
    Not at the moment. I want to do this in a future version, but it will require some considerable work. However, depending on your which options you want to vary, you may be able to avoid having to read the logfile several times by using cache files. (This is likely to be faster, but more complicated.)
  14. I ran out of memory when trying to run analog. What can I do?
    See the section on Coping with low memory.
  15. You're processing 20,000,000 requests in under 10 minutes. Why is mine much slower?
    or Analog appears to stall.
    If you have DNS lookups on, they are very slow. Otherwise, it probably depends on the speed of your computer and disks, and what other programs are running at the same time. You can use the PROGRESSFREQ command to see if it's really stalled or whether it's just being slow. If you are running out of memory, you might find analog's LOWMEM commands helpful.
  16. How do I make a link on my page that runs analog?
    Link to the anlgform program, with the desired options. But be careful about the load on your server.
  17. Do I have to save all my old logfiles?
    or Can analog make statistics from old reports instead of reading the whole logfile again?
    These questions are answered in the section about Cache files.
  18. Can analog write to a database or spreadsheet?
    Use the computer-readable output style, which can export to CSV. Or if what you really want to do is to run analog again without re-reading the logfiles, read the section about Cache files.

E. Form Interface

There is also a section on troubleshooting in the documentation about the form interface.
  1. I couldn't make the form run.
    Have you made analog work without the form? Have you run anlgform.pl from the command line as explained in the section on troubleshooting?
  2. How can I specify different logfiles from the form interface?
    Just add a new field to the form with name=LOGFILE
  3. My browser showed me anlgform.pl, rather than running it.
    You have to tell the server to execute the CGI program, not just send it out like it would for a normal file. Often this is done by putting it in a special /cgi-bin/ directory.
  4. Why does the form interface give "Document Returned no Data"?
    If it doesn't happen for a while, then probably the server is giving up before the analog process has finished running. Increase the timeout interval on the server.
  5. The images don't appear when running analog from the form interface.
    For the bar charts, you probably need to set the IMAGEDIR, because if the images are in your /cgi-bin/ directory, the server will normally try to execute them instead of just sending them out. Pie charts don't appear unless you configure them specially.
  6. Why do I get some reports that weren't requested on the form?
    If a report is neither included nor excluded on the form, the system default will be used. This will depend on your configuration files and on compile-time settings.
  7. How do I make a link to anlgform.pl without using anlgform.html?
    anlgform.pl accepts the GET or POST methods of form submission. So you can make a link with the arguments passed after a question mark in the usual GET way.
  8. Is there a form interface not using Perl (e.g. ASP or .exe)?
    There is a Windows executable version of the Perl script on the analog helpers page. At the time of writing, I don't know of any ASP version of the anlgform program, but if someone writes one, I'll put it on the analog helpers page too. Warning: Potential authors must understand CGI security issues in general, and the extra issues about what the analog form interface must disallow, or they will open security holes on their system.

F. Design Decisions

or "Why didn't you do it this way?"
  1. Why doesn't the HEADERFILE replace the whole <head> of the output file?
    Because you almost never get valid HTML or XHTML that way. Use a style sheet instead.
  2. Why don't you just use one image, and scale it with the width and height attributes?
    It doesn't work with the BARSTYLE command.
  3. In the XHTML output, why not just put a class= on each <COL> instead of on each cell?
    Because most properties can't be set on columns. For example, you can't set the text colour for a whole column. See the CSS spec.
  4. Why doesn't the OUTFILE command automatically create the directory for the output file?
    Actually, most programs don't do this. It's too easy to create directories in unrelated parts of the filesystem if you make a typo.
  5. Why not automatically spot robots by whether they request /robots.txt?
    It's not reliable. Not all robots request /robots.txt, and not everything that requests /robots.txt is a robot. (Consider a webmaster checking his own /robots.txt, for example.)
  6. Why not just do DNS resolution of the hosts that actually make it into the Host Report?
    There is one theoretical and one practical problem. Theoretically, the problem is that which hosts do make it into the Host Report can change when the DNS lookups have been done. And practically, this wouldn't help identify the busiest countries or organisations, which is usually what you really want to know. However, there is a Perl script on the helper applications page to do this.
  7. Couldn't you do the DNS lookups faster with threads?
    The problem is, the standard commands for DNS lookups are not thread-safe on many platforms, so it would involve a lot of platform-specific code. Also it's technically difficult to coordinate the lookup threads and the main logfile-reading thread. Again, there are programs for specific platforms on the helper applications page.
  8. Why doesn't analog analyse the error_log?
    The error log is intended for humans rather than computers to read. So there is no consistent format: even different versions of the same server have different formats. And there is not much need to analyse it because analog's various failure reports are good enough for almost all purposes.
  9. My server lists local names in the logfile. Can you put a common suffix on them automatically?
    This wouldn't be a good idea by default, because things like "unknown" would get the suffix. You can always add them using HOSTALIAS. (There is an example to accomplish this using regular expressions in the section about aliases.)
  10. Can you extrapolate from the current month's partial data to produce a prediction for the whole month, based on the rate so far?
    No. There are too many problems in trying to produce anything sensible, especially near the beginning of the month. Different days of the week and different times of day cause lots of problems. I would prefer to produce accurate raw data than suspect derived data.
  11. Can you extend the Domain Report to say which US states people visited from?
    No. Some programs pretend to do this, but you can actually only tell which state the computer the person was using is in, which may be quite different from where the user was for ISP's or other large organisations.
  12. Please distinguish between the different BSDs in the Operating System Report.
    Sorry, I know they're different operating systems, but I don't want to introduce any finer granularity. At least, not in the main distribution -- the prepackaged versions for BSD do add this granularity, and this is good.
  13. Why not use language codes instead of country codes for the names of the language files?
    People are more familiar with the country codes, and not all of my languages have language codes anyway. Anyway, the filenames are normally invisible to the user.
  14. Why doesn't analog produce statistics on "visits"?
    See How the Web Works.
  15. Why don't you sell analog?
    I didn't write analog for the money, and I'm happy just to see people use it. Also, by making it open source, lots of people send me ideas and code to include in future versions. How do you think I got all those languages? (Of course, if you want to send me money, or gifts in kind, or even just postcards...).

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/favicon.ico0000644000175000017500000000206610161303532016005 0ustar sret1sret100000000000000 &(( @pww ww w ww wwwpww wwww www w w w ww w ww wpwwwwwwwwwwwwwwwwwwwwwwwwwwwwp(     ϟanalog-6.0/docs/form.html0000644000175000017500000005655210161303532015526 0ustar sret1sret100000000000000 Readme for analog -- form interface and CGI program [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Form interface and CGI program


The form interface provides an HTML front end to analog, on Unix or Windows platforms (and maybe others). That means that users can select options from a web page, instead of having to create a configuration file.

Important: For security reasons, you must not attempt to run analog itself as a CGI program, or even leave it in the directory or folder with your web files or CGI programs. When the form interface runs analog for you, it checks that analog isn't given any dangerous options. Without this check, your system could be vulnerable to attack.

The form interface is suitable for ordinary users to use, but it needs to be set up by a system administrator or other expert. In order to set it up, you have to be running a web server. You need to know what CGI programs are, where they live on your server, and how to set up their permissions properly. You also need to know how to write HTML forms. I shall assume this level of background knowledge for the rest of this section. And you have to be running Perl 5.001 or later: see Technical details below for other system requirements. (Actually, if you're on Windows and don't have Perl, you can download an executable version of the form interface from the helper applications page.)

Please don't try and set up the form until analog has been set up and is running properly on its own. It just adds another level of complexity to troubleshoot. And unlike analog itself, the form interface will not run "out of the box". You have to read the whole of this section to find out how to set it up safely.

Warning: CGI programs can contain security loopholes which allow an unscrupulous user to harm your system. (If you don't know about this, you shouldn't be running CGI programs at all. Read and understand the World Wide Web Security FAQ and the CGI Security FAQ first.) I have tried to make this form interface safe, but I cannot guarantee it. Even the most carefully-designed CGI programs can accidentally have serious security bugs. And I take no responsibility if anything goes wrong: you use it at your own risk. (See the licence.) Furthermore, you should be aware that unless you take special measures like password protection or limiting anlgform.pl to specific hostnames, setting up the form interface implies making analog executable, and your logfiles analysable, by anyone on the internet. It's usually a bad idea to allow this, because it has obvious negative implications both for privacy and for the load on your system: an attacker can run multiple copies of analog causing a denial-of-service attack. There are more notes on security design in this program towards the end of this section.

The form interface consists of two parts: a form (called anlgform.html) to choose the options, and a cgi program (called anlgform.pl) to pass them to the analog program. Both anlgform.html and anlgform.pl must be configured to your system before they will work at all. There are instructions at the top of both files explaining how to do this.

The form which is distributed with the program should only be regarded as an example form. You can find forms in languages other than English in the lang directory. Or you can write your own if you prefer. In fact you don't actually need the form at all: if you want just to create a link to the cgi program, with the arguments passed after a question mark in the URL in the usual way, then that's fine.


Almost every analog configuration command can be specified on the form, just by including a form element with that name on the form. So, for example, if you wanted to add a field for users to choose a logfile, you could write
Logfile name: <input type=text name="LOGFILE">
or maybe something like
<select name=LOGFILE size=1>
  <option value="/var/log/apache/fred"> Fred's logfile
  <option value="/var/log/apache/jane"> Jane's logfile
</select>

There are a few commands which you can't specify on the form for security or performance reasons. The full list is *LOGFORMAT, LANGFILE, DESCFILE, HEADERFILE, FOOTERFILE, UNCOMPRESS, OUTFILE, CACHEOUTFILE, ERRFILE, LOCALCHARTDIR, DNS and SETTINGS; and the person setting up the form can add more. See the security notes below for the reasons for these exclusions, and for some more commands you might want to add to the forbidden list. You can, if you prefer, specify the commands which are allowed, rather than those which are forbidden.


Some commands are most conveniently specified in two halves. First, there are commands which take two arguments (for example ALIASes or LOGFILE). You can cope with these by sending two commands from the form, called COMMAND1 and COMMAND2. For example,
Alias this file: <input type=text name="FILEALIAS1">
To this one: <input type=text name="FILEALIAS2">
You can only specify one such pair this way, so there's no way to specify several of the same ALIAS, for example. Only the last COMMAND1 and the last COMMAND2 you specify count.

Then there are FLOOR commands. To avoid users of the form having to know the syntax of these commands, you can if you want specify them in two halves, FLOORA and FLOORB, and they will be stuck together. For example, the form distributed with the program specifies

<br>Include all domains with at least
<input type=TEXT name="DOMFLOORA" maxlength=6 size=6>
<select name="DOMFLOORB">
  <option value=r>requests
  <option value=p>requests for pages
  <option value=b selected>bytes
</select>
If DOMFLOORA contains 5% and DOMFLOORB contains r, then DOMFLOOR 5%r will be sent to the program. (Or DOMFLOORA=5 and DOMFLOORB=%r would work too, if you chose to present the form that way.)
There are a couple of extra non-analog commands which can be sent from the form. First, if the option qv=1 is set, then analog is not run, but a list of the configuration commands which would have been sent to analog is printed instead. This is useful for checking that the CGI program is working properly. It can also allow users to produce a configuration file from form settings.

Secondly, you can specify other configuration files to be included at specific times. When analog is called by the CGI program, it first processes the default configuration file as usual. Then it processes any configuration file specified by an option with name cg. Then it processes all the other commands which the CGI program specifies. After that, it processes any configuration file specified by an option with name cm. Finally, it processes the mandatory configuration file as usual. (You may therefore want two copies of analog, one for form use and one for non-form use, with different configuration files compiled in.) Note that the commands in the default and mandatory configuration files will contribute to the configuration: some of them may even override options specified on the form. For example, if the default configuration file contains an INCLUDE command, this may cause INCLUDE and EXCLUDE commands specified on the form to behave unexpectedly.


anlgform.pl usually sends the commands to analog in the order in which it received them, which should be the same as the order they occurred in the form. But there are some exceptions. First, all commands of the same name are grouped together. So an interleaved sequence of INCLUDEs and EXCLUDEs won't work, for example. Secondly, even though the names of commands are case-insensitive, commands of the same name but in different cases may come in the wrong order. Keep them in the same case! Thirdly, WARNINGS and LOGTIMEOFFSET are sent first (and thus the LOGTIMEOFFSET applies to any logfiles specified on the form).

There are a couple of commands which the form always sets. These may override what you have set elsewhere. First, it sets either DNS READ (if a DNSFILE is set on the form) or DNS NONE (otherwise). Do not attempt to override this -- not only will you get timeout problems, but an attacker can then write to any file by setting DNSFILE.

The second command which the form always sets is WARNINGS FL, so that the less important warnings don't fill up your server's error log. You can override this by sending an explicit WARNINGS command from the form. And thirdly, it sets DEBUG -C to avoid filling up the error log if the LOGFORMAT is incorrectly configured: this can't be overridden from the form, only from the mandatory configuration file.

You won't get pie charts on the form unless you set a CHARTDIR and LOCALCHARTDIR in your default configuration file (LOCALCHARTDIR is disabled from the form for security reasons). And even if you do this, there will be a problem if two users try and run the form interface at the same time, because they will be trying to write the same images, so they may see broken images or each other's charts.

There is one small point about compressed logfiles. For security reasons, when using the form interface you need to specify the full pathname to the uncompression command in the UNCOMPRESS command in your configuration file.

Again for security reasons, analog checks the input from configuration commands more carefully when using the form interface before outputting it. One side-effect of this is that the JAPANESE-JIS character set won't work. Use one of the other Japanese character sets instead.


Form troubleshooting

Here is what to do if you are having problems setting up the form interface.

First, does analog run properly on its own without anlgform?

Next, you can run anlgform.pl from the (DOS or Unix) command line. This is good enough to debug most problems. You can specify options in pairs like this:

anlgform.pl qv=1 LOGFILE=/some/log REQINCLUDE=pages
If you include qv=1 in the argument list as above, you will see what anlgform.pl is trying to send to analog. If you don't include qv=1, anlgform.pl will try and run analog.

If it still doesn't work, check the following points:

  1. Have you edited anlgform.pl and anlgform.html as instructed at the top of those files?
  2. Do other CGI programs work on your server? Is anlgform.pl in the right place to be recognised as a CGI program by the server?
  3. Look in the server's error log for clues. You might want to set WARNINGS ON before you do this, because by default only warnings in categories F and L are reported.
  4. Sometimes it's helpful to set the ERRFILE in your analog configuration file (it won't work from the form) to catch any errors and warnings which may be getting lost. This is especially true on IIS which incorrectly sends errors to the browser instead of to an error log. If you are using Internet Explorer you will probably also need to disable the "friendly" error messages so that you can see the actual error message.
  5. Are all relevant files (analog itself, logfiles, configuration files, auxiliary files such as domain files...) executable/readable by your web server?
  6. If some form options don't seem to take effect, then check whether they are being overridden by a command in a configuration file. (Although SETTINGS is forbidden from the form, you might find it useful to set it in your default configuration file.)
  7. If you get a long wait, then no data returned, the server is probably timing out the request before analog has finished. The remedy is to increase the timeout interval.
  8. As explained above, the form always sets DNS READ or DNS NONE, WARNINGS FL, and DEBUG -C, overriding your default configuration file.
  9. Again as explained above, pie charts may not appear or may appear wrongly.
  10. Again as explained above, uncompressing of compressed logfiles doesn't work unless you use the full pathname in the UNCOMPRESS command.
  11. And once again as explained above, the JAPANESE-JIS character set won't work from the form interface.

Security notes

As I said above, CGI programs can often contain security loopholes. (See the World Wide Web Security FAQ and the CGI Security FAQ for more on this.) Although I don't guarantee that the form interface is safe, I have done my best to make it so. Here I shall explain my design decisions. Comments on them are of course welcome: if they need to remain confidential, you can email me privately at analog-author@lists.meer.net.

First, you should think about who can run the form interface. Unless you take special measures like password protection or limiting anlgform.pl to specific hostnames, adding the form interface to your site implies making analog executable, and your logfiles analysable, by anyone on the internet, as often as they want. It's usually a bad idea to allow this, because of the obvious concerns both about privacy and about the load on your system. Unless you limit the total CPU available to any analog processes, it is easy for an attacker to run multiple copies of analog, causing a denial-of-service attack.

Certain commands are ignored by anlgform.pl and not passed to analog. The list of them can be found at the top of anlgform.pl. Here are the reasons for them. HEADERFILE and FOOTERFILE would place any file on your system within the output. The *LOGFORMAT commands would also allow any file to be read, because someone could designate each line to be a single filename and then just list the filenames. OUTFILE, CACHEOUTFILE, ERRFILE and LOCALCHARTDIR would allow people to write to your filespace; ERRFILE would also divert warnings away from your server's error log. UNCOMPRESS would allow a user to execute any command. DNS is forbidden because setting it higher than READ would normally cause the process to time out, and also because with DNS WRITE, the DNSFILE would be a file to write, not just a file to read. CGI would allow the user to generate syntactically incorrect output. PROGRESSFREQ would allow a user to conduct a denial-of-service attack by filling up your error log really, really fast (and DEBUG C is also disabled for the same reason.)

None of the above should be deleted (unless you are really, really sure that it's completely impossible for anyone other than yourself to run anlgform.pl). There are three other commands which are forbidden by default but which you could consider removing from the forbidden list. SETTINGS is included because it will give away the locations of some files on your system. But it is useful for diagnostic purposes, and you could consider removing it temporarily if you have trouble setting up the form. The other commands which are included are LANGFILE and DESCFILE. They are included because it is possible that another file could be exactly the right number of lines long to be accepted as a language file or report descriptions file, and then parts of it would get into the output. But it would have to be exactly the right number of lines long first. These commands shouldn't really be needed if your copy of analog is installed correctly, because the LANGUAGE command should find the right files. But if you want them, and you're prepared to take the risk described above, you can remove LANGFILE and/or DESCFILE from the list.

There are other commands which you might consider adding to the list. For example, it is theoretically possible (though rather unlikely), that another file on your system could conform sufficiently closely to one of the predefined log formats that analog could be persuaded to analyse it and so reveal some of its contents. If you're worried about this, or even if you want to force only one particular logfile to be analysed from the form, you can add the LOGFILE command to the list of forbidden commands. And you could add DOMAINSFILE for similar reasons. Or if you wanted to stop a user having control over which analog warnings were written to the error log, you could add WARNINGS to the list. (Possible attempted security violations detected by anlgform will always be written.)

You can of course add any command you like to the list. For example, a user can use any configuration file on your system unless you add CONFIGFILE. If you add a command, you must also add any aliases for it. Have a look in the source file globals.c for the same command under different names -- some commands have legacy names which I don't admit to in the documentation.

For more certainty, you can, if you prefer, configure anlgform so that you specify the commands which are allowed, rather than those which are forbidden. See the top of anlgform.pl for how to do this.


For those who know about CGI security issues, here are some more technical comments on my design. anlgform.pl sets the $PATH environment variable to be empty. It opens analog as a pipe in order to pass arguments into analog's standard input. User-specified data is not used for the open() function, only passed down the pipe. anlgform.pl is run with the -T flag on Unix. (Does anyone know how to get this working under Windows?)

The arguments to LOGFILE and CACHEFILE commands are checked for containing only certain allowed characters (specifically, letters, digits, /\.:_*? space, and - between two {letter, digit, underscore}'s). This is because they could match an UNCOMPRESS command and thus be passed to the shell when the uncompress command is popen()'ed.

Apart from that, command names are checked for containing only letters and the digits 1 and 2; and the arguments to commands are checked for not containing control characters (actually characters 0-32 and 127-159; in particular newline characters are prohibited). The length of the commands isn't checked by anlgform.pl, but buffer overflow shouldn't be an issue as configuration commands are checked for length by analog.

By the way, the reason that I advise that analog itself shouldn't be used as a CGI program is that some servers, notably Microsoft IIS, allow users to pass command line arguments into a CGI program. And even if the program doesn't return the proper CGI headers, the output can be sent back to the user. This means that all the above checking of arguments is then thwarted. Of course, on servers on which you can't pass command line arguments to a CGI program, there are not the same security concerns, but then analog isn't very useful as a CGI program because if you can't pass any arguments, you can only get the default output.


Technical details

You need to be running Perl 5.001 or later (unless you're on Windows and download the executable version of the form interface from the helper applications page). You can get the latest version of Perl free from www.perl.org (or from http://www.activestate.com/Products/ActivePerl/ if you're on Windows). You also need the module CGI.pm, but this should have come with Perl anyway.

On Windows, you have to associate the .pl extension with the Perl executable so that Perl scripts are executed by Perl.

anlgform.pl will understand the GET or POST methods of form submission. The HTML spec says that GET should be used when, as in this case, running the program has no side effects. However, section 15.1.3 of the HTTP spec says that POST should be used if some of the options being passed might be confidential. Also, very long URLs, formed by specifying lots of options, can cause trouble to some older servers. So anlgform.html uses the POST method by default. However, the GET method will also work. For example, you could make a normal link to anlgform.pl with options specified after a question mark in the usual GET way.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/helpers.html0000644000175000017500000000336610161303532016220 0ustar sret1sret100000000000000 Readme for analog -- helper applications [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Helper applications


Some people have written helper applications for analog. These are independent programs which work together with analog to make certain tasks easier. There are graphical configuration tools, for example, or tools which post-process analog's output to produce graphs. There are tools to do the DNS lookups more quickly, configuration files for certain jobs, and lots of other things.

These helper applications are all listed at the analog site. The list is constantly changing, so I'm not distributing it with the program. But I strongly recommend you go to the analog helper applications page and check it out.

There are also some example configuration files in the examples directory or folder distributed with the program.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/hierreps.html0000644000175000017500000001755510161303532016404 0ustar sret1sret100000000000000 Readme for analog -- hierarchical reports [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Hierarchical reports


Some of the non-time reports have a hierarchical (or tree) structure: so, for example, each domain in the Domain Report can have subdomains listed under it, which in turn can have sub-subdomains, and so on. This section describes commands for managing hierarchical reports.

First, you need to be able to control what gets listed in the reports. For this you need to use the SUB family of commands. So, for example, the command SUBDIR /~sret1/* would ensure that the Directory Report would not only contain an entry for the sum of my files, but also one for each of my subdirectories, something like this:

29,111: /~sret1/
10,234:   /~sret1/analog/
 5,179:   /~sret1/backgammon/
11,908: /~steve/
You can have more than one * in the command. For example
SUBDOMAIN *.*
would list the whole Domain Report two levels deep.

If you specify a SUB command, all the intermediate levels are included automatically. So, for example, after

SUBDOMAIN statslab.cam.ac.uk
cam.ac.uk and ac.uk will be included in the Domain Report too, and after *.*.ac.uk, *.ac.uk will be included.

Here are examples of the other four SUB commands:

SUBTYPE *.gz         # in the File Type Report
SUBBROW */*          # e.g. Netscape/4 in the Browser Summary
SUBBROW Netscape/*.*  # add minor version numbers for Netscape
REFDIR http://search.yahoo.com/*   # Referring Site Report
SUBORG *.aol.com     # Organisation Report
SUBORG *.*.com       # Break down all .com's

The SUBDOMAIN command (but none of the others) can include a second argument describing the subdomain. For example

SUBDOMAIN cam.ac.uk 'University of Cambridge'
Then that subdomain will be listed with its translation in the Domain Report. You can also have numerical subdomains: e.g.,
SUBDOMAIN 131.111 'University of Cambridge'
If you sort the subdomains alphabetically, the numerical ones will also be sorted alphabetically, not numerically. I don't think this will cause any problems.

One other use for the SUBDIR command is if you have used the second argument to the LOGFILE command. Suppose you have translated files like /index.html into http://www.mycompany.com/index.html. Then the command

SUBDIR http://*    # or
SUBDIR http://*/*
would be appropriate to make the Directory Report look right.
The lower levels of each report have FLOOR and SORTBY commands which work exactly the same as those we have already seen for the top level. These commands are SUBDIRFLOOR, SUBDOMFLOOR, SUBORGFLOOR, SUBTYPEFLOOR, SUBBROWFLOOR and REFDIRFLOOR; and SUBDIRSORTBY, SUBDOMSORTBY, SUBORGSORTBY, SUBTYPESORTBY, SUBBROWSORTBY and REFDIRSORTBY.

A sub-item is listed in a hierarchical report only if it is above the sub-FLOOR, and it is included with a SUB command, and it is not excluded because of an INCLUDE or EXCLUDE command, and its immediate parent is listed. For example, specifying

SUBDIR /*/*/
SUBDIRFLOOR -3r
SUBDIRSORTBY REQUESTS
would list the three subdirectories with most requests under each directory. SUBDIRFLOOR 1:r would have listed any subdirectory with at least 1% of the maximum number of requests of any top level directory.

The three file reports (Request Report, Redirection Report and Failure Report) and the three referrer reports (Referrer Report, Redirected Referrer Report and Failed Referrer Report) are not fully hierarchical, but they do list search arguments together under the file to which they refer (provided that the arguments have been read in: see the ARGSINCLUDE command). So they have similar sub-FLOOR and sub-SORTBY commands, namely REQARGSFLOOR, REDIRARGSFLOOR, FAILARGSFLOOR, REFARGSFLOOR, REDIRREFARGSFLOOR and FAILREFARGSFLOOR; and REQARGSSORTBY, REDIRARGSSORTBY, FAILARGSSORTBY, REFARGSSORTBY, REDIRREFARGSSORTBY and FAILREFARGSSORTBY. The same applies to the Operating System Report with its subdivisions of operating systems: it has SUBOSFLOOR and SUBOSSORTBY.


The lower levels of a hierarchical report temporarily interrupt the top level, and even though they are indented, this can sometimes make it look as if the report is out of order. If you have a lot of sub-items, for example in the Referrer Report if there are a lot of search arguments, then including the N column can help to make it clearer again.
Sometimes one item in the pie chart takes up most of the pie. In this case, you can elect to plot its sub-items on the chart instead, by using the *CHARTEXPAND family of commands. For example
OSCHARTEXPAND Windows
will use Windows 98, Windows NT etc. as wedges in the pie chart, instead of accumulating all the Windows versions together in one wedge. The complete list of these commands is DIRCHARTEXPAND, DOMCHARTEXPAND, ORGCHARTEXPAND, TYPECHARTEXPAND, BROWCHARTEXPAND, OSCHARTEXPAND, REQCHARTEXPAND, REDIRCHARTEXPAND, FAILCHARTEXPAND, REFCHARTEXPAND, REDIRREFCHARTEXPAND, FAILREFCHARTEXPAND and REFSITECHARTEXPAND. The CHARTEXPAND commands can take a comma-separated list (without spaces) as an argument, but not wildcards.

Just as for top-level items, sub-items will only be included if they are listed in the main table for the report. And so if an item does not have any sub-items listed, it will not be expanded, even if you asked for it to be. This means that you may need to use the appropriate SUB commands or SUBFLOOR commands to make sure that the sub-items do get listed. For example

SUBDOMAIN *.com
DOMCHARTEXPAND .com

Also, sub-items will only appear on the pie chart if they are large enough to get on in their own right. Note that if an item has any sub-items listed, and is expanded, then the item itself will no longer appear on the chart, only any sub-items which are large enough.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/include.html0000644000175000017500000003346710161303532016206 0ustar sret1sret100000000000000 Readme for analog -- inclusions and exclusions [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Inclusions and exclusions


After aliasing each item, analog decides whether that item is wanted or not. The whole line is only counted if all the items are wanted. Whether an item is wanted or not is determined by INCLUDE and EXCLUDE commands specified by the user. These commands can be used to exclude requests from your local users, for example, or to analyse only files in a subdirectory. For example
HOSTEXCLUDE mycomputer.myisp.com
would exclude all requests by that computer from the statistics. (To exclude lines just from one specific report, see below.)

The rule for determining whether an item is included or excluded is as follows. All the INCLUDE and EXCLUDE commands for that item are considered one by one in order, and the item is included or excluded according to the last command it matched. Items which don't match any of the INCLUDE or EXCLUDE commands are included if the first command was an exclusion, and excluded if the first command was an inclusion. For example, the configuration

FILEINCLUDE /~sret1/*
FILEEXCLUDE /~sret1/backgammon/*,/~sret1/analog/*
FILEINCLUDE /~sret1/backgammon/*.gif
would instruct the program to examine only my files, excluding my backgammon and analog files, but including gifs in my backgammon directory. On the other hand,
FILEEXCLUDE /~sret1/*/img/*
would analyse all files, except for images in my various directories. (If you get confused with all the inclusions and exclusions, remember that you can always use SETTINGS ON to see what the options you have specified represent.) Note that inclusions and exclusions can contain any number of wildcards, and can be lists separated by commas (but no spaces).

The full list of these commands is HOSTINCLUDE and HOSTEXCLUDE; FILEINCLUDE and FILEEXCLUDE; BROWINCLUDE and BROWEXCLUDE; REFINCLUDE and REFEXCLUDE; USERINCLUDE and USEREXCLUDE; VHOSTINCLUDE and VHOSTEXCLUDE; and STATUSINCLUDE and STATUSEXCLUDE.


Some notes on these commands.

Because the inclusions and exclusions take place after the aliasing, the name you must use is the aliased name. (In the absence of output alias commands, this is the name of the item in the output.)

Sometimes a line doesn't contain a particular sort of item, either because there is no field reserved for it on the line, or because the browser didn't send it for that request, or because it was present but corrupt. You can include or exclude these lines by making a special blank entry in the INCLUDE or EXCLUDE command. For example,

USERINCLUDE jim
USERINCLUDE ""
would include lines from user jim and lines without any user specified.

The behaviour of REQINCLUDE and REFINCLUDE can be slightly unintuitive if the file has search arguments.

You can also use regular expressions for the inclusions and exclusions by prefixing the expression with "REGEXP:" or "REGEXPI:". I've already described this at length in the context of aliases, so you can look there for all the details. A regular expression must be on a line on its own, not within a comma-separated list.


With HOSTINCLUDE and HOSTEXCLUDE, you have to use numerical addresses if your web server records numerical addresses in the logfile, or names if it records names (or if you're resolving the numerical addresses with analog's DNS resolution). For numerical addresses, you can use some special formats, like this:
HOSTINCLUDE 131.111.20.18      # simple IP address
HOSTINCLUDE 131.111.20.*       # wildcard
HOSTINCLUDE 131.111.20         # the same meaning
HOSTINCLUDE 131.111.20-23      # a range of class C addresses
HOSTINCLUDE 131.111.20.18/23   # subnet mask

The STATUSINCLUDE and STATUSEXCLUDE commands are slightly different from the rest. They work on HTTP status codes. (These codes are defined in the HTTP spec, and viewable in the Status Code Report. But if you don't already know about them, you really don't want to use these commands anyway!) The arguments to the commands are a comma-separated list of ranges. One end of the range can be blank, meaning from the first, or to the last, status code. For example
STATUSINCLUDE 200-206,304,500-
would mean only look at lines with status codes 200-206, 304 or 500-599.

Some people want to exclude status code 304 (Not Modified) to stop those requests appearing in the Request Report. But there is a better solution. By default, analog counts code 304 as a successful request, because it assumes that the cached version of the document is then presented to the user. But you can count it as a redirected request with the command

304ISSUCCESS OFF
For most people this is the wrong option, because code 304 is really the same as code 200 to the user. So again, if you don't understand this, stick with the default.
There is also one other pair of commands which belongs in this category, namely the FROM and TO commands. These specify a time period to restrict the analysis to. The simplest usage of these commands is FROM yyMMdd or FROM yyMMdd:hhmm, where yy represents the last two digits of the year (analog assumes that the year is between 1970 and 2069), MM represents the month, dd is the date, hh the hour, and mm the minute. So, for example, to analyse only requests from 1st July 1999 to 1pm on 15th June 2000 I would use the configuration
FROM 990701
TO   000615:1300
Alternatively, each of the components can be preceded by + or - to represent time relative to the time at which the program was invoked. In this case, the date can have more than 2 digits. This allows constructions like
FROM -01-00+01   # from tomorrow last year
TO -00-0131  # to the end of last month (OK even if last month
             # didn't have 31 days)
FROM -00-00-112
TO   -00-00-01  # statistics for the last 16 weeks
FROM -00-00-00:-06+01  # statistics for the last 6 hours
There are command line abbreviations +F and +T for the FROM and TO commands; for example, +T-00-00-01:1800 looks at statistics until 6pm yesterday. -F and -T turn off the from and to, as do FROM OFF and TO OFF.
There are also INCLUDE and EXCLUDE commands for most of the reports. Unlike the INCLUDE and EXCLUDE commands discussed above, these don't exclude logfile lines but individual lines from particular reports.

So, for example, the command

REFREPEXCLUDE http://your.site.com/*
would exclude your internal referrers from the Referrer Report. However, it would not exclude them from the Failed Referrer Report, the Referring Site Report, etc. (you need to use FAILREFEXCLUDE, REFSITEEXCLUDE etc. for that); nor would it prevent other analysis of logfile lines with those referrers, as REFEXCLUDE would.

The full list of these commands is REQINCLUDE and REQEXCLUDE; REDIRINCLUDE and REDIREXCLUDE; FAILINCLUDE and FAILEXCLUDE; TYPEINCLUDE and TYPEEXCLUDE; DIRINCLUDE and DIREXCLUDE; HOSTREPINCLUDE and HOSTREPEXCLUDE; REDIRHOSTINCLUDE and REDIRHOSTEXCLUDE; FAILHOSTINCLUDE and FAILHOSTEXCLUDE; DOMINCLUDE and DOMEXCLUDE; ORGINCLUDE and ORGEXCLUDE; REFREPINCLUDE and REFREPEXCLUDE; REFSITEINCLUDE and REFSITEEXCLUDE; SEARCHQUERYINCLUDE and SEARCHQUERYEXCLUDE; SEARCHWORDINCLUDE and SEARCHWORDEXCLUDE; INTSEARCHQUERYINCLUDE and INTSEARCHQUERYEXCLUDE; INTSEARCHWORDINCLUDE and INTSEARCHWORDEXCLUDE; REDIRREFINCLUDE and REDIRREFEXCLUDE; FAILREFINCLUDE and FAILREFEXCLUDE; BROWSUMINCLUDE and BROWSUMEXCLUDE; BROWREPINCLUDE and BROWREPEXCLUDE; OSINCLUDE and OSEXCLUDE; VHOSTREPINCLUDE and VHOSTREPEXCLUDE; REDIRVHOSTREPINCLUDE and REDIRVHOSTREPEXCLUDE; FAILVHOSTREPINCLUDE and FAILVHOSTREPEXCLUDE; USERREPINCLUDE and USERREPEXCLUDE; REDIRUSERREPINCLUDE and REDIRUSERREPEXCLUDE; and FAILUSERINCLUDE and FAILUSEREXCLUDE.

The inclusion or exclusion applies to the unaliased name, if you are doing any output aliases. (This contrasts with the behaviour of normal INCLUDE and EXCLUDE commands, which apply to the aliased name.)

All directory names end in slashes, so DIRINCLUDE and DIREXCLUDE, and REFSITEINCLUDE and REFSITEEXCLUDE, implicitly add a trailing slash even if you don't give one. This sometimes catches people out in the following situation.

REFSITEEXCLUDE http://my.host.com/*     # probably not what you want
means not to list subdirectories of the referring site http://my.host.com/, but to keep the site itself in the list. To exclude the site completely, just use
REFSITEEXCLUDE http://my.host.com/

You can also use the symbolic word pages in suitable INCLUDE and EXCLUDE commands; one very common command is

REQINCLUDE pages
to include only pages in the Request Report.
There are some miscellaneous INCLUDE and EXCLUDE commands which I'll describe now. First, analog determines which files should count as pages (and thus which requests count as page requests) using an INCLUDE/EXCLUDE pair called PAGEINCLUDE and PAGEEXCLUDE. By default, (case insensitive) *.html and *.htm, and directories (*/) count as pages. But you change the list by commands like
PAGEINCLUDE *.asp
PAGEEXCLUDE /sret1.html
I.e., *.asp are pages, but /sret1.html isn't. (If the file has search arguments, the PAGEINCLUDE and PAGEEXCLUDE are reckoned just on the part of the filename before the question mark.)
In some of the reports, analog can link to the files which it's listing. You can specify exactly which files are linked to with the LINKINCLUDE family of commands. For example,
REQLINKINCLUDE pages,*.pdf
would link to pages and PDF files in the Request Report. The full set of these commands is REQLINKINCLUDE and REQLINKEXCLUDE (Request Report), REDIRLINKINCLUDE and REDIRLINKEXCLUDE (Redirection Report), FAILLINKINCLUDE and FAILLINKEXCLUDE (Failure Report), REFLINKINCLUDE and REFLINKEXCLUDE (Referrer Report), REDIRREFLINKINCLUDE and REDIRREFLINKEXCLUDE (Redirected Referrer Report), and FAILREFLINKINCLUDE and FAILREFLINKEXCLUDE (Failed Referrer Report). Note that the target of the links is also affected by the BASEURL command.
Finally, there is a pair of commands called ROBOTINCLUDE and ROBOTEXCLUDE, which determine which browsers count as "robots" in the Operating System Report. For example,
ROBOTINCLUDE Googlebot/*

There is one final set of INCLUDE and EXCLUDE commands to include or exclude the search arguments at the end of URLs. But there are some slightly complicated issues surrounding those, so they deserve a new section.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/indx.html0000644000175000017500000011304710161303532015516 0ustar sret1sret100000000000000 Readme for analog -- index [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Index


[ A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | numbers]

This is the index for this Readme. Follow the numbers after each name to find references to that command or concept. Families of commands are indexed under the second part of the name: for example, HOSTEXCLUDE is under *EXCLUDE, not under HOST.

This index includes all of analog's configuration commands: if a command you used in previous versions is not here, see the section on Upgrading from earlier versions. All commands are also listed in the Quick reference with their syntax and examples, and that section is not cross-referenced from this index.

Acknowledgements [1]
Addresses, numerical [1]
*ALIAS [1]
Aliases [1]
ALL [1]
ALLBACK [1]
ALLGRAPH [1]
analog.cfg [1][2][3][4]
anlgform.html [1]
anlgform.pl [1]
anlghead.h [1][2]
Announcements [1]
APACHEDEFAULTLOGFORMAT [1]
APACHELOGFORMAT [1]
ARGSEXCLUDE [1]
*ARGSFLOOR [1]
ARGSINCLUDE [1]
*ARGSSORTBY [1]
Arguments in URLs [1][2]
ASCII output style [1]
*BACK [1]
Bar charts [1]
BARSTYLE [1]
BASEURL [1]
Basic commands [1]
Broken pipe [1][2]
BROW* commands - see under second part of name
Browser Report [1][2][3]
Browser Summary [1][2][3][4]
BROWREP* commands - see under second part of name
BROWSERREP [1]
BROWSERSUM [1]
BROWSUM* commands - see under second part of name
Bugs, reporting [1]
Bytes, how displayed [1]
BYTESDP [1]
bzip2 logfiles [1]
Cache files [1]
CACHEOUTFILE [1]
CACHEFILE [1]
CASE [1]
CGI program [1]
*CHART [1]
CHARTDIR [1]
*CHARTEXPAND [1]
"Click-thru"s [1]
Colours [1]
*COLS [1][2]
Comma separated value output [1]
Command line arguments [1][2][3]


Compilation problems [1]
Compiling [1]
Compressed logfiles [1]
COMPSEP [1]
Computer-readable output style [1]
CONFIGFILE [1]
Configuration files [1][2][3][4]
Configuration file, default [1]
Configuration file, mandatory [1]
Contents [1]
Contributors [1]
Cookies [1]
Corrupt logfile lines, definition [1]
Countries [1]
Crashes [1]
CSSPREFIX [1]
CSV output [1]
Customising analog [1]
Daily Report [1][2][3]
Daily Summary [1][2][3]
DAILYREP [1]
DAILYSUM [1]
Date reports [1][2]
Dates, restricting [1]
DAYREP* commands - see under second part of name
DAYSUM* commands - see under second part of name
DEBUG [1]
Debugging [1]
DECPOINT [1]
Default configuration file [1]
Default logfile format [1]
DEFAULTLOGFORMAT [1]
Definitions [1]
DESCFILE [1][2]
DESCRIPTIONS [1]
DIR* commands - see under second part of name
DIRECTORY [1]
Directory Report [1][2][3][4]
DIRSUFFIX [1]
DNS [1]
DNS lookups [1]
DNSBADHOURS [1]
DNSFILE [1]
DNSGOODHOURS [1]
DNSLOCKFILE [1]
DNSTIMEOUT [1]
DOM* commands - see under second part of name
DOMAIN [1]
Domain Report [1][2][3][4][5]
Domains file [1]
DOMAINSFILE [1]
Donations [1]
ERRFILE [1]
ERRLINELENGTH [1]
error_log [1][2]
Error Report [1]
Errors [1]
Example outputs [1]
Examples of each command [1]
*EXCLUDE [1]
Exclusions [1]
FAIL* commands - see under second part of name
Failed Referrer Report [1][2][3][4]
Failed requests, definition [1]
FAILHOST [1]
FAILHOST* commands - see under second part of name
FAILREF [1]
FAILREF* commands - see under second part of name
FAILURE [1]
Failure Report [1][2][3][4]
FAILUSER [1]
FAILUSER* commands - see under second part of name
FAILVHOST [1]
FAILVHOST* commands - see under second part of name
FAQ [1]
Fatal errors [1]
FILE* commands - see under second part of name
File, definition [1]
File Size Report [1][2][3]
File Type Report [1][2][3][4]
FILETYPE [1]
Filters [1]
First day of week [1]
FIVEREP [1]
FIVEREP* commands - see under second part of name
FIVESUM [1]
FIVESUM* commands - see under second part of name
Five-Minute Report [1][2][3]
Five-Minute Summary [1][2][3]
*FLOOR [1][2][3]
FOOTERFILE [1]
Form interface [1]
Frequently Asked Questions [1]
FROM [1]
GENERAL [1]
General Summary [1][2]
GENSUMLINES [1]
GOTOS [1]
*GRAPH [1]
Graphs [1]
gzipped logfiles [1]
HEADERFILE [1]
Helper applications [1]
Hierarchical reports [1]
Hits [1]
Home page [1]
HOST [1]
HOST* commands - see under second part of name
Host, definition [1]
Host Failure Report [1][2][3]
Host Redirection Report [1][2][3]
Host Report [1][2][3]
HOSTNAME [1]
Hostnames, numerical [1]
HOSTREP* commands - see under second part of name
HOSTURL [1]
Hour of the Week Summary [1][2][3]
Hourly Report [1][2][3]
Hourly Summary [1][2][3]
HOURLYREP [1]
HOURLYSUM [1]
HOURREP* commands - see under second part of name
HOURSUM* commands - see under second part of name
HTML output style [1]
HTMLPAGEWIDTH [1]
IMAGEDIR [1]
*INCLUDE [1]
Inclusions and exclusions [1]
Incremental processing [1]
Internal Search Query Report [1][2][3][4]
Internal Search Word Report [1][2][3][4]
Introduction [1]
INTSEARCHENGINE [1]
INTSEARCHQUERY [1]
INTSEARCHQUERY* commands - see under second part of name
INTSEARCHWORD [1]
INTSEARCHWORD* commands - see under second part of name
IP addresses [1]
JPEGCHARTS [1]
LANGFILE [1]
LANGUAGE [1]
Languages [1][2]
LASTSEVEN [1]
LATEX output style [1]
Licence [1][2]
*LINKEXCLUDE [1]
*LINKINCLUDE [1]
LOCALCHARTDIR [1]
LOGFILE [1]
Logfile formats [1][2]
Logfile prefix [1]
Logfiles [1]
Logfiles, choosing [1]
Logfiles, compressed [1]
Logfiles, finding [1]
Logfiles, preprocessing [1]
LOGFORMAT [1]
LOGO [1]
LOGOURL [1]
LOGTIMEOFFSET [1]
Low memory [1]
*LOWMEM [1][2]
Mailing lists [1]
Makefile [1]
Mandatory configuration file [1]
Map [1]
MARKCHAR [1]
Meaning of output [1]
Memory, using less [1]
MINGRAPHWIDTH [1]
MONTH* commands - see under second part of name
MONTHLY [1]
Monthly Report [1][2][3]
Non-time reports [1][2]
NOROBOTS [1]
"Not listed" lines [1][2][3]
Numerical addresses [1]
Numerical hostnames [1]
Operating System Report [1][2][3][4]
ORG* commands - see under second part of name
ORGANISATION [1]
Organisations, definition [1]
Organisation Report [1][2][3][4]
OS Report [1][2][3][4]
OS* commands - see under second part of name
OSREP [1]
OUTFILE [1]
OUTPUT [1]
Output aliases [1]
OUTPUT COMPUTER [1][2]
Output, configuring [1]
Output style, computer-readable [1]
Output styles [1]
Page, definition [1]
PAGEEXCLUDE [1]
PAGEINCLUDE [1]
Pages, defining [1]
*PAGEWIDTH [1]
Path through site [1]
PDFLATEX [1]
Pie charts [1]
PLAIN output style [1]
PLAINPAGEWIDTH [1]
PNGIMAGES [1]
Preprocessing logfiles [1]
Processing Time Report [1][2][3]
PROCTIME [1]
PROCTIME* commands - see under second part of name
PROGRESSFREQ [1]
QUARTERLY [1]
Quarterly Report [1][2][3]
QUARTERLY* commands - see under second part of name
QUARTERREP [1]
QUARTERREP* commands - see under second part of name
QUARTERSUM [1]
QUARTERSUM* commands - see under second part of name
Quarter-Hour Report [1][2][3]
Quarter-Hour Summary [1][2][3]
Quick reference [1]
RAWBYTES [1]
REDIR [1]
REDIR* commands - see under second part of name
Redirected Referrer Report [1][2][3][4]
Redirected requests, definition [1]
Redirection Report [1][2][3][4]
REDIRHOST [1]
REDIRHOST* commands - see under second part of name
REDIRREF [1]
REDIRREF* commands - see under second part of name
REDIRUSER [1]
REDIRUSER* commands - see under second part of name
REDIRVHOST [1]
REDIRVHOST* commands - see under second part of name
REF* commands - see under second part of name
REFARGSEXCLUDE [1]
REFARGSINCLUDE [1]
REFDIR [1]
Reference, quick [1]
REFERRER [1]
Referrer, definition [1]
Referrer Report [1][2][3][4]
Referring Site Report [1][2][3][4]
REFREP* commands - see under second part of name
REFSITE [1]
REFSITE* commands - see under second part of name
Regular expressions [1][2]
Report descriptions, in documentation [1]
Report descriptions, in output [1]
Report descriptions file [1][2]
Report.html [1][2]
Reporting bugs [1]
REPORTORDER [1]
Reports, list of [1][2]
REPORTSPAN [1]
REPORTSPANTHRESHOLD [1]
REPSEPCHAR [1]
REQ* commands - see under second part of name
REQUEST [1]
Request Report [1][2][3][4]
Requests, definition [1]
Requests for pages, defining [1]
Requests for pages, definition [1]
Requests, types of [1]
Robots, discouraging [1]
Robots, identifying [1]
ROBOTEXCLUDE [1]
ROBOTINCLUDE [1]
*ROWS [1]
RUNTIME [1]
Sample outputs [1]
Search arguments [1][2] -- see also Search Query Report and Search Word Report below
Search Query Report [1][2][3][4]
Search Word Report [1][2][3][4]
SEARCHCHARCONVERT [1]
SEARCHENGINE [1]
SEARCHQUERY [1]
SEARCHQUERY* commands - see under second part of name
SEARCHWORD [1]
SEARCHWORD* commands - see under second part of name
Search engines, discouraging [1]
SEPCHAR [1]
Session ids [1]
SETTINGS [1][2]
SIZE [1]
SIZE* commands - see under second part of name
*SORTBY [1][2][3]
Source code [1]
Spiders, discouraging [1]
Starting to use analog [1]
Starting to use analog on a Mac [1]
Starting to use analog on Windows [1]
Starting to use analog on other platforms [1]
STATUS [1]
Status Code Report [1][2][3]
STATUS* commands - see under second part of name
STYLESHEET [1]
SUBBROW [1]
SUBDIR [1]
Subdirectories [1]
SUBDOMAIN [1]
Subdomains [1]
SUB*FLOOR [1]
SUBORG [1]
SUB*SORTBY [1]
SUBTYPE [1]
Successful requests, definition [1]
Syntax [1][2]
Time reports [1][2]
TIMECOLS [1]
TIMEOFFSET [1]
Times, restricting [1]
Title line [1][2]
TO [1]
Total requests, definition [1]
Translators [1]
Tree reports [1]
TYPE* commands - see under second part of name
UNCOMPRESS [1]
Unknown domains [1][2]
Unresolved numerical addresses [1][2]
Unwanted logfile entries, definition [1]
Upgrading from earlier versions [1]
USER [1]
USER* commands - see under second part of name
USERCASE [1]
User Failure Report [1][2][3]
User Redirection Report [1][2][3]
User Report [1][2][3]
USERREP* commands - see under second part of name
VHOST [1]
VHOST* commands - see under second part of name
VHOSTREP* commands - see under second part of name
Virtual domains/virtual hosts [1][2]
Virtual Host Failure Report [1][2][3]
Virtual Host Redirection Report [1][2][3]
Virtual Host Report [1][2][3]
Visitors [1]
Visits [1]
WARNINGS [1]
Warnings [1][2]
WEEK* commands - see under second part of name
WEEKBEGINSON [1]
WEEKHOUR [1]
WEEKHOUR* commands - see under second part of name
WEEKLY [1]
Weekly Report [1][2][3]
What was new? [1][2][3][4]
What's new? [1][2]
XHTML output style [1]
XML output style [1]
YEAR* commands - see under second part of name
YEARLY [1]
Yearly Report [1][2][3]
zipped logfiles [1]
304ISSUCCESS [1]

[ A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | numbers]


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/logfile.html0000644000175000017500000004247010161303532016176 0ustar sret1sret100000000000000 Readme for analog -- choosing a logfile [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Choosing a logfile


The basic command for selecting a logfile is
LOGFILE logfilename
or just to put the logfile name on the command line without any arguments, e.g., analog logfilename. In the Mac version, you can also analyse a particular single logfile by dragging it onto the analog icon. All logfiles must be within your computer's file system (on disk, or at least mounted under Unix, or on a mapped drive under NT) -- analog won't use FTP or HTTP to fetch them from the internet.

A - sign or the word stdin is interpreted as standard input: this is useful on Unix systems for constructing pipes. There is also an optional second argument to the LOGFILE command which is explained below.

You can have several LOGFILE commands. You can include wildcards in the logfile name (but not necessarily in the directory name: this is system-dependent), and you can use a list of logfiles separated by commas (without spaces). So the following commands would tell analog to read logfile1, c:\logs\logfile2, and all files ending in .log:

LOGFILE logfile1,*.log
LOGFILE c:\logs\logfile2
Or if you were on a Mac, you might use something like
LOGFILE "Hard Drive:Internet Applications:Analog:Logs:*"
You can also use the special command
LOGFILE none
to erase the list of logfiles specified so far.

If the name of a logfile in a LOGFILE command doesn't include a directory, it will be looked for wherever analog expects to find logfiles. (This location is built in when the program is compiled.) For example, on Windows it would be in the same folder as the analog executable. But logfile names given on the command line are within the current directory.

You can also include the date in the LOGFILE name, by using the following codes.

%D  date of month
%m  month name, in English
%M  month number
%y  two-digit year
%Y  four-digit year
%H  hour
%n  minute
%w  day of week, in English
So for example,
LOGFILE access_log%Y%M.log
will look for the logfile access_log200109.log, if it's September 2001. The date used is actually the TO date if one was specified, and otherwise the time of the start of the program. So for example, you can look at all of last month's logfiles with the commands
TO -00-0131                   # to end of last month
LOGFILE access_log%Y%M??.log  # finds access_log200108??.log in Sep 2001

The LOGFILE commands are cumulative, except that any logfiles on the command line or in configuration files specified on the command line override any in the default configuration file or configuration files loaded from there, and are themselves overridden by any in the mandatory configuration file or configuration files loaded from there. Usually you don't need to worry about this, and it will do what you expect! (Actually I should have said "logfiles or cache files" -- but we'll get on to that later).


Analog knows about several different types of logfile. By default it will attempt to see if your logfile is of one of the types it knows about, based on the first line. The types it can usually diagnose are the common log format, the NCSA combined format, referrer log and browser log, the W3 extended log format, the Microsoft IIS format, the Netscape format, the WebSTAR format, the WebSite format and the MacHTTP format. Examples of all these formats are given at the end of this section. If you have debugging on, analog will report what type of logfile it thinks yours is.

If your logfile is not in one of the standard formats, you will probably still be OK, because it is possible to tell analog about other formats using a LOGFORMAT command. This is explained in the next section. But most users don't ever need to know about this because they have logfiles in a standard format. So the best thing to do is just to try analysing your logfile and see if analog will understand it. If it does, you don't need to worry about LOGFORMATs.

If analog can't understand your logfile, it will warn you that it can't detect the format, or possibly that it found a lot of corrupt lines. There are basically five reasons why this might happen:

  1. Many people try and use a LOGFORMAT command when they don't need one. Always try without one first.
  2. Some log formats are not very well designed and analog can't analyse them reliably. In this case it will give up, usually with a helpful message, rather than risk doing a bad job. For example, you might get "Logfile with ambiguous dates" or "Time without date." In this case you should read the notes on all the built-in formats below where some common problems with those formats are described.
  3. Since analog tries to deduce the format based on the first line of the logfile, it could just be that the first line is corrupt. In this case, you could tell analog the format, or you could just fix the first line.
  4. For the same reason, if the format changes midway through the log, analog will count the remaining lines as corrupt. In this case, you will find that your output page contains a partial analysis but with a large number of corrupt lines too. You will need to give analog two LOGFORMAT commands to tell it about the two different formats.
  5. Finally, some logfiles really aren't in one of the standard formats. In this case you will need to read the next section and learn how to tell analog about your format.
If you can't see what's wrong with your logfile, you can specify DEBUG ON, and analog will report where each line was corrupt.
There is also an optional second argument to the LOGFILE command, which specifies a prefix to add to all the filenames in that logfile. This is useful if you've got several different servers or virtual hosts, when the same filename may occur on each of the servers. For example,
LOGFILE mydomain.log http://www.mydomain.com
would translate a filename /file.html in mydomain.log to http://www.mydomain.com/file.html. (If you only have logfiles from one server, and you just want the prefix so that you can host the output on a different server, then you probably want the BASEURL command instead.)

Note that because this actually changes the name of the file, any FILEINCLUDE, FILEEXCLUDE or FILEALIAS command will have to refer to the new name, including the prefix.

If you are using this command to combine logfiles from several different virtual hosts, then the Virtual Host Report doesn't tell you about the different virtual hosts. The virtual host name has just become part of the filename. So you want to look in the Directory Report instead. (And you will probably want to use the SUBDIR command as well.)

If the logfile contains the name of the virtual host on each line, then the argument can contain a %v, and the name of the virtual host will be inserted at that point. If %v is included and the logfile line doesn't have a virtual host, then that line will be marked as corrupt.


It is often convenient to store logfiles compressed to save disk space. Analog will automatically read logfiles compressed using gzip, zip or bzip2. But if you have logfiles compressed using some other program, analog can still read them provided that you use an UNCOMPRESS command to say how to uncompress them.

You need to supply the types of file that you want to uncompress in a comma-separated list, together with the name of a command that will uncompress the files to standard output (rather than to a file). For example, on Unix you might use

UNCOMPRESS *.Z "/usr/bin/uncompress -c"
whereas on Windows NT, you might use
UNCOMPRESS *.Z ("c:\Program Files\uncompress\uncompress" -c)

If analog determines that a logfile which it's uncompressing isn't wanted for the analysis, a "broken pipe" error can be reported. This is produced by the uncompressing command and is out of analog's control, but it's harmless.

(Hint: There's nothing to stop you using the UNCOMPRESS command for other types of preprocessing, for example DNS resolution.)


Logfile formats

Here is a summary of the various logfile formats which analog knows about. To illustrate them, I have used the same (fictional) request as it might be recorded in the different formats.

The common logfile format is written by most servers. Its lines look like

jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
"GET /~sret1/ HTTP/1.0" 200 1243
(except all on one line). Some versions of Microsoft software have a buggy version of this with an extra quote mark before the HTTP like this:
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
"GET /~sret1/ "HTTP/1.0" 200 1243
Analog will understand these, but (as with any two formats) it will reject lines if the format changes half way through.
The NCSA referrer log looks like
[25/Dec/1998:17:45:35] http://www.site.com/ -> /~sret1/
and the browser (or agent) log looks like
[25/Dec/1998:17:45:35] Mozilla/2.0 (X11; I; HP-UX A.09.05)
In the referrer log, the date can be omitted.
The NCSA combined log is the same as the common log, except that it has the referrer and browser on the end in quotes, like this:
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ HTTP/1.0"
200 1243 "http://www.site.com/" "Mozilla/2.0 (X11; I; HP-UX A.09.05)"
(except all one line). If you are using the Apache server, you can generate this with the mod_log_config module, using the Apache command
LogFormat "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\""
It is usually better to use the combined log than separate logs, because it stores more information in less space.
The Microsoft IIS logfile looks like
192.64.25.41, -, 25/12/98, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
2178, 303, 1243, 200, 0, GET, /~sret1/, -,
(except all on one line; and sometimes with four-digit years). However, the format is extremely badly designed, in that the date follows local conventions: in other words, in North America the above example would have the date 12/25/98 instead. Analog will diagnose which form the logfile is in if possible: but if both the date and the month are at most 12, there is no way to tell which format it is. In this case, it will advise you to use the command LOGFORMAT MICROSOFT-NA for North American date format, or LOGFORMAT MICROSOFT-INT for international date format. In some countries, the date will not be in either of these formats, in which case you need to write your own LOGFORMAT command, based on the examples in the next section.

There are also various third-party extensions to the Microsoft format to include, for example, the browser and referrer. But they all do it in different ways, so analog can't automatically diagnose them, and again, you need to write a LOGFORMAT command for them.


The WebSite format looks like
12/25/98 17:45:35  jay.bird.com  host1  Server  fred  GET  /~sret1/
http://www.site.com/    Mozilla/2.0 (X11; I; HP-UX A.09.05)  200  1243  2178
(except all on one line, and with the fields separated by tabs). It suffers from the same problem with ambiguous dates as the IIS logfile (above), so again you might have to use LOGFORMAT WEBSITE-NA or LOGFORMAT WEBSITE-INT, or even have to write your own LOGFORMAT command.
The MacHTTP format looks like
12/25/98  17:45:35   OK    jay.bird.com  /~sret1/  1243
with the fields separated by tabs.
The W3 extended log, the Netscape log, and the WebSTAR log can be recognised because they must include at or near the top a line telling analog what format to expect on subsequent lines. (They may also contain later lines changing the format). If the header line is missing, analog won't be able to interpret the subsequent lines and so won't be able to analyse the logfile. In this case, you will have to either replace the missing header or use a LOGFORMAT command to tell analog your format.

If analog finds that the header line is corrupt, it will usually tell you what was wrong with it. The most common problem is that you're not allowed the time without the date or vice versa -- in particular, having the date just at the top of the logfile is not sufficient; you must have it on each line. By default, Microsoft servers produce extended logs with the date only at the top. But if the date changes during the logfile, the server doesn't then write a new date line. This means that missing days or corrupt entries can make analog get a day out in either direction, with no way to rescue or even recognise the situation!

For this reason analog knows that it can't analyse such logfiles safely, so instead it insists that the date should be on every line. There are some programs on the helper applications page to put the date on each line. If you already have such a logfile you might want to use one of these programs, but they have to assume that the date doesn't change during the logfile, so it would be much safer to tell your server to log the date on every line in future.

The extended log is described at http://www.w3.org/TR/WD-logfile.html. Its header line looks like

#Fields: date time cs-uri
In the rest of the logfile, the fields can be separated by spaces or tabs. Remember the logfile must contain the date as well as the time on every line -- see above.

There is also Microsoft's attempt at the extended format -- unfortunately they didn't read the spec., so they didn't enclose the browser and referrer in quotes, they replaced spaces in the browser name with +'s, and they put the time taken to serve the request in milliseconds instead of seconds. And there is WebSTAR's attempt which is very nearly right except that they erroneously used the CS-HOST field as the client hostname instead of the server hostname. Analog will understand all of these versions.

Extended logs always record the time in GMT, so you will probably need to use a LOGTIMEOFFSET command to convert to your local timezone.

The WebSTAR format is described at http://www.starnine.com/webstar/docs/ws4manual.3f.html. It has a header line like

!!LOG_FORMAT DATE TIME RESULT URL BYTES_SENT HOSTNAME
In the rest of the logfile, the fields are separated by tabs. The WebSTAR server also records the time in GMT, so again you will probably need to use a LOGTIMEOFFSET command to convert to your local timezone. Some other Mac servers also use the WebSTAR format, or something looking like it. Analog will understand these too.

Finally, the Netscape header line looks like

format=%Ses->client.ip% [%SYSDATE%] "%Req->reqpb.clf-request%"
%Req->srvhdrs.clf-status% %Req->srvhdrs.content-length%

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/logfmt.html0000644000175000017500000004343710161303532016051 0ustar sret1sret100000000000000 Readme for analog -- log formats [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Log formats


This section is about how to tell analog the format of your logfile. Most people don't need to do this because analog can detect the format automatically -- try it first and see, because you will save yourself a lot of trouble! But if you do need to specify the log format explicitly, here is how to do it.

The basic command to specify a log format looks like

LOGFORMAT format
-- we'll discuss what the formats can be in a minute. Or if you are using the Apache server, you will probably find it more convenient to use
APACHELOGFORMAT apacheformat
instead.

The LOGFORMAT and APACHELOGFORMAT commands only apply to logfiles specified with a LOGFILE command later in the same configuration file. So you must put the LOGFORMAT above the LOGFILE to which it refers. If you declare your logfiles on the command line, or drag them onto the app on the Mac, you must use DEFAULTLOGFORMAT or APACHEDEFAULTLOGFORMAT instead. This is so that different logfiles can have different formats, like this:

LOGFILE log0
LOGFORMAT format1
LOGFILE log1
LOGFORMAT format2
LOGFILE log2
LOGFILE log3
In this example, log1 is in format1, log2 and log3 are in format2, and log0 isn't in either format -- analog will try and detect which format it's in.
The APACHELOGFORMAT command is followed by the LogFormat from your Apache httpd.conf file. For example, if your httpd.conf contained the following lines:
LogFormat "%h %l %u %t %v \"%r\" %>s %b" myformat
CustomLog /var/log/apache/access.log myformat
then your analog.cfg should contain
APACHELOGFORMAT (%h %l %u %t %v \"%r\" %>s %b)
LOGFILE /var/log/apache/access.log
(Use parentheses instead of quotes round the argument if the argument already contains quotes.) Analog understands all Apache log formats, with the exception that it won't parse Apache's "%...{format}t" construction for customised times: if you have this construction, you will have to use ordinary LOGFORMAT instead. (This is because "%...{format}t" is sometimes localised.)
The possible formats for use with the LOGFORMAT command are of two types. First there are some symbolic words, and then there are log format strings. We'll look at the words first.

There are format words for all the built-in formats analog knows about. You might need one of these words if your logfile is in a standard format, but analog can't detect which format it's in for some reason; for example, maybe the first line is corrupt; or maybe analog can't tell whether you're using North American or international dates. So for example

LOGFORMAT COMMON
will select common format; you can also have COMBINED, REFERRER, BROWSER, EXTENDED, MICROSOFT-NA (North American date format), MICROSOFT-INT (international date format), WEBSITE-NA, WEBSITE-INT, MS-EXTENDED (Microsoft's attempt at extended format), WEBSTAR-EXTENDED (WebSTAR's version of extended format), MS-COMMON (a buggy version of common format in some versions of Microsoft software), NETSCAPE, WEBSTAR or MACHTTP. All these formats were defined at the end of the previous section. You can also use the special word AUTO to return to automatic detection.

If your logfile is not in one of the recognised formats, you can tell analog about your format using a log format string. You only ever need this if your logfile has lines which are not in one of the standard formats. (And even if it isn't in a standard format, if you're using the Apache web server, you will find APACHELOGFORMAT easier.)

The format string consists of a template for the logfile line, with the various fields and special characters replaced by codes as follows. Please note that these codes are case sensitive -- for example, %b is completely different from %B!

%S
host (the client hostname, or address of the computer making the request)
%s
numerical IP address of client (if recorded in a separate field; used when %S is empty)
%r
file requested
%q
query string (part of filename after ?, if recorded in a separate field)
%B
browser
%A
browser with +'s instead of spaces
%f
referrer
%u
user (tip: a cookie or session id can usefully be defined as %u too)
%v
virtual host (the server hostname, also called the virtual domain)
%d
day of the month
%m
month in digits
%M
month, three letter English abbreviation
%y
year, last two digits
%Y
year, four digits
%Z
year, two or four digits (less efficient)
%h
hour of the day
%n
minute of the hour
%a
a or A for am, or p or P for pm, if %h is in the 12-hour clock. (So to match "am" you need %am and to match "AM" you need %aM)
%U
"Unix time" (seconds since beginning of 1970, GMT). If it includes decimals, use %U.%j
%b
number of bytes transferred
%t
processing time in seconds
%T
processing time in milliseconds
%D
processing time in microseconds
%c
HTTP status code
%C
code words used instead of HTTP status code in some servers -- only used internally
%j
junk: ignore this field (field can be empty too)
%w
white space: spaces or tabs
%W
optional white space
%%
% sign
\n
new line
\t
tab stop
\\
single backslash
So for example, the common log format, which looks like
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
"GET /~sret1/ HTTP/1.0" 200 1243
(except all on one line) could be represented by the LOGFORMAT command
LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b)
In other words, it's just the sample line but with the hostname replaced by %S, the username by %u etc. (The parentheses are needed because the argument contains spaces.) Or take another example: if you had lines which looked like
Fri 25/12/98 5:45pm, /~sret1/, jay.bird.com, 200, 1243,
http://www.site.com, Mozilla/2.0 (X11; I; HP-UX A.09.05)
(all on one line again), you could use the format
LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B)
Remember: if you have trouble writing a LOGFORMAT string, you can turn debugging on, and analog will report where each line was corrupt. If you still have trouble, you can write to the analog-help mailing list.
A logfile can sometimes have lines in several different formats. So you can specify several LOGFORMAT commands in a row, and they will all apply to the next logfile. This is also useful if the format of your logfile changes half way through. So in this example:
LOGFORMAT COMMON
LOGFORMAT COMBINED
LOGFILE log1
LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B)
LOGFILE log2
LOGFILE log3
log1 has lines in both common and combined format, whereas log2 and log3 have lines just in the format in the previous example.

If you specify several formats, analog tries to match each line to the first format first, then if that fails the next, and so on, so the order of the formats is important. Usually you want to specify the most common one first, to minimise the time spent trying to match lines to inappropriate formats.


I suggested above that any logfile which doesn't have a LOGFORMAT command earlier in the same configuration file, or is specified on the command line, is auto-detected. But this isn't quite true. Actually such logfiles get a special format called the default log format. The default format starts off as auto-detection, but you can change it if you want with the DEFAULTLOGFORMAT command. This command works exactly the same as the LOGFORMAT command -- it understands the same formats, and if you have several DEFAULTLOGFORMAT commands, they accumulate in the same way. The difference is that they don't need to be put in any particular place. (There is also APACHEDEFAULTLOGFORMAT, which has the same effect but uses the Apache LogFormat strings.)

So let's go back to the first example:

LOGFILE log0
LOGFORMAT format1
LOGFILE log1
LOGFORMAT format2
LOGFILE log2
LOGFILE log3
Here log0 actually gets the default log format. If there are no DEFAULTLOGFORMAT commands, the default will be auto-detection. But if there are DEFAULTLOGFORMAT commands, even in another configuration file, that will be the format of log0.

The times you need to use the DEFAULTLOGFORMAT instead of the LOGFORMAT are if you want to change the format of logfiles which aren't given in a LOGFILE command -- for example, ones specified on the command line, or dragged onto the program icon on a Mac, or compiled in.


A couple more technical details and tips about LOGFORMAT commands.

The "Unix time", %U, is always recorded in GMT. So you will probably need to use a LOGTIMEOFFSET command to convert to your local timezone. Also, it's just the integer part of the time, so if you have decimals you will have to use %U.%j .

The log formats which analog can handle are those which are known as instantaneously decipherable: in practice, this means that the character which terminates a string can never occur in the string. So for example, in common format, which looks like

LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b)
if the hostname ever contained a space, the line would be marked as corrupt, because analog terminates the host at the first space, not at the first occurrence of space-dash-space, and then the rest of the line wouldn't match. Of course, hostnames should never contain spaces, so this shouldn't be a problem. There are a couple of other restrictions: if there is any date or time information, then the year, month, date, hour and minute must all be present: and the same information may not occur twice in the format (so you can't have both %m and %M, for example, because these both represent the month; make one of them a %j to have it ignored).

Sometimes you need to read one of the fields in a logfile, but not analyse it. For example, if you have a separate common log and referrer log, the referrer log might look like

http://guide-p.infoseek.com/Titles -> /~sret1/analog/
But the requests for /~sret1/analog/ would already have been counted when reading the main logfile, so you don't want to count them again now. You get round this by specifying a * in that item in the format string, like this:
LOGFORMAT (%f -> %*r)

A tip: sometimes it is more efficient to specify two or more adjacent fields to ignore with a single %j, as long as the whole group ends with a recognisable character. So common format is more efficiently specified as

LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j] "%j %r %j" %c %b)
-- in the date and time [25/Dec/1998:17:45:35 +0000], the seconds and the timezone can be ignored with a single %j, extending until the close-bracket.

Another tip: %j can also be used to ignore whole lines, rather than just fields analog doesn't use. For example, the extended log format ignores lines beginning with # by using

LOGFORMAT #%j
and the Microsoft format ignores lines corresponding to FTP requests with
LOGFORMAT (%*S, %*u, %m/%d/%y, %h:%n:%j, %j)
If those formats had not been used, the lines would have been incorrectly marked as corrupt.
Finally, both for reference and as examples, here is a list of all the fixed formats that analog understands, together with the example lines from the previous section and their built-in definitions (split over two lines where necessary).
Common format, LOGFORMAT COMMON
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
      "GET /~sret1/ HTTP/1.0" 200 1243
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%wHTTP%j" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%r" %c %b)
Microsoft common format, LOGFORMAT MS-COMMON
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
      "GET /~sret1/ "HTTP/1.0" 200 1243
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%w"HTTP%j" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%r" %c %b)
Combined log, LOGFORMAT COMBINED
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ HTTP/1.0" 200
      1243 "http://www.site.com/" "Mozilla/2.0 (X11; I; HP-UX A.09.05)"
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%wHTTP%j" %c %b "%f" "%B")
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r" %c %b "%f" "%B")
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%r" %c %b "%f" "%B")
Referrer log, LOGFORMAT REFERRER
[25/Dec/1998:17:45:35] http://www.site.com/ -> /~sret1/
or http://www.site.com/ -> /~sret1/
LOGFORMAT ([%d/%M/%Y:%h:%n:%j] %f -> %*r)
LOGFORMAT (%f -> %*r)
Browser log, LOGFORMAT BROWSER
[25/Dec/1998:17:45:35] Mozilla/2.0 (X11; I; HP-UX A.09.05)
LOGFORMAT ([%d/%M/%Y:%h:%n:%j] %B)
Microsoft log, North American dates, LOGFORMAT MICROSOFT-NA
192.64.25.41, -, 12/25/98, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
192.64.25.41, -, 12/25/2001, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
LOGFORMAT (%S, %u, %m/%d/%Z, %h:%n:%j, W3SVC%j, %j, %v,
      %T, %j, %b, %c, %j, %j, %r, %q,)
LOGFORMAT (%*S, %*u, %m/%d/%Z, %h:%n:%j, %j)
Microsoft log, international dates, LOGFORMAT MICROSOFT-INT
192.64.25.41, -, 25/12/98, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
192.64.25.41, -, 25/12/2001, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
LOGFORMAT (%S, %u, %d/%m/%Z, %h:%n:%j, W3SVC%j, %j, %v,
      %T, %j, %b, %c, %j, %j, %r, %q,)
LOGFORMAT (%*S, %*u, %d/%m/%Z, %h:%n:%j, %j)
WebSite log, North American dates, LOGFORMAT WEBSITE-NA
12/25/98 17:45:35  jay.bird.com  host1  Server  fred  GET  /~sret1/
   http://www.site.com/    Mozilla/2.0 (X11; I; HP-UX A.09.05)  200  1243  2178
LOGFORMAT (%m/%d/%y %h:%n:%j\t%S\t%v\t%j\t%u\t%j\t%r\t%f\t%j\t%B\t%c\t%b\t%T)
WebSite log, international dates, LOGFORMAT WEBSITE-INT
25/12/98 17:45:35  jay.bird.com  host1  Server  fred  GET  /~sret1/
   http://www.site.com/    Mozilla/2.0 (X11; I; HP-UX A.09.05)  200  1243  2178
LOGFORMAT (%d/%m/%y %h:%n:%j\t%S\t%v\t%j\t%u\t%j\t%r\t%f\t%j\t%B\t%c\t%b\t%T)
MacHTTP format, LOGFORMAT MACHTTP
12/25/98  17:45:35   OK    jay.bird.com  /~sret1/  1243
LOGFORMAT (%m/%d/%y\t%h:%n:%j \t%C%w%S\t%r\t%b)
The extended log, Netscape log and WebSTAR log don't have any built-in formats: analog constructs their formats from their header lines.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/lowmem.html0000644000175000017500000000764710161303532016064 0ustar sret1sret100000000000000 Readme for analog -- coping with low memory [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Coping with low memory


This section describes how to run analog with lower amounts of memory. For a normal logfile this will make analog run a bit slower. But if your computer is running out of memory when running analog, it will go very slowly indeed: so for large logfiles, this can make analog run much faster, or even make an analysis possible that wouldn't otherwise be possible.

Recall what happens to an item when it has been read in. First it is aliased. Secondly, it is checked to see whether it is included or excluded. Then finally, if all the items are wanted, one request is added to its score.

Normally the name of the item is saved before the aliasing takes place. This avoids analog having to do the aliasing again next time the same item is encountered. But this can take up more memory than necessary. So there is a family of LOWMEM commands provided, which tell analog to record the name at a later stage, or even not at all. If you use these commands, analog will have to do a bit more work than normal, but it will use less memory. On most sites, the hosts take up most of the memory, so I'll use the HOSTLOWMEM command as an example.

The command

HOSTLOWMEM 0
represents the normal case, when the hostname is recorded before being aliased. If you specify
HOSTLOWMEM 1
instead, then the hostname is not recorded until after the aliasing. If you specify
HOSTLOWMEM 2
then the name is not recorded until after the inclusion and exclusion lookup has been done as well. And finally, if you give the command
HOSTLOWMEM 3
then the hostname is not saved at all, and the Host Report will not be constructed, even if you've asked for it. (The Domain Report can still be constructed though.) The analogous commands for the other items are FILELOWMEM, BROWLOWMEM, REFLOWMEM, USERLOWMEM and VHOSTLOWMEM.
So what should you do if analog runs out of memory? First, look in your logfile to see which items are taking up all the memory. If you have lots of different filenames, ones you generate on the fly for example, you would want to use the FILELOWMEM commands. Maybe you could combine all the similar filenames into one with a FILEALIAS command, and use FILELOWMEM 1. (If you have lots of different filenames caused by different search arguments, then using ARGSEXCLUDE might solve your problem without any need to use LOWMEM at all). But for most users, it is the hostnames which cause the problem. If you only want to analyse requests from certain hosts, then you could use HOSTLOWMEM 2 to exclude the others before recording those that are left. If you don't want to exclude any hosts, and you haven't got enough memory to record all the different hostnames, then HOSTLOWMEM 3 would be appropriate.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/mailing.html0000644000175000017500000001777610161303532016210 0ustar sret1sret100000000000000 Readme for analog -- mailing lists [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Mailing lists


I welcome mail about analog, both praise and bug reports! I and others are also usually happy to help people who have trouble with analog: it helps me to find bugs, and know where the documentation is unclear.

If your statistics are provided by someone else, for example your web hosting company, you should normally get support from them. They're the only ones who can configure analog to your specifications.

There are three mailing lists for analog.

analog-announce
Announcements about analog. I post to this when there are new versions, for example. Only gets a few messages a year. You can join this list by filling in the form at http://lists.meer.net/mailman/listinfo/analog-announce
analog-help
Getting help with analog from experienced users. This is the place to go if you have trouble setting up or configuring the program. Usually you will get a swift reply. You have to subscribe to the list before you can send a message. This is necessary to deter spammers. You can subscribe at http://lists.meer.net/mailman/listinfo/analog-help
You can also read this list as a forum (but not post) or as a newsgroup.
analog-author
This just goes to me. Use for private comments, or other things that would not be suitable for the analog-help list. I'm pretty bad at answering my mail, so don't expect a swift reply. Don't use this address for user support questions: they will be ignored.
There is also an independent Japanese analog mailing list. And there are also companies offering support for analog on a commercial basis: you can find a list of them on the analog home page.
If you want to get help with analog, please check the following simple things first. (For articles on how to ask in such a way that you'll get a useful answer, I recommend Eric Raymond's How To Ask Questions The Smart Way and Simon Tatham's How to Report Bugs Effectively.)
  1. Read the FAQ. Maybe I've answered your question already. If I have, I'll just direct you to the FAQ, not answer it again.
  2. If analog produced some error messages when it ran, they probably indicate what went wrong. Read the section on Errors and warnings.
  3. If your question is "Will this command have that effect?", why not try it and see!
  4. If you think you've found a bug, read the list of known bugs at my site, to see if your bug is already known about.
  5. Read the other relevant pages of the Readme, particularly the sections on Starting to use analog and Customising analog. You may also find the index useful. We don't appreciate people who are too lazy to read the documentation. (If the documentation is unclear, or the relevant paragraph is too well hidden, then that's a different matter. Of course I want to know about that.)
  6. Have a look in the web archives of the mailing list to see if your question has already been answered there.
  7. If analog isn't doing what you thought you asked it to, then run it with the SETTINGS ON configuration command, and see what options it thinks it's meant to be using.
I'm sorry to be so fussy, but a lot of the mail on the list really needn't have been sent at all, and just wastes the time of everybody on the list. As I say, I really do welcome genuine mail.

If you still need help, subscribe to the to the analog-help mailing list using the form at http://lists.meer.net/mailman/listinfo/analog-help, and then send your mail to analog-help@lists.meer.net. Please do the following when you send mail to the list.

  1. Describe exactly what you did, what you expected, and what the computer did. Include the exact text of any error messages, not a précis.
  2. Mention which version of analog you are using, on which operating system.
  3. Although you should obey the first two points, you should also try and send a short message. Most people don't bother to read long messages.
  4. Give your mail a subject line which indicates immediately what aspect of analog it is about. (This is useful for the archives).
  5. Do not send long files or attachments unless you're asked to. We do not want to see your configuration file, your header file, your output file, or any logfile over 10 lines long. They are almost always useless to us. And anyway, excessively long messages will be rejected by the mailing list server.

If you want to send a private message to me, you can send it to me at analog-author@lists.meer.net. Please don't use this address for user support questions: I don't have time to answer them, and I'll just ignore them.
There are several web archives of the analog-help list. You can find them at these places: You can also find archives of the analog-announce list at If you prefer Usenet format, you can also read the groups as newsgroups at Many thanks to meer.net for providing these mailing lists for me, to GMane for the mail-to-news gateways, and to all those who provide list archives.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/map.html0000644000175000017500000000633510161303532015332 0ustar sret1sret100000000000000 Readme for analog -- map of Readme [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Map of Readme



Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/meaning.html0000644000175000017500000000351310161303532016166 0ustar sret1sret100000000000000 Readme for analog -- what the results mean [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What the results mean


This section of the Readme is about understanding the results analog produces. It's divided into three subsections.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/othreps.html0000644000175000017500000004255010161303532016240 0ustar sret1sret100000000000000 Readme for analog -- other reports [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Other reports


This section deals with the non-time reports. There are quite a lot of commands which control these reports, although we've seen some of them already.

First, these reports have COLS commands, just like the time reports. (See the section on Time reports for how to use these commands.) But for these reports, several additional columns are available. Here is the full list of columns for the non-time reports

R
Number of requests
r
Percentage of the requests
S
Number of requests in the last 7 days
s
Percentage of the requests in the last 7 days
P
Number of page requests
p
Percentage of the page requests
Q
Number of page requests in the last 7 days
q
Percentage of the page requests in the last 7 days
B
Number of bytes transferred
b
Percentage of the bytes
C
Number of bytes transferred in the last 7 days
c
Percentage of the bytes in the last 7 days
d
Date of last access
D
Date and time of last access
e
Date of first access
E
Date and time of first access
N
The number of the item in the list
So, for example,
REQCOLS NRSD
counts the files in the Request Report, listing the number of requests for each, the number of requests for each in the last 7 days, and the time when each was last requested. The full list of COLS commands for non-time reports is HOSTCOLS, REDIRHOSTCOLS, FAILHOSTCOLS, ORGCOLS, DOMCOLS, REQCOLS, DIRCOLS, TYPECOLS, SIZECOLS, PROCTIMECOLS, REDIRCOLS, FAILCOLS, REFCOLS, REFSITECOLS, SEARCHQUERYCOLS, SEARCHWORDCOLS, INTSEARCHQUERYCOLS, INTSEARCHWORDCOLS, REDIRREFCOLS, FAILREFCOLS, BROWREPCOLS, BROWSUMCOLS, OSCOLS, VHOSTCOLS, REDIRVHOSTCOLS, FAILVHOSTCOLS, USERCOLS, REDIRUSERCOLS, FAILUSERCOLS and STATUSCOLS. Not every column is allowed in every report, but if you specify an illegal one, analog will warn you about it.
Next you need to know how use a SORTBY command to specify how the reports should be sorted. There are ten possible ways of sorting reports:
REQUESTS
total number of requests
REQUESTS7
requests within the last 7 days
PAGES
total requests for pages
PAGES7
requests for pages within the last 7 days
BYTES
total bytes transferred
BYTES7
bytes transferred within the last 7 days
FIRSTDATE
time of first request
DATE
time of most recent request
ALPHABETICAL
alphabetically
RANDOM
unsorted, sometimes useful for speed in very long reports
For example, the command
HOSTSORTBY ALPHABETICAL
will sort the Host Report alphabetically. The full list of SORTBY commands is HOSTSORTBY, REDIRHOSTSORTBY, FAILHOSTSORTBY, ORGSORTBY, DOMSORTBY, REQSORTBY, DIRSORTBY, TYPESORTBY, REDIRSORTBY, FAILSORTBY, REFSORTBY, REFSITESORTBY, SEARCHQUERYSORTBY, SEARCHWORDSORTBY, INTSEARCHQUERYSORTBY, INTSEARCHWORDSORTBY, REDIRREFSORTBY, FAILREFSORTBY, BROWREPSORTBY, BROWSUMSORTBY, OSSORTBY, VHOSTSORTBY, REDIRVHOSTSORTBY, FAILVHOSTSORTBY, USERSORTBY, REDIRUSERSORTBY, FAILUSERSORTBY and STATUSSORTBY. Again, not every sort method is possible in every report, but you'll be warned if you choose an illegal one.

There is one known bug concerned with SORTBY ALPHABETICAL. The report is sorted before any output alias is applied. This means that if an output alias has been specified for the report, then the report may appear not to be sorted correctly.


You can also specify a FLOOR for most reports, saying how much activity an item needs before it is listed on the report. (Other items will just be accumulated together in the "not listed" line at the bottom of the report.) There are lots of possible ways of specifying floors, which I'll list here, using the DOMFLOOR (Domain Report FLOOR) command as an example. Essentially each one consists of a number indicating the level of the floor, followed by a letter indicating the floor criterion.
DOMFLOOR 1000r       # all domains with at least 1000 requests
DOMFLOOR 100s        # at least 100 requests within the last 7 days
DOMFLOOR 1000p       # at least 1000 requests for pages
DOMFLOOR 100q        # at least 100 requests for pages within the last 7 days
DOMFLOOR 1000000b    # at least 1,000,000 bytes transferred
DOMFLOOR 1kb         # at least 1 kilobyte (1024 bytes)
DOMFLOOR 10.5Mc      # at least 10.5Mb within the last 7 days
DOMFLOOR 0.5%r       # 0.5% of the total requests in the Domain Report
                     # (ditto %s, %p etc.)
DOMFLOOR 0.5:r       # 0.5% of the maximum number of requests for any domain
                     # (ditto :s, :p etc.)
DOMFLOOR 970701d     # last access since 1st July 1997
DOMFLOOR 970701e     # first access since 1st July 1997
DOMFLOOR -00-01-00d  # last access in last month (see
                     # documentation on FROM and TO commands)
DOMFLOOR -100r       # domains with top 100 number of requests
                     # (ditto -100s, p, q, b, c, d, or e)
The full list of FLOOR commands is HOSTFLOOR, REDIRHOSTFLOOR, FAILHOSTFLOOR, DOMFLOOR, ORGFLOOR, REQFLOOR, DIRFLOOR, TYPEFLOOR, REDIRFLOOR, FAILFLOOR, REFFLOOR, REFSITEFLOOR, SEARCHQUERYFLOOR, SEARCHWORDFLOOR, INTSEARCHQUERYFLOOR, INTSEARCHWORDFLOOR, REDIRREFFLOOR, FAILREFFLOOR, BROWREPFLOOR, BROWSUMFLOOR, OSFLOOR, VHOSTFLOOR, REDIRVHOSTFLOOR, FAILVHOSTFLOOR, USERFLOOR, REDIRUSERFLOOR, FAILUSERFLOOR and STATUSFLOOR. Once again, not every floor method is legal for every report, but you'll be warned if you try and choose an illegal one.
I've already told you about how to turn each report on and off from the command line using its code letter. In fact, you can specify the SORTBY and the FLOOR in the same command. Take the example of the Referrer Report. If you follow the +f (to turn the report on) with a letter, it represents the sort method according to the following code:
r
REQUESTS
s
REQUESTS7
p
PAGES
q
PAGES7
b
BYTES
c
BYTES7
d
DATE
e
FIRSTDATE
a
ALPHABETICAL
x
RANDOM
You can then, or alternatively, use one of the above FLOOR formats to specify the floor. If you specify a SORTBY, you can also leave off the last letter of the floor, and analog will guess it according to the sort method: the floor will be the same as the sort method, or by requests if the sort method is ALPHABETICAL or RANDOM. Here are four examples:
+fp
means turn the Referrer Report on and sort it by page requests, but says nothing about the floor;
+f100s
means list all referrers with at least 100 requests in the last 7 days, but says nothing about the sort method;
+fb10000
means list all referrers with at least 10,000 bytes, sorted by bytes;
+fa-000101d
means list all referrers with accesses this year, sorted alphabetically.

Each of these reports can have a pie chart drawn at the top of it. The charts can be turned on and off, or plotted by a different criterion, using the CHART commands. For example,
REQCHART OFF
will stop you getting a pie chart on the Request Report, whereas
REQCHART ON
will turn it back on. You can also use the following arguments to plot the chart by a specific variable.
REQUESTS
total number of requests
REQUESTS7
requests within the last 7 days
PAGES
total requests for pages
PAGES7
requests for pages within the last 7 days
BYTES
total bytes transferred
BYTES7
bytes transferred within the last 7 days
By default, the chart will be plotted by the SORTBY if that's one of the above six variables, or else by the FLOOR if that's one of the six, or failing both of those by REQUESTS. Usually you just want to stick to the default, and analog will warn you if you could have used the SORTBY or FLOOR and requested something different.

The full list of CHART commands is HOSTCHART, REDIRHOSTCHART, FAILHOSTCHART, ORGCHART, DOMCHART, REQCHART, DIRCHART, TYPECHART, REDIRCHART, FAILCHART, REFCHART, REFSITECHART, SEARCHQUERYCHART, SEARCHWORDCHART, INTSEARCHQUERYCHART, INTSEARCHWORDCHART, REDIRREFCHART, FAILREFCHART, BROWREPCHART, BROWSUMCHART, OSCHART, VHOSTCHART, REDIRVHOSTCHART, FAILVHOSTCHART, USERCHART, REDIRUSERCHART, FAILUSERCHART, STATUSCHART, SIZECHART and PROCTIMECHART. Again, not every chart method is available for every report. You can also use

ALLCHART ON
ALLCHART OFF
to turn them all on or off simultaneously.

The pie charts are normally written to the same directory as the OUTFILE. But you can specify a different location using the CHARTDIR and LOCALCHARTDIR commands. If the OUTFILE is standard output, you must use these commands, or you will not get any pie charts. Also, if you are writing two output files to the same directory, you must use these commands, or one set of images will overwrite the other. And you also need to use these commands if you are using the form interface, but there are additional issues in that case.

You have to use both of the commands before they have any effect. The CHARTDIR is the location of the pie chart directory on your server, similar to the IMAGEDIR; it's used for putting in the <img> tag to include the image. The LOCALCHARTDIR is the location on your local disk; it's where the image is written to. For example, you might have

CHARTDIR /images/
LOCALCHARTDIR /usr/local/apache/htdocs/images/
to put the pie charts in locations like /usr/local/apache/htdocs/images/dom.png and link to them like <img src="/images/dom.png">. On Windows, you will need to put the LOCALCHARTDIR in quotes, to stop the backslash at the end of the line being interpreted to mean that the command continues on the next line. For example,
LOCALCHARTDIR "\webimages\analog\"
Actually, the CHARTDIR and LOCALCHARTDIR are just prefixes to the filename, so you can specify something like
CHARTDIR /stats/rep1
LOCALCHARTDIR /usr/local/htdocs/stats/rep1
to put the pie charts in locations like /usr/local/htdocs/stats/rep1dom.png and link to them like <img src="/stats/rep1dom.png">. Also the names can contain date codes in the same way as the LOGFILE and OUTFILE.

If you compiled your own version of analog, and you used your version of libgd instead of mine (see the Makefile for how to do this), then you can use the command

JPEGCHARTS ON
to make the charts in JPEG format instead of PNG. (See the PNGIMAGES command for how to make the bar charts in the time reports into gif's instead of png's.)

Here are the exact rules for which wedges are plotted in the pie chart. Up to ten wedges, plus "Other", are drawn, but wedges are only drawn if they are large enough. Also, wedges are only drawn if the item is listed in the main table for the report. And the whole chart will not be plotted if it would contain only one wedge.

If you want to plot more detail on the pie charts, for example Windows 98 & Windows NT instead of just Windows on the Operating System Report chart, see the next section.


You can list the time period covered by each report. This is off by default because it uses a lot of memory to calculate it, but if different reports cover different time periods (which can happen if your log format has changed at some point), it's useful to turn it on with the command
REPORTSPAN ON
There is also a command called REPORTSPANTHRESHOLD (which can be abbreviated RSTHRESH). This says that each report span should only be listed if it differs from the overall span of the whole report -- listed at the top of the page -- by at least this many minutes at one end. For example,
REPORTSPANTHRESHOLD 60
will only list a report span if that report starts at least an hour after the start of the logfile, or ends at least an hour before the end of the logfile. You can set
REPORTSPANTHRESHOLD 0
to make sure that the report span is listed on all the reports.
We've already seen some other commands affecting what was listed in the non-time reports. The output INCLUDE and EXCLUDE commands specified lines to omit from each report, and the output alias commands specified some aliasing to do on the names before they were listed. There were also LINKINCLUDE and LINKEXCLUDE commands to control what was linked to in the reports. You might want to have another look at these paragraphs.

There's one other command which affects the links in the Request Report, Redirection Report and Failure Report. The command BASEURL prepends an additional string to the URLs in the target of the link. For example, after the command

BASEURL http://www.statslab.cam.ac.uk
/~sret1/ will be linked to http://www.statslab.cam.ac.uk/~sret1/, not just to /~sret1/. This is very useful if you want to display the statistics on a different server from the server they refer to. If you want the file to be listed as http://www.statslab.cam.ac.uk/~sret1/, rather than just to be linked to that address, you need to use the second argument to the LOGFILE command instead.

In the next section, we'll look at commands for generating hierarchical reports, which are closely related to the commands in this section.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/output.html0000644000175000017500000005523710161303532016122 0ustar sret1sret100000000000000 Readme for analog -- configuring the output [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Configuring the output


So far we have mainly discussed commands which control how analog reads the logfiles. We now get on to commands for configuring the output.
First, you can change the style of the output using the OUTPUT command. There are seven possible output styles, called XHTML, HTML, PLAIN, ASCII, XML, LATEX and COMPUTER.

XHTML is the default. It produces web pages in XHTML 1.0. HTML produces web pages in HTML 2.0.

PLAIN produces plain text files, and ASCII is the same as PLAIN except that it uses all ASCII characters (no accents etc.) if possible. (This is because some applications don't understand accented characters).

LATEX produces LaTeX code which can be turned into PDF if you have the pdflatex command installed. (If you want to use the ordinary latex command, specify PDFLATEX OFF.) It's only available with certain European languages (US-ASCII, ISO-8859-1 and ISO-8859-2 character sets). Yes, I know it gives overfull hboxes sometimes.

COMPUTER is a special format suitable for reading by a computer (useful for reading into a spreadsheet, or post-processing with a graphics package, for example). There is a separate section about this format later.

XML produces an XML output which is an alternative format for post-processing. The DTD for the XML output is distributed with the program. You can find more information about the XML style, and an example of a post-processing program, at http://timian.jessen.ch/.

As well as a command like

OUTPUT PLAIN
you can also select PLAIN style with the command line argument +a, and XHTML with the command line argument -a.

You can also specify OUTPUT NONE for no output, if you are producing a cache file.


Next, you can change the language of the output. There are two ways to do this. The usual way is to use the LANGUAGE command. For example, the command
LANGUAGE FRENCH
will give you the output in French. The available languages at the moment are ARMENIAN, BASQUE, BULGARIAN (Windows-1251), BULGARIAN-MIK (MIK-16), CATALAN, SIMP-CHINESE (GB2312), TRAD-CHINESE (Big5), CZECH (ISO Latin 2), CZECH-1250 (Windows-1250), DANISH, DUTCH, ENGLISH, US-ENGLISH, FINNISH, FRENCH, GERMAN, HUNGARIAN, INDONESIAN, ITALIAN, JAPANESE-EUC (EUC-JP), JAPANESE-JIS (ISO-2022-JP), JAPANESE-SJIS (SJIS), JAPANESE-UTF (UTF-8), KOREAN, LATVIAN, NORWEGIAN (Bokmål), NYNORSK, POLISH, PORTUGUESE, BR-PORTUGUESE, RUSSIAN (KOI8-R), RUSSIAN-1251 (Windows-1251), SERBIAN, SLOVAK (ISO Latin 2), SLOVAK-1250 (Windows-1250), SLOVENE (ISO Latin 2), SLOVENE-1250 (Windows-1250), SPANISH, SWEDISH, SWEDISH-ALT (alternative translation avoiding Anglicisms), TURKISH and UKRAINIAN.

The following languages were available for previous versions of analog, but have not yet been translated for version 5: BOSNIAN, CROATIAN, GREEK, ICELANDIC, LITHUANIAN and ROMANIAN. As and when they are translated, they will be added to the analog home page. If you want to translate any of them (or any other language), I would be delighted! See below.

The other way to specify a language is to use the LANGFILE command. This is useful if you want to download a new language from the analog home page, or if you want to translate one yourself, or even if you want to change some words or phrases or the way the dates and times are formatted in the output. The LANGFILE command tells analog in which file to find the various words and phrases for a new language. For example, the command

LANGFILE guarani.lng   # or
LANGFILE /usr/etc/httpd/analog/lang/guarani.lng
would read from that file. If the name of the file doesn't include a directory, it will be looked for wherever analog normally expects to find its language files.

Some languages also have domains files or report descriptions files available. These are normally selected automatically by the LANGUAGE command. But you can tell analog to use different ones with the DOMAINSFILE and DESCFILE commands. Also, some languages have translations of the form interface or configuration file.

If you want to translate another language, I would be delighted! Do contact me first to make sure that no-one else is already translating the same language. The file README.txt in the language directory, and the English language file, contain some brief instructions for translating new languages.

Equally, if you find any mistakes in the output in different languages, please do let me know because I'm not able to check them all myself!


You can change which file the output goes to with a command like
OUTFILE stats.htm
or with a command line argument like +Ostats.htm. If you use the filename - or stdout, the output will go to standard output, which is normally the screen, but Unix users might like to redirect it to another file or even into a pipe. You can also use an absolute path name, like
OUTFILE /usr/bin/httpd/htdocs/stats.html  # Unix
OUTFILE "Hard Disk:Server Apps:WebSTAR:Analog:Report.html" # Mac
If the name of the OUTFILE doesn't include a directory, it will be put wherever analog expects to put its output files. (This location is built in when the program is compiled.) For example, on Windows it would be in the same folder as the analog executable. But if you use the +O command line argument, the file is within the current directory.

You can include date codes in the OUTFILE in exactly the same way as for the LOGFILE. So for example,

OUTFILE stats%y%M%D.html
will produce filenames like stats990501.html. As with the LOGFILE, the date used is the TO date if one was specified, and otherwise the time of the start of the program.
Next, you need to know how to turn the different reports on and off. There are 44 different reports which analog can produce, if your web server has been configured to record the necessary data in the logfiles. Each one has a short name, and a code letter or number, as follows. (Note that the code letters are case sensitive: Z is quite different from z, for example).
x  GENERAL         General Summary
1  YEARLY          Yearly Report
Q  QUARTERLY       Quarterly Report
m  MONTHLY         Monthly Report
W  WEEKLY          Weekly Report
D  DAILYREP        Daily Report
d  DAILYSUM        Daily Summary
H  HOURLYREP       Hourly Report
h  HOURLYSUM       Hourly Summary
w  WEEKHOUR        Hour of the Week Summary
4  QUARTERREP      Quarter-Hour Report
6  QUARTERSUM      Quarter-Hour Summary
5  FIVEREP         Five-Minute Report
7  FIVESUM         Five-Minute Summary
S  HOST            Host Report
l  REDIRHOST       Host Redirection Report
L  FAILHOST        Host Failure Report
Z  ORGANISATION    Organisation Report
o  DOMAIN          Domain Report
r  REQUEST         Request Report
i  DIRECTORY       Directory Report
t  FILETYPE        File Type Report
z  SIZE            File Size Report
P  PROCTIME        Processing Time Report
E  REDIR           Redirection Report
I  FAILURE         Failure Report
f  REFERRER        Referrer Report
s  REFSITE         Referring Site Report
N  SEARCHQUERY     Search Query Report
n  SEARCHWORD      Search Word Report
Y  INTSEARCHQUERY  Internal Search Query Report
y  INTSEARCHWORD   Internal Search Word Report
k  REDIRREF        Redirected Referrer Report
K  FAILREF         Failed Referrer Report
B  BROWSERREP      Browser Report
b  BROWSERSUM      Browser Summary
p  OSREP           Operating System Report
v  VHOST           Virtual Host Report
R  REDIRVHOST      Virtual Host Redirection Report
M  FAILVHOST       Virtual Host Failure Report
u  USER            User Report
j  REDIRUSER       User Redirection Report
J  FAILUSER        User Failure Report
c  STATUS          Status Code Report
For details on what the various reports mean, and a summary of the commands which control them, see the section on Analog's reports.

You can turn each report on or off with configuration commands like

FIVEREP OFF
REFSITE ON
or by using command line arguments like -5 and +s. You can also turn all reports except the General Summary on or off with the commands ALL ON and ALL OFF, or with the command line arguments +A and -A.
You can turn the descriptions of each report off with the command
DESCRIPTIONS OFF
Even if DESCRIPTIONS is ON, the descriptions will only appear if analog can find a report descriptions file in your language, or if you specify one using the DESCFILE command: for example,
DESCFILE descriptions.txt
If the name of the descriptions file doesn't include a directory, it will be looked for wherever analog normally expects to find its language files.

You can turn the "Go To" lines in the output off with the command

GOTOS OFF
GOTOS ON turns them on again, and GOTOS FEW puts the "Go To" lines just at the top and bottom. GOTOS OFF can be abbreviated with the -X command line argument, and GOTOS ON with +X.

You can turn off the "Program started at" line at the top of the output, and the "Running Time" line at the bottom, with the command

RUNTIME OFF
and turn them on again with RUNTIME ON.

The figures in parentheses in the General Summary are for the last seven days: either the seven days before the TO time, or if no TO time is given, the seven days before the time of the program start. The figures for the last seven days are normally included if some, but not all, of the requests fall in those seven days; but you can turn them off by means of the command

LASTSEVEN OFF
Of course LASTSEVEN ON turns them on again.

You can change the order of the reports by means of the REPORTORDER command. You should list the code letters for all possible reports in the order you want them. Non-alphanumeric characters are ignored and so can be used as separators. For example,

REPORTORDER x-1QmdDhHw4567W-cPz-ritEIYy-SlLZo-sNnfKk-ujJ-vMR-bBp

You can turn the lines in General Summary on and off individually using the GENSUMLINES command. The default is
GENSUMLINES ALL
meaning all available lines. (You always only get the ones relevant to your logfile though.) You can turn lines off using a command like
GENSUMLINES -KL
(to turn off lines K & L) and turn them on again with a command like
GENSUMLINES +K
You can specify the exact set of lines to include with a command like
GENSUMLINES CDFGHM
You now just need to know which lines have which code letters, which is given in the following table.
 
Successful requests (always listed)
B
Average successful requests per day
C
Logfile lines without status code
D
Successful requests for pages
E
Average successful requests for pages per day
F
Failed requests
G
Redirected requests
H
Requests with informational status code
I
Distinct files requested
J
Distinct hosts served
K
Corrupt logfile lines
L
Unwanted logfile entries
M
Data transferred
N
Average data transferred per day

There is a command called IMAGEDIR which tells analog where the various images used to make the output page should live. It should be a URL, not the actual location on your disk, and it should include the final slash. For example, you could have
IMAGEDIR img/   # relative URL: within the same directory as the output
IMAGEDIR /img/  # off the root directory of your server
IMAGEDIR http://www.myother.server.com/img/  # on another server
Some people are confused about the IMAGEDIR. It's just put in the <img> tags in the output. You can see its effect if you look at the HTML source of the output page.

You can use gif images instead of png's for the bar charts by specifying

PNGIMAGES OFF
PNGIMAGES doesn't affect the pie charts, which are always png's: but see the JPEGCHARTS command for something similar.
There are four commands which affect the top line of the output. First, the LOGO and LOGOURL commands allow you to replace the analog logo with another image (for example, your organisation's logo). You can say
LOGO picture.gif  # for this file
LOGO /images/picture2.gif  # a different file
LOGO none         # for no logo
The logo is assumed to be inside the IMAGEDIR unless it starts with a slash, or contains ://

The LOGOURL command specifies a URL to link the logo to. If you change the LOGO, you probably want to change the LOGOURL as well. For example,

LOGOURL http://www.mycompany.com/
LOGOURL none   # for no link
The LOGOURL command only works with the XHTML output style, not HTML 2.0.

There are commands HOSTNAME and HOSTURL which affect the name and link at the end of the title line. For example, I might specify

HOSTNAME "Stephen Turner"
HOSTURL  http://homepage.ntlworld.com/adelie/stephen/
to generate the title "Web Server Statistics for Stephen Turner". Again, you can use none as the HOSTURL to specify no link. Analog will normally translate characters in the hostname to HTML if necessary. So to include literal HTML, such as accented characters, in the output you need to precede them by a backslash, like this:
HOSTNAME "M\&uuml;ller & S\&ouml;hne"

There are commands called HEADERFILE and FOOTERFILE. These let you specify files to be inserted near the top and bottom of your output. You can also specify
HEADERFILE none
to cancel a previously-specified header file. Again, if the name of the HEADERFILE or FOOTERFILE doesn't include a directory, analog will assume a directory, specified when the program was compiled.
There is a command called STYLESHEET to specify the URL of a style sheet for the output. This allows you to change the colours etc. (See http://www.w3.org/Style/css/ for how to write a style sheet.) For example,
STYLESHEET /housestyle.css
STYLESHEET none   # to cancel it
In the XHTML output style, if you specify a style sheet, it will replace the default one, so you might prefer to use the default one as a base -- you can find it in the directory examples/css, along with some other style sheets contributed by users.

There is a command CSSPREFIX to add a prefix to all the CSS class names used in the XHTML output style. This is useful to avoid clashes with other style sheets: the disadvantage is that it will make your output longer. For example,

CSSPREFIX anlg
CSSPREFIX none    # to cancel it
Of course, if you use your own style sheet, you will have to add the CSSPREFIX to all the class names in the style sheet.
There are three related commands called SEPCHAR, REPSEPCHAR and DECPOINT. These specify single characters to be used as the thousands separator in numbers, the thousands separator within the columns in the reports, and the decimal point. Normally, these will be set automatically for the language you choose, but you can change them if you want. For example, a French user might choose
SEPCHAR " "
REPSEPCHAR none
DECPOINT ,
to make "three thousand and a quarter" look like "3 000,25" in text and "3000,25" in the reports.

There is a command called RAWBYTES. Specify RAWBYTES ON if you want the exact number of bytes to be listed, or RAWBYTES OFF if you want the number of kilobytes or Megabytes as appropriate to be listed instead.

If RAWBYTES is OFF (which is the default), then you can use the BYTESDP command to specify how many decimal places you want the bytes rounded to. The default is 2, which will display numbers like "91.26 kilobytes".


There are commands called HTMLPAGEWIDTH, PLAINPAGEWIDTH and LATEXPLAINWIDTH which specify the width of the page. Which one is used depends on whethere the output style is HTML/XHTML, PLAIN/ASCII, or LATEX. The output is not guaranteed to fit in this width, but analog will take notice of it when choosing the width of the time graphs, when sorting the Host Report alphabetically, when drawing horizontal rules, and when writing some bits of text.
There is a command called NOROBOTS which stops robots which obey the robots META tag from indexing your output page or following its links. Normally this is set to ON but you can specify NOROBOTS OFF if you don't mind robots finding your other pages this way. Note that you will stop far more robots if you also put your stats page in your robots.txt file; on the other hand, this file has to be kept up to date by the server administrator.
Sometimes your server is not in the same timezone as you, or at least records the times in its logfiles in a different timezone (for example GMT). So that you can get your statistics in your local time, there is a command called LOGTIMEOFFSET to change the time by a certain number of minutes. As with the LOGFORMAT command, this only affects logfiles which come later in the same configuration file.

You have to be careful using this command. Because of daylight savings time in operation in different parts of the world at different times, analog cannot attempt to convert between different timezones. So it's your responsibility to set the right offset for different times of year. For example, if you were in Chicago, but your server was recording time in GMT, you would need to specify two different time offsets, one of minus five hours for summer and one of minus six hours for winter. You would need to split your logfiles in the right places and then run commands like

LOGTIMEOFFSET -300
LOGFILE summer*.log
LOGTIMEOFFSET -360
LOGFILE winter*.log

There is also a related command called TIMEOFFSET. This tells analog how much to offset the time of the computer on which it is running (rather than the computer running the server), to get your local time.


In the following sections we shall look at some commands for configuring the output of particular reports, under the following headings: Time reports, Other reports and Hierarchical reports.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/quickref.html0000644000175000017500000012017710161303532016367 0ustar sret1sret100000000000000 Readme for analog -- quick reference [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Quick reference


This section is list of all of analog's configuration commands, together with a quick reference to their syntax and some examples. It's designed for those who are already familiar with the program, so it's pretty useless for trying to learn the program: to learn about the commands, read the section on Customising analog instead, or consult the index for a reference. Command line arguments aren't listed here, but there is a list of them in the index. Not all commands are available on all platforms.

This section is divided into the following parts:

Notation

The syntax for each command is given using the following notation.
"stuff"        the word stuff
x y            x followed by y
(x | y)        x or y
[x]            optional x
subset("...")  any letters from the string, in any order
perm("...")    all the letters from the string, in any order
*x             x may contain wildcards * and ? (and often comma-separated list)
x := y         x is defined to be y
COMMAND        the command under discussion
In addition, I use the following names for different types of argument.
char           a single character
string         a string
digit          a digit
number         a non-negative integer (i.e. a string of digits)
real           a non-negative real number
regexp         a Perl-syntax regular expression
file           a filename within your server's filespace;
                   e.g. /index.html
localfile      a filename within your system's filespace;
                   e.g. /usr/local/analog.html
                      or analog.html
                 if no directory specified, placed within suitable
                 directory specified at compile-time
localfmtfile   as localfile, but may contain date codes;
                   e.g. /usr/local/analog%y%M.html
referrer       a URL of a referring page;
                   e.g. http://search.yahoo.com/
URL            a URL which may be absolute, or relative to the output page;
                   e.g. images/ or /~fred/images/
                      or http://www.fred.com/images/
fmtURL         as URL, but may contain date codes

Note: I have occasionally opted for clarity above strict accuracy where I don't think it will cause any confusion!

The syntax for commands in general was given earlier: remember that an argument which contains a hash or a space must be put in quotes or parentheses.

Input and output files

Syntax
LOGFILE (*localfmtfile | "-" | "none") [prefix_string]
OUTFILE (localfmtfile | "-" | "none")
CACHEFILE (*localfmtfile | "-" | "none")
CACHEOUTFILE (localfmtfile | "-" | "none")
UNCOMPRESS *localfile program
Examples
LOGFILE /httpd/logs/*
LOGFILE c:\logs\log1,c:\logs\log2
OUTFILE "Hard Disk:Report%Y%M.html"
UNCOMPRESS *.Z "/usr/bin/uncompress -c"

LOGFORMAT commands

Syntax
format_string := (see documentation)
Apache_format_string := (see Apache documentation)
logformat := ("COMMON" | "COMBINED" | "REFERRER" | "BROWSER" | "EXTENDED" |
              "MICROSOFT-NA" | "MICROSOFT-INT" | "WEBSITE-NA" | "WEBSITE-INT" |
              "MS-EXTENDED" | "WEBSTAR-EXTENDED" | "MS-COMMON" | "NETSCAPE" |
              "WEBSTAR" | "MACHTTP" | "AUTO" | format_string)
LOGFORMAT logformat
DEFAULTLOGFORMAT logformat
APACHELOGFORMAT Apache_format_string
APACHEDEFAULTLOGFORMAT Apache_format_string
Notes
LOGFORMAT and APACHELOGFORMAT only affect logfiles occurring later in the same configuration file.
Examples
LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b)
DEFAULTLOGFORMAT MS-EXTENDED
APACHELOGFORMAT (%h %l %u %t \"%r\" %s %b)

ALIAS commands

1. Commands (items)
FILEALIAS, HOSTALIAS, BROWALIAS, REFALIAS, USERALIAS, VHOSTALIAS
Syntax
COMMAND *olditem ["PLAIN:"]newitem
COMMAND ("REGEXP:" | "REGEXPI:")regexp ["PLAIN:"]newitem
Notes
Aliases item in all reports. Items with the same resultant name are combined. newitem may contain $1, $2 etc., representing the *'s in olditem or the bracketed subexpressions in regexp. (PLAIN: makes $'s on the right-hand side into literal $'s.)
Examples
FILEALIAS /*/football/* /$1/soccer/$2
USERALIAS REGEXP:^([^U].*) U$1

2. Commands (reports)
TYPEALIAS, HOSTREPALIAS, REDIRHOSTALIAS, FAILHOSTALIAS, REQALIAS, REDIRALIAS, FAILALIAS, DIRALIAS, DOMALIAS, ORGALIAS, REFREPALIAS, REFSITEALIAS, REDIRREFALIAS, FAILREFALIAS, BROWREPALIAS, BROWSUMALIAS, OSALIAS, VHOSTREPALIAS, REDIRVHOSTALIAS, FAILVHOSTALIAS, USERREPALIAS, REDIRUSERALIAS, FAILUSERALIAS
Syntax
COMMAND *item ["PLAIN:"]string
COMMAND ("REGEXP:" | "REGEXPI:")regexp ["PLAIN:"]string
Notes
Aliases item on one line of one report only. $1, $2 etc. in string are interpreted as explained above.
Examples
REQALIAS /football/ "/football/ (Main football page)"
REFREPALIAS REGEXP:^(http://([^/]*\.)?(maths|stats)\.uxy\.edu.*) ([$3] $1)

3. Other commands: syntax
CASE ("SENSITIVE" | "INSENSITIVE")
USERCASE ("SENSITIVE" | "INSENSITIVE")
SEARCHCHARCONVERT ("ON" | "OFF")
DIRSUFFIX suffix
LOGTIMEOFFSET ["+" | "-"] number
TIMEOFFSET ["+" | "-"] number
304ISSUCCESS ("ON" | "OFF")
Examples
CASE SENSITIVE
DIRSUFFIX index.htm
LOGTIMEOFFSET -300

INCLUDE/EXCLUDE commands

1. Commands (items)
FILEINCLUDE, FILEEXCLUDE, HOSTINCLUDE, HOSTEXCLUDE, BROWINCLUDE, BROWEXCLUDE, REFINCLUDE, REFEXCLUDE, USERINCLUDE, USEREXCLUDE, VHOSTINCLUDE, VHOSTEXCLUDE
Syntax
COMMAND (*item | "")
COMMAND ("REGEXP:" | "REGEXPI:")regexp
Notes
Excludes all logfile entries containing an excluded item from all reports. Includes and excludes are done after aliases, so the item is the aliased name, if applicable. HOSTINCLUDE and HOSTEXCLUDE can also take IP address ranges and subnet masks.
Examples
FILEINCLUDE /jim/*,/jane/*
FILEINCLUDE REGEXP:^/~[^/]*/$
HOSTEXCLUDE proxy*.aol.com
USEREXCLUDE ""

2. Syntax (including and excluding status codes)
range := (number | number "-" number | number "-" | "-" number | "*")
STATUSINCLUDE range [, ranges]
STATUSEXCLUDE range [, ranges]
Notes
All numbers must be in the range 100-599.
Example
STATUSINCLUDE 200-299,304

3. Syntax (including and excluding dates)
partdate := ["+" | "-"] digit digit
date := partdate partdate partdate [":" partdate partdate]
FROM date
TO date
Examples
FROM 990719:1200
TO -00-0101

4. Commands (reports)
REQINCLUDE, REQEXCLUDE, REDIRINCLUDE, REDIREXCLUDE, FAILINCLUDE, FAILEXCLUDE, TYPEINCLUDE, TYPEEXCLUDE, DIRINCLUDE, DIREXCLUDE, HOSTREPINCLUDE, HOSTREPEXCLUDE, REDIRHOSTINCLUDE, REDIRHOSTEXCLUDE, FAILHOSTINCLUDE, FAILHOSTEXCLUDE, DOMINCLUDE, DOMEXCLUDE, ORGINCLUDE, ORGEXCLUDE, REFREPINCLUDE, REFREPEXCLUDE, REFSITEINCLUDE, REFSITEEXCLUDE, SEARCHQUERYINCLUDE, SEARCHQUERYEXCLUDE, SEARCHWORDINCLUDE, SEARCHWORDEXCLUDE, INTSEARCHQUERYINCLUDE, INTSEARCHQUERYEXCLUDE, INTSEARCHWORDINCLUDE, INTSEARCHWORDEXCLUDE, REDIRREFINCLUDE, REDIRREFEXCLUDE, FAILREFINCLUDE, FAILREFEXCLUDE, BROWREPINCLUDE, BROWREPEXCLUDE, BROWSUMINCLUDE, BROWSUMEXCLUDE, OSINCLUDE, OSEXCLUDE, VHOSTREPINCLUDE, VHOSTREPEXCLUDE, REDIRVHOSTINCLUDE, REDIRVHOSTEXCLUDE, FAILVHOSTINCLUDE, FAILVHOSTEXCLUDE, USERREPINCLUDE, USERREPEXCLUDE, REDIRUSERINCLUDE, REDIRUSEREXCLUDE, FAILUSERINCLUDE, FAILUSEREXCLUDE
Syntax
COMMAND *item
COMMAND ("REGEXP:" | "REGEXPI:")regexp
Notes
Excludes an excluded item from one report only. HOSTREP*, REDIRHOST* and FAILHOST* can also take IP address ranges and subnet masks.
Example
REQINCLUDE pages

5. Commands (hyperlinks)
See below.

6. Syntax (miscellaneous)
PAGEINCLUDE *file
PAGEEXCLUDE *file
ARGSINCLUDE *file
ARGSEXCLUDE *file
REFARGSINCLUDE *referrer
REFARGSEXCLUDE *referrer
ROBOTINCLUDE *browser
ROBOTEXCLUDE *browser
Notes
These can be regular expressions too.
Examples
PAGEINCLUDE *.jsp
ROBOTINCLUDE *crawler*

DNS commands

Syntax
DNSFILE localfile
DNS ("NONE" | "READ" | "LOOKUP" | "WRITE")
DNSLOCKFILE localfile
DNSGOODHOURS number
DNSBADHOURS number
DNSTIMEOUT number
Examples
DNSFILE dnscache.txt
DNS WRITE
DNSBADHOURS 48

Sub-item commands

Syntax
SUBDIR *file
SUBDOMAIN *subdomain
SUBDOMAIN subdomain name
SUBORG *subdomain
SUBTYPE *extension
SUBBROW *browser
REFDIR *referrer
Examples
SUBDIR /jim/*/*
SUBTYPE *.gz

LOWMEM commands

Commands
FILELOWMEM, HOSTLOWMEM, BROWLOWMEM, REFLOWMEM, USERLOWMEM, VHOSTLOWMEM
Syntax
COMMAND ("0" | "1" | "2" | "3")
Example
HOSTLOWMEM 3

Report commands

Commands
GENERAL, ALL, YEARLY, QUARTERLY, MONTHLY, WEEKLY, DAILYREP, DAILYSUM, HOURLYREP, HOURLYSUM, WEEKHOUR, QUARTERREP, QUARTERSUM, FIVEREP, FIVESUM, HOST, REDIRHOST, FAILHOST, ORGANISATION, DOMAIN, REQUEST, DIRECTORY, FILETYPE, SIZE, PROCTIME, REDIR, FAILURE, REFERRER, REFSITE, SEARCHQUERY, SEARCHWORD, INTSEARCHQUERY, INTSEARCHWORD, REDIRREF, FAILREF, BROWSERREP, BROWSERSUM, OSREP, VHOST, REDIRVHOST, FAILVHOST, USER, REDIRUSER, FAILUSER, STATUS
Syntax
REPORTCOMMAND ("ON" | "OFF")
Examples
ALL OFF
HOURLYREP ON

GRAPH commands

Commands
ALLGRAPH, YEARGRAPH, QUARTERLYGRAPH, MONTHGRAPH, WEEKGRAPH, DAYREPGRAPH, DAYSUMGRAPH, HOURREPGRAPH, HOURSUMGRAPH, WEEKHOURGRAPH, QUARTERREPGRAPH, QUARTERSUMGRAPH, FIVESUMGRAPH, FIVEREPGRAPH
Syntax
COMMAND ("R" | "r" | "P" | "p" | "B" | "b")
Example
ALLGRAPH B

BACK commands

Commands
ALLBACK, YEARBACK, QUARTERLYBACK, MONTHBACK, WEEKBACK, DAYREPBACK, HOURREPBACK, QUARTERREPBACK, FIVEREPBACK
Syntax
COMMAND ("ON" | "OFF")
Example
ALLBACK ON

ROWS commands

Commands
YEARROWS, QUARTERLYROWS, MONTHROWS, WEEKROWS, DAYREPROWS, HOURREPROWS, QUARTERREPROWS, FIVEREPROWS
Syntax
COMMAND number
Example
QUARTERREPROWS 192

COLS commands

1. Commands (time reports)
TIMECOLS, YEARCOLS, QUARTERLYCOLS, WEEKCOLS, MONTHCOLS, WEEKCOLS, DAYREPCOLS, DAYSUMCOLS, HOURREPCOLS, HOURSUMCOLS, WEEKHOURCOLS, QUARTERREPCOLS, QUARTERSUMCOLS, FIVEREPCOLS, FIVESUMCOLS
Syntax
cols1 := subset("RrPpBb")
COMMAND cols1
Example
MONTHCOLS bRP

2. Commands (most success reports)
HOSTCOLS, ORGCOLS, DOMCOLS, DIRCOLS, REFCOLS, REFSITECOLS, SEARCHQUERYCOLS, SEARCHWORDCOLS, INTSEARCHQUERYCOLS, INTSEARCHWORDCOLS, BROWREPCOLS, BROWSUMCOLS, OSCOLS, VHOSTCOLS, USERCOLS
Syntax
cols2 := subset("NDdEeRrSsPpQqBbCc")
COMMAND cols2
Example
USERCOLS BD

3. Syntax (Request and File Type Reports)
REQCOLS subset("NDdEeRrSspqBbCc")
TYPECOLS subset("NDdEeRrSsBbCc")
Example
TYPECOLS NRb

4. Commands (failure, redirection and Status Code reports)
REDIRCOLS, FAILCOLS, REDIRHOSTCOLS, FAILHOSTCOLS, REDIRREFCOLS, FAILREFCOLS, REDIRVHOSTCOLS, FAILVHOSTCOLS, REDIRUSERCOLS, FAILUSERCOLS, STATUSCOLS
Syntax
cols4 := subset("NDdEeRrSs")
COMMAND cols4
Example
FAILCOLS D

5. Commands (Size and Processing Time Reports)
SIZECOLS, PROCTIMECOLS
Syntax
cols5 := subset("DdEeRrSsPpQqBbCc")
COMMAND cols5
Example
SIZECOLS RB

SORTBY commands

1. Commands (most success reports)
HOSTSORTBY, ORGSORTBY, DOMSORTBY, DIRSORTBY, REFSORTBY, REFSITESORTBY, SEARCHQUERYSORTBY, SEARCHWORDSORTBY, INTSEARCHQUERYSORTBY, INTSEARCHWORDSORTBY, BROWREPSORTBY, BROWSUMSORTBY, OSSORTBY, VHOSTSORTBY, USERSORTBY, SUBDIRSORTBY, SUBDOMSORTBY, SUBORGSORTBY, SUBBROWSORTBY, SUBOSSORTBY, REFDIRSORTBY, REFARGSSORTBY
Syntax
sortby1 := ("REQUESTS" | "REQUESTS7" | "PAGES" | "PAGES7" |
            "BYTES" | "BYTES7" | "DATE" | "FIRSTDATE" |
            "ALPHABETICAL" | "RANDOM")
COMMAND sortby1
Example
DOMSORTBY ALPHABETICAL

2. Commands (Request and File Type Reports)
REQSORTBY, TYPESORTBY, REQARGSSORTBY, SUBTYPESORTBY
Syntax
sortby2 := ("REQUESTS" | "REQUESTS7" | "BYTES" | "BYTES7" |
            "DATE" | "FIRSTDATE" | "ALPHABETICAL" | "RANDOM")
COMMAND sortby2
Example
REQSORTBY REQUESTS

3. Commands (failure, redirection and Status Code reports)
REDIRSORTBY, FAILSORTBY, REDIRHOSTSORTBY, FAILHOSTSORTBY, REDIRREFSORTBY, FAILREFSORTBY, REDIRVHOSTSORTBY, FAILVHOSTSORTBY, REDIRUSERSORTBY, FAILUSERSORTBY, STATUSSORTBY, REDIRARGSSORTBY, FAILARGSSORTBY, REDIRREFARGSSORTBY, FAILREFARGSSORTBY
Syntax
sortby3 := ("REQUESTS" | "REQUESTS7" | "DATE" | "FIRSTDATE" |
            "ALPHABETICAL" | "RANDOM")
COMMAND sortby3
Example
FAILSORTBY DATE

FLOOR commands

Commands (top-level)
HOSTFLOOR, REDIRHOSTFLOOR, FAILHOSTFLOOR, ORGFLOOR, DOMFLOOR, REQFLOOR, DIRFLOOR, TYPEFLOOR, REDIRFLOOR, FAILFLOOR, REFFLOOR, REFSITEFLOOR, SEARCHQUERYFLOOR, SEARCHWORDFLOOR, INTSEARCHQUERYFLOOR, INTSEARCHWORDFLOOR, REDIRREFFLOOR, FAILREFFLOOR, BROWREPFLOOR, BROWSUMFLOOR, OSFLOOR, VHOSTFLOOR, REDIRVHOSTFLOOR, FAILVHOSTFLOOR, USERFLOOR, REDIRUSERFLOOR, FAILUSERFLOOR, STATUSFLOOR
Commands (lower levels)
REQARGSFLOOR, REDIRARGSFLOOR, FAILARGSFLOOR, REFARGSFLOOR, REDIRREFARGSFLOOR, FAILREFARGSFLOOR, SUBDIRFLOOR, SUBDOMFLOOR, SUBORGFLOOR, SUBTYPEFLOOR, SUBBROWFLOOR, SUBOSFLOOR, REFDIRFLOOR
Syntax
partdate := ["+" | "-"] digit digit
date := partdate partdate partdate [":" partdate partdate]
COMMAND number ("r" | "s" | "p" | "q")
COMMAND number ["k" | "M" | "G" | "T" | "P" | "E" | "Z" | "Y"] ("b" | "c")
COMMAND real ("%" | ":") ("r" | "s" | "p" | "q" | "b" | "c")
COMMAND date ("d" | "e")
COMMAND "-" number ("r" | "s" | "p" | "q" | "b" | "c" | "d" | "e")
Notes
Actually, this syntax isn't quite correct. REQFLOOR, TYPEFLOOR, REQARGSFLOOR and SUBTYPEFLOOR aren't allowed to be of type "p" or "q"; and REDIRFLOOR, FAILFLOOR, REDIRHOSTFLOOR, FAILHOSTFLOOR, REDIRREFFLOOR, FAILREFFLOOR, REDIRVHOSTFLOOR, FAILVHOSTFLOOR, REDIRUSERFLOOR, FAILUSERFLOOR, STATUSFLOOR, REDIRARGSFLOOR, FAILARGSFLOOR, REDIRREFARGSFLOOR and FAILREFARGSFLOOR aren't allowed to be of type "p", "q", "b" or "c".
Examples
TYPEFLOOR -20r
REQARGSFLOOR 0.1%b

CHART commands

1. Commands (most success reports)
HOSTCHART, ORGCHART, DOMCHART, REQCHART, DIRCHART, REFCHART, REFSITECHART, SEARCHQUERYCHART, SEARCHWORDCHART, INTSEARCHQUERYCHART, INTSEARCHWORDCHART, BROWREPCHART, BROWSUMCHART, OSCHART, VHOSTCHART, USERCHART, SIZECHART, PROCTIMECHART
Syntax
chart1 := ("ON" | "OFF" | "REQUESTS" | "REQUESTS7" | "PAGES" | "PAGES7" |
            "BYTES" | "BYTES7")
COMMAND chart1
Example
DOMCHART BYTES

2. Commands (failure, redirection and Status Code reports)
REDIRHOSTCHART, FAILHOSTCHART, REDIRCHART, FAILCHART, REDIRREFCHART, FAILREFCHART, REDIRVHOSTCHART, FAILVHOSTCHART, REDIRUSERCHART, FAILUSERCHART, STATUSCHART
Syntax
chart2 := ("ON" | "OFF" | "REQUESTS" | "REQUESTS7")
COMMAND chart2
Example
FAILCHART ON

3. Syntax (TYPECHART)
TYPECHART ("ON" | "OFF" | "REQUESTS" | "REQUESTS7" | "BYTES" | "BYTES7")

4. Syntax (ALLCHART)
ALLCHART ("ON" | "OFF")

5. CHARTEXPAND commands
DIRCHARTEXPAND, DOMCHARTEXPAND, ORGCHARTEXPAND, TYPECHARTEXPAND, BROWCHARTEXPAND, OSCHARTEXPAND, REQCHARTEXPAND, REDIRCHARTEXPAND, FAILCHARTEXPAND, REFCHARTEXPAND, REDIRREFCHARTEXPAND, FAILREFCHARTEXPAND, REFSITECHARTEXPAND
Syntax
COMMAND item[,item...]
Example
DOMCHARTEXPAND .com,.net

Hyperlinks

Syntax
REQLINKINCLUDE *file
REQLINKEXCLUDE *file
REDIRLINKINCLUDE *file
REDIRLINKEXCLUDE *file
FAILLINKINCLUDE *file
FAILLINKEXCLUDE *file
REFLINKINCLUDE *referrer
REFLINKEXCLUDE *referrer
REDIRREFLINKINCLUDE *referrer
REDIRREFLINKEXCLUDE *referrer
FAILREFLINKINCLUDE *referrer
FAILREFLINKEXCLUDE *referrer
BASEURL prefix_string
Notes
The LINK commands can be regular expressions too.
Examples
REQLINKINCLUDE pages
REFLINKINCLUDE *.cgi,*.cgi?*
BASEURL http://www.mycompany.com

Language commands

Syntax
LANGUAGE ("ARMENIAN" | "BASQUE" | "BULGARIAN" | "BULGARIAN-MIK" |
          "CATALAN" | "SIMP-CHINESE" | "TRAD-CHINESE" | "CZECH" |
          "CZECH-1250" | "DANISH" | "DUTCH" | "ENGLISH" | "US-ENGLISH" |
          "FINNISH" | "FRENCH" | "GERMAN" | "HUNGARIAN" | "INDONESIAN" |
          "ITALIAN" | "JAPANESE-EUC" | "JAPANESE-JIS" | "JAPANESE-SJIS" |
          "JAPANESE-UTF" | "KOREAN" | "LATVIAN" | "NORWEGIAN" | "NYNORSK" |
          "POLISH" | "PORTUGUESE" | "BR-PORTUGUESE" | "RUSSIAN" |
          "RUSSIAN-1251" | "SERBIAN" | "SLOVAK" | "SLOVAK-1250" | "SLOVENE" |
          "SLOVENE-1250" | "SPANISH" | "SWEDISH" | "SWEDISH-ALT" | "TURKISH" |
          "UKRAINIAN")
LANGFILE localfile
DOMAINSFILE localfile
DESCFILE localfile
Notes
I hope that the other languages which were available in previous versions of analog -- BOSNIAN, SIMP-CHINESE, TRAD-CHINESE, CROATIAN, FINNISH, GREEK, ICELANDIC, LITHUANIAN, BR-PORTUGUESE, ROMANIAN, SLOVAK and SPANISH -- will be available for download from the analog home page soon.
Examples
LANGUAGE ITALIAN
LANGFILE hindi.lng

Cosmetic and miscellaneous commands

Syntax

OUTPUT ("XHTML" | "HTML" | "PLAIN" | "ASCII" | "LATEX" | "COMPUTER" | "XML" | "NONE")
GOTOS ("ON" | "OFF" | "FEW")
RUNTIME ("ON" | "OFF")
DESCRIPTIONS ("ON" | "OFF")
REPORTSPAN ("ON" | "OFF")
REPORTSPANTHRESHOLD number
LASTSEVEN ("ON" | "OFF")
REPORTORDER perm("x1QmWDdHwh4657oZSlLujJkKfsNnBbpvRMcPztiEIYyr")
GENSUMLINES ("ALL" | ["+" | "-"] subset("BCDEFGHIJKLMN"))
IMAGEDIR URL
CHARTDIR fmtURL
LOCALCHARTDIR localfmtfile
JPEGCHARTS ("ON" | "OFF")
PNGIMAGES ("ON" | "OFF")
NOROBOTS ("ON" | "OFF")
LOGO (URL | "none")
LOGOURL (URL | "none")
HOSTNAME string
HOSTURL (URL | "none")
HEADERFILE (localfile | "none")
FOOTERFILE (localfile | "none")
STYLESHEET (URL | "none")
CSSPREFIX (string | "none")
SEPCHAR (char | "none")
REPSEPCHAR (char | "none")
DECPOINT char
COMPSEP string
RAWBYTES ("ON" | "OFF")
BYTESDP number
HTMLPAGEWIDTH number
PLAINPAGEWIDTH number
LATEXPAGEWIDTH number
PDFLATEX ("ON" | "OFF")
BARSTYLE ("a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j")
MARKCHAR char
MINGRAPHWIDTH number
WEEKBEGINSON ("SUNDAY" | "MONDAY" | "TUESDAY" | "WEDNESDAY" | "THURSDAY" | "FRIDAY" | "SATURDAY")
SEARCHENGINE *referrer comma-separated-strings
INTSEARCHENGINE *file comma-separated-strings
Examples
Too many to list. See the documentation on each individual command.

Diagnostics

Syntax
SETTINGS ("ON" | "OFF")
DEBUG ("ON" | "OFF" | ["+" | "-"] subset("CDFSU"))
WARNINGS ("ON" | "OFF" | ["+" | "-"] subset("CDEFLMR"))
PROGRESSFREQ number
ERRFILE localfile
ERRLINELENGTH number
Examples
DEBUG ON
DEBUG CF
WARNINGS -DL
PROGRESSFREQ 50000

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/reports.html0000644000175000017500000003607010161303532016252 0ustar sret1sret100000000000000 Readme for analog -- analog's reports [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Analog's reports


This section summarises all of analog's reports, and the main commands which control them. For details on these commands, see the sections on Time reports, Other reports and Hierarchical reports. For exact details on what is counted in each report, see the section on Analog's definitions.

You can get descriptions of each report within the output by using the DESCRIPTIONS and DESCFILE commands.

Note: The examples below are in the HTML output style. Most people are using the XHTML output style, but I've used the HTML output style for the documentation to make sure that it works on all browsers.

Top lines


Program started at Thu-24-Sep-1998 13:48.
Analysed requests from Wed-16-Sep-1998 09:52 to Mon-21-Sep-1998 02:04 (4.7 days).
The top two lines of the output tell you when the program was run, and which dates it includes data from. (The second line includes all non-excluded requests, even failures, whereas most reports only include successful requests.)

General Summary


(Figures in parentheses refer to the 7 days to 24-Sep-1998 13:48).
Successful requests: 79,646 (48,947)
Average successful requests per day: 17,036 (6,992)
Successful requests for pages: 31,138 (18,689)
Average successful requests for pages per day: 6,660 (2,669)
Failed requests: 9,008 (6,378)
Redirected requests: 344 (235)
Distinct files requested: 8,180 (2,884)
Distinct hosts served: 6,640 (4,991)
Corrupt logfile lines: 2
Data transferred: 976.92 Mbytes (627.06 Mbytes)
Average data transferred per day: 208.96 Mbytes (89.58 Mbytes)
The General Summary contains some overall statistics about the data being analysed: the most important being the number of requests (the total number of files downloaded, including graphics); the number of requests for pages (just counting the various pages on your site); the number of distinct hosts (the number of different computers requests have come from); and the amount of data transferred in bytes. For exactly what the various lines mean, see the section on Analog's definitions. Bear in mind that one user can generate many requests by viewing lots of different pages or images, or by viewing the same page many times.

The figures in parentheses represent the seven days given at the top of this report: it's the seven days before the TO time if there was a TO command, or if not the seven days before the program was run.

You can't find out the number of visitors or visits you've had, and don't believe any program which tells you that you can. See the section on How the web works for a discussion of this.

You can turn this report on or off with the GENERAL command. You can control which lines are included using the GENSUMLINES command. You can include or exclude the figures for the last seven days with the LASTSEVEN command. You may get slightly different lines to those above, depending on exactly what's in your logfile.

Time reports


Each unit (+) represents 800 requests for pages, or part thereof.
week beg.: #reqs: pages: 
---------: -----: -----: 
13/Sep/98: 69614: 25277: ++++++++++++++++++++++++++++++++
20/Sep/98: 10032:  5861: ++++++++
Busiest week: week beginning 13/Sep/98 (26,654 requests for pages).
These reports tell you how many requests there were in each time period. They also tell you which was the busiest time period.

The timezone is whatever your server records time in -- usually your server's local time, or sometimes GMT. You can adjust it to another timezone with the LOGTIMEOFFSET command.

You can control whether each report is included or not with the appropriate ON or OFF command. You can control which columns are listed by the COLS commands. You can control which measurement to use for the bar charts and the "busiest" line by the GRAPH commands. You can determine how many rows are displayed with the ROWS commands. You can display the lines backwards or forwards in time by the BACK commands. You can change the graphic used for the bar charts with the BARSTYLE command.

Time summaries


Each unit (+) represents 150 requests for pages, or part thereof.
day: #reqs: pages: 
---: -----: -----: 
Sun:  2031:  1193: ++++++++
Mon:  8001:  4668: ++++++++++++++++++++++++++++++++
Tue:     0:     0: 
Wed: 13934:  5915: ++++++++++++++++++++++++++++++++++++++++
[etc.]

These reports tell you the total number of requests in each day or hour of the week, or in each period of the day, summed over all the weeks or days in the report. (It's not the average, nor is it the figures for just the last week or last day).

You can control whether each report is included or not with the appropriate ON or OFF command. You can control which columns are listed by the COLS commands. You can control which measurement to use for the bar charts by the GRAPH commands. You can change the graphic used for the bar charts with the BARSTYLE command.

Other reports


Listing the first 5 files by the number of requests, sorted by the number of requests.
#reqs: %bytes:       last date: file
-----: ------: ---------------: ----
 4123:  2.29%: 21/Sep/98 01:57: /~sret1/analog/
 3064:  0.15%: 21/Sep/98 01:54: /~sret1/analog/analogo.gif
 1737:  0.01%: 21/Sep/98 01:53: /~sret1/images/bar1.gif
 1692:  0.01%: 21/Sep/98 01:53: /~sret1/images/bar16.gif
 1685:  0.01%: 21/Sep/98 01:53: /~sret1/images/bar8.gif
67345: 97.54%: 21/Sep/98 02:04: [not listed: 8,175 files]

The rest of the reports are all quite similar. Here is a list of them. If you're unfamiliar with some of the terms, see the section on Analog's definitions. Usually you can only get some of these reports, depending on what information is recorded in your logfile.

There are lots of commands which control these reports. As usual, you can control whether each report is included or not with the appropriate ON or OFF command. You can control which columns are listed with the COLS commands. You can change how the reports are sorted with the SORTBY commands. You can control how many items are listed with the FLOOR commands. You can control whether and how the pie charts are plotted with the CHART commands. You can list the time period covered by each report with the REPORTSPAN command. You can include or exclude individual items with the output INCLUDE and EXCLUDE commands. You can change the names of items in the reports with the output alias commands. Which files are linked to in the reports is controlled by the LINKINCLUDE and LINKEXCLUDE commands. The links are also affected by the BASEURL command.

The "not listed" line at the bottom counts those items which didn't get enough traffic to get above the FLOOR for the report. (It doesn't include items which you've explicitly excluded.)

Most of these reports have a hierarchical structure, like this example for the Domain Report:


Listing the first 5 domains by the number of requests, sorted by the number of requests.
no.: #reqs: %bytes: domain
---: -----: ------: ------
  1: 13243: 16.23%: .com (Commercial)
   :  1262:  1.26%:   aol.com
  2: 11783: 25.64%: .jp (Japan)
   :  9592: 22.19%:   ad.jp
   :  1043:  1.97%:   co.jp
  3: 10073: 11.62%: .net (Network)
   :  1926:  1.71%:   uu.net
  4:  9657: 13.31%: [unresolved numerical addresses]
  5:  7388:  8.04%: .uk (United Kingdom)
   :  5792:  5.74%:   ac.uk
   :  1510:  1.99%:   co.uk
   : 18502: 25.16%: [not listed: 82 domains]

Notice that the lower levels are always listed with their parents, so they break up the sort order. Also, they don't count towards the total number of items listed, so there are only 5 domains listed in the example above, as you can see in the first column. (The N column is particularly useful in hierarchical reports for this reason.)

You can control which items are listed on the lower levels by the SUB family of commands. There are also separate sub-SORTBY and sub-FLOOR commands for the lower levels. (These commands are called ARGSSORTBY and ARGSFLOOR for some reports, such as the Request Report.) You can plot the lower levels instead of the top-level items on the pie charts using the CHARTEXPAND commands.

Bottom lines


This analysis was produced by analog 6.0.
Running time: 8 seconds.

At the end of the output you can see which version of analog produced the report, and how long it took.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/start.html0000644000175000017500000000423010161303532015702 0ustar sret1sret100000000000000 Readme for analog -- starting to use analog [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Starting to use analog


The only thing you need to run analog is to be able to read the logfiles which are produced by your web server. If you don't know what these logfiles are and where to find them, contact your internet service provider (ISP) or system administrator. Analog doesn't write the logfiles: it only reads them.

If you log in to your ISP's machine from your home machine, you have two options. If you have the right permissions, you can run analog on your ISP's machine. Otherwise, you can download (e.g., ftp) the logfiles from their machine to yours, and then run analog on your machine.

Once you've downloaded the right version of analog for your computer from the analog home page (or a mirror site), you need to know how to set it up and run it. This is very easy, but the instructions are slightly different depending which platform you're using.

If you can't manage to set up analog after reading the instructions, send a message to the analog-help mailing list.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/startmac.html0000644000175000017500000000725010161303532016370 0ustar sret1sret100000000000000 Readme for analog -- starting to use analog (Mac) [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Starting to use analog on a Mac


Here is the really short summary:
  1. Edit analog.cfg
  2. Run analog
  3. Read Report.html

When you download the Mac version of analog, it should unpack itself. (If it doesn't, you might have to run StuffIt Expander on it). You should then find in the analog directory a configuration file called analog.cfg and the analog application itself, as well as the Readme, the Licence and a couple of other files. When you double-click on the analog icon, it will run in its own window, and produce an output file called Report.html. (For help in interpreting the output, see What the results mean.) The window will then close if there weren't any warning messages, or stay open for you to read them if there were.
You can configure analog by putting commands in the configuration file, analog.cfg. Although this is less familiar to Mac users than pressing buttons etc., it's really much simpler and more flexible when you get used to it. One command you will need straight away is
LOGFILE logfilename    # to set where your logfile lives
The logfile must be stored locally -- analog won't use FTP or HTTP to fetch it from the internet. There's a sample logfile supplied with the program.

There are already some configuration commands to get you started in the configuration file, but there are lots of others available. You can find the most common ones in the section on basic commands later in the Readme, and you can read about all of them in the section on customising analog. There are also some sample configuration files in the examples folder.


Another way to start analog is to drag a logfile onto the analog icon, in which case analog will try to analyse it, or drag a configuration file onto the icon, in which case analog will use the commands in that configuration file. (Analog detects whether it's a configuration file or a logfile by whether it starts with "# " or not.) This enables you to create different reports without having two copies of the application.

There is another way to give options, via command line arguments. You'll see these mentioned in this Readme from time to time, but MacOS before MacOS X doesn't have a command line, so ignore these unless you've downloaded the Darwin version of analog.

If you want to compile your own version of analog (it's written in C), or just to read the source code, it's available from the analog home page. (It's the same source code for all versions).


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/startpc.html0000644000175000017500000001045610161303532016234 0ustar sret1sret100000000000000 Readme for analog -- starting to use analog (Windows) [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Starting to use analog under Windows


This describes how to set up analog under Windows 95/NT or later. Windows 3.1 users will have to read the section on other platforms instead.

Here is the really short summary:

  1. Edit analog.cfg
  2. Run analog (a DOS window flashes up).
  3. Read Report.html

There's also a How-To written by Simon Handfield, which explains how to get started in more detail with lots of pictures.


When you've downloaded analog, and either you or your browser has unzipped it, you will find in the analog folder a configuration file called analog.cfg and the analog executable itself, as well as the Readme, the Licence and a couple of other files. There is no setup.exe: analog is already ready to run without one.

(Some unzip programs are broken, and do not create folders when they should. If you don't have a folder called lang inside the analog folder, create one and put all the files called *.lng and *.tab into it.)

There are two ways of running analog. You can either run it from Windows (by single-clicking or double-clicking on its icon, depending on your setup), or you can run it from the DOS command prompt (under Start-Programs). If you run it from Windows, it will create a DOS window to run in. When it's finished, it will produce an output file called Report.html and some graphics; and a file called errors.txt which contains any errors there might have been. The first time you run it, this will all happen almost instantly. This is not a bug. For help in interpreting the output, see What the results mean.


You can configure analog by putting commands in the configuration file, analog.cfg. Although this is less familiar to Windows users than pressing buttons etc., it's really much simpler and more flexible when you get used to it. You can edit analog.cfg using any plain text editor, for example Notepad. One command you will need straight away is
LOGFILE logfilename    # to set where your logfile lives
The logfile must be stored locally -- analog won't use FTP or HTTP to fetch it from the internet. There's a sample logfile supplied with the program.

There are already some configuration commands to get you started in the configuration file, but there are lots of others available. You can find the most common ones in the section on basic commands later in the Readme, and you can read about all of them in the section on customising analog. There are also some sample configuration files in the examples folder.

If you run analog from the DOS command prompt, there is another way to give options, via command line arguments, given on the command line after the program name. These are just shortcuts for configuration file commands. You can use the command line arguments if you run analog from a batch file too.

If you want to compile your own version of analog (it's written in C), or just to read the source code, it's available from the analog home page. (It's the same source code for all versions).


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/startux.html0000644000175000017500000001325710161303532016270 0ustar sret1sret100000000000000 Readme for analog -- starting to use analog (other platforms) [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Starting to use analog on other platforms


Here is the really short summary:
  1. Edit anlghead.h and compile, if necessary
  2. Edit analog.cfg
  3. Run analog

Many platforms have a precompiled version of analog available. Before compiling analog, have a look at the analog home page to see if yours does.

If you're not using one of the platforms for which a precompiled version is available, you'll have to compile your own version from the source. But don't worry -- it's written in standard C throughout, so it will compile out of the box on most platforms. (The source code is the same for all platforms.)

First, change to the src/ directory.

Then look at the file anlghead.h, and see if there's anything you want to edit.

When you have done that, you need to compile the program. How to do that depends on which operating system you're using.


Compiling under Unix. First edit anlghead.h as described above. Then just type
make
within the src/ directory to compile the program. On most systems, that will be sufficient, and the compiled program should appear in the parent directory. If it fails to compile, have a look in the Makefile to see if there's anything that you need to change to suit your configuration, and try again. It says in that file what to do. In particular, Solaris 2 (SunOS 5+) users need to change the LIBS= line.

(Experts can pass some arguments in on the make command line instead of by editing anlghead.h: e.g.

make DEFS='-DLANGDIR=\"/usr/etc/apache/analog/lang/\"'
This is useful if you have a script to compile analog.)

If you haven't got gcc, you will need to change the compiler - try acc or cc instead.

Compiling under OpenVMS. You can find OpenVMS build scripts within the src/build directory. Unzip them within the src directory. Then to build Analog interactively from the command line, type

$ @ Build_Analog
or to submit the Build_Analog procedure to a batch queue, type
$ Submit /NoPrint /Keep Batch.com
The command procedure will use MMS (or MMK) if it is available, otherwise it will compile everything from raw command procedures.

Compiling under Acorn RiscOS. The Makefile can be found in the src/build directly, although at this point it has not been updated for version 5 of analog. You will have to make directories called C, H and O, and move the sources files into the appropriate directories: e.g., alias.c must be renamed C.alias. And you will find that there are some filenames in the header file anlghead.h that you want to change to fit into the RiscOS directory structure.

Compiling under OS/2. To compile analog for OS/2, you will need the EMX package. You should edit the Makefile to have OS=OS2 and LIBS=-lsocket. Then after editing anlghead.h and running Make, you need to run the command

EMXBIND -b ANALOG
to generate the analog.exe executable.
After you've compiled the program, leave the src/ directory and then just type
analog
to run the program. (Or ./analog if for some reason . isn't in your $PATH.)

You can configure analog by putting commands in the configuration file, which is called analog.cfg by default. Two commands you will need straight away are

LOGFILE logfilename      # to set where your logfile lives
OUTFILE outputfile.html  # to send the output to a file instead of the screen
The logfile must be stored locally -- analog won't use FTP or HTTP to fetch it from the internet. There's a sample logfile supplied with the program. For help in interpreting the output, see What the results mean.

There are already some configuration commands to get you started in the configuration file, but there are lots of others available. You can find the most common ones in the section on basic commands later in the Readme, and you can read about all of them in the section on customising analog. There are also some sample configuration files in the examples directory.

There is one other way to give options to analog, via command line arguments, given on the command line after the program name. These are just shortcuts for configuration file commands.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/syntax.html0000644000175000017500000001614210161303532016100 0ustar sret1sret100000000000000 Readme for analog -- syntax of configuration commands [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Syntax of configuration commands


This section describes how analog finds configuration commands, and what the syntax of a configuration file should be. The syntax of individual commands is given in the Quick reference section later.
When analog starts up, it first reads options from configuration files and the command line (assuming that you are running analog from an operating system with a command line). Defaults for many of these options will have already been set in the files anlghead.h and anlghea2.h at the time the program was compiled. So if you compile your own version of analog, rather than downloading a pre-compiled executable, you can also set some options in those files before compiling. Those options are all documented there.
The first file which analog reads is the default configuration file, normally called analog.cfg. You can stop this file being read by specifying the option -G on the command line. Then the command line arguments are read, in the order in which they appear. Finally, the mandatory configuration file is read, if you specified one when you compiled the program. This is a configuration file which cannot be overridden by the user: if it is not found, analog exits immediately. This allows a system administrator to prevent users analysing certain files or producing certain reports, for example. However, note that the only certain way to prevent users analysing things is to deny them access to the logfile. Otherwise there is nothing to stop them analysing the logfile using another copy of analog or another program.
You can include another configuration file by a command like
CONFIGFILE other.cfg
The commands in the other configuration file are read immediately, in order. The program then continues reading the first configuration file where it left off. Note that reading in several configuration files does not produce several output pages, but a single output page based on all the options.

You can also include another configuration file from the command line by using a command like +gother.cfg. (Note that there is no space between +g and the filename; this is true of all command line arguments.) But note that reading an alternative configuration file does not stop the default configuration file (usually analog.cfg) being read as well. To do that you have to specify -G as well as the +g command. This is because if you want several different configurations, it's most convenient to put all the common options in analog.cfg, and options specific to each configuration in a separate file. Then the +g command line option will read both those files.

If the name of a configuration file given in a CONFIGFILE command doesn't include a directory, it will be looked for wherever analog expects to find its configuration files. (This location is a compile-time option.) For example, in the Windows version it would be in the same folder as the analog executable. This applies to the default and mandatory configuration files as well. But configuration files given with +g are relative to the current directory at the time you run the program.

In the Mac version, you can start up a program with a particular configuration file instead of the default one by dragging the configuration file onto the analog icon. The file must start with "# ".

You can also specify any configuration command on the command line even if it doesn't have a command line abbreviation, by use of the +C command. (NB The C must be upper case.) For example, +C"UNCOMPRESS *.gz gzcat" will include that command.


Here are the syntax rules for configuration commands. A configuration file contains several commands, normally on separate lines; any text after a hash (#) on a line is ignored as a comment. Configuration commands can be continued across lines by using a backslash as the last character on the line (but can't then have comments until the end of all the lines; also the total length can't be more than 254 characters). Each command consists of the command name followed by one or two arguments. An argument to a command may optionally be placed in single or double quotes or parentheses, and it must be if the argument contains a hash or a space, or if the last character of the last argument is a backslash. So, for example, here are some valid configuration commands.
DAILYSUM   OFF   # We don't want a Daily Summary
DAILYREP  "ON"   # We want a full Daily Report instead 
HOSTNAME (Spam Widgets Inc.)  # Spaces, so quotes or brackets needed
LOGFILE logfile1.log,\
logfile2.log     # This line and the previous one are one command
Generally later commands override earlier ones if you can have only one of that thing (e.g., for the OUTFILE), or supplement them if you can have several (e.g., for the LOGFILE, because you can read several logfiles). Apart from that, the order of commands doesn't matter, except that LOGFORMAT and LOGTIMEOFFSET commands must come earlier in the same configuration file than the LOGFILE to which they refer.
If all the options seem a bit confusing, just run
analog -settings [other options]
from the command line, or include SETTINGS ON in the configuration commands. Then instead of running normally, analog will just tell you what the values of all the variables will be, based on the defaults in anlghead.h and anlghea2.h, the configuration commands, and the command line options. If you're on Unix or Windows, remember that you can send the output to a file with
analog -settings > file
Also, analog -version will just give the version number.
Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/timereps.html0000644000175000017500000001703610161303532016405 0ustar sret1sret100000000000000 Readme for analog -- time reports [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Time reports


This section is about commands which control the appearance of the time reports. There are thirteen such reports, which show the pattern of usage over time. Eight of them (the ones with "Report" in their name) show the usage at specific times, whilst the other five (the "Summaries") show the total (not average) activity at particular times of day and week over the whole time period of the report.

By the way, in the following lists, don't get confused between the commands for the Quarterly Report (which begin with QUARTERLY) and those for the Quarter-Hour Report and Quarter-Hour Summary (with begin with QUARTERREP and QUARTERSUM respectively).


Each time report can contain columns listing the requests, requests for pages, and bytes transferred at that time, using the following code letters.
R
Number of requests
r
Percentage of the requests
P
Number of page requests
p
Percentage of the page requests
B
Number of bytes transferred
b
Percentage of the bytes
Which columns appear in which reports is controlled by various COLS commands. For example, the command
HOURSUMCOLS Pb
tells analog to include the number of page requests and percentage of the bytes, in that order, as the columns for the Hourly Summary. The full list of these COLS commands is YEARCOLS, QUARTERLYCOLS, MONTHCOLS, WEEKCOLS, DAYREPCOLS, DAYSUMCOLS, HOURREPCOLS, HOURSUMCOLS, WEEKHOURCOLS, QUARTERREPCOLS, QUARTERSUMCOLS, FIVEREPCOLS and FIVESUMCOLS. There is also a TIMECOLS command, which specifies that all the time reports are to have the specified columns.
Similarly, analog can plot the bar charts in the time reports according to the number of requests, number of page requests, or number of bytes. This is controlled by the GRAPH family of commands. So, for example,
DAYREPGRAPH P
tells analog to plot the bar charts in the Daily Report by the number of page requests. This also controls how analog decides which is the busiest time period in the bottom line of the report. Using a lower case letter tells analog to plot the bar charts with ASCII characters instead of the normal red bars. (This produces shorter output, and it is how they appear anyway in PLAIN and ASCII output styles, or when viewed with a non-graphical browser.) So, for example,
DAYREPGRAPH b
would plot the Daily Report by bytes, without using the graphics. The full list of GRAPH commands is YEARGRAPH, QUARTERLYGRAPH, MONTHGRAPH, WEEKGRAPH, DAYREPGRAPH, DAYSUMGRAPH, HOURREPGRAPH, HOURSUMGRAPH, WEEKHOURGRAPH, QUARTERREPGRAPH, QUARTERSUMGRAPH, FIVEREPGRAPH and FIVESUMGRAPH. There's also an ALLGRAPH command to set all of them simultaneously.
There are various possible graphics available for the graphs, controlled by the BARSTYLE command, as follows. (They will all look the same if you have a non-graphical browser.)

BARSTYLE a  +++++++++++
BARSTYLE b  +++++++++++
BARSTYLE c  +++++++++++
BARSTYLE d  +++++++++++
BARSTYLE e  +++++++++++
BARSTYLE f  +++++++++++
BARSTYLE g  +++++++++++
BARSTYLE h  +++++++++++
BARSTYLE i  +++++++++++
BARSTYLE j  +++++++++++
The default style is b.
You can plot the graphs either forwards in time (starting from the earliest date) or backwards (starting from the latest date). Use commands like
MONTHBACK ON  # Monthly Report backwards
WEEKBACK OFF  # Weekly Report forwards
The full list of BACK commands is YEARBACK, QUARTERLYBACK, MONTHBACK, WEEKBACK, DAYREPBACK, HOURREPBACK, QUARTERREPBACK and FIVEREPBACK. It tends to be confusing to mix directions (and analog will warn you if you attempt it) so usually you want to use the ALLBACK command which will set all of them at once.
For the more detailed time reports, you usually only want to list the last few time periods. (Every five minutes for the last three years?? I think not.) So analog provides some ROWS commands to let you specify how many rows you want in the time reports. For example
QUARTERREPROWS 96  # only the last day's worth
MONTHROWS 0        # 0 means no restriction: show all time
The full list of ROWS commands is YEARROWS, QUARTERLYROWS, MONTHROWS, WEEKROWS, DAYREPROWS, HOURREPROWS, QUARTERREPROWS and FIVEREPROWS. Even if a ROWS command is given, the line at the bottom of the report will still show the busiest time period ever, not just the busiest one in that many rows.
The character which is used for plotting the graphs in PLAIN and ASCII styles or on a non-graphical browser is specified by means of the MARKCHAR command. For example,
MARKCHAR =
tells analog to use the equals sign.

There is a parameter called MINGRAPHWIDTH which sets the minimum nominal size of the graphs. For example, if you set

MINGRAPHWIDTH 10
then the graph will be allowed to be up to 10 characters wide, even if that would exceed the PAGEWIDTH.

There is one more command which affects the time reports. You can specify which day should be counted as the first day of the week. This affects the layout of the Daily Report, Daily Summary, Weekly Report and Hour of the Week Summary. For example, our local student newspaper publishes a new edition on the web every Friday, so they like to specify WEEKBEGINSON FRIDAY for their reports.

In the next section, we'll look at commands relating to the non-time reports.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/update.html0000644000175000017500000006257710161303532016051 0ustar sret1sret100000000000000 Readme for analog -- upgrading from earlier versions [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: Upgrading from earlier versions


This section lists those commands which existed in older versions of analog, but which have been changed or abolished in this version. It also lists reasons why the same input might now produce different output. The new features in this version are listed in the section What's new in this version?.

If you are upgrading from a previous version of analog, you should keep your old analog.cfg, and your old anlghead.h if you are compiling your own copy of analog rather than using one of the precompiled versions.

Upgrading from 5.91beta1 and earlier

Upgrading from 5.90beta2 and earlier

Upgrading from 5.32 and earlier

Upgrading from 5.31 and earlier

Upgrading from 5.24 and earlier

Upgrading from 5.23 and earlier

Upgrading from 5.21 and earlier

Upgrading from 5.1 and earlier

Upgrading from 5.03 and earlier

Upgrading from 5.02 and earlier

Upgrading from 5.01 and earlier

Upgrading from 5.0 and earlier

Upgrading from 4.91beta1 and earlier

Upgrading from 4.90beta4 and earlier

Upgrading from 4.90beta3 and earlier

Upgrading from 4.90beta1 and earlier

Upgrading from 4.16 and earlier

Upgrading from 4.13 and earlier

Upgrading from 4.11 and earlier

Upgrading from 4.1 and earlier

Upgrading from 4.04 and earlier

Upgrading from 4.03 and earlier

Upgrading from 4.0 and earlier

Upgrading from 3.90beta1 and earlier

Upgrading from 3.32 and earlier

Upgrading from 3.3 and earlier

Upgrading from 3.2 and earlier

Upgrading from 3.11 and earlier

Upgrading from 3.0, Win32 form interface

Upgrading from 2.90beta1

Upgrading from 2.11 and earlier

Upgrading from 2.0, Win32 users

Upgrading from 1.92 and earlier, Mac users

Upgrading from 1.9beta's

Upgrading from 1.2's and earlier


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/wasnew1.html0000644000175000017500000001277610161303532016150 0ustar sret1sret100000000000000 Readme for analog -- what was new in version 1? [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What was new in version 1?


This section lists the new features which were in version 1 of analog.
What's new in version 6?
What was new in version 5?
What was new in version 4?
What was new in version 3?
What was new in version 2?
1.2.6 (08-Jun-96)
Minor bug fix; will only affect those with corrupt logfiles.
1.2.5 (05-Feb-96)
Minor bug fix for weekly report.
1.2.4 (23-Jan-96)
Patch for Spyglass server logfile format.
1.2.3 (22-Nov-95)
A couple of bug fixes (wild subdomains sometimes caused crashes).
-v option now gives the version number.
1.2.2 (13-Nov-95)
Patch for proxy servers: http:// not translated to http:/
1.2 (11-Nov-95)
Can configure columns in reports to give percentage requests and number of bytes.
Wild subdomains (e.g., *.com).
Nameless subdomains.
Subdomains now listed in alphabetical order.
Proper support for numerical hostnames in HOSTIGNORE, HOSTONLY, SUBDOMAIN and alphabetical sorting.
New BASEURL command allowing statistics to be displayed on other servers.
Output always says how things are sorted.
"Last 7 days" now behaves sensibly with TO.
Filenames containing /../, /./ and // translated.
Header and footer options removed from form (for security reasons).
1.1 (02-Oct-95)
Form interface introduced.
ASCII output now possible as well as HTML.
Output file can now be specified in the configuration file.
FROM and TO commands more powerful.
DEBUG and BACKGROUND introduced.
One bug fix: alphabetical sorting doesn't now swap some hostnames.
List of primes included in distribution.
1.0 (12-Sep-95)
Only minor changes since 0.94beta.
0.94beta (30-Aug-95)
New configuration variables SEPCHAR and REPORTORDER.
New configuration commands WITHARGS and WITHOUTARGS.
New commandline options +-A and +-x. (Config.: ALL and GENERAL).
Logfile entries with - as the return code are now regarded as successes, not corrupt entries.
Fixed bugs in host report when aliases or numerical hosts are present.
Documentation rewritten.
0.93beta (27-Jul-95)
Approximate hostname counting now possible in fixed memory.
New configuration commands ISPAGE and ISNOTPAGE.
New commandline option -v.
New configuration command WEEKBEGINSON.
Proper error message when memory exceeded.
Program split into several files.
0.92beta (11-Jul-95)
New reports introduced: hostname, full daily, and weekly.
FROM and TO commands introduced.
Header and footer files introduced.
More helpful warning messages.
Ability to read configuration instructions from stdin.
Subdomain commands moved from domains file to configuration file.
Makefile provided.
0.91beta (04-Jul-95)
Configuration file introduced, enabling many new options.
Some bug fixes and speed improvements.
Ability to print "top n" reports (rather than "everything higher than n").
Request report can print only pages.
Ability to try and resolve numerical addresses.
Now less fussy about the format of the domains file.
Logo added.
Readme converted to HTML.
0.9beta
More speed improvements, and some bug fixes.
Introduced -u option.
Introduced subdomain analysis.
Included "not modified" replies as successes, not redirects.
First public release at 0.9beta3. (29-Jun-95)
0.89beta (21-Jun-95)
Commandline arguments.
Efficiency improvements.
Host count and "last 7 day" statistics.
0.8beta (14-Jun-95)
Initial program, just default options.

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/wasnew2.html0000644000175000017500000001745610161303532016151 0ustar sret1sret100000000000000 Readme for analog -- what was new in version 2? [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What was new in version 2?


This section lists the new features which were in version 2 of analog.
What's new in version 6?
What was new in version 5?
What was new in version 4?
What was new in version 3?
2.11 (14-Mar-97)
Minor bug fixes to yesterday's release.
2.1 (13-Mar-97)
Language support rewritten, causing reduction in code size of 2200 lines.
New configuration command LANGFILE.
New Acorn RiscOS version.
Page requests per day reported.
Bug fix: CASE INSENSITIVE could cause %7E-type conversions not to take place.
2.0.2 (04-Mar-97)
DNS lookups and wildcards should now work in the Win32 version.
New configuration command PRINTVARS.
Fix for zero length hostnames after DNS lookups.
Minor corrections in French and Spanish translations.
2.0 (10-Feb-97)
New native Win32 version.
Wildcards allowed in filenames on Mac.
Ignores browser "-".
1.93beta (18-Jan-97)
New commands BROWALIAS, CONFIGFILE and PROGRESSFREQ.
Form program can now call configuration files.
Form program now uses the default choices if none specified.
Domain report prints correctly in preformatted output.
Specifying +1 and +V2 doesn't crash the program.
-v reports dates correctly.
Trailing dots on hostnames removed.
Second argument to LOGFILE command can't be obliterated by /../
1.92beta (08-Oct-96)
DNS lookups added on Mac.
Netpresenz format understood on Mac.
New languages: Spanish, Italian and Danish.
Extra information when debugging turned on.
*.htm are now pages on all machines.
A few small bugs fixed.
1.91beta4 (13-Jul-96)
Cache file now includes page request information.
DNS bug fixed.
New command DNSHASHSIZE.
Bug in browser reports fixed.
1.91beta3 (09-Jul-96)
BSD/OS compilation bug believed fixed.
Fixed HOSTALIAS which I broke yesterday.
DNS bug (causing too many lookups) identified, although not yet fixed.
1.91beta2 (08-Jul-96)
Some bug fixes (including: HOSTEXCLUDE and CASE INSENSITIVE didn't work properly; selecting "no links" failed on the form; less fussy about what can appear on the form).
Mac version no longer includes source code, so is much shorter.
1.91beta1 (05-Jul-96)
Now DNS code doesn't look up a name twice, even if one is a failed request.
1.91beta (05-Jul-96)
Will now output in any of several languages.
Preformatted output introduced.
New File Type Report.
Can limit the number of rows in the time reports.
Number of requests for pages (as opposed to raw requests) now calculated throughout.
DNS lookup returns, with caching across runs.
Logfiles can include wildcards.
Wildcards can include multiple *'s.
Can process case insensitive logfiles.
OUTPUTALIAS commands introduced.
New commands to specify exactly what is included, and what linked, in the request report and referrer report.
FILEALIAS a a and FILEALIAS a b; FILEALIAS b c now work.
New ALLOW options to cancel INCLUDES.
REPSEPCHAR and DECPOINT introduced.
DIRSUFFIX introduced.
Debugging reports number of corrupt lines in other logs.
Hash sizes can now be allocated at run time.
stdin can now be used for any input file, but not for two.
Macintosh version now quits automatically if no warnings have been issued.
Form interface made more secure.
"Mozilla (compatible)" separated out in Browser Summary.
Major internal changes should improve speed.
Code for non-Unix platforms integrated into main code.
"Referrer" spelled correctly.
Licence introduced.
Update file introduced.
Readme updated to include non-Unix instructions.
(19-Apr-96)
First Mac version.
1.9beta6 (11-Apr-96)
Two bug fixes (number of bytes was incorrectly reported in some cases, and -v would overwrite the OUTFILE).
Documentation improved.
1.9beta5 (06-Mar-96)
More bug fixes...
1.9beta4 (05-Mar-96)
One important bug fix (I broke GRAPHICAL OFF in 1.9beta3).
New form cgi options: ch, gr and ou=3.
Code shortened.
(05-Mar-96)
First DOS version.
1.9beta3 (01-Mar-96)
Mainly bug fixes and improved documentation.
Browser and referer reports now include failed requests.
The WARNINGS option can now be specified on the form.
1.9beta2 (07-Feb-96)
Small bug fixes.
1.9beta (06-Feb-96)
Lots of changes. The most important new features are
  • Six new reports (hourly report, browser report, browser summary, referer report, status code report and error report).
  • Analysis of NCSA/Apache referer log, agent log and combined log formats.
  • Graphical time reports that still work on text-based browsers.
  • Configurable columns in the time reports.
  • Time reports can run backwards.
  • Time graphs can be plotted by bytes instead of by requests.
  • Can cache old data so that old logfiles need not be kept.
  • Can process several logfiles.
  • Can combine logfiles from several different hosts.
  • Will uncompress compressed logfiles.
  • All configuration options can now be specified on the commandline.
  • Mandatory configuration file added.
  • Lots of new options in the form processing program.
  • Wildcards greatly improved throughout.
  • Alphabetical host report right-aligned.
  • Bytes now quoted as MBytes etc. instead of long number.
  • Produces HTML2.0 compliant output.
  • New sort method RANDOM (saves time for long reports).
  • Floors for reports now work properly.
  • Can now specify a report FROM 100 or more days ago.
  • Option to turn off warnings.
  • Considerable savings in code length over previous versions.
What was new in version 1?

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/wasnew3.html0000644000175000017500000003075310161303532016145 0ustar sret1sret100000000000000 Readme for analog -- what was new in version 3? [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What was new in version 3?


This section lists the new features which were in version 3 of analog.
What's new in version 6?
What was new in version 5?
What was new in version 4?
3.32 (02-Sep-99)
Bug fixes, including:
  • Drag-and-drop on Mac now works.
  • Unsafe characters in hyperlinks now escaped.
  • One bug that caused crashes when printing deep Directory Reports fixed.
New VMS build scripts. Let me know of any compilation problems.
Computer-readable output now reports version of analog used.
Improved some diagnostic messages.
New language Serbo-Croatian; new domains files for Italian and Russian; corrected Polish language files.
New documentation on Analog's reports and Quick reference.
Now uses named anchors throughout the documentation, so that cross-references link to the right part of a page.
3.31 (19-Jun-99)
New command BARSTYLE; you will need to use new images.
Russian language file corrected.
Some bug fixes, including one important one correcting cache file output.
3.3 (19-May-99)
New commands ERRFILE, DNSLOCKFILE, APACHELOGFORMAT and APACHEDEFAULTLOGFORMAT.
Can include the date in the name of the OUTFILE and the CACHEOUTFILE.
Support for WebSite logfiles.
New token %U in log formats for "Unix time" (seconds since 1970).
Won't overwrite old cache files.
Now works properly on SunOS 4.
Fix for occasional crashes on Windows.
Checks language files are not too long.
"Last seven days" data now calculated more accurately and displayed more clearly.
Computer-readable output now reports SORTBY's as well as floors.
Revised Makefile will work with older make's.
Corrected Catalan language files.
Includes form interfaces in French and Japanese.
LOGFORMAT documentation now includes the LOGFORMAT commands for all built-in log formats.
3.2 (04-May-99)
Bug fixes: in particular REFLINKINCLUDE pages now works; and cache files now include all items even if they're not wanted for the main report.
Lines without a particular item now work properly with INCLUDE and EXCLUDE commands. This can cause differences in results from previous versions.
New version of form interface to work round bug in Microsoft Internet Information Server.
New command NOROBOTS.
Backslashes are now coerced to forward slashes in filenames and usernames. While not always correct technically, it usually is in practice, and it makes them behave correctly in other parts of the program.
Usernames are now treated as case insensitive. Let me know if this causes a problem on any system.
Computer-readable output style now reports floors.
Rewritten Unix Makefile, and VMS build script. Let me know of any compilation problems.
New languages: Catalan, Icelandic, Japanese, Korean, Latvian, Lithuanian. Corrected Spanish language files and French domains file.
LANGUAGE now selects local domains file automatically, where available.
Removed support for NetPresenz logs. The reasons are in the section on how to upgrade.
Form interface documentation rewritten; FAQ broken into sections; sections on logfiles and log formats separated and rewritten; new section on helper applications; and dozens of other improvements to the documentation.
3.11 (26-Nov-98)
Bug fix version.
Microsoft's attempt at W3 extended format is now understood even if there is a second #Fields: line in the logfile.
There is also a fix for a new Microsoft bug which results in an non-standard common format.
Intermittent crashes under Windows fixed.
Mailing lists announced.
3.1 (17-Oct-98)
Understands Microsoft's attempt at W3 extended format.
Several bugs fixed, including one that caused occasional crashes and one that caused the output to grow and grow.
Form interface works on Windows.
Allows aliases with two or more *'s on left hand side, if right hand side contains no *'s.
Aliases work properly with CASE INSENSITIVE.
Numerical SUBDOMAINs fixed.
Understands more WebSTAR and Netscape tokens.
Accents in domains file work.
LOGFORMAT removed from form interface as security risk.
Several warning messages improved.
Report aliases and in/exclusions shown in settings output.
Character set declared at top of output.
Spanish, Dutch, Norwegian (Bokmål and Nynorsk), Finnish, Turkish, Greek, Polish, Russian & Chinese language files included.
3.0 (15-Jun-98)
Corrected W3 extended format.
Fix for broken strcmp() function on SunOS 5.
Portuguese, Brazilian Portuguese, Danish and Hungarian language files included.
Precompiled executable for OS/2 available.
2.91beta1 (04-Jun-98)
Form interface included.
Uses less memory when compiling reports.
New operating system, BS2000/OSD, and code for EBCDIC character set.
New command DEFAULTLOGFORMAT.
LASTSEVEN and BASEURL reinstated.
More information added to PRINTVARS output.
AppleScript support for Unix-style command lines added to Mac version.
Now works on SunOS 4, and other small bug fixes.
French, German, Swedish, Czech, Slovak, Slovene and Romanian language files included.
One page version of the Readme included in the documentation.
2.90beta4 (09-Apr-98)
Mended DNS cache file reading, which I broke in yesterday's release.
2.90beta3 (08-Apr-98)
Fixed bug that caused a crash while giving warning messages on SunOS; bug that caused configuration files that called other configuration files not to be completed; and other smaller bugs.
Italian language files included.
2.90beta2 (03-Apr-98)
Separate LOGFORMATs for North American and international date formats, when using Microsoft or Netpresenz logs.
Understands the AppleShare IP server's attempt at the WebSTAR format.
Directory report now works properly even if you use the second argument to the LOGFILE command.
Wild cards in filenames work properly on the Mac.
Other small bug fixes.
One speed improvement (I gain about 3%).
Several corrections and clarifications to the documentation.
2.90beta1 (27-Mar-98)
This version is a completely rewritten version. Every single line of code is new. The whole code is shorter despite considerable improvements in functionality. Several people have reported that it is significantly faster. The most important new features are:
  • Eleven new reports (Quarter-Hour, Five-Minute, Redirection, Failure, File Size, Referring Site, Redirected Referrer, Failed Referrer, Virtual Host, User, User Failure).
  • Reads logfiles in user-customisable format.
  • Analyses user and virtual host data, and failed requests.
  • Hierarchical reports list subdirectories under directories, and allow analysis of browser version numbers.
  • Faster sorting of long reports.
  • Floor and sort method made independent.
  • "Last date" column in reports, and can floor and sort by date.
  • Busiest time period at bottom of time reports.
  • "Not listed" line at bottom of other report.
  • Knows HTTP/1.1 status codes.
  • General Summary can go anywhere in the report.
  • General Summary and "Go To"s can now be turned on and off independently.
  • Status Code Report can be sorted in different ways.
  • Time offset commands.
  • Much better checking of invalid configuration options and invalid logfile lines.
  • Only reads logfiles it might need.
  • Improvements in DNS functionality: can now read the DNS file without further lookups: also, separate recheck intervals for successful and failed lookups.
  • Hash sizes now chosen automatically.
  • More flexible language support.
  • Mac version reads gzipped logfiles.
  • Mac version supports drag-and-drop onto program icon.
  • Readme files completely re-written. Broken into lots of files, and new sections on Starting to use analog and What the results mean, as well as an index.
The following features have been abolished.
  • No Error Report. The error log was always intended for humans rather than computers to read. Moreover, its format varied from server to server, and even between different versions of the same server. The place of the Error Report has largely been taken by the new reports, particularly the Failure Report.
  • The approximate host counting has been abolished for the time being. I can put it back if there is a significant demand for it.
  • Only one * can now appear on the left-hand side of aliases. This is to avoid ambiguities.
  • For changes in the names and syntax of configuration options and command line arguments, see the section about upgrading.
The following features are not yet present, but will be added by version 3.
  • The form interface.
  • Most of the languages.
What was new in version 2?
What was new in version 1?

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/wasnew4.html0000644000175000017500000002525110161303532016143 0ustar sret1sret100000000000000 Readme for analog -- what was new in version 4? [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What was new in version 4?


This section lists the new features which were in version 4 of analog.
What's new in version 6?
What was new in version 5?
4.16 (13-Feb-01)
Security fix for buffer overflow bug.
Small correction to Brazilian Portuguese language file.
4.15 (01-Feb-01)
Bug fixes for accented letters in dates and for EBCDIC character set.
4.14 (22-Jan-01)
Commas are allowed in regular expressions.
Can do a FLOOR beyond Terabytes.
OS X & MPE/iX ports.
Bug fixes, especially for multibyte character sets.
Unprintable characters in the report are now replaced by '?'.
Traditional Chinese, Portuguese, Brazilian Portuguese, US English and corrected French domains files.
Rewrote the documentation on Cache files. Added some new data to How the Web Works.
4.13 (11-Oct-00)
Corrected infelicity in compilation procedure.
4.12 (05-Oct-00)
Recognises Windows Me for Operating System Report.
Can count beyond Terabytes.
PCRE code upgraded to version 3.4.
AS/400 port. Patches to compile cleanly on Cygwin and 64-bit Solaris.
Bulgarian and Croatian language files. Catalan and Finnish domains files.
Various bug fixes.
New Licence (mostly less restrictive than the previous one).
4.11 (31-May-00)
The default definition of "pages" is now case insensitive, and also includes *.asp.
Reads the extended logs from IIS 5 correctly.
Version number displayed before any warning or debugging messages.
The "number of days" at the top of the report now obeys DECPOINT (and is also now to 2 decimal places).
Improved OpenVMS build procedure.
Hungarian and Romanian language files, and corrected Spanish language files and English domains files.
Italian and Spanish form interfaces.
The FAQ now has a list of contents.
4.1 (30-Mar-00)
Regular expressions in ALIASes and INCLUDEs are now available on all platforms.
Regular expressions are now Perl-syntax regular expressions. (Thanks to Philip Hazel's PCRE library.)
"Repeated fields" in logfile header lines are now allowed.
New commands STATUSINCLUDE and STATUSEXCLUDE, and 304ISSUCCESS.
New output style PLAIN (like ASCII but with accents). New language files for this.
In the computer-readable output, hierarchical reports now have an extra column, indicating the depth of the item in the hierarchy.
All referrers now count as "pages." (See upgrade notes.)
Configuration commands can be continued across lines with a backslash.
New token %s in LOGFORMAT, allowing per-line selection of client-name and client-IP fields.
New log format WEBSTAR-EXTENDED to allow for a small bug in WebSTAR's implementation of the extended log format.
Korean language files. Also alternative Swedish translation.
4.04 (21-Mar-00)
The analog home page has moved to www.analog.cx
New column d in non-time reports.
The RUNTIME command now turns off the "Program started at" line as well as the "Running Time" line.
Non-alphanumeric characters are now allowed in the REPORTORDER as separators.
Correctly parses more APACHELOGFORMATs.
Better detection of Windows 2000 in Operating System Report.
Better warning messages when the erroneous command contains a space.
Code for NeXTSTEP operating system.
Better treatment of multibyte character sets.
Icelandic language files. Corrections to Bosnian, French, Italian, Japanese & Swedish.
4.03 (21-Feb-00)
Fixed several small bugs.
New command RUNTIME.
Brazilian Portuguese language files and Swedish domains files. Corrections to Dutch.
4.02 (31-Jan-00)
New command SEARCHCHARCONVERT.
Support for Apache's new %q code in APACHELOGFORMAT.
Fix for search reports causing crashes on Windows.
New language: Czech. Corrections for Serbian, Slovene and Ukrainian.
4.01 (17-Dec-99)
New command USERCASE.
Some of the default paths have changed in anlghead.h.
Improvements to OpenVMS port.
Language files included for Armenian, Bosnian, Catalan, traditional Chinese, Dutch, Finnish, German, Italian, Slovak, Slovene, Spanish, Swedish & Ukrainian; corrections to Russian & Turkish.
4.0 (16-Nov-99)
Simplified Chinese, Danish, Japanese, Portuguese & Serbian language files included.
Otherwise only small changes since 3.90beta2.
3.90beta2 (02-Nov-99)
It is now recommended that you don't run analog as a CGI program for security reasons. (The CGI command is still present, but it is now not documented.)
The Organisation Report is now hierarchical.
The Browser Summary is now arranged by major version number. (See notes on upgrading.)
Non-exact bytes are now given to 3 decimal places.
GOTOS FEW puts the "Go To" lines just at the top and bottom of the output.
PRINTVARS has been renamed SETTINGS.
-settings output improved, especially with OUTPUT NONE.
Split PAGEWIDTH into HTMLPAGEWIDTH and ASCIIPAGEWIDTH.
Includes language files for French, Greek, Norwegian (Bokmål & Nynorsk), Polish, Russian and Turkish.
New configuration file examples/big.cfg containing most commands.
3.90beta1 (07-Oct-99)
First beta test for version 4. The most important new features are:
  • Five new reports: Organisation Report, Operating System Report, Search Word Report, Search Query Report, Processing Time Report.
  • Browser Summary improved (will change results).
  • Form interface completely rewritten, and considerably simplified.
  • Multiple *'s now allowed on left-hand side of ALIASes.
  • Regular expressions allowed in INCLUDEs & EXCLUDEs, and ALIASes.
  • The output INCLUDEs and EXCLUDEs now apply to the lower levels of a hierarchical report as well as the top level.
  • New commands: CGI, STYLESHEET and ERRLINELENGTH.
  • New column N in most reports.
  • DEBUG C now reports which part of a corrupt logfile line is corrupt.
  • Non-exact bytes are now displayed as, e.g., 47.68 Mbytes instead of 48,832 kbytes. This should be less confusing.
  • Timestamps added to PROGRESSFREQ reports.
  • The DNS file has a new time encoding.
  • Header files split up to make anlghead.h simpler.
  • Form interfaces in German and U.S. English included.
  • New documentation about search arguments.
  • New examples directory.
  • New licence. (Nearly the same, just clarified, and slightly loosened).
What was new in version 3?
What was new in version 2?
What was new in version 1?

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/wasnew5.html0000644000175000017500000004043310161303532016143 0ustar sret1sret100000000000000 Readme for analog -- what was new in version 5? [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What was new in version 5?


This section lists the new features which were in version 5 of analog.
What's new in version 6?
5.32 (23-Mar-03)
Recognises Safari and Camino browsers.
New LOGFORMAT specification %D (processing time in microseconds).
Understands %A and %D in APACHELOGFORMAT.
5.31 (11-Jan-03)
Recognises Phoenix and Chimera browsers.
Fixes for Mac, OpenVMS and RISC OS ports.
Various other small bug fixes.
5.30 (30-Nov-02)
Reads gzipped logfiles without the need for an UNCOMPRESS command.
Host inclusions and exclusions can now use IP address ranges and subnet masks.
New command BYTESDP command to list kilobytes etc. to a chosen number of decimal places. The default number of decimal places has changed from three to two.
New code for RISC OS port, including wildcards in filenames. (Thanks to Stefan Bellon for this code).
Various bug fixes.
Indonesian and Slovak language files.
New How-To entitled Getting started under Windows. (Thanks to Simon Handfield).
5.24 (25-Jun-02)
Recognises Netscape 7 browser. Also better diagnosis of Windows operating systems for Netscape and Mozilla browsers.
New version of IIS How-To.
Later UNCOMPRESS commands now correctly override earlier ones.
SEARCHCHARCONVERT can now be turned on for multibyte character sets, though it's not recommended.
French report descriptions files.
New versions of Polish and alternative Swedish language files.
East Timor country code is now .tl.
5.23 (14-May-02)
Added PROGRESSFREQ to the list of forbidden commands from the form interface, because it allows a denial-of-service attack.
Also emphasised in the documentation that allowing untrusted users to run analog through the form interface is inherently open to a denial-of-service attack.
Fixed two bugs which caused occasional crashes while outputting.
Russian language files included (KOI8-R and Windows-1251 character sets).
Added new domains to the French domains files.
New How-To on configuring IIS.
5.22 (20-Mar-02)
Security fix for cross-site scripting security bug.
Upgraded zlib code to version 1.1.4 (although analog wasn't vulnerable to the security bug in zlib 1.1.3).
The PROGRESSFREQ messages now go to the screen as well as to the ERRFILE.
The second argument to SUBDOMAIN can now contain *'s and $'s.
Added eight new domains to many of the domains files.
Revised Japanese language files.
5.21 (20-Feb-02)
Corrected the MacHTTP log format, which didn't work in 5.2.
All the BARSTYLEs redrawn, and two new BARSTYLEs added, adapted from an idea by Dave Holle. (You will have to move the new graphics into your IMAGEDIR in order to use them.)
5.2 (13-Feb-02)
You can now plot the lower levels of hierarchical reports on the pie charts by using the new CHARTEXPAND family of commands.
Added MACHTTP to the list of built-in log formats that analog recognises automatically.
Recognises ; as well as & as query-string separator.
The rules for generating "organisations" from numerical addresses have changed.
Filenames given on the command line are now relative to the current directory, not the analog directory.
Ignores completely blank lines at the top of a logfile.
Makefiles for Microsoft Visual C++ can be found in the new src/build directory. Makefiles for other platforms have moved out of the source tree into there too.
You can now refer to kilobytes as kibibytes by editing your language file.
Revised versions of Japanese language files.
Revised the Licence.
Advertised new donations page.
5.1 (07-Nov-01)
The Browser Summary now recognises the Konqueror and Galeon browsers, and distinguishes Mozilla and Netscape. (If you are using a configuration file from an older version of analog, you need to remove one line.)
The Operating System Report now recognises Windows XP.
Numerical addresses are now included in the Organisation Report.
Logfile and cache file names can now contain date codes, in the same way as the OUTFILE.
The person setting up the form interface can now specify a list of allowed commands, rather than a list of forbidden commands.
The LATEX output style now works with the ISO-Latin-2 character set as well as ISO-Latin-1. New command PDFLATEX.
New LOGFORMAT token %Z for two- or four-digit years.
In the COMPSEP, you can now use \t to represent a tab.
New warnings category G; some warnings reclassified.
Various small bugs fixed. Also there is some rewriting internally, but it should be transparent to the user.
The Windows executable has been compiled using MinGW instead of Microsoft Visual C++.
Finnish translation, and corrections to German and Serbian. Brazilian Portuguese report descriptions files.
5.03 (07-Jul-01)
Bug fixes, including one bug that caused a crash under Windows.
Spanish translation, and corrections to SWEDISH-ALT translation.
5.02 (23-Jun-01)
Understands the new IIS log format with four-digit years.
Traditional Chinese and Brazilian Portuguese language files.
Japanese is now available in four character sets.
Four language files which were already distributed with the program are now available through the LANGUAGE command: BULGARIAN-MIK (MIK-16 charset), CZECH-1250 and SLOVENE-1250 (Windows-1250), and SWEDISH-ALT (alternative translation avoiding Anglicisms).
5.01 (19-May-01)
New command PNGIMAGES.
New token "PLAIN:" in ALIAS commands.
Unix man page included in source distribution.
New example configuration file examples/bigbyrep.cfg.
A few small bug fixes.
Italian report descriptions files; corrections to German language files.
5.0 (01-May-01)
How-To's introduced.
Wildcards now allowed in LOGFILE names from the form interface.
UNCOMPRESS now works on filenames with spaces in, and other small bug fixes.
Makefiles and build scripts for OpenVMS.
This version is available in 24 languages: Armenian, Bulgarian, Catalan, Czech, Danish, Dutch, English, US English, French, German, Hungarian, Italian, Japanese, Korean, Latvian, Norwegian (Bokmål & Nynorsk), Polish, Portuguese, Serbian, Slovene, Swedish, Turkish and Ukrainian.
4.91beta1 (10-Apr-01)
Output EXCLUDEs are now more fully excluded, producing significant changes in results.
New JPEGCHARTS command (only available if you compile analog yourself, with your own libgd).
New mailing list instructions to include subscriptions over the web, and the digest version of the analog-help list.
Mac version decompresses pkzip and bzip2 logfiles.
Ports to Mac OS X (Carbon) and IBM OS/390.
Pie charts work with EBCDIC character sets; and other improved EBCDIC support.
Wildcards in LOGFILE directories now work under more Unices.
The one-page version of the documentation, whole.html, is no longer distributed with the program. (It's still available at my site.)
This version is available in 21 languages: Armenian, Bulgarian, Catalan, Dutch, English, US English, French, German, Italian, Japanese, Korean, Latvian, Norwegian (Bokmål & Nynorsk), Polish, Portuguese, Serbian, Slovene, Swedish, Turkish and Ukrainian.
4.90beta4 (26-Mar-01)
Wildcards in directory names in LOGFILE commands now work under Unix. (Thanks to Owen Cliffe for this code.)
The CHARTDIR and LOCALCHARTDIR can now contain date codes, in the same way as the OUTFILE.
My own configuration file included in the examples directory.
This version is available in sixteen languages: Armenian, Bulgarian, Catalan, English, US English, French, German, Italian, Japanese, Korean, Latvian, Polish, Portuguese, Slovene, Swedish and Ukrainian.
4.90beta3 (13-Feb-01)
Security fix for buffer overflow bug.
4.90beta2 (05-Feb-01)
New commands CHARTDIR and LOCALCHARTDIR.
The pie charts are now easier to read, and work properly in non-European character sets.
*.asp is no longer included in the default definition of "pages". (See how to upgrade).
The computer-readable output style now gives the REPORTSPANs.
On Unix, now follows symlinks when finding the name of the analog binary to construct other filenames.
Various other minor bug fixes from 4.90beta1.
This version is available in nine languages: Armenian, Bulgarian, Catalan, English, US English, French, Portuguese, Swedish and Ukrainian.
4.90beta1 (22-Jan-01)
This is the first beta test for version 5.
  • Twelve new reports: Yearly Report, Quarterly Report, Five-Minute Summary, Quarter-Hour Summary, Hour of the Week Summary, Host Failure Report, Host Redirection Report, Virtual Host Failure Report, Virtual Host Redirection Report, User Redirection Report, Internal Search Word Report and Internal Search Query Report.
  • Pie charts are now included at the top of most reports. *CHART commands to control them.
  • New command GENSUMLINES to control which lines are listed in the General Summary.
  • The "Distinct hosts" line now appears in the General Summary even if you aren't making a Host, Organisation or Domain Report.
  • New commands DESCRIPTIONS and DESCFILE to provide descriptions of each report.
  • New commands REPORTSPAN and REPORTSPANTHRESHOLD to list the time period covered by each report.
  • New commands ROBOTINCLUDE and ROBOTEXCLUDE for listing robots in the Operating System Report.
  • New command INTSEARCHENGINE to allow the internal search reports.
  • New command DNSTIMEOUT (on some platforms) to reduce the time taken for failed DNS lookups.
  • New LINKINCLUDE and LINKEXCLUDE commands. (See how to upgrade).
  • New columns E and e for time of first request; and S, s, Q, q, C and c for data in last 7 days; also corresponding SORTBY and FLOOR commands.
  • Substantial internal changes to allow these new columns without using extra memory if they are not wanted, and to substantially reduce code size (from what it would have been otherwise!).
  • LaTeX output style.
  • All files are now looked for in the "right" directories. This should improve usability substantially, especially from the form interface. (See how to upgrade).
  • If you specify a CACHEFILE command but no LOGFILE command, analog won't read the default logfile. (See how to upgrade).
  • US English now uses the 12-hour clock by default. (See how to upgrade).
  • Computer readable output now reports the busiest time period for the time reports.
  • Several commands have changed to better names, but the old names should still work.
In addition, version 4.14 was also released on the same date, and this version includes all its changes.
This version is only available in English and US English.
What was new in version 4?
What was new in version 3?
What was new in version 2?
What was new in version 1?

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/webworks.html0000644000175000017500000003343210161303532016416 0ustar sret1sret100000000000000 Readme for analog -- how the web works [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: How the web works


This section is about what happens when somebody connects to your web site, and what statistics you can and can't calculate. There is a lot of confusion about this. It's not helped by statistics programs which claim to calculate things which cannot really be calculated, only estimated. The simple fact is that certain data which we would like to know and which we expect to know are simply not available. And the estimates used by other programs are not just a bit off, but can be very, very wrong. For example (you'll see why below), if your home page has 10 graphics on, and an AOL user visits it, most programs will count that as 11 different visitors!

This section is fairly long, but it's worth reading carefully. If you understand the basics of how the web works, you will understand what your web statistics are really telling you.


1. The basic model. Let's suppose I visit your web site. I follow a link from somewhere else to your front page, read some pages, and then follow one of your links out of your site.

So, what do you know about it? First, I make one request for your front page. You know the date and time of the request and which page I asked for (of course), and the internet address of my computer (my host). I also usually tell you which page referred me to your site, and the make and model of my browser. I do not tell you my username or my email address.

Next, I look at the page (or rather my browser does) to see if it's got any graphics on it. If so, and if I've got image loading turned on in my browser, I make a separate connection to retrieve each of these graphics. I never log into your site: I just make a sequence of requests, one for each new file I want to download. The referring page for each of these graphics is your front page. Maybe there are 10 graphics on your front page. Then so far I've made 11 requests to your server.

After that, I go and visit some of your other pages, making a new request for each page and graphic that I want. Finally, I follow a link out of your site. You never know about that at all. I just connect to the next site without telling you.


2. Caches. It's not always quite as simple as that. One major problem is caching. There are two major types of caching. First, my browser automatically caches files when I download them. This means that if I visit them again, the next day say, I don't need to download the whole page again. Depending on the settings on my browser, I might check with you that the page hasn't changed: in that case, you do know about it, and analog will count it as a new request for the page. But I might set my browser not to check with you: then I will read the page again without you ever knowing about it.

The other sort of cache is on a larger scale. Almost all ISPs now have their own cache. This means that if I try to look at one of your pages and anyone else from the same ISP has looked at that page recently, the cache will have saved it, and will give it out to me without ever telling you about it. (This applies whatever my browser settings.) So hundreds of people could read your pages, even though you'd only sent it out once.


3. What you can know. The only things you can know for certain are the number of requests made to your server, when they were made, which files were asked for, and which host asked you for them.

You can also know what people told you their browsers were, and what the referring pages were. You should be aware, though, that many browsers lie deliberately about what sort of browser they are, or even let users configure the browser name. And some people use "anonymizers" which deliberately send false browsers and referrers.


4. What you can't know.
  1. You can't tell the identity of your readers. Unless you explicitly require users to provide a password, you don't know who connected or what their email addresses are.
  2. You can't tell how many visitors you've had. You can guess by looking at the number of distinct hosts that have requested things from you. Indeed this is what many programs mean when they report "visitors". But this is not always a good estimate for three reasons. First, if users get your pages from a local cache server, you will never know about it. Secondly, sometimes many users appear to connect from the same host: either users from the same company or ISP, or users using the same cache server. Finally, sometimes one user appears to connect from many different hosts. AOL now allocates users a different hostname for every request. So if your home page has 10 graphics on, and an AOL user visits it, most programs will count that as 11 different visitors!
  3. You can't tell how many visits you've had. Many programs, under pressure from advertisers' organisations, define a "visit" (or "session") as a sequence of requests from the same host until there is a half-hour gap. This is an unsound method for several reasons. First, it assumes that each host corresponds to a separate person and vice versa. This is simply not true in the real world, as discussed in the last paragraph. Secondly, it assumes that there is never a half-hour gap in a genuine visit. This is also untrue. I quite often follow a link out of a site, then step back in my browser and continue with the first site from where I left off. Should it really matter whether I do this 29 or 31 minutes later? Finally, to make the computation tractable, such programs also need to assume that your logfile is in chronological order: it isn't always, and analog will produce the same results however you jumble the lines up.
  4. Cookies don't solve these problems. Some sites try to count their visitors by using cookies. This reduces the errors. But it can't solve the problem unless you refuse to let people read your pages who can't or won't take a cookie. And you still have to assume that your visitors will use the same cookie for their next request.
  5. You can't follow a person's path through your site. Even if you assume that each person corresponds one-to-one to a host, you don't know their path through your site. It's very common for people to go back to pages they've downloaded before. You never know about these subsequent visits to that page, because their browser has cached them. So you can't track their path through your site accurately.
  6. You often can't tell where they entered your site, or where they found out about you from. If they are using a cache server, they will often be able to retrieve your home page from their cache, but not all of the subsequent pages they want to read. Then the first page you know about them requesting will be one in the middle of their true visit.
  7. You can't tell how they left your site, or where they went next. They never tell you about their connection to another site, so there's no way for you to know about it.
  8. You can't tell how long people spent reading each page. Once again, you can't tell which pages they are reading between successive requests for pages. They might be reading some pages they downloaded earlier. They might have followed a link out of your site, and then come back later. They might have interrupted their reading for a quick game of Minesweeper. You just don't know.
  9. You can't tell how long people spent on your site. Apart from the problems in the previous point, there is one other complete show-stopper. Programs which report the time on the site count the time between the first and the last request. But they don't count the time spent on the final page, and this is often the majority of the whole visit.
There are lots of other things you can't know. These are just examples. The summary is that you can know what happens at your server, but you can't know what the user or the user's browser does with the data you have sent.
5. Real data. Of course, the important question is how much difference these theoretical difficulties make. In a recent paper (World Wide Web, 2, 29-45 (1999): PDF 228kb), Peter Pirolli and James Pitkow of Xerox Palo Alto Research Center examined this question using a ten day long logfile from the xerox.com web site. One of their most striking conclusions is that different commonly-used methods can give very different results. For example, when trying to measure the median length of a visit, they got results from 137 seconds to 629 seconds, depending exactly what you count as a new visitor or a new visit. As they were looking at a fixed logfile, they didn't consider the effect of server configuration changes such as refusing caching, which would change the results still more.
6. Conclusion. The bottom line is that HTTP is a stateless protocol. That means that people don't log in and retrieve several documents: they make a separate connection for each file they want. And a lot of the time they don't even behave as if they were logged into one site. The world is a lot messier than this naïve view implies. That's why analog reports requests, i.e. what is going on at your server, which you know, rather than guessing what the users are doing.

Defenders of counting visits etc. claim that these are just small approximations. I disagree. For example, almost everyone is now accessing the web through a cache. If the proportion of requests retrieved from the cache is 50% (a not unrealistic figure) then half of the users' requests aren't being seen by the servers.

Other defenders of these methods claim that they're still useful because they measure something which you can use to compare sites. But this assumes that the approximations involved are comparable for different sites, and there's no reason to suppose that this is true. Pirolli & Pitkow's results show that the figures you get depend very much on how you count them, as well as on your server configuration. And even once you've agreed on methodology, different users on different sites have different patterns of behaviour, which affect the approximations in different ways: for example, Pirolli & Pitkow found different characteristics of weekday and weekend users at their site.

Still other people say that at least the trend over time of these numbers tells you something. But even that may not be true, because you may not be comparing like with like. Consider what would happen if a large ISP decided to change its proxy server configuration. It could substantially change your apparent number of visits, even if there was no actual change in the traffic levels at your site.

I've presented a somewhat negative view here, emphasising what you can't find out. Web statistics are still informative: it's just important not to slip from "this page has received 30,000 requests" to "30,000 people have read this page." In some sense these problems are not really new to the web -- they are present just as much in print media too. For example, you only know how many magazines you've sold, not how many people have read them. In print media we have learnt to live with these issues, using the data which are available, and it would be better if we did on the web too, rather than making up spurious numbers.


7. Acknowledgements and further reading. Many other people have made these points too. While originally writing this section, I benefited from three earlier expositions: Interpreting WWW Statistics by Doug Linder; Getting Real about Usage Statistics by Tim Stehle; and Making Sense of Web Usage Statistics by Dana Noonan. (The last two don't seem to be available on the web any more.)

Another, extremely well-written document on these ideas is Measuring Web Site Usage: Log File Analysis by Susan Haigh and Janette Megarity. Being on a Canadian government site, it's available in both English and French. Or for an even more negative point of view, you could read Why Web Usage Statistics are (Worse Than) Meaningless by Jeff Goldberg.


Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/whatsnew.html0000644000175000017500000001051010161303532016403 0ustar sret1sret100000000000000 Readme for analog -- what's new in this version? [ Top | Up | Prev | Next | Map | Index ]

Analog 6.0: What's new in this version?


This section lists the major new features in each version of analog. There's also another section about how to upgrade from older versions of analog, listing which commands have changed or been abolished, or how the output of this version differs from that of previous versions.
6.0 (19-Dec-04)
Added Palm OS and Symbian OS to the Operating System Report.
ISO 8601 extended date format available in language files.
Another style sheet from James Reeves added to the examples directory.
5.92beta1 (14-Nov-04)
Analog is now distributed under the GNU General Public License.
Fix problems building unzip.c on some platforms.
Fix invalid XHTML output in non-European languages.
The DNSTIMEOUT command is now off by default, because it breaks DNS lookups on many platforms.
Recognises Firebird and Firefox as browsers.
msnbot recognised as a robot in the default configuration.
Patches for Mac.
New Makefiles for Windows and RISC OS.
Corrections to Finnish and Japanese language files.
5.91beta1 (23-Aug-03)
Reads zip and bzip2 logfiles without the need for an UNCOMPRESS command.
Automatically strips ;params section from URLs (for example, jsessionid's).
Recognises Windows Server 2003 in the Operating System Report.
First user-contributed style sheets added to examples/css directory.
Computer-readable output style now forces English output.
More corrections to XML output style.
Patches for OpenVMS and RISC OS.
Basque language files.
Country code .cs, formerly Czechoslovakia, is now Serbia and Montenegro. (Changed in English, French and German domains files, and removed from other domains files).
Corrections to Swedish and Ukrainian language files, and to German domains files.
5.90beta2 (10-Apr-03)
Internal Search reports now work properly on case-insensitive file systems.
Various bug fixes and improvements to XHTML and XML output styles.
New command CSSPREFIX to add a prefix to the CSS class names used in the XHTML output.
XML DTD distributed with the program.
Language files for Simplified Chinese.
5.90beta1 (30-Mar-03)
This is the first beta test for version 6.
Output code completely rewritten, to permit more output formats.
New output formats XHTML and XML. (Thanks to Per Jessen for XML, and to Jeremy Wadsack for help with XHTML).
XHTML is now the default output style.
The barcharts are now made from png's not gif's by default.
New command LOGOURL.
What was new in version 5?
What was new in version 4?
What was new in version 3?
What was new in version 2?
What was new in version 1?

Go to the analog home page.

Stephen Turner
19 December 2004

Need help with analog? Use the analog-help mailing list.

[ Top | Up | Prev | Next | Map | Index ] analog-6.0/docs/Licence.txt0000644000175000017500000004615310161303532015774 0ustar sret1sret100000000000000Analog is copyright (c) Stephen R. E. Turner and other authors 1995 - 2004. This copyright and licence apply to all source code, compiled code, documentation, graphics and auxiliary files, except where otherwise stated. Analog is free software. You can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License, published by the Free Software Foundation. This licence can be found below. Note that the program is distributed without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. If you modify analog, you are encouraged to submit your changes to me for possible inclusion in subsequent versions. If you distribute analog with a book or a magazine or something like that, I'd be pleased to receive a copy. Analog includes code from the bzip2, gd, pcre, png, unzip & zlib libraries, and from FreeBSD. These portions of code are also subject to their own copyrights and licensing conditions, which can be found in the analog docs directory in files with names beginning with "Lic". If you like analog, please consider making a donation towards its development at http://www.analog.cx/donations/ . Thank you. Stephen R. E. Turner Cambridge, England analog-author@lists.meer.net http://www.analog.cx/ 19 December 2004 ====== GNU GENERAL PUBLIC LICENSE STARTS HERE ====== GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. analog-6.0/examples/0000755000175000017500000000000010161303533014547 5ustar sret1sret100000000000000analog-6.0/examples/css/0000755000175000017500000000000010161303532015336 5ustar sret1sret100000000000000analog-6.0/examples/css/jreeves/0000755000175000017500000000000010161303533017002 5ustar sret1sret100000000000000analog-6.0/examples/css/jreeves/Readme.txt0000644000175000017500000000005510161303533020740 0ustar sret1sret100000000000000Style sheets contributed by James C. Reeves. analog-6.0/examples/css/jreeves/blue.css0000644000175000017500000000630210161303533020444 0ustar sret1sret100000000000000/* This is the style sheet placed at the top of XHTML output.*/ /* Created by J.C. Reeves on 02-Jun-2003 */ /* Updated by J.C. Reeves on 02-Jun-2003 */ body { background-color: #FFFFFF; color: #333333; font-family: Verdana, Arial; font-size: 10pt; margin: 2em } hr { color: #55554B; border: 1px inset; noshade } pre, tt, code, kbd, samp { font-family: 'Lucida Console', 'Courier New'; background-color: #E1E1C8; font-size: 9pt; font-variant: normal } h1 { border-bottom:3px double #FFFFFF; width: 100%; text-align: center; font-family:Times New Roman; font-style:italic; font-weight:bold; padding-left:6px; padding-right:6px; padding-top:3px; padding-bottom:3px; letter-spacing:2pt; background-color:#FFFFFF; color:#000000 } h2 { border-top:3px double #000080; background-color: #000080; width: 100%; color:#FFFFFF; font-family:Times New Roman; letter-spacing:4pt; font-style:italic; font-weight:bold; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:6px; border-bottom-style:solid } table { text-align: right; margin-left: 30px; background-color: #D0E0F0; border-collapse: collapse; font-size:8pt } th { border-top:3px double #000080; border-bottom:3px double #000080; border-right:1px solid #C0C0FF; font-weight: bold; background-color: #000080;color:#FFFFFF; border-left-width:medium; padding-left:5px; padding-right:5px; padding-top:2px; padding-bottom:6px; letter-spacing:-1pt } td { border-right: 1px solid #606070; border-left-width:medium; border-top-width:medium; border-bottom-width:medium; padding-left:5px; padding-right:5px; padding-top:0px; padding-bottom:1px } td.x { font-family: Lucida Console; white-space: pre } .header { border-top:3px double #000080; border-bottom:3px double #000080; text-align: left; ; font-size:10pt; border-right-width:medium; background-color:#000080; color:#FFFFFF; padding-left:6; padding-right:6; padding-top:3 } .xl { text-align: left; border-right: medium none;; font-size:8pt } .xr { text-align: right; border-right: medium none;; font-size:8pt } .bar { text-align: left; border-right: medium none;; font-size:8pt } tr.sub {background-color: #C0C0FF; font-size:8pt } .repdesc { font-style: italic; } .repspan { font-style: italic; } .goto { border:1px solid #000080; font-size: 8pt; font-variant:small-caps; letter-spacing:-1pt; background-color:#D0E0F0; padding-left:6; padding-right:6; padding-top:4; padding-bottom:4 } .gensumtitle { font-weight: bold; font-variant:small-caps; } .gototitle { font-weight: bold; font-variant:small-caps; letter-spacing:-1pt } .runtimetitle { font-weight: bold; } img { border-style: none; } a:link { color: blue; text-decoration: none; } a:visited { color: purple; text-decoration: none; } a:link:hover { text-decoration: underline; } a:visited:hover { text-decoration: underline; } a:link:active { color: red; text-decoration: underline; } a:visited:active { color: red; text-decoration: underline; } analog-6.0/examples/css/jreeves/buff.css0000644000175000017500000000572710161303533020451 0ustar sret1sret100000000000000/* This is the style sheet placed at the top of XHTML output.*/ /* Created by J.C. Reeves on 02-Jun-2003 */ /* Updated by J.C. Reeves on 03-Jun-2003 */ body { color: #333333; font-family: Verdana, Arial; font-size: 10pt; margin: 2em } hr { color: #55554B; border: 1px inset; noshade } pre, tt, code, kbd, samp { font-family: 'Lucida Console', 'Courier New'; background-color: #FFFFE1; font-size: 9pt; font-variant: normal } h1 { width: 100%; text-align: center; font-family: Times New Roman; font-style: italic; font-weight: bold; letter-spacing: 2pt; background-color: #FFFFFF; color: #000000; border: 1 solid #55554B; padding-left: 6px; padding-right: 6px; padding-top: 3px; padding-bottom: 3px } h2 { background-color: #55554B; width: 100%; color: #ffffe1; font-family: Times New Roman; letter-spacing: 4pt; font-style: italic; font-weight: bold; border-top: 3px double #55554B; padding-left: 6px; padding-right: 6px; padding-top: 2px; padding-bottom: 6px } table { text-align: right; margin-left: 30px; background-color: #FFFFE1; border-collapse: collapse; font-size:8pt } th { border-top:3px double #55554B; border-bottom:3px double #55554B; border-right:1px solid #e1e1c8; font-weight: bold; background-color: #55554B;color:#ffffe1; border-left-width:medium; padding-left:5px; padding-right:5px; padding-top:2px; padding-bottom:6px; letter-spacing:-1pt } td { border-left-width: medium; border-right: 1px solid #606070; border-top-width: medium; border-bottom-width: medium; padding-left: 5px; padding-right: 5px; padding-top: 0px; padding-bottom: 1px } td.x { font-family: Lucida Console; white-space: pre } .header { text-align: left; font-size: 10pt; background-color: #FFFFE1; color: #55554B; border: 1 solid #55554B; padding-left: 6; padding-right: 6; padding-top: 6 } .xl { text-align: left; border-right: medium none;; font-size:8pt } .xr { text-align: right; border-right: medium none;; font-size:8pt } .bar { text-align: left; border-right: medium none;; font-size:8pt } tr.sub {background-color: #e1e1c8; font-size:8pt } .repdesc { font-style: italic; } .repspan { font-style: italic; } .goto { font-size: 8pt; font-variant: small-caps } .gensumtitle { font-weight: bold; font-variant:small-caps; } .gototitle { font-variant: small-caps; font-weight: bold } .runtimetitle { font-weight: bold; } img { border-style: none; } a:link { color: blue; text-decoration: none; } a:visited { color: purple; text-decoration: none; } a:link:hover { text-decoration: underline; } a:visited:hover { text-decoration: underline; } a:link:active { color: red; text-decoration: underline; } a:visited:active { color: red; text-decoration: underline; } analog-6.0/examples/css/jreeves/gray.css0000644000175000017500000000626610161303533020470 0ustar sret1sret100000000000000/* This is the style sheet placed at the top of XHTML output.*/ /* Created by J.C. Reeves on 02-Jun-2003 */ /* Updated by J.C. Reeves on 03-Jun-2003 */ body { background-color: #FFFFFF; color: #505050; font-family: Verdana, Arial; font-size: 10pt; margin: 2em } hr { color: #505050; border-style: inset; border-width: 1px } pre, tt, code, kbd, samp { font-family: 'Lucida Console', 'Courier New'; background-color: #E2E2E2; font-size: 9pt; font-variant: normal } h1 { border-bottom:3px double #FFFFFF; width: 100%; text-align: center; font-family:Times New Roman; font-style:italic; font-weight:bold; padding-left:6px; padding-right:6px; padding-top:3px; padding-bottom:3px; letter-spacing:2pt; background-color:#FFFFFF; color:#000000 } h2 { background-color: #505050; width: 100%; color: #FFFFFF; font-family: Times New Roman; letter-spacing: 4pt; font-style: italic; font-weight: bold; border-top: 3px double #000080; border-bottom-style: solid; padding-left: 6px; padding-right: 6px; padding-top: 2px; padding-bottom: 6px } table { text-align: right; background-color: #E2E2E2; border-collapse: collapse; font-size: 8pt; margin-left: 30px } th { font-weight: bold; background-color: #505050; color: #FFFFFF; letter-spacing: -1pt; border-left-width: medium; border-right: 1px solid #C0C0C0; border-top: 2px double #505050; border-bottom: 2px double #505050; padding-left: 5px; padding-right: 5px; padding-top: 2px; padding-bottom: 6px } td { border-right: 1px solid #606070; border-left-width:medium; border-top-width:medium; border-bottom-width:medium; padding-left:5px; padding-right:5px; padding-top:0px; padding-bottom:1px } td.x { font-family: Lucida Console; white-space: pre } .header { text-align: left; font-size: 10pt; background-color: #505050; color: #FFFFFF; border-right-width: medium; border-top-style: double; border-top-color: #505050; border-bottom-style: double; border-bottom-color: #505050; padding-left: 6; padding-right: 6; padding-top: 3 } .xl { text-align: left; border-right: medium none;; font-size:8pt } .xr { text-align: right; border-right: medium none;; font-size:8pt } .bar { text-align: left; border-right: medium none;; font-size:8pt } tr.sub { background-color: #C0C0C0; font-size: 8pt } .repdesc { font-style: italic; } .repspan { font-style: italic; } .goto { font-size: 8pt; font-variant: small-caps; background-color: #E2E2E2; padding-left: 6; padding-right: 6; padding-top: 4; padding-bottom: 4 } .gensumtitle { font-weight: bold; font-variant:small-caps; } .gototitle { font-variant: small-caps; font-weight: bold } .runtimetitle { font-weight: bold; } img { border-style: none; } a:link { color: blue; text-decoration: none; } a:visited { color: purple; text-decoration: none; } a:link:hover { text-decoration: underline; } a:visited:hover { text-decoration: underline; } a:link:active { color: red; text-decoration: underline; } analog-6.0/examples/css/jreeves/gray_expanded.css0000644000175000017500000002440310161303533022331 0ustar sret1sret100000000000000/* This is the style sheet placed at the top of XHTML output */ /* and was specifically written for the Analog product. */ /* Created by J.C. Reeves on 02-Jun-2003 */ /* Updated by J.C. Reeves on 07-Dec-2004 */ /* COMMON HTML TAGS */ body { color: #000000; font-family: Verdana; Arial; font-size: 10pt; background-color: #969696; margin: 2em } hr { color: #505050; border-style: inset; border-width: 2px } pre, tt, code, kbd, samp { font-family: 'Lucida Console', 'Courier New'; background-color: #E2E2E2; font-size: 8pt; font-variant: normal } h1 { width: 100%; text-align: center; font-family: Times New Roman; letter-spacing: 2pt; background-color: #505050; color: #FFFFC8; font-style: italic; font-weight: bold; border-bottom: 3px double #FFFFFF; padding-left: 6px; padding-right: 6px; padding-top: 4px; padding-bottom: 4px; margin-top:6; margin-bottom:6 } h2 { background-color: #505050; width: 100%; color: #FFFFC8; font-family: Times New Roman; letter-spacing: 3pt; font-style: italic; font-weight: bold; padding-left: 6px; padding-right: 6px; padding-top: 2px; padding-bottom: 6px; margin-top:6; margin-bottom:6 } table { background-color: #E1E1E1; border-collapse: collapse; font-size: 8pt; position: relative; text-align: right; font-family: 'Lucida Console', 'Courier New'; letter-spacing: -1; border: 2px solid #000000; margin-left: 30px; margin-right: 30px; margin-top:0; margin-bottom:12 } th { font-size: 9pt; background-color: #505050; color: #FFFFC8; border-left-width: medium; border-right: 1px solid #C0C0C0; border-top: 2px double #505050; border-bottom: 2px double #505050; padding-left: 5px; padding-right: 5px; padding-top: 2px; padding-bottom: 6px; font-variant:small-caps; font-family:Arial } td { border-left-width: medium; border-right: 1px solid #606070; border-top-width: medium; padding-left: 2px; padding-right: 2px; padding-top: 1px; padding-bottom: 1px } tr.sub { background-color: #D2D2D2 } img { } /* HYPERLINK TAGS */ a:link { color: blue; text-decoration: none } a:visited { color: purple; text-decoration: none } a:link:hover { text-decoration: underline } a:visited:hover { text-decoration: underline } a:link:active { color: red; text-decoration: underline } /* XHTML CLASSES */ /* INFORMATION LINES CLASSES */ .analysisspan { margin:6 30; text-align: center; background-color: #E1E1E1; border: 2px solid #000000; padding-left: 6; padding-right: 5; padding-top: 4; padding-bottom: 4 } .busiesttime { color: #FF0000; font-size: 10pt; text-transform: uppercase; font-weight: bold; margin-left: 30 } .lastseven { margin-left: 30 } .eachunit { margin-left: 30 } .xl { text-align: left; border-right: medium none } .xr { text-align: right; border-right: medium none } .bar { text-align: left; font-size: 9pt; border-right-style: none; border-right-width: medium } .repdesc { font-style: italic } .whatinc { font-style: italic; margin-left: 30 } .repspan { font-style: italic } .goto { margin:6 30; font-size: 8pt; background-color: #E2E2E2; background-attachment: scroll; border: 2px solid #000000; padding-left: 6; padding-right: 6; padding-top: 4; padding-bottom: 4 } .gototitle { font-size: 10pt; color: #FF0000; font-weight: bold; text-decoration:underline; text-transform:uppercase } .gensumtitle { letter-spacing: -1pt; font-weight: bold; margin-right: 6 } .gensumlines { margin:3 30; background-color: #E1E1E1; border: 2px solid #000000; padding-left: 6; padding-right: 6; padding-top: 4; padding-bottom: 4 } .credit { margin:6 30; background-color: #E1E1E1; border: 2px solid #000000; padding-left: 6; padding-right: 6; padding-top: 4; padding-bottom: 4 } .runtimetitle { font-weight: bold } /* MAIN SECTIONS CLASSES */ .header { padding:6; text-align: center; font-size: 10pt; background-color: #FFFFFF; border-style: solid; border-width: 1; } .year { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .quartly { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .month { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .week { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .hourrep { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .quartrep { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .fiverep { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .weekhour { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .quartsum { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .fivesum { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .dayrep { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .daysum { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .hoursum { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .org { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .dom { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .host { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .ref { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .refsite { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .searchw { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .searchq { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .isearchq { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .isearchw { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .browrep { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .browsum { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .os { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .dir { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .req { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .type { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .size { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .code { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .redir { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .redirvh { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .redihost { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .redirref { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .rediuser { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .vhost { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .fail { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .failhost { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .failref { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .failuser { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .failvh { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .user { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .proctime { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .gensum { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 } .footer { background-color: #FFFFFF; border: 1px solid #000000; margin-top: 6; margin-bottom: 6; padding: 6 }analog-6.0/examples/css/Readme.txt0000644000175000017500000000030710161303532017274 0ustar sret1sret100000000000000This directory contains style sheets contributed by users. default.css is the default style that you get if you don't specify any other. To use a different one, specify it with a STYLESHEET command. analog-6.0/examples/css/default.css0000644000175000017500000000314710161303533017502 0ustar sret1sret100000000000000/* This is the default style sheet placed at the top of XHTML output. If you declare your own style sheet, you don't get the default one, so you might like to use this one as a starting point. */ /* If you make a good style sheet and want to share it, please send it to me!*/ h2 { background-color: #A0C0F0; width: 98%; padding: 3px 6px; } table { text-align: right; margin-left: 30px; background-color: #D0E0F0; border-collapse: collapse; } th { border-bottom: 1px solid #404050; border-right: 1px dotted #606070; border-top: none; border-left: none; padding: 0px 5px 1px 5px; font-weight: bold; background-color: #A0C0F0; } td { padding: 0px 5px 1px 5px; border-right: 1px dotted #606070; border-left: none; border-bottom: none; border-top: none; } td.x { font-family: monospace; white-space: pre; } .xl { text-align: left; border-right: none; } .xr { text-align: right; border-right: none; } .bar { text-align: left; border-right: none; } tr.sub {background-color: #C0C0FF; font-style: italic; } .repdesc { font-style: italic; } .repspan { font-style: italic; } .goto { font-size: small; } .gensumtitle { font-weight: bold; } .gototitle { font-weight: bold; } .runtimetitle { font-weight: bold; } img { border-style: none; } a:link { color: blue; text-decoration: none; } a:visited { color: purple; text-decoration: none; } a:link:hover { text-decoration: underline; } a:visited:hover { text-decoration: underline; } a:link:active { color: red; text-decoration: underline; } a:visited:active { color: red; text-decoration: underline; } analog-6.0/examples/big.cfg0000644000175000017500000002625710161303533016005 0ustar sret1sret100000000000000# Here is a big configuration file for analog version 6.0 # # # It contains most commands which you can use # (or at least one example from each family of commands). # See bigbyrep.cfg for a similar file arranged by report instead of by family # of command. # # Actually this file doesn't really do much except show you what's available, # because it gives almost all the commands their default values. # (As of time of writing -- I don't promise it will stay up-to-date.) # # Even this file doesn't contain all the commands -- you'll have to read the # docs for the full set! # # First the commands you are most likely to want to change. # # If you need a LOGFORMAT command (most people don't -- try it without first!), # it must go here, above the LOGFILE commands. # LOGFORMAT MICROSOFT-NA # The logfile(s) to be analysed LOGFILE logfile.log # LOGFILE /old/logs/access_log.* # # Your organisation's name and URL for the top line of the report HOSTNAME "[my organisation]" HOSTURL none # # Where to write the report OUTFILE Report.html # # URL for the images directory IMAGEDIR images/ # # Whether to use PNG or GIF images PNGIMAGES ON # # URL and local directory for the pie charts # CHARTDIR /images/ # LOCALCHARTDIR /usr/local/apache/htdocs/images/ # # Style sheet for the output page STYLESHEET none CSSPREFIX none # # Web server fetches /dir/index.html when asked for /dir/ DIRSUFFIX index.html # # Case sensitive or case insensitive file system: default depends on your OS. # If your web server and your analog run on different OS's, you may need to # change this according to the machine running your server. # CASE INSENSITIVE # USERCASE SENSITIVE # # How to uncompress compressed logfiles # UNCOMPRESS *.bz "bzip2 -cd" # Cache files: see docs/cache.html CACHEFILE none CACHEOUTFILE none # Aliases: see docs/alias.html # I can't list all of them, but there are aliases for individual items, e.g. # FILEALIAS /football/* /soccer/* # and there are also aliases for each report, e.g. # REQALIAS /soccer/* "Football: /soccer/*" # You can also use regular expressions: # FILEALIAS REGEXP:^/(football|soccer)/(.*) /$2 TYPEALIAS .html ".html [Hypertext Markup Language]" TYPEALIAS .htm ".htm [Hypertext Markup Language]" TYPEALIAS .shtml ".shtml [Server-parsed HTML]" TYPEALIAS .ps ".ps [PostScript]" TYPEALIAS .gz ".gz [Gzip compressed files]" TYPEALIAS .tar.gz ".tar.gz [Compressed archives]" TYPEALIAS .jpg ".jpg [JPEG graphics]" TYPEALIAS .jpeg ".jpeg [JPEG graphics]" TYPEALIAS .gif ".gif [GIF graphics]" TYPEALIAS .png ".png [PNG graphics]" TYPEALIAS .txt ".txt [Plain text]" TYPEALIAS .cgi ".cgi [CGI scripts]" TYPEALIAS .pl ".pl [Perl scripts]" TYPEALIAS .css ".css [Cascading Style Sheets]" TYPEALIAS .class ".class [Java class files]" TYPEALIAS .pdf ".pdf [Adobe Portable Document Format]" TYPEALIAS .zip ".zip [Zip archives]" TYPEALIAS .hqx ".hqx [Macintosh BinHex files]" TYPEALIAS .exe ".exe [Executables]" TYPEALIAS .wav ".wav [WAV sound files]" TYPEALIAS .avi ".avi [AVI movies]" TYPEALIAS .arc ".arc [Compressed archives]" TYPEALIAS .mid ".mid [MIDI sound files]" TYPEALIAS .mp3 ".mp3 [MP3 sound files]" TYPEALIAS .doc ".doc [Microsoft Word document]" TYPEALIAS .rtf ".rtf [Rich Text Format]" TYPEALIAS .mov ".mov [Quick Time movie]" TYPEALIAS .mpg ".mpg [MPEG movie]" TYPEALIAS .mpeg ".mpeg [MPEG movie]" TYPEALIAS .asp ".asp [Active Server Pages]" TYPEALIAS .jsp ".jsp [Java Server Pages]" TYPEALIAS .cfm ".cfm [Cold Fusion]" TYPEALIAS .php ".php [PHP]" TYPEALIAS .js ".js [JavaScript code]" # Inclusions and exclusions: see docs/include.html # Again there are these for individual items, e.g. # FILEINCLUDE /football/* # FILEEXCLUDE /football/* # and for each report, e.g. # REQINCLUDE pages # REQINCLUDE *.pdf # Or you can use regular expressions: # FILEINCLUDE REGEXP:^/(football|soccer) # You can make more things into pages with commands like # PAGEINCLUDE *.shtml # PAGEINCLUDE *.asp # PAGEINCLUDE *.jsp # PAGEINCLUDE *.cfm # PAGEINCLUDE *.pl # PAGEINCLUDE *.php # You can limit the dates analysed with FROM and/or TO: see docs/include.html # FROM 991001 # TO -00-00-01 # Controlling status codes: see docs/include.html # STATUSINCLUDE 200-299,304 # STATUSEXCLUDE 206 304ISSUCCESS ON # Which browsers count as robots in the Operating System Report ROBOTINCLUDE REGEXPI:robot ROBOTINCLUDE REGEXPI:spider ROBOTINCLUDE REGEXPI:crawler ROBOTINCLUDE Googlebot* ROBOTINCLUDE msnbot* ROBOTINCLUDE Infoseek* ROBOTINCLUDE Scooter* ROBOTINCLUDE *Slurp* ROBOTINCLUDE *Validator* ROBOTINCLUDE Ultraseek* # Whether each report is wanted: see docs/output.html GENERAL ON YEARLY OFF QUARTERLY OFF MONTHLY ON DAILYREP OFF DAILYSUM ON WEEKLY OFF HOURLYREP OFF HOURLYSUM ON QUARTERREP OFF QUARTERSUM OFF FIVEREP OFF FIVESUM OFF DOMAIN ON ORGANISATION ON DIRECTORY ON FILETYPE ON REQUEST ON REDIR OFF FAILURE OFF SIZE ON PROCTIME OFF HOST OFF REDIRHOST OFF FAILHOST OFF REFERRER OFF REFSITE OFF REDIRREF OFF FAILREF OFF VHOST OFF REDIRVHOST OFF FAILVHOST OFF USER OFF REDIRUSER OFF FAILUSER OFF SEARCHQUERY OFF SEARCHWORD ON INTSEARCHQUERY OFF INTSEARCHWORD OFF BROWSERREP OFF BROWSERSUM OFF OSREP ON STATUS ON # The columns in each report: see docs/timereps.html and docs/othreps.html TIMECOLS RP YEARCOLS RP QUARTERLYCOLS RP MONTHCOLS RP WEEKCOLS RP DAYREPCOLS RP DAYSUMCOLS RP HOURREPCOLS RP HOURSUMCOLS RP QUARTERREPCOLS RP QUARTERSUMCOLS RP FIVEREPCOLS RP FIVESUMCOLS RP DOMCOLS Rb ORGCOLS Rb HOSTCOLS Rb REDIRHOSTCOLS R FAILHOSTCOLS R DIRCOLS Rb TYPECOLS Rb REQCOLS RbD REDIRCOLS R FAILCOLS R REFCOLS R REFSITECOLS R REDIRREFCOLS R FAILREFCOLS R BROWREPCOLS R BROWSUMCOLS R OSCOLS NRP SIZECOLS Rb PROCTIMECOLS R VHOSTCOLS Rb REDIRVHOSTCOLS R FAILVHOSTCOLS R USERCOLS Rb REDIRUSERCOLS R FAILUSERCOLS R SEARCHQUERYCOLS R SEARCHWORDCOLS R INTSEARCHQUERYCOLS R INTSEARCHWORDCOLS R STATUSCOLS R # How the graphs are plotted: see docs/timereps.html ALLGRAPH P YEARGRAPH P MONTHGRAPH P DAYREPGRAPH P DAYSUMGRAPH P HOURREPGRAPH P HOURSUMGRAPH P WEEKGRAPH P QUARTERREPGRAPH P QUARTERSUMGRAPH P FIVEREPGRAPH P FIVESUMGRAPH P # Whether the time reports run forwards or backwards: see docs/timereps.html ALLBACK OFF YEARBACK OFF QUARTERLYBACK OFF MONTHBACK OFF DAYREPBACK OFF HOURREPBACK OFF WEEKBACK OFF QUARTERREPBACK OFF FIVEREPBACK OFF # The number of rows to display in each time report: see docs/timereps.html YEARROWS 0 QUARTERLYROWS 0 MONTHROWS 0 WEEKROWS 0 DAYREPROWS 42 HOURREPROWS 72 QUARTERREPROWS 96 FIVEREPROWS 288 # The floors for each report: see docs/othreps.html and docs/hierreps.html REQFLOOR 20r REQARGSFLOOR 10r REDIRFLOOR -30r REDIRARGSFLOOR 10r FAILFLOOR -30r FAILARGSFLOOR 10r DOMFLOOR 0b SUBDOMFLOOR 0.5%b ORGFLOOR -20r SUBORGFLOOR 0.5%r DIRFLOOR 0.01%b SUBDIRFLOOR 0.01%b TYPEFLOOR 0.1%b SUBTYPEFLOOR 0.1%b HOSTFLOOR -50r REDIRHOSTFLOOR -20r FAILHOSTFLOOR -20r REFFLOOR 20r REFARGSFLOOR 10r REFSITEFLOOR -30r REFDIRFLOOR 50r REDIRREFFLOOR -30r REDIRREFARGSFLOOR 10r FAILREFFLOOR -30r FAILREFARGSFLOOR 10r BROWSUMFLOOR -20r SUBBROWFLOOR -20r BROWREPFLOOR -40r OSFLOOR 0p SUBOSFLOOR 0p VHOSTFLOOR -20b REDIRVHOSTFLOOR -20r FAILVHOSTFLOOR -20r USERFLOOR -50r REDIRUSERFLOOR -20r FAILUSERFLOOR -20r SEARCHQUERYFLOOR -30r SEARCHWORDFLOOR -30r INTSEARCHQUERYFLOOR -30r INTSEARCHWORDFLOOR -30r STATUSFLOOR 0r # How each report is sorted: see docs/othreps.html and docs/hierreps.html REQSORTBY REQUESTS REDIRSORTBY REQUESTS FAILSORTBY REQUESTS DOMSORTBY BYTES ORGSORTBY REQUESTS DIRSORTBY BYTES TYPESORTBY BYTES HOSTSORTBY ALPHABETICAL REDIRHOSTSORTBY REQUESTS FAILHOSTSORTBY REQUESTS REFSORTBY REQUESTS REFSITESORTBY REQUESTS REDIRREFSORTBY REQUESTS FAILREFSORTBY REQUESTS BROWREPSORTBY REQUESTS BROWSUMSORTBY REQUESTS OSSORTBY PAGES SUBOSSORTBY PAGES VHOSTSORTBY BYTES REDIRVHOSTSORTBY REQUESTS FAILVHOSTSORTBY REQUESTS USERSORTBY REQUESTS REDIRUSERSORTBY REQUESTS FAILUSERSORTBY REQUESTS SEARCHQUERYSORTBY REQUESTS SEARCHWORDSORTBY REQUESTS INTSEARCHQUERYSORTBY REQUESTS INTSEARCHWORDSORTBY REQUESTS STATUSSORTBY ALPHABETICAL # Whether and how pie charts are plotted: see docs/othreps.html REQCHART ON REDIRCHART ON FAILCHART ON TYPECHART ON SIZECHART ON PROCTIMECHART ON DIRCHART ON HOSTCHART ON REDIRHOSTCHART ON FAILHOSTCHART ON DOMCHART ON ORGCHART ON REFCHART ON REFSITECHART ON REDIRREFCHART ON FAILREFCHART ON BROWREPCHART ON BROWSUMCHART ON OSCHART ON VHOSTCHART ON REDIRVHOSTCHART ON FAILVHOSTCHART ON USERCHART ON REDIRUSERCHART ON FAILUSERCHART ON SEARCHQUERYCHART ON SEARCHWORDCHART ON INTSEARCHQUERYCHART ON INTSEARCHWORDCHART ON STATUSCHART ON # Zoom in on some wedges using CHARTEXPAND # OSCHARTEXPAND Windows # What to link to in the reports REQLINKINCLUDE pages REDIRLINKEXCLUDE * FAILLINKEXCLUDE * REFLINKINCLUDE * REDIRREFLINKINCLUDE * FAILREFLINKINCLUDE * # BASEURL http://my.server.com # Cosmetic commands: mostly in docs/output.html OUTPUT XHTML LANGUAGE ENGLISH # LANGFILE uk.lng # DOMAINSFILE ukdom.tab # DESCFILE ukdesc.txt HEADERFILE none FOOTERFILE none LOGO analogo LOGOURL http://www.analog.cx/ REPORTORDER x1QmWDdHwh4657oZSlLujJkKfsNnBbpvRMcPztiEIYyr GENSUMLINES ALL GOTOS ON RUNTIME ON DESCRIPTIONS ON REPORTSPAN OFF REPORTSPANTHRESHOLD 60 WEEKBEGINSON SUNDAY LASTSEVEN ON MARKCHAR + # SEPCHAR and DECPOINT are usually taken from the language file # SEPCHAR , # DECPOINT . REPSEPCHAR none COMPSEP " " RAWBYTES OFF BYTESDP 2 NOROBOTS ON SEARCHCHARCONVERT ON BARSTYLE b HTMLPAGEWIDTH 65 ASCIIPAGEWIDTH 76 MINGRAPHWIDTH 15 # The following commands are only available on some systems: see docs/dns.html # DNSFILE dnscache # DNSLOCKFILE dnslock # DNS NONE # DNSGOODHOURS 100000 # DNSBADHOURS 336 # DNSTIMEOUT 10 # Sub-item commands: see docs/hierreps.html. Examples are # SUBDOM *.com # SUBDIR /*/*/ SUBTYPE *.gz,*.Z # A list of search engines. More SEARCHENGINE commands can be found at # http://www.analog.cx/helpers/#conffiles SEARCHENGINE http://*google.*/* q,as_q,as_epq,as_oq SEARCHENGINE http://*altavista.*/* q SEARCHENGINE http://*yahoo.*/* p SEARCHENGINE http://*lycos.*/* query,wfq SEARCHENGINE http://*aol.*/* query SEARCHENGINE http://*excite.*/* search SEARCHENGINE http://*go2net.*/* general SEARCHENGINE http://*metacrawler.*/* general SEARCHENGINE http://*msn.*/* q,MT SEARCHENGINE http://*netscape.*/* search SEARCHENGINE http://*looksmart.*/* key SEARCHENGINE http://*webcrawler.*/* qkw,search,searchText SEARCHENGINE http://*overture.*/* Keywords SEARCHENGINE http://*teoma.*/* q SEARCHENGINE http://*infospace.*/* qkw SEARCHENGINE http://*alltheweb.*/* q SEARCHENGINE http://*dogpile.*/* q SEARCHENGINE http://*ask.*/* q,ask SEARCHENGINE http://*alltheweb.*/* query SEARCHENGINE http://*northernlight.*/* qr SEARCHENGINE http://*nlsearch.*/* qr SEARCHENGINE http://*dmoz.*/* search SEARCHENGINE http://*/netfind* query SEARCHENGINE http://*/pursuit query # Search engines on your own site # INTSEARCHENGINE /cgi-bin/my.cgi q # Use one of these if you are short of memory: see docs/lowmem.html FILELOWMEM 0 HOSTLOWMEM 0 BROWLOWMEM 0 REFLOWMEM 0 USERLOWMEM 0 VHOSTLOWMEM 0 # Commands for debugging SETTINGS OFF DEBUG OFF WARNINGS ON PROGRESSFREQ 0 # ERRFILE somefile ERRLINELENGTH 78 # # By Stephen Turner 1999 - 2004. No warranty for this file. # This file is given into the public domain: it may be used, modified and # redistributed without restriction. analog-6.0/examples/bigbyrep.cfg0000644000175000017500000004151510161303533017041 0ustar sret1sret100000000000000# This configuration file contains most of analog's commands, arranged by # the report they affect. See big.cfg for a similar file arranged by family # of command instead. (Unlike big.cfg, this file doesn't use the default # values though.) # # This configuration file was contributed by Lucian Wischik. HOSTNAME "***SAMPLE DATA***" HOSTURL http://www.statslab.cam.ac.uk # FROM 991001 # TO -00-00-01 ############################################################################### # THE LOGFILE INPUT # ############################################################################### # If you need a LOGFORMAT command (most people don't -- try it without first!), # it must go here, above the LOGFILE commands. LOGFILE logfile.log DNS READ DNSFILE dnscache.txt DNSLOCKFILE dnslock.txt DNSGOODHOURS 1000000 DNSBADHOURS 500 # DNSTIMEOUT 10 CACHEFILE none CACHEOUTFILE none DIRSUFFIX index.html # UNCOMPRESS *.bz "bzip2 -cd" ############################################################################### # THE OUTPUT # ############################################################################### OUTFILE index.html OUTPUT XHTML LANGUAGE ENGLISH # Analog expects to find ancilliary files in these locations: IMAGEDIR images/ # CHARTDIR /images/ # LOCALCHARTDIR /usr/local/apache/htdocs/images/ STYLESHEET none CSSPREFIX none LOGO none HEADERFILE none FOOTERFILE none # 'Runtime' says how long the analysis took. 'Gotos' are irritating shortcuts. # 'Descriptions' say verbosely what each report is. 'Reportorder' what order # the reports come in. 'Reportspan' is for when some parts cover a different # time span to others, but is costly in terms of memory usage. RUNTIME ON GOTOS OFF DESCRIPTIONS OFF REPORTSPAN OFF REPORTSPANTHRESHOLD 60 REPORTORDER x-1QmWDdHhw4657-oZSsfnNBbp-irtz-cILKElk-vRMujJyYP # x=General # 1=Yearly Q=Quarterly m=Monthly W=Weekly D=Daily d=DailySum # H=Hourly h=HourlySum w=HoursOfWeek 4=15minly 6=15minlySum 5=5minly # 7=5minlySum # o=Domain Z=Organisat. S=Host s=RefSite f=ReferrerURL # n=SearchWord N=SearchQuery B=Browser b=BrowserSum p=OS # i=Dir. r=File t=FileType z=FileSize c=Status # I=Failure L=FailHost K=FailRef E=Redir l=RedirHost k=RedirRef # v=VHost R=RedirVHost M=FailVHost u=User j=RedirUser J=FailUser # y=IntSearchWord Y=IntSearchQuery P=ProcTime WEEKBEGINSON MONDAY MARKCHAR + REPSEPCHAR none COMPSEP " " RAWBYTES OFF BYTESDP 2 NOROBOTS ON SEARCHCHARCONVERT ON BARSTYLE b PNGIMAGES ON HTMLPAGEWIDTH 65 ASCIIPAGEWIDTH 76 MINGRAPHWIDTH 15 # BASEURL http://my.server.com - use this if the report's on a different web page from the data ############################################################################### # GENERAL REPORT # # Shows total and average numbers of reqests. # # GENSUMLINES - which information and in which order to show (see list below) # # LASTSEVEN - each item says, in brackets, the data for the last seven days # # (If your logs are old when you run analog, use TO field to say which 7) # ############################################################################### # I=distinct files J=distinct hosts F=failed req G=redirected reqs # K=bad loglines L=unwanted logli. C=no-status logli. H=no-status reqs # B=av.succ.reqs/day D=tot.succ.pages E=av.succ.pages/day # M=tot.data N=av.data/day GENERAL ON GENSUMLINES BDEFIJMN LASTSEVEN ON ############################################################################### # TIME REPORTS # # # # Yearly, 1/4ly, monthly, weekly, daily+sum, hourly+sum, 1/4hrly+sum, 5min+sum# # 'Reports' show how much traffic over each past year, month, hour... # # 'Summaries' divide all the traffic into days of the week, hours of the day. # # # # COLS - which columns to display (see below for list of fields) # # GRAPH - which of those fields should be plotted as the bar-graph # # BACK - turn it on to have the list in reverse order (most recent first) # # ROWS - how many rows to display, or 0 for unlimited # ############################################################################### # R=num of reqs P=num of pages B=num of bytes # r=% of reqs p=% of pages b=% of bytes YEARLY OFF YEARCOLS RP YEARGRAPH P YEARBACK OFF YEARROWS 0 MONTHLY ON MONTHCOLS PB MONTHGRAPH B MONTHBACK OFF MONTHROWS 0 QUARTERLY OFF QUARTERLYCOLS RP QUARTERLYBACK OFF QUARTERLYROWS 0 WEEKLY OFF WEEKCOLS RP WEEKGRAPH P WEEKBACK OFF WEEKROWS 0 DAILYREP ON DAYREPCOLS PB DAYREPGRAPH P DAYREPBACK OFF DAYREPROWS 42 DAILYSUM OFF DAYSUMCOLS RP DAYSUMGRAPH P HOURLYREP OFF HOURREPCOLS RP HOURREPGRAPH P HOURREPBACK OFF HOURREPROWS 72 HOURLYSUM ON HOURSUMCOLS Pb HOURSUMGRAPH P QUARTERREP OFF QUARTERREPCOLS RP QUARTERREPGRAPH P QUARTERREPBACK OFF QUARTERREPROWS 96 QUARTERSUM OFF QUARTERSUMCOLS RP QUARTERSUMGRAPH P FIVEREP OFF FIVEREPCOLS RP FIVEREPGRAPH P FIVEREPBACK OFF FIVEREPROWS 288 FIVESUM OFF FIVESUMCOLS RP FIVESUMGRAPH P ############################################################################### # VISITOR REPORTS - WHO IS VISITING THE SITE, AND WHERE THEY'VE COME FROM # # # # Domain, Organisation, Host - visitor is .uk; cam.ac.uk; cus.cam.ac.uk # # Refsite, Referrer - visitor was previously at this site; this URL # # Searchquery, Searchwords - visitor got here by performing this search # # Browser+sum, os - visitor is using this browser; this operating system # # # # COLS - which colums to display (see below for list of fields) # # CHART - pie chart display on or off. # # SORTBY - how to sort the list (see below for types of sort) # # FLOOR - only list those things above a certain size &c. (see below) # # SUB - some reports have hierarchical things, like .ac.uk a subdomain of .uk # # ARGS - similar to sub: "google?this" is deemed an ARG of google, not a SUB # # LINKINCLUDE - in dir and req reports, should we link to the URLs mentioned? # ############################################################################### # Cols: # R=num of reqs P=num of pages B=num of bytes D=time of last req # r=% of reqs p=% of pages b=% of bytes d=date of last req # S=reqs last 7d Q=pages last 7d C=bytes last 7d E=time of first req # s=% reqs last 7d q=% pages last 7d c=% bytes last 7d e=date of first req # N=index number of item within the list # Sortby: # REQUESTS, PAGES, BYTES - sort by total number of requests, pages or bytes # REQUESTS7, PAGES7, BYTES7 - sort by number in the past seven days # FIRSTDATE, DATE - sort by date of first or last access # ALPHABETICAL, RANDOM - alphatical sort or random sort # Floor: only list things # 10r 10p 10Mb - with at least 10 requests, 10 pages, 10 megabytes # 1%r 1%p 1%b - with at least 1% of tot requests, pages, bytes in the report # 10s 10q 10kc - with at least 10 requests, 10 pages, 10kb in the past 7 days # 1%s 1%p 1%b - with at least 1% of reqs, pages, bytes in the past 7 days # -5r -5s -5p - in the top 5 requests, or requests in past 7 days, or pages # -00-01-00d - with last access within the last month (see FROM/TO docs) # 970701d, 970701e - with last/first access since 1st July 1997 DOMAIN ON DOMCHART ON DOMCOLS PQ DOMSORTBY PAGES DOMFLOOR 0p SUBDOMSORTBY PAGES SUBDOMFLOOR 0.5%p ORGANISATION ON ORGCHART ON ORGCOLS Pb ORGSORTBY PAGES ORGFLOOR -20p SUBORGSORTBY PAGES SUBORG *.ac.uk SUBORG *.co.uk SUBORGFLOOR 0.5%p HOST ON HOSTCHART OFF HOSTCOLS Pb HOSTSORTBY PAGES HOSTFLOOR -50p REFSITE ON REFSITECHART OFF REFSITECOLS PQ REFSITESORTBY PAGES7 REFSITEFLOOR -20q REFDIRSORTBY PAGES7 REFDIRFLOOR 0.5%q REFERRER ON REFCHART OFF REFCOLS PQ REFSORTBY PAGES7 REFLINKINCLUDE * REFFLOOR -30q REFARGSSORTBY PAGES7 REFARGSFLOOR 0.5%q SEARCHWORD ON SEARCHWORDCHART ON SEARCHWORDCOLS PQq SEARCHWORDSORTBY PAGES7 SEARCHWORDFLOOR 0.5%q SEARCHQUERY ON SEARCHQUERYCHART OFF SEARCHQUERYCOLS Q SEARCHQUERYSORTBY PAGES7 SEARCHQUERYFLOOR -200q BROWSERREP OFF BROWREPCHART OFF BROWREPCOLS Rb BROWREPSORTBY REQUESTS BROWREPFLOOR -40r BROWSERSUM ON BROWSUMCHART ON BROWSUMCOLS PQq BROWSUMSORTBY PAGES7 BROWSUMFLOOR -15q SUBBROW */* SUBBROWSORTBY PAGES7 SUBBROWFLOOR -20q OSREP ON OSCHART ON # OSCHARTEXPAND Windows OSCOLS PQq OSSORTBY PAGES7 OSFLOOR 0q SUBOSSORTBY PAGES7 SUBOSFLOOR 0q ############################################################################### # VIEWING REPORTS - WHICH FILES PEOPLE HAVE VIEWED AND DOWNLOADED # # # # Directory - which directories and subdirectories people have viewed # # Request - which particular files have they viewed # # Filetype, Size - which types are viewed most, and their size distribution # # # # COLS, CHART, SORTBY, FLOOR, SUB, ARGS, LINKINCLUDE - as above # # SUBDIR - deem something to be counted as a subdirectory. Can have several. # # REQINCLUDE, REQEXCLUDE - what to include/exclude. These are obeyed in order # # SUBTYPE - list of things that have subtypes, as in file.ps.Z # ############################################################################### DIRECTORY ON DIRCHART OFF DIRCOLS PQc DIRSORTBY PAGES7 SUBDIRSORTBY PAGES7 DIRFLOOR 0q SUBDIRFLOOR 0q SUBDIR /*/*/ REQUEST ON REQCHART OFF REQCOLS RSc REQSORTBY REQUESTS7 REQFLOOR 0.05%s REQARGSSORTBY REQUESTS7 REQARGSFLOOR 0.05%s REQEXCLUDE * REQINCLUDE *.html REQINCLUDE *.htm REQINCLUDE *.zip REQINCLUDE *.gz REQINCLUDE *.Z REQINCLUDE *.pdf REQLINKINCLUDE pages REQLINKINCLUDE *.zip REQLINKINCLUDE *.pdf FILETYPE ON TYPECHART OFF TYPECOLS Rb TYPESORTBY BYTES SUBTYPE *.gz,*.Z SIZE ON SIZECHART OFF SIZECOLS ScR ############################################################################### # SERVICE REPORTS - HOW WELL WE ARE DELIVERING THE PAGES # # # # Status - whether the pages were delivered okay, or failed # # Proctime - time to dispatch files # # Failure - people requests these pages, and it failed # # Failhost, Failref - failures arose from links on these hosts, on these URLs # # Redir - people requested these files but were redirected # # Redirhost, redirref - redirections arose from links on these hosts and URLs # # # # COLS, CHART, SORTBY, FLOOR, SUB, ARGS, LINKINCLUDE - as above # # 304ISSUCCESS - 304 Not Modified means user saw a cached copy: i.e. success! # ############################################################################### STATUS ON STATUSCHART ON STATUSCOLS R STATUSSORTBY ALPHABETICAL STATUSFLOOR 0r 304ISSUCCESS ON PROCTIME OFF PROCTIMECOLS R PROCTIMECHART ON FAILURE ON FAILCHART OFF FAILCOLS RS FAILSORTBY REQUESTS7 FAILFLOOR -30s FAILARGSSORTBY REQUESTS7 FAILARGSFLOOR 10s FAILLINKEXCLUDE * FAILHOST OFF FAILHOSTCHART OFF FAILHOSTCOLS RS FAILHOSTSORTBY REQUESTS7 FAILHOSTFLOOR -20s FAILREF ON FAILREFCHART OFF FAILREFCOLS RS FAILREFSORTBY REQUESTS7 FAILREFFLOOR -30s FAILREFARGSSORTBY REQUESTS7 FAILREFARGSFLOOR 10s FAILREFLINKINCLUDE * REDIR ON REDIRCHART OFF REDIRCOLS SR REDIRSORTBY REQUESTS7 REDIRFLOOR -30s REDIRARGSSORTBY REQUESTS7 REDIRARGSFLOOR 10s REDIRLINKEXCLUDE * REDIRHOST OFF REDIRHOSTCHART OFF REDIRHOSTCOLS SR REDIRHOSTSORTBY REQUESTS7 REDIRHOSTFLOOR -20s REDIRREF ON REDIRREFCHART OFF REDIRREFCOLS RS REDIRREFSORTBY REQUESTS7 REDIRREFFLOOR -30s REDIRREFARGSSORTBY REQUESTS7 REDIRREFARGSFLOOR 10s REDIRREFLINKINCLUDE * ############################################################################### # MISCELLANEOUS REPORTS # # VHost, RedirVHost, FailVHost - for multiple virtual host on a single server # # IntSearchQuery, IntSearchWord - for when a site has its own search engine # # User, RedirUser, FailUser - for authenticated user or cookie analysis # ############################################################################### VHOST OFF VHOSTCHART ON VHOSTCOLS Rb VHOSTFLOOR -20b VHOSTSORTBY BYTES REDIRVHOST OFF REDIRVHOSTCHART ON REDIRVHOSTCOLS R REDIRVHOSTFLOOR -20r REDIRVHOSTSORTBY REQUESTS FAILVHOST OFF FAILVHOSTCOLS R FAILVHOSTCHART ON FAILVHOSTFLOOR -20r FAILVHOSTSORTBY REQUESTS INTSEARCHQUERY OFF INTSEARCHQUERYCOLS R INTSEARCHQUERYCHART ON INTSEARCHQUERYFLOOR -30r INTSEARCHQUERYSORTBY REQUESTS INTSEARCHWORD OFF INTSEARCHWORDCOLS R INTSEARCHWORDCHART ON INTSEARCHWORDFLOOR -30r INTSEARCHWORDSORTBY REQUESTS USER OFF USERCOLS Rb USERCHART ON USERSORTBY REQUESTS USERFLOOR -50r REDIRUSER OFF REDIRUSERCOLS R REDIRUSERCHART ON REDIRUSERSORTBY REQUESTS REDIRUSERFLOOR -20r FAILUSER OFF FAILUSERCOLS R FAILUSERCHART ON FAILUSERSORTBY REQUESTS FAILUSERFLOOR -20r ############################################################################### # MISCELLANEOUS TECHNICAL INTERNAL STUFF # ############################################################################### TYPEALIAS .html ".html [Hypertext Markup Language]" TYPEALIAS .htm ".htm [Hypertext Markup Language]" TYPEALIAS .shtml ".shtml [Server-parsed HTML]" TYPEALIAS .ps ".ps [PostScript]" TYPEALIAS .gz ".gz [Gzip compressed files]" TYPEALIAS .tar.gz ".tar.gz [Compressed archives]" TYPEALIAS .jpg ".jpg [JPEG graphics]" TYPEALIAS .jpeg ".jpeg [JPEG graphics]" TYPEALIAS .gif ".gif [GIF graphics]" TYPEALIAS .png ".png [PNG graphics]" TYPEALIAS .txt ".txt [Plain text]" TYPEALIAS .cgi ".cgi [CGI scripts]" TYPEALIAS .pl ".pl [Perl scripts]" TYPEALIAS .css ".css [Cascading Style Sheets]" TYPEALIAS .class ".class [Java class files]" TYPEALIAS .pdf ".pdf [Adobe Portable Document Format]" TYPEALIAS .zip ".zip [Zip archives]" TYPEALIAS .hqx ".hqx [Macintosh BinHex files]" TYPEALIAS .exe ".exe [Executables]" TYPEALIAS .wav ".wav [WAV sound files]" TYPEALIAS .avi ".avi [AVI movies]" TYPEALIAS .arc ".arc [Compressed archives]" TYPEALIAS .mid ".mid [MIDI sound files]" TYPEALIAS .mp3 ".mp3 [MP3 sound files]" TYPEALIAS .doc ".doc [Microsoft Word document]" TYPEALIAS .rtf ".rtf [Rich Text Format]" TYPEALIAS .mov ".mov [Quick Time movie]" TYPEALIAS .mpg ".mpg [MPEG movie]" TYPEALIAS .mpeg ".mpeg [MPEG movie]" TYPEALIAS .asp ".asp [Active Server Pages]" TYPEALIAS .jsp ".jsp [Java Server Pages]" TYPEALIAS .cfm ".cfm [Cold Fusion]" TYPEALIAS .php ".php [PHP]" TYPEALIAS .js ".js [JavaScript code]" ROBOTINCLUDE REGEXPI:robot ROBOTINCLUDE REGEXPI:spider ROBOTINCLUDE REGEXPI:crawler ROBOTINCLUDE Googlebot* ROBOTINCLUDE msnbot* ROBOTINCLUDE Infoseek* ROBOTINCLUDE Scooter* ROBOTINCLUDE *Slurp* ROBOTINCLUDE *Validator* ROBOTINCLUDE Ultraseek* # More SEARCHENGINE commands can be found at # http://www.analog.cx/helpers/#conffiles SEARCHENGINE http://*google.*/* q,as_q,as_epq,as_oq SEARCHENGINE http://*altavista.*/* q SEARCHENGINE http://*yahoo.*/* p SEARCHENGINE http://*lycos.*/* query,wfq SEARCHENGINE http://*aol.*/* query SEARCHENGINE http://*excite.*/* search SEARCHENGINE http://*go2net.*/* general SEARCHENGINE http://*metacrawler.*/* general SEARCHENGINE http://*msn.*/* q,MT SEARCHENGINE http://*netscape.*/* search SEARCHENGINE http://*looksmart.*/* key SEARCHENGINE http://*webcrawler.*/* qkw,search,searchText SEARCHENGINE http://*overture.*/* Keywords SEARCHENGINE http://*teoma.*/* q SEARCHENGINE http://*infospace.*/* qkw SEARCHENGINE http://*alltheweb.*/* q SEARCHENGINE http://*dogpile.*/* q SEARCHENGINE http://*ask.*/* q,ask SEARCHENGINE http://*alltheweb.*/* query SEARCHENGINE http://*northernlight.*/* qr SEARCHENGINE http://*nlsearch.*/* qr SEARCHENGINE http://*dmoz.*/* search SEARCHENGINE http://*/netfind* query SEARCHENGINE http://*/pursuit query ############################################################################### # SOME DEBUG SETTINGS # ############################################################################### SETTINGS OFF DEBUG OFF WARNINGS ON PROGRESSFREQ 50000 ERRLINELENGTH 78 # ERRFILE somefile FILELOWMEM 0 HOSTLOWMEM 0 BROWLOWMEM 0 REFLOWMEM 0 USERLOWMEM 0 VHOSTLOWMEM 0 analog-6.0/examples/misclogs.cfg0000644000175000017500000001736410161303533017063 0ustar sret1sret100000000000000From: Garrett Bartley To: analog-help@lists.isite.net Date: Fri, 1 Nov 2002 13:50:46 -0500 Subject: [analog-help] Log formats for several log types As promised, here are the log formats for several different server services that I have successfully created with good results. I can make no guarantee on any of these, but I can say that they have worked for me. Please feel free to offer any corrections or improvements. ============================================================================= Microsoft FTP Server Sample log file line: 2002-10-31 15:33:33 207.32.96.139 user MSFTPSVC2 Server1 192.168.1.100 21 [2855]created filename.ext - 226 0 165340 1468 FTP - - - - Log format: LOGFORMAT "%Y-%m-%d %h:%n:%j %s %u %j %j %j [%j]%j %r - %C %b %b %t FTP - - - -" Notes: This is with all logging turned on except for the Win32 status. ============================================================================= Real Media Server Sample log file line: 12.216.124.30 - - [31/Oct/2002:22:45:26 -0500] "GET dir/091202v1.rm RTSP/1.0" 200 23306141 [WinNT_5.0_6.0.9.380_play32_AOL8_en-US_UNK_axembed] [abc4fd5b-8b09-456b-9cdf-3e7fea4b705d] [Stat1: 8028 18 0 0 0 64_Kb ps_Stereo_Music_-_RA8][Stat2: 64083 65987 0 0 0 18 18 0 0 0 50 64_Kbps_Stereo_Music_-_RA8] 77700425 1595 905 123 0 8581 Log format: LOGFORMAT "%s %j %j [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b [%B] %j" Notes: This ignores the extra statistics at the end and just reports the basics. ============================================================================= Serv-U FTP Server Sample log file line: [3] Tue 14May02 16:56:25 - (000037) Error sending file f:\filename.ext, aborting (3.09 Kb/sec - 487424 bytes, client closed data connection) [4] Tue 30Apr02 14:52:54 - (000257) Received file f:\filename.ext successfully (29 .2 Kb/sec - 5651 bytes) [3] Wed 01May02 23:18:53 - (000002) Sent file f:\filename.ext successfully (92.2 Kb/sec - 6893 bytes) [5] Tue 30Apr02 10:29:18 - (000245) Connected to 216.136.171.204 (Local address 192.168.1.101) Log format(s): LOGFORMAT "[%j] %j %d%M%y %h:%n:%j - (%j) Error sending file %r, aborting (%j Kb/sec - %b bytes, %j %j)" LOGFORMAT "[%j] %j %d%M%y %h:%n:%j - (%j) Received file %r successfully (%j Kb/sec - %b bytes)" LOGFORMAT "[%j] %j %d%M%y %h:%n:%j - (%j) Sent file %r successfully (%j Kb/sec - %b bytes)" LOGFORMAT "[%j] %j %d%M%y %h:%n:%j - (%j) Connected to %s (Local address 192.168.1.101)" ============================================================================= Shoutcast (Old style logging) Sample log file lines: <08/18/02@04:25:49> [SHOUTcast] DNAS/win32 v1.8.0 (Jan 2 2001) starting up... <08/18/02@04:25:49> [main] loaded config from C:\Program Files\SHOUTcast2\sc_serv_gui.ini <08/18/02@04:25:49> [main] initializing (usermax:200 portbase:9191)... <08/18/02@04:25:49> [main] No ban file found (sc_serv.ban) <08/18/02@04:25:49> [main] No rip file found (sc_serv.rip) <08/18/02@04:25:49> [main] opening source socket <08/18/02@04:25:49> [main] source thread starting <08/18/02@04:25:49> [main] opening client socket <08/18/02@04:25:49> [source] listening for connection on port 9192 <08/18/02@04:25:49> [main] Client Stream thread [0] starting <08/18/02@04:25:49> [main] client main thread starting <08/18/02@04:25:49> [dest: 216.253.39.2] server unavailable, disconnecting <08/18/02@04:25:58> [source] connected from 66.192.5.158 <08/18/02@04:25:58> [source] icy-name:NEWSRADIO 640 WGST (rush dr. laura kimmer) ; icy-genre:NEWS TALK <08/18/02@04:25:58> [source] icy-pub:1 ; icy-br:24 ; icy-url:http://www.wgst.com <08/18/02@04:25:58> [source] icy-irc:#shoutcast ; icy-icq:0 ; icy-aim:N/A <08/18/02@04:25:59> [dest: 205.188.234.42] starting stream (UID: 0)[L: 1] <08/18/02@04:25:59> [dest: 205.188.234.42] connection closed (0 seconds) (UID: 0)[L: 0]{Bytes: 16384} <08/18/02@04:26:00> [yp_add] yp.shoutcast.com added me successfully <08/18/02@04:28:59> [yp_tch] yp.shoutcast.com touched! <09/11/02@12:08:25> [dest: 63.236.253.100] service full, disconnecting Log format(s): LOGFORMAT "<%m/%d/%y@%h:%n:%j> [dest: %s] connection closed (%t seconds) (UID: %u)[L: %r]{Bytes: %b} LOGFORMAT "<%m/%d/%y@%h:%n:%j> [dest: %s] starting stream (UID: %j)[L: %j] LOGFORMAT "<%m/%d/%y@%h:%n:%j> [yp_tch] yp.shoutcast.com touched! LOGFORMAT "<%m/%d/%y@%h:%n:%j> [dest: %s] service full, disconnecting LOGFORMAT "<%m/%d/%y@%h:%n:%j> [SHOUTcast] DNAS/win32 v1.8.0 (Jan 2 2001) starting up... LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] loaded config from C:\Program Files\%j\sc_serv_gui.ini LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] initializing (usermax:%j portbase:%j)... LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] No ban file found (sc_serv.ban) LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] No rip file found (sc_serv.rip) LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] opening source socket LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] source thread starting LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] opening client socket LOGFORMAT "<%m/%d/%y@%h:%n:%j> [source] listening for connection on port %j LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] Client Stream thread [%j] starting LOGFORMAT "<%m/%d/%y@%h:%n:%j> [main] client main thread starting LOGFORMAT "<%m/%d/%y@%h:%n:%j> [dest: %s] server unavailable, disconnecting LOGFORMAT "<%m/%d/%y@%h:%n:%j> [source] connected from %j LOGFORMAT "<%m/%d/%y@%h:%n:%j> [source] icy-name:NEWSRADIO 640 WGST (rush dr. laura kimmer) ; icy-genre:NEWS TALK LOGFORMAT "<%m/%d/%y@%h:%n:%j> [source] icy-pub:1 ; icy-br:24 ; icy-url:http://www.wgst.com LOGFORMAT "<%m/%d/%y@%h:%n:%j> [source] icy-irc:#shoutcast ; icy-icq:0 ; icy-aim:N/A <%m/%d/%y@%h:%n:%j> [yp_add] yp.shoutcast.com added me successfully ============================================================================= Shoutcast (New W3C style logging) Sample log file lines: #Fields: c-ip c-dns date time cs-uri-stem c-status cs(User-Agent) sc-bytes x-duration avgbandwidth 66.156.94.18 66.156.94.18 2002-09-14 22:38:34 /stream?title=Unknown 200 iTunes%2F3%2E0%20%28Macintosh%3B%20N%3B%20PPC%29 409600 86 38096 Log format(s): LOGFORMAT "%s %S %Y-%m-%d %h:%n:%j %r %c %u %b %j %j" ============================================================================= Microsoft Windows Media Sample log file lines: #Fields: c-ip date time c-dns cs-uri-stem c-starttime x-duration c-rate c-status c-playerid c-playerversion c-playerlanguage cs(User-Agent) cs(Referer) c-hostexe c-hostexever c-os c-osversion c-cpu filelength filesize avgbandwidth protocol transport audiocodec videocodec channelURL sc-bytes c-bytes s-pkts-sent c-pkts-received c-pkts-lost-client c-pkts-lost-net c-pkts-lost-cont-net c-resendreqs c-pkts-recovered-ECC c-pkts-recovered-resent c-buffercount c-totalbuffertime c-quality s-ip s-dns s-totalclients s-cpu-util 203.40.128.205 2002-11-01 05:23:33 vincet mms://media.streamtoyou.com/cog/ISDN/OT_les06.asf 166 6 1 200 {CD48B822-BB6E-11D6-A01B-DD746EAE8C33} 6.4.7.1119 en-AU Mozilla/4.0_(compatible;_MSIE_6.0;_Windows_98;_YComp_5.0.0.0) http://www.ministerialtraining.org/VideoView.asp?ID=1&U=8&L=6&V=6&S=100 IEXPLORE.EXE 6.0.2600.0 Windows_98 4.10.0.2222 Pentium 1805 23113117 10638 mms UDP Windows_Media_Audio_V2 Microsoft_MPEG-4_Video_Codec_V3 - 15237 0 52 37 0 0 0 0 0 0 1 0 100 65.172.162.91 - 1 0 Log format(s): LOGFORMAT (#%j: %j) LOGFORMAT (%s%w%Y-%m-%d%w%h:%n:%j%w%S%w%r%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%B%w%f%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%b%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%j%w%v%w%j%w%j) Notes: This is with all logging turned on except for the Win32 status. ============================================================================= Microsoft SMTP Note: Analog detects the log format automagically since it is very similar to IIS W3C logging. ============================================================================= analog-6.0/examples/robotinc.cfg0000644000175000017500000000034610161303533017052 0ustar sret1sret100000000000000# Jeremy Wadsack maintains a comprehensive list of ROBOTINCLUDE commands. # I don't distribute it because it's constantly being updated. # You can get the latest version from # http://www.analog.cx/helpers/index.html#conffiles analog-6.0/examples/searchen.cfg0000644000175000017500000000035010161303533017016 0ustar sret1sret100000000000000# Israel Hanukoglu maintains a comprehensive list of SEARCHENGINE commands. # I don't distribute it because it's constantly being updated. # You can get the latest version from # http://www.analog.cx/helpers/index.html#conffiles analog-6.0/examples/statslab.cfg0000644000175000017500000000363010161303533017047 0ustar sret1sret100000000000000# This is my personal configuration file, used to make # http://www.statslab.cam.ac.uk/~sret1/stats/stats.html # This is run IN ADDITION to the default analog.cfg distributed with # the program. It contains some commands specific to our site, so it # is NOT SUITABLE for running at your site without editing it first. # HOSTNAME "**SAMPLE** the Statistical Laboratory **SAMPLE**" HOSTURL http://www.statslab.cam.ac.uk/ HOSTLOWMEM 3 REFLOWMEM 3 WARNINGS -L IMAGEDIR /~sret1/images/ STYLESHEET /~sret1/analog/analog.css REPSEPCHAR , TO -00-00-01 SUBDOMAIN *.* DOMEXCLUDE 1*,2* SUBDOMAIN statslab.cam.ac.uk (Statistical Laboratory) SUBDOMAIN ac.uk (UK Academic) SUBDOMAIN cam.ac.uk (University of Cambridge) SUBDOMAIN co.uk (UK Commercial) SUBORG statslab.cam.ac.uk REFREPEXCLUDE http://*.statslab.cam.ac.uk/* REFREPEXCLUDE http://131.111.20.59/* REFREPEXCLUDE javascript:* FILEALIAS /~sret1/backgammon/main.html /~sret1/backgammon/ FILEALIAS /~sret1/home.html /~sret1/ PAGEINCLUDE *.html.gz,*.txt,/cgi-bin/* REQINCLUDE pages,*.ps,*.ps.gz,*.ps.Z REQLINKEXCLUDE /cgi-bin/* ARGSEXCLUDE * REPORTSPAN ON REPORTSPANTHRESHOLD 100000 SIZECOLS Rrb DAYSUMCOLS P HOURSUMCOLS P ORGFLOOR -25p ORGSORTBY PAGES SUBORGFLOOR -25p SUBORGSORTBY PAGES ORGCOLS RPB BROWSERSUM OFF BROWSERREP OFF REFERRER OFF REFSITE OFF SEARCHWORD ON SEARCHQUERY OFF ORGCHART OFF SIZECHART OFF REQCHART OFF SEARCHWORDCHART OFF MONTHGRAPH P MONTHCOLS RPB DIRCOLS Pb REQFLOOR 2000r TYPEALIAS .html.gz ".html.gz [Gzipped HTML]" TYPEALIAS .ps.gz ".ps.gz [Gzipped PostScript]" TYPEALIAS .xbm ".xbm [X bitmap]" TYPEALIAS .c ".c [C programs]" TYPEALIAS .bib ".bib [BibTeX databases]" TYPEALIAS .ppt ".ppt [PowerPoint presentations]" TYPEALIAS .jar ".jar [Java archives]" # # By Stephen Turner 17/Feb/2001, 17/Jan/2002. No warranty for this file. # This file is given into the public domain: it may be used, modified and # redistributed without restriction. analog-6.0/examples/typealias.cfg0000644000175000017500000000033110161303533017220 0ustar sret1sret100000000000000# Rene Krauss maintains a longer list of TYPEALIAS commands. # I don't distribute it because it's constantly being updated. # You can get the latest version from # http://www.analog.cx/helpers/index.html#conffiles analog-6.0/examples/virtdoms.cfg0000644000175000017500000000415710161303533017106 0ustar sret1sret100000000000000# THIS CONFIGURATION FILE IS NOT READY TO USE WITHOUT EDITING! # USE ONLY THE FIRST OR THE SECOND HALF OF THIS FILE! # # There are basically two ways to set up your web server if you are serving # lots of virtual domains. The first, which is usually better if you don't # have many virtual domains, is to log them all to different logfiles. This # method is covered pretty thoroughly in one of the How-To documents, but here # is a summary. # # It's easy to analyse each single domain independently, by just specifying # its logfile. If you want to analyse all the domains together, you will need # commands like LOGFILE domain1.log http://www.domain1.com LOGFILE domain2.log http://www.domain2.com # This will add the prefix for that domain to the filenames in that logfile, # so that the same filename in two domains doesn't get confused. The command SUBDIR http://*/ # or SUBDIR http://*/* # is useful make the Directory Report look better. # # The second way to set up your server is to log all the domains to one # logfile. If you do this, you have to log the virtual domain name on each # line so that you know which domain that line belongs to. You will then # probably need a LOGFORMAT command. For example, if you log the virtual # domain at the beginning of the line, which is otherwise in combined format, # you would want a LOGFORMAT command like LOGFORMAT (%v %S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%wHTTP%j" %c %b "%f" "%B") # You still need to add the prefix for the domain to each filename, and you # can do this by a LOGFILE command like LOGFILE alldomains.log http://www.%v.com # Then you can go ahead and analyse the whole site. As above, you will want # the command SUBDIR http://*/ # or SUBDIR http://*/* # If you want to analyse just one of the domains, say domain1, you need the # command VHOSTINCLUDE domain1 # Alternatively, if you often want to analyse just one of the domains, first # split the logfile into pieces corresponding to each virtual domain. This # avoids the need to pass through the whole logfile each time. # # By Stephen Turner 1999-2001. No warranty for this file. # May be used and redistributed without restriction. analog-6.0/examples/xferlog.cfg0000644000175000017500000000106510161303533016700 0ustar sret1sret100000000000000# Here are a couple of LOGFORMAT lines to analyse the xferlog produced by # wu-ftpd and other FTP servers. This only analyses outgoing files. # You may also want to edit the language file a little to make it more # FTP-friendly: e.g. change "WWW Server Statistics" to "FTP Server Statistics" LOGFORMAT (%j %M %d %h:%n:%j %Y %t %S %b %r %j %j o %j %u ftp %j %j) LOGFORMAT (%j %j %j %j %j %j %j %j %j %j %j i%j) LOGFILE [your logfile here] # LANGFILE ftp.lng # # By Stephen Turner 1999. No warranty for this file. # May be used and redistributed without restriction. analog-6.0/images/0000755000175000017500000000000010161303537014202 5ustar sret1sret100000000000000analog-6.0/images/analogo.gif0000644000175000017500000000106710161303533016311 0ustar sret1sret100000000000000GIF89a66ٿ!,66X0JԼ82`p'YzEp,` `/E. P $SR}l(# 9}q7ڸ<.پ["HExvhv@z#QaVFCYwhxAPUaS}Qk7OTc>xu7]<}Gsi:cB~LYwn|lmSƙ䘼GMpLjޟռ⍚ߠSjCl%TK>wE'f\#aH(aPuuGkk%!E&*&+`9Up R8wShsKd ;^]*YjLb(m`vآM"B+n@9i1RUc )LW}sv.}(Wy"OH [g_О':ߧ.vXm{Ц7hR ~Lg'L2RMZwUwO7Tx@Ͼ{$FO</;analog-6.0/images/analogo.png0000644000175000017500000000101410161303534016321 0ustar sret1sret100000000000000PNG  IHDR66~kwPLTEtRNS@ftEXtSoftwaregif2png 2.3.2QIDATx}A E- # $_eMԧ̧ju.Zfue&-ϵiIy+;iu\ύV<=OU&|6ƥ{?O ytQs#!)陓$zS2f9~>e)?{ӣt6e=:,"tYb02rB&HJ\%IJ:kyƗ#FnG8sS_voݺ?~# 4)AͲIENDB`analog-6.0/images/bara1.gif0000644000175000017500000000004710161303534015655 0ustar sret1sret100000000000000GIF87a33,};analog-6.0/images/bara1.png0000644000175000017500000000016510161303534015675 0ustar sret1sret100000000000000PNG  IHDRMPLTE33"ÀtEXtSoftwaregif2png 2.4.2^G IDATxc`@ 3%IENDB`analog-6.0/images/bara16.gif0000644000175000017500000000007310161303534015742 0ustar sret1sret100000000000000GIF89a33,ڋ޼H扦W;analog-6.0/images/bara16.png0000644000175000017500000000016610161303534015764 0ustar sret1sret100000000000000PNG  IHDR1MPLTE33"ÀtEXtSoftwaregif2png 2.4.2^G IDATxc`fIENDB`analog-6.0/images/bara2.gif0000644000175000017500000000005110161303534015651 0ustar sret1sret100000000000000GIF87a33,c*;analog-6.0/images/bara2.png0000644000175000017500000000016510161303534015676 0ustar sret1sret100000000000000PNG  IHDR𲌤PLTE33"ÀtEXtSoftwaregif2png 2.4.2^G IDATxc`@UIENDB`analog-6.0/images/bara32.gif0000644000175000017500000000010710161303534015736 0ustar sret1sret100000000000000GIF87a33,&ڋ޼H扦ʶ L];analog-6.0/images/bara32.png0000644000175000017500000000016610161303534015762 0ustar sret1sret100000000000000PNG  IHDRҌPLTE33"ÀtEXtSoftwaregif2png 2.4.2^G IDATxc`JIENDB`analog-6.0/images/bara4.gif0000644000175000017500000000005510161303534015657 0ustar sret1sret100000000000000GIF87a 33,  k ;analog-6.0/images/bara4.png0000644000175000017500000000016510161303534015700 0ustar sret1sret100000000000000PNG  IHDR APLTE33"ÀtEXtSoftwaregif2png 2.4.2^G IDATxc`eYqIENDB`analog-6.0/images/bara8.gif0000644000175000017500000000006210161303534015661 0ustar sret1sret100000000000000GIF87a@33,@ڋ޼;analog-6.0/images/bara8.png0000644000175000017500000000016610161303534015705 0ustar sret1sret100000000000000PNG  IHDR@I PLTE33"ÀtEXtSoftwaregif2png 2.4.2^G IDATxc` 6jIENDB`analog-6.0/images/barb1.gif0000644000175000017500000000010310161303534015647 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,N)譋^;analog-6.0/images/barb1.png0000644000175000017500000000022510161303534015673 0ustar sret1sret100000000000000PNG  IHDR +PLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^GIDATxc`A `Pc `pP $[.IENDB`analog-6.0/images/barb16.gif0000644000175000017500000000017610161303534015747 0ustar sret1sret100000000000000GIF89axxXXFF3300&&,K0I0ͻ`(dilp,tm|pH,@rl:ШtJZЂvzxL.;analog-6.0/images/barb16.png0000644000175000017500000000022710161303534015763 0ustar sret1sret100000000000000PNG  IHDR=PLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^GIDATxc`R(  C(?KfIENDB`analog-6.0/images/barb2.gif0000644000175000017500000000011410161303534015652 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,08!dIhE;analog-6.0/images/barb2.png0000644000175000017500000000022510161303534015674 0ustar sret1sret100000000000000PNG  IHDR8RPLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^GIDATxc`A(`Pc(`pP(:IENDB`analog-6.0/images/barb32.gif0000644000175000017500000000024510161303534015742 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,r0I8ͻ_A(dihlp,t- x|pH,Ȥr ШtJZجvzx %zn|N\~ ;analog-6.0/images/barb32.png0000644000175000017500000000023010161303534015753 0ustar sret1sret100000000000000PNG  IHDRr]PLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^GIDATxc`h 8Ai  ӡIENDB`analog-6.0/images/barb4.gif0000644000175000017500000000012510161303534015656 0ustar sret1sret100000000000000GIF87a xxXXFF3300&&, ",ITͻ di$ll!tmt;analog-6.0/images/barb4.png0000644000175000017500000000022510161303534015676 0ustar sret1sret100000000000000PNG  IHDR PPLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^GIDATxc`@hA 04-+|IENDB`analog-6.0/images/barb8.gif0000644000175000017500000000014410161303534015663 0ustar sret1sret100000000000000GIF87a@xxXXFF3300&&,@108;`(di9lp,2ax|pH,$2;analog-6.0/images/barb8.png0000644000175000017500000000022610161303534015703 0ustar sret1sret100000000000000PNG  IHDR@FPLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^GIDATxc`  %`p!B IENDB`analog-6.0/images/barc1.gif0000644000175000017500000000010410161303534015651 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,P0:A8;»+`X$;analog-6.0/images/barc1.png0000644000175000017500000000023710161303534015677 0ustar sret1sret100000000000000PNG  IHDR +PLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^G&IDATxc````e`e`RRRe`666e`qqqe` Z IENDB`analog-6.0/images/barc16.gif0000644000175000017500000000032610161303534015745 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,P59e|eH֍z.ʬo3_6͗ Ȥ#<2g9m>Nj*"_/ w#w=ou[|wyxz ° ;analog-6.0/images/barc16.png0000644000175000017500000000025110161303534015761 0ustar sret1sret100000000000000PNG  IHDR=PLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^G0IDATxc````3 RT) Ʀ`WJ0khh(%?1)- IENDB`analog-6.0/images/barc2.gif0000644000175000017500000000012010161303534015650 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,P.t"k`CN-&;analog-6.0/images/barc2.png0000644000175000017500000000024710161303534015701 0ustar sret1sret100000000000000PNG  IHDR8RPLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^G.IDATxc````cFAAQf`RRRafccSf`qqqaPf*7IENDB`analog-6.0/images/barc32.gif0000644000175000017500000000047610161303534015751 0ustar sret1sret100000000000000GIF87axxXXFF3300&&,P59e|eH֍)j&+x_7>b(\O'6Ҫ6z`Wf*#w=ou[|wyxz~|Ʒ _~ hpa}"tH`ņ3b8 QcG = qa;analog-6.0/images/barc32.png0000644000175000017500000000025210161303534015760 0ustar sret1sret100000000000000PNG  IHDRr]PLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^G1IDATxc````P(((:IIIu 1@bׁ 9carIENDB`analog-6.0/images/barc4.gif0000644000175000017500000000014610161303534015662 0ustar sret1sret100000000000000GIF87a xxXXFF3300&&, 3P59bm (&JC:L;Dz]@,#RYL;analog-6.0/images/barc4.png0000644000175000017500000000024710161303534015703 0ustar sret1sret100000000000000PNG  IHDR PPLTExxXXFF3300&&m|tEXtSoftwaregif2png 2.4.2^G.IDATxc````EȘIII30"cWd mLPIENDB`analog-6.0/images/barc8.gif0000644000175000017500000000022110161303534015660 0ustar sret1sret100000000000000GIF87a@xxXXFF3300&&,@^P59e|evbI LǶP9#$Oett2vr^B7 tIENDB`analog-6.0/images/barf32.gif0000644000175000017500000000026510161303534015750 0ustar sret1sret100000000000000GIF87a33[,o܁K&,ry8y[I]΄5͘C=GҺ6On;W'WrּEw_v=iƿMr77XW(x$wȘ(HW9yJ:*JEzj jY JT;analog-6.0/images/barf32.png0000644000175000017500000000017410161303535015767 0ustar sret1sret100000000000000PNG  IHDRҌPLTE33[]tEXtSoftwaregif2png 2.4.2^GIDATxc`O_D2]IENDB`analog-6.0/images/barf4.gif0000644000175000017500000000007210161303535015664 0ustar sret1sret100000000000000GIF87a 33[, o܁K&,ry8yP;analog-6.0/images/barf4.png0000644000175000017500000000017310161303535015705 0ustar sret1sret100000000000000PNG  IHDR APLTE33[]tEXtSoftwaregif2png 2.4.2^GIDATxc`p IENDB`analog-6.0/images/barf8.gif0000644000175000017500000000011410161303535015665 0ustar sret1sret100000000000000GIF87a@33[,@+o܁K&,ry8y[I]* ;analog-6.0/images/barf8.png0000644000175000017500000000017310161303535015711 0ustar sret1sret100000000000000PNG  IHDR@I PLTE33[]tEXtSoftwaregif2png 2.4.2^GIDATxc`0y&4IENDB`analog-6.0/images/barg1.gif0000644000175000017500000000013510161303535015662 0ustar sret1sret100000000000000GIF87axxFXX0FF j33[00P&&Bf,)譍"bf;analog-6.0/images/barg1.png0000644000175000017500000000024410161303535015702 0ustar sret1sret100000000000000PNG  IHDR +!PLTExxXXFF3300&&uL/tEXtSoftwaregif2png 2.4.2^GIDATxc`% `p4 `U@I*?cY08΃t*BT;Fx,Nf2VgwP~|~w{y ;analog-6.0/images/barg8.png0000644000175000017500000000030010161303535015702 0ustar sret1sret100000000000000PNG  IHDR@F$PLTExxFXX0FF j33[00P&&Bf9R tEXtSoftwaregif2png 2.4.2^G5IDATxu UH!RH!RH!ZπUMiL-:Js}F!cXIENDB`analog-6.0/images/barh1.gif0000644000175000017500000000013610161303535015664 0ustar sret1sret100000000000000GIF87axxFXX0FF j33[00P&&Bf, 8[»5`h!di)hD;analog-6.0/images/barh1.png0000644000175000017500000000025610161303535015706 0ustar sret1sret100000000000000PNG  IHDR +!PLTExxXXFF3300&&uL/tEXtSoftwaregif2png 2.4.2^G&IDATxc```b`RRb`qqb`KKbbZj7n7EEIENDB`analog-6.0/images/barh16.gif0000644000175000017500000000043710161303535015756 0ustar sret1sret100000000000000GIF87axxFXX0FF j33[00P&&Bf, T8,:mW}8!})fmGjmB[CD.@,BfSm : థ@.o@ @ _u'qrmtjq  ·ĻȳƸù  ;analog-6.0/images/barh16.png0000644000175000017500000000032510161303535015771 0ustar sret1sret100000000000000PNG  IHDR=$PLTExxFXX0FF j33[00P&&Bf9R tEXtSoftwaregif2png 2.4.2^GJIDATxc```&fRR66&f`qq &f`KK//&f蒜9s64תUwM. Np!nn!=IENDB`analog-6.0/images/barh2.gif0000644000175000017500000000016210161303535015664 0ustar sret1sret100000000000000GIF87axxFXX0FF j33[00P&&Bf,' T8, C(nDiZEnFZG,oHm[IoJ[p;analog-6.0/images/barh2.png0000644000175000017500000000031210161303535015700 0ustar sret1sret100000000000000PNG  IHDR8R$PLTExxFXX0FF j33[00P&&Bf9R tEXtSoftwaregif2png 2.4.2^G?IDATxc```f`RR66f`qq f`KK//f蒜9s6תUw ;?IENDB`analog-6.0/images/barh32.gif0000644000175000017500000000067710161303535015762 0ustar sret1sret100000000000000GIF87axxFXX0FF j33[00P&&Bf, T8,:mW}8!})fmGjŒ]:ϸ$QlZ D*yLjefzu3=Gwlrt|~ginµſǨsGo="L-$HqĈ(VpDu ,vQE;"@9$F!9ҥG%eęr&L+y&ћ?MeLPZX@Q5XZԭWjXe6+ذf߶ׯdօV^b;;analog-6.0/images/barh32.png0000644000175000017500000000032610161303535015770 0ustar sret1sret100000000000000PNG  IHDRr]$PLTExxFXX0FF j33[00P&&Bf9R tEXtSoftwaregif2png 2.4.2^GKIDATxc```0IIIKzh/聢Ҳ˫f蒜9s@ \V޽{@DAbg@IENDB`analog-6.0/images/barh4.gif0000644000175000017500000000022010161303536015662 0ustar sret1sret100000000000000GIF87a xxFXX0FF j33[00P&&Bf, E T8,:m `(plt\ӛpClZ|FvkYxYVF;analog-6.0/images/barh4.png0000644000175000017500000000032310161303536015705 0ustar sret1sret100000000000000PNG  IHDR P$PLTExxFXX0FF j33[00P&&Bf9R tEXtSoftwaregif2png 2.4.2^GHIDATxc```LJJZ0K444F3eWh.ə3ghUVI޽F IENDB`analog-6.0/images/barh8.gif0000644000175000017500000000030210161303536015667 0ustar sret1sret100000000000000GIF87a@xxFXX0FF j33[00P&&Bf,@w T8,:mW}8骶t}AmR(7ax& Df27rz,d6@.%Ao@#{ w~{  ;analog-6.0/images/barh8.png0000644000175000017500000000032410161303536015712 0ustar sret1sret100000000000000PNG  IHDR@F$PLTExxFXX0FF j33[00P&&Bf9R tEXtSoftwaregif2png 2.4.2^GIIDATxc```I3))i [X\\DCCq liiYոh.ə3gVZ%{n\4ZX8IENDB`analog-6.0/images/bari1.gif0000644000175000017500000000010410161303536015661 0ustar sret1sret100000000000000GIF87a33XXxxЉ&&,N)R#`&;analog-6.0/images/bari1.png0000644000175000017500000000022210161303536015701 0ustar sret1sret100000000000000PNG  IHDR6!PLTE33XXxxЉ&&xytEXtSoftwaregif2png 2.4.2^GIDATxc`A `Pc b`8uJ }IENDB`analog-6.0/images/bari16.gif0000644000175000017500000000020310161303536015747 0ustar sret1sret100000000000000GIF87a33XXxxЉ&&,P0I0ͻ`(dilp,tm|pH,@rl:tJF1جvxL.z.';analog-6.0/images/bari16.png0000644000175000017500000000022610161303536015773 0ustar sret1sret100000000000000PNG  IHDRMPLTE33XXxxЉ&&xytEXtSoftwaregif2png 2.4.2^G IDATxc`R( ]@qP \(K7A-DIENDB`analog-6.0/images/bari2.gif0000644000175000017500000000011610161303536015665 0ustar sret1sret100000000000000GIF87a33XXxxЉ&&,08&^T9Bl ;analog-6.0/images/bari2.png0000644000175000017500000000022310161303536015703 0ustar sret1sret100000000000000PNG  IHDRXbPLTE33XXxxЉ&&xytEXtSoftwaregif2png 2.4.2^GIDATxc`A(`Pc(@ |UIENDB`analog-6.0/images/bari32.gif0000644000175000017500000000025410161303536015753 0ustar sret1sret100000000000000GIF87a33XXxxЉ&&,y0I8ͻ_A(dihlp,t- x|pH,Ȥr ШtJZجvzx mznm|N﬏~ ;analog-6.0/images/bari32.png0000644000175000017500000000023110161303536015765 0ustar sret1sret100000000000000PNG  IHDRx<PLTE33XXxxЉ&&xytEXtSoftwaregif2png 2.4.2^G#IDATxc`h 8AiO\nJ IENDB`analog-6.0/images/bari4.gif0000644000175000017500000000013010161303536015663 0ustar sret1sret100000000000000GIF87a 33XXxxЉ&&, %,ITͻ di$$ axx;analog-6.0/images/bari4.png0000644000175000017500000000022410161303536015706 0ustar sret1sret100000000000000PNG  IHDR jPLTE33XXxxЉ&&xytEXtSoftwaregif2png 2.4.2^GIDATxc`@hA 0Lf`4] [%IENDB`analog-6.0/images/bari8.gif0000644000175000017500000000014710161303536015677 0ustar sret1sret100000000000000GIF87a@33XXxxЉ&&,@408;`(di9lp,rj8|OPH(Ȥrl2;analog-6.0/images/bari8.png0000644000175000017500000000022510161303536015713 0ustar sret1sret100000000000000PNG  IHDR@LPLTE33XXxxЉ&&xytEXtSoftwaregif2png 2.4.2^GIDATxc`  % lA7.;xhPIENDB`analog-6.0/images/barj1.gif0000644000175000017500000000013610161303536015667 0ustar sret1sret100000000000000GIF87a33[XX0xxF&&Bf,)譍aE!hF;analog-6.0/images/barj1.png0000644000175000017500000000023610161303536015707 0ustar sret1sret100000000000000PNG  IHDR6!PLTE33XXxx&&otEXtSoftwaregif2png 2.4.2^GIDATxc`% `p4 b`q IENDB`analog-6.0/images/barj16.gif0000644000175000017500000000037510161303536015762 0ustar sret1sret100000000000000GIF87a33[XX0xxF&&Bf,)RWJ p tM˲m^3(Fb)$8΂t*BT;F/g3n8m{~|~h`\XYjZdJB>:;L?cY08΃t*BT;F%YL4& n8NNH;^O ;analog-6.0/images/barj8.png0000644000175000017500000000027210161303536015716 0ustar sret1sret100000000000000PNG  IHDR@LPLTE33[XX0xxF&&BftEXtSoftwaregif2png 2.4.2^G5IDATxc`A I+1\ p i@Ph&tA_tL E=?Vƣ`IENDB`analog-6.0/images/html2.gif0000644000175000017500000000034710161303536015722 0ustar sret1sret100000000000000GIF89a0 !,0 2Ks܅7 觮)jm\¨ G|%r^K$.EZe8DDp^pB07J_们ptf&б7B'פf%(x&58vYTyXI`Az9Ib V"b5+kL{;l[ƚ=M]P;analog-6.0/images/html2.png0000644000175000017500000000044210161303536015735 0ustar sret1sret100000000000000PNG  IHDR0 ) PLTEtRNS@ftEXtSoftwaregif2png 2.3.2QIDATxڅб @ Aɥ> ,SB_xvG2rֵ+ܫ3nj;=1hFEu|PkBj:vs}{Ĺz\p>P5VZ. ж%",`C"@1ߔ~35IENDB`analog-6.0/images/sq0.png0000644000175000017500000000013310161303537015410 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcπ01JcA,\IENDB`analog-6.0/images/sq1.png0000644000175000017500000000013610161303537015414 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcd`π01#U?.UFIENDB`analog-6.0/images/sq2.png0000644000175000017500000000013510161303537015414 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcdh`F1R`IENDB`analog-6.0/images/sq3.png0000644000175000017500000000013510161303537015415 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxc010Jc,IENDB`analog-6.0/images/sq4.png0000644000175000017500000000013610161303537015417 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcd`h` * 5\IENDB`analog-6.0/images/sq5.png0000644000175000017500000000013510161303537015417 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcdπ010Jc@-VIENDB`analog-6.0/images/sq6.png0000644000175000017500000000013610161303537015421 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxc01#Ut+E"IENDB`analog-6.0/images/sq7.png0000644000175000017500000000013610161303537015422 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcd7`b F4r ?$IENDB`analog-6.0/images/sq8.png0000644000175000017500000000013610161303537015423 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxcl`h` * Aagwy~IENDB`analog-6.0/images/sq9.png0000644000175000017500000000013510161303537015423 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxc`b`trJIENDB`analog-6.0/images/sqg.png0000644000175000017500000000013610161303537015502 0ustar sret1sret100000000000000PNG  IHDR PXgAMA aIDATxclhh` * a"IENDB`analog-6.0/lang/0000755000175000017500000000000010161303542013652 5ustar sret1sret100000000000000analog-6.0/lang/README.txt0000644000175000017500000000204010161303537015350 0ustar sret1sret100000000000000This directory contains all language files and other translations for analog. Notes to translators: Files are named after country codes (not language codes); or in some cases country code plus an additional letter indicating the character set. There is a variety of files which can be translated, but only one is essential, namely the language file. Here are all the possibilities. If the country code is xy, then the language MUST have xy.lng Language file in the language's usual character set It MAY have xya.lng Language file transliterated into US-ASCII, i.e. no accents etc. Every language is ENCOURAGED to have xydom.tab Domains file in local character set xydesc.txt Report descriptions file in local character set and if it has an ASCII language file, it SHOULD then have corresponding xyadom.tab, xyadesc.txt It MAY also have xyform.html Form interface xy.cfg Configuration file with any locale-specific commands: for example LANGUAGE and TYPEOUTPUTALIAS commands analog-6.0/lang/am.lng0000644000175000017500000003133310161303537014760 0ustar sret1sret100000000000000## Armenian Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of Armenian language file. ## (Dependant of the user's browser settings, in some cases this can be ## "x-user-defined" ARMSCII-8 ## Abbreviations for the day and month names. ѷ ߵ ز ## Next some standard common words. ## Abbreviation for "week beginning" ߳ Ͻ. ## Quarter of a year ų ݻ ۳ ۳ݻ ## ?bytes represents kbytes, Mbytes etc. ? ѳ ѳݻ ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 ų ų ų ͻ ѳݷ ѳݷݻ ϳͳϳ ѳݷ ϳͳϳ ѳݷݻ û ûݻ ݻ ϳٳϻ ϳٳϻݻ ݻ URL URL-ݻ ݻ (ݳ) -ݻ ## (= operating system, operating systems) ϳ ϳ ݻ ϳ׳ ϳ׳ ṻ ׳ϳ ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ݹѳ ## The time reports, plus "busiest" strings (at the bottom of each report) ϳ ٻݳ Ǫ ٻݳ ݪ ϳ ٻݳ ޳óϳ ٻݳ ߳ê ϳ ϳ ٻݳ ijٳ ijٳ ޳ ų ٻݳ ų٪ -ų -ų ij ٻݳ ݷ- ݷ- ٻݳ ݷ ݻ ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! ѳݷ ѳݷ ѳݷݻ n гݷ ٳ ѳݷ ѳݷݻ n гݷ ӳٳ ѳݷ ѳݷݻ n û û ûݻ n ݻ n гٳ ͻ n ٳ ͻ n ҳٳ ͻ n ݻ URL URL-ݻ n ϳ ϳ ϳ n URL URL-ݻ n ҳ ݻ URL URL-ݻ n ѳٳ ѳ ѳݻ n n ܻ ѳٳ ѳ ѳݻ n ܻ n γͳϳ ѳݷ ϳͳϳ ѳݷ ϳͳϳ ѳݷݻ n γͳϳ ѳݷ ٳ ϳͳϳ ѳݷ ϳͳϳ ѳݷݻ n γͳϳ ѳݷ ӳٳ ϳͳϳ ѳݷ ϳͳϳ ѳݷݻ n ݻ n ٳ ݻ n ӳٳ ݻ n ݻ n ݻ n ݳ ݳ ݳݻ n ݻ n ϳٳϻ۳ ϳٳϻ ϳٳϻݻ n γr׳ ϳ׳ ϳ׳ ṻ n ٳ ųٳݳ ## Used at the bottom of the report ϳ ˳ųٳݳ 1 ## Used in the time reports ٻ dz ݻϳ۳ ϳ ٳ ϳ ѳ ѳٳ ѳ ѳٳ ## Used at the bottom of each non-time report: need m, f & n genders * * ݻϳ۳ ## Used on the pie charts: again need m, f & n genders * * ## Used at the top of the report ߳ ѳݻ ## Used in the General Summary г ѳݻ ϳ ѳ ѳݻ г ѳݻ ϳ ѳ ѳݻ ӳݳ۳ ջ ϳ׳ ҳ ѳݻ ѳݻ гݻ ջϳϳ ϳ׳ ѻ г ͻ ѳݷݻ ӳݳ۳ ݳ ջ ӳݳ۳ ϳ ٳ ˳ ۳ݻ ϳ ˳ ۳ݻ ϳͻ ճ 񳵻 7 7 ǽ ## Some special phrases for particular reports. (㵳ѳ ѳݻ) ( ) (ѳ ) /(ٳ-û) (û ϳ) ( ) (ûݻ) ѳ ݹ ݻ ѳ ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) # 7 % %7 # 7 % %7 ? 7 7 ? % %7 #. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s * * %d %s * * %s ## "by" in the phrase "listing the top 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests . ## Different ways of doing floors ѳ ݳ 7 ѳݻ ݳ 7 ѳ ݳ 7 ѳݻ ݳ 7 ѳ ѳݻ ѳ ݳ 7 ѳݻ ݳ 7 ӳ ѳ ӳ ѳݻ ӳ ѳ ݳ 7 ӳ ѳݻ ݳ 7 % ۳ݻ % ۳ݻ ݳ 7 % ۳ݻ ٻݳ Ż % ۳ݻ ٻݳ Ż ݳ 7 ## ?bytes represents kbytes, Mbytes etc. ? ݳ 7 ݳ 7 ? ݳ 7 ѳ ѳٳ ѻ ӳ ѳٳ ѻ ѳٳ ѻ ѳٳ ѻ ӳ ѳٳ ѻ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ## Used at the top of each report ݳ ۳ݻ ## Used in pie charts ͳ ## different ways of sorting ݳ 7 % ѳݻ % ѳݻ ݳ 7 % ѳݻ ٻݳٻ ݳ % ѳݻ ٻݳٻ ݳ ݳ 7 ѳݻ ѳݻ ݳ 7 % ѳݻ % ѳݻ ݳ 7 % ѳݻ ٻݳٻ ݳ % ѳݻ ٻݳٻ ݳ ݳ 7 ѳݻ ѳݻ ݳ 7 % ѳݻ % ѳݻ ݳ 7 % ѳݻ ٻݳٻ ݳ % ѳݻ ٻݳٻ ݳ ݳ 7 ѳݻ ѳݻ ݳ 7 % ӳ ѳݻ % ӳ ѳݻ ݳ 7 % ӳ ѳݻ ٻݳٻ ݳ % ӳ ѳݻ ٻݳٻ ݳ ݳ 7 ӳ ѳݻ ӳ ѳݻ ݳ 7 ѳٳ ųٳݳ ѳٳ ųٳݳ ӳ ѳٳ ųٳݳ ѳٳ ųٳݳ ѳٳ ųٳݳ ӳ ѳٳ ųٳݳ ## 3 other ways of sorting in m, f, & n * * ۵ݳϳ ϳ * * ϳ * * 㹳 ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%Y ## In Daily Summary %w ## In Hourly Report %d/%m/%Y %H:%n%x%I:%o ## In Hourly Summary %H ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/amdom.tab0000644000175000017500000001205610161303537015447 0ustar sret1sret100000000000000ad 2 ݹ ae 3 dz۳ 񳵳ϳ ݻ af 1 ճ ag 2 ai 1 ɳ al 1 ɵdz am 2 г۳ an 1 ۳ ǹɳݹݻ ao 1 ݷɳ aq 1 ǹ ar 3 ݳ arpa 1 ܺ as 1 ٻ۳ at 3 dz au 3 dz aw 1 az 1 ba 3 dz-лݳ bb 2 񵳹 bd 1 ݷɳ be 3 ɷdz bf 1 ݳ bg 2 ճdz bh 1 bi 1 ݹ bj 1 bm 1 bn 1 ݻ ɳ bo 3 dz br 3 dz bs 1 ѳ۳ սݻ bt 1 ó bv 1 ս bw 1 ݳ by 1 dz bz 1 ǽ ca 3 γݳ cc 1 ۳ սݻ cd 1 ݷ ϳ ѳ cf 1 г ۳ г cg 1 ݷ ch 2 dz ci 1 ck 1 սݻ cl 2 cm 1 γٻ cn 3 ݳ co 3 ٵdz com 2 ϳ cr 3 ϳ cu 2 cv 1 γݳ ݹ սݻ cx 2 ݹ۳ ս cy 3 cz 2 ˳ϳ ѳ de 2 ٳdz dj 1 ǵ dk 2 dz dm 2 do 3 ۳ ѳ dz 1 ec 3 edu 2 ݳϳ ee 2 dz eg 3 eh 1 ۳ ѳ er 1 es 2 dz et 1 г fi 2 ɳݹdz fj 3 fk 1 ɻݹ۳ սݻ fm 1 سݻdz fo 1 ۳ սݻ fr 2 dz fx 1 dz (ϳ ) ga 1 gb 1 dz۳ ³ gd 1 ݳ ge 1 gf 1 dzϳ ۳ݳ gg 1 gh 3 ݳ gi 1 ǵó gl 1 ɳݹdz gm 1 ٵdz gn 1 ݻ gov 2 ϳ gp 1 (dz) gq 1 гϳͳ ݻ gr 2 ݳ gs 1 . dz . ݹ սݻ gt 3 ٳɳ gu 1 () gw 1 ݻ gy 1 dzݳ hk 3 ݷ hm 1 л ݳɹ սݻ hn 2 ݹ hr 2 dz ht 1 г hu 2 ݷdz id 3 ݹݻdz ie 2 ɳݹdz il 3 ۻ im 1 س ս in 3 ݹϳ int 1 糽 io 1 ݳϳ ݹϳϳ dz iq 1 ir 1 is 2 ɳݹdz it 2 dz je 1 jm 3 ڳٳϳ ս jo 3 ݳ jp 3 ֳdz ke 3 dz kg 1 kh 1 γٵdz ki 1 ǵ km 1 kn 1 ܻ kp 1 kr 3 г kw 3 ky 1 ٳ սݻ kz 1 Գ la 1 ȳ lb 3 ǵݳ lc 1 dz li 2 lk 1 ȳϳ lr 1 ǵdz ls 1 Ȼ lt 2 dz lu 2 ٵ lv 2 ȳdz ly 1 ǵdz ma 1 س mc 2 ݳ md 1 ɹdz mg 1 سϳ mh 1 س߳۳ սݻ mil 2 鳽ٳϳ mk 3 سϻdz ml 1 س mm 1 ۳ٳ mn 1 dz mo 1 سϳ mp 1 سdz۳ սݻ mq 1 سϳ ս mr 1 سdz ms 1 mt 3 سó mu 1 س mv 1 سɹ mw 1 سɳ mx 3 ػϳ my 3 سɳdz mz 1 έٵ na 1 ܳǵdz nc 1 γɻdz (dz) ne 1 Ƿ net 2 nf 1 ۳ ս ng 1 Ƿdz ni 3 ϳ nl 2 ǹɳݹݻ no 2 dz np 1 ܻ nr 1 ܳ nu 2 nz 3 ɳݹdz om 1 ٳ org 2 ߳ó ϳٳϻݻ pa 3 ݳٳ pe 3 pf 1 ݻdz (dz) pg 3 ݻ ph 3 ݻ pk 3 pl 3 Ȼѳ pm 1 ǻ pn 1 ս pr 1 pt 2 dz pw 1 ɳ py 3 qa 1 re 1 (dz) ro 2 dz ru 2 rw 1 ݹ sa 3 ۳ dz sb 1 ۳ սݻ sc 1 ɻ sd 1 se 2 dz sg 3 ݷ sh 1 лɻݳ si 2 dz sj 1 ɵ ij سۻ սݻ sk 2 ۳ г sl 1 ǻ Ȼݻ sm 1 س sn 1 ݻ so 1 ٳdz sr 1 ݳ st 1 su 2 ܳ sv 3 sy 1 dz sz 1 ɻݹ tc 1 γ սݻ td 1 ⳹ tf 1 dzϳ г ݻ tg 1 th 3 ³ɳݹ tj 1 tk 1 ϻɳ tl 1 ۳ tm 1 ٻ tn 1 dz to 1 ݷ tp 1 ۳ tr 3 dz tt 3 ǹ ᵳ tv 1 tw 3 tz 1 ݽdz ua 3 ݳ ug 3 ݹ uk 3 dz۳ ³ um 1 սݻ us 4 dz۳ ܳѳݷݻ uy 3 uz 1 va 1 ϳ vc 1 ݳdz ve 3 ݻɳ vg 1 ۳ սݻ (dz) vi 1 ۳ սݻ () vn 1 ǻݳ vu 1 wf 1 ݳ սݻ ws 1 ye 1 ٻ yt 1 سû yu 3 гɳdz za 3 г ϳ zm 1 ٵdz zr 1 ݷ ϳ ѳ zw 3 ݵ analog-6.0/lang/ba.lng0000644000175000017500000003322110161303537014743 0ustar sret1sret100000000000000## Bosnian language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Bosnian version (1.1) ISO-8859-2 and ASCII 7bit - made by Emir Alikadi ## ## Prijedlozi i ispravke dobro doli! ## ## emir@mensartis.com ## ## The character set of this language file (ISO Latin 2) ISO-8859-2 ## Abbreviations for the day and month names. ned. pon. uto. sri. et. pet. sub. jan. feb. mar. apr. maj. jun. jul. avg. sep. okt. nov. dec. ## Next some standard common words. ## Abbreviation for "week beginning" po. sedmice ++year++ ## Quarter of a year ++quarter++ mjesec dan dana sat min min sek sek bajt bajta ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ zahtjev zahtjeva dana ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum vrijeme ++time++ poetni datum poetno vrijeme posljednji datum posljednje vrijeme dokument dokumenata host hostova virtualni host virtualna hosta direktorij direktorija domen domena organizacija organizacije tip tipova URL URL-a brauzer brauzeri OS OS-i ## (= operating system, operating systems) veliina izraz za pretragu izrazi za pretragu sajt sajtova korisnik korisnika statusna oznaka statusnih oznaka Statistika za Web server ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Osnovne informacije ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Statistika po mjesecima Najvie zauzeti mjesec: Statistika po sedmicama Najvie zauzeta sedmica: sedmica poela Dnevni saetak Dnevna statistika Najvie zauzeti dan: Statistika po satima Saetak po satima ++Hour of the Week Summary++ Najvie zauzeti sat: 15-to minutna statistika ++Quarter-Hour Summary++ Najvie zauzetih 15 min.: 5-to minutna statistika ++Five-Minute Summary++ Najvie zauzetih 5 min.: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Statistika po hostovima host hostova n ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Statistika po direktorijima direktorij direktorija n Statistika po ekstenzijama ekstenzija ekstenzija n Statistika po zahtjevima datoteka datoteka n Statistika po preusmjeravanjima datoteka datoteka n Statistika po grekama datoteka datoteka n Statistika po stranama sa kojih se stizalo dolazei URL dolazeih URL-a n Statistika po WWW serverima sa kojih se stizalo dolazei WWW server dolazeih WWW servera n Statistika po preusmjerenim dolascima dolazei URL dolazeih URL-a n Statistika pogrenih pristizanja dolazei URL dolazeih URL-a n Statistika po upitima za pretragu upit upita n Statistika po rijeima za pretragu rije za pretragu rijei za pretrage n ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Statistika po virtuelnim hostovima virtuelni host virtuelnih hostova n ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Statistika po korisnicima korisnik korisnika n ++User Redirection Report++ ++user++ ++users++ ++n++ Statistika greaka po korisnicima korisnik korisnika n Pregled po brauzerima brauzer brauzera n Statistika po brauzerima brauzer brauzera n Statistika po operativnim sistemima operativni sistem operativnih sistema n Statistika po domenima domen domena n Statistika po organizacijama organizacija organizacija n Statistika po statusnim oznakama statusna oznaka statusnih oznaka n Izvjetaj o utroenom vremenu Statistika po veliini datoteke ## Used at the bottom of the report Ovaj izvjetaj je pripremio Utroeno vrijeme Manje od 1 ## Used in the time reports Svaki jedinica predstavlja ili dio istoga zahtjeva za stranicu zahtjeva za stranice ## Used at the bottom of each non-time report: need m, f & n genders * * nije na listi ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report Program startao Analizirani zahtjevi od do ## Used in the General Summary Uspjenih zahtjeva Dnevni prosjek uspjenih zahtjeva Uspjenih zahtjeva za stranice Dnevni prosjek uspjenih zahtjeva za stranice Broj linija u dnevniku bez statusnih oznaka Neuspjenih zahtjeva Preusmjerenih zahtjeva Zahtjeva sa statusnom oznakom (100-101) Zahtjeva za razliite datoteke Razliitih opsluenih hostova Neispravnih linija u dnevniku Neeljenih linija u dnevniku Prenesenih podataka Dnevni prosjek prenesenih podataka Brojevi u zagradama se odnose na 7 dana prije prethodnih 7 dana Skok na Vrh strane ## Some special phrases for particular reports. [nerijeene numerike adrese] [domen nije dat] [nepoznati domen] [root direktorij] [nema direktorija] [nema ekstenzije] [direktorija] Nepoznat Windows Ostali Unix-i ++Robots++ Nepoznat OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) zahtjeva ++7-day reqs++ %zahtjeva ++%7-day reqs++ stranica ++7-day pages++ %stranica ++%7-day pages++ bajta ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %bajta ++%7-day bytes++ br. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Ispis prvih %s * * Ispis prvih %d %s * * Ispis %s ## "by" in the phrase "listing the top 3 files BY number of requests" po ## All requests WITH AT LEAST 10 requests sa najmanje ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ preusmjereni zahtjev preusmjerenih zahtjeva ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ neuspjeni zahtjev neuspjenih zahtjeva ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % saobraaja ++% of the traffic in the last 7 days++ % najveeg obima saobraaja ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ bajta saobraaja ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ zahtjevano od sa preusmjerenim zahtjevom od sa neuspjenim zahtjevom od ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortirano prema ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting obimu saobraaja ++the amount of traffic in the last 7 days++ % zahtjeva ++% of the requests in the last 7 days++ % najveeg broja zahtjeva ++% of the maximum number of requests in the last 7 days++ broju zahtjeva ++the number of requests in the last 7 days++ % zahtjeva za stranice ++% of the requests for pages in the last 7 days++ % najveeg broja zahtjeva za stranice ++% of the maximum number of requests for pages in the last 7 days++ broju zahtjeva za stranice ++the number of requests for pages in the last 7 days++ % preusmjerenih zahtjeva ++% of the redirected requests in the last 7 days++ % najveeg broja preusmjerenih zahtjeva ++% of the maximum number of redirected requests in the last 7 days++ broju preusmjerenih zahtjeva ++the number of redirected requests in the last 7 days++ % neuspjenih zahtjeva ++% of the failed requests in the last 7 days++ % najveeg broja neuspjenih zahtjeva ++% of the maximum number of failed requests in the last 7 days++ broj neuspjenih zahtjeva ++the number of failed requests in the last 7 days++ vremenu posljednjeg zahtjeva vremenu posljednjeg preusmjerenog zahtjeva vremenu posljednjeg neuspjenog zahtjeva ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n * * sortirano po abecedi * * sortirano brojano * * nesortirano ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y. u %H:%n ## "Program started at" and "Analysed requests from" %w %d. %m %Y. u %H:%n ## In Daily Report %d.%m %y. ## In Daily Summary ++%w++ ## In Hourly Report %d.%m %y. %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d.%m %y. %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d.%m %y. ## In Monthly Report %m %Y. ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d.%m %y. ## The date & time (D) column in non-time reports %d.%m %y. %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m %y. u %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Nastavi sa zahtjevom 101 Promjena protokola 1xx [Raznolike informacije] 200 OK 201 Napravljeno 202 Prihvaeno za buduu obradu 203 Nevjerodostojna informacija 204 OK, ali nista za poslati 205 Poniti dokument 206 Djelomian sadraj 2xx [Raznoliki uspjesi] 300 Postoje viestruki dokumenti 301 Dokument pomjeren za stalno 302 Dokument nadjen drugdje 303 Vidi drugi dokument 304 Nepromijenjeno od posljednjeg zahtjeva 305 Koristi proxy 306 Promijeni proxy 307 Dokument pomjeren trenutno 3xx [Raznolike redirekcije] 400 Pogrean zahtjev 401 Potrebna potvrda vjerodostojnosti 402 Plaanje potrebno 403 Pristup zabranjen 404 Dokument nije nadjen 405 Metod nije dozvoljen 406 Dokument nije prihvatljiv klijentu 407 Potrebna proxy potvrda vjerodostojnosti 408 Zahtjev istekao 409 Zahtjev u neskladu sa stanjem resursa 410 Dokument nestao za stalno 411 Potrebna duzina 412 Preduslov neispravan 413 Zahtjev predugaak 414 Predugacko ime zahtjevanog dokumenta 415 Nepodravan tip medija 416 Zahtijevani raspon neispravan 417 Neuspjeno oekivanje 4xx [Raznolike greke klijenta/korisnika] 500 Interna server greka 501 Nepodravan tip zahtjeva 502 Greka na prijanjem serveru 503 Usluga trenutno nije prisutna 504 Gateway istekao 505 Nepodravana HTTP verzija 506 Redirekcija neuspjena 5xx [Raznolike greke servera] xxx [Nepoznato] analog-6.0/lang/baq.lng0000644000175000017500000003350010161303537015124 0ustar sret1sret100000000000000############################################################################### ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ## ############################################################################### ## ## BAIETZ Fundazioak euskaratuta ## ## /usr/lib/analog/lang/eu.lng izan daiteke ## analog.conf fitxategian, ez jarri "LANGUAGE BASQUE", baizik eta ## "LANGFILE eu.lng" ## ############################################################################### ISO-8859-15 ## Abbreviations for the day and month names. Iga Alh Aar Aaz Osg Orl Lar Urt Ots Mar Api Mai Eka Uzt Abu Ira Urr Aza Abe ## Next some standard common words. ## Abbreviation for "week beginning" aste hasiera urtea ## Quarter of a year hiruhilekoa hilea egun egun ordua minutu minutu segundu segundu byte byte ## ?bytes represents kbytes, Mbytes etc. ?byte eskaera eskaera data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data ordua ordua lehen data lehen ordua azken data azken ordua artxibo artxibo sistema sistem zerbitzari birtual zerbitzari birtual direktorio direktorio domeinu domeinu erakunde erakunde luzapen luzapen URL URL Nabigatzailea Nabigatzaile SE SE ## (= operating system, operating systems) neurria bilatutako termino bilatutako termino gune gune erabiltzaile erabiltzaile egoera kode egoera kode Zerbitzari honen estatistikak: ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Laburpen orokorra ## The time reports, plus "busiest" strings (at the bottom of each report) Urtekako txostena Trafiko handienaren urtea: Hiruhilabetekako txostena Trafiko handienaren hiruhilabetea: Hilekako txostena Trafiko handienaren hilea: Astekako txostena Trafiko handienaren astea: Egunkako laburpena Egunkako txostena Trafiko handienaren eguna: Ordukako txostena Ordukako laburpena Astearen ordukako txostena Trafiko handienaren ordua: Ordulaurdenkako txostena Ordulaurdenkako laburpena Trafiko handienaren ordulaurdena: Bost minutukako txostena Bost minutukako laburpena Trafiko handienaren bost minutuak: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings. and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Sistema txostena sistema sistem m Sistema Birbideratze txostena sistema sistem m Sistema Akats txostena sistema sistem m Direktorio txostena direktorio directorio m Fitxategi Moten txostena luzapena luzapen m Eskaera txostena artxiboa artxibo m Biribideratze txostena artxiboa artxibo m Eskaera baten akatsen txostena artxiboa artxibo m Eskatzaileen txostena URL eskatzailea URL eskatzaile m Gune eskatzaileen txostena gune eskatzailea gune eskatzaile m Birbideratutako eskatzaileen txostena URL eskatzailea URL eskatzaile m Eskatzaileen akatsen txostena eskatzailearen URLa eskatzaileen URL m Bilaketa Galderen txostena galdera galdera m Bilatutako Hitzen txostena bilatutako hitza bilatutako hitz m Bilaketa Galderen Barne txostena galdera galder m Bilaketa Hitzen Barne txostena bilatutako hitz bilatutako hitz m Zerbitzari birtualen txostena zerbitzari birtual zerbitzari birtual m Zerbitzari Birtualen Birbideratze txostena zerbitzari birtual zerbitzari birtual m Zerbitzari Birtualen Akatsen txostena zerbitzari birtual zerbitzari birtual m Erabiltzaileen txostena erabiltzaile erabiltzaile m Erabiltzaileen Birbideratze txostena erabiltzaile erabiltzaile m Erabiltzaileen Akatsen txostena erabiltzaile erabiltzaile m Nabigatzaileen Laburpena nabigatzailea nabigatzaile m Nabigatzaileen txostena nabigatzailea nabigatzaile m Sistema Eragileen txostena sistema eragile sistema eragile m Domeinuen txostena domeinua domeinuak m Erakunde txostena Erakundea Erakundeak m Egoera kodeen txostena egoera kodea egoera kodeak m Prozesatze denboren txostena Artxiboen neurriaren txostena ## Used at the bottom of the report Azterketa hau egin duen programa: Eman duen denbora Gehienez 1 ## Used in the time reports Ale bakoitzak adierazten du edo zatia orriren eskaera eskaera orriko ## Used at the bottom of each non-time report: need m, f & n genders zerrendatu gabe * * ## Used on the pie charts: again need m, f & n genders Besterik * * ## Used at the top of the report Programa exekutatu da: Eskaeren azterketa tartea: --> ## Used in the General Summary Eskaera zuzenak Eguneko bataz besteko eskaera kopurua Orriko eskaera zuzenak Eguneko orriko bataz besteko eskaera zuzenen kopurua Logean egoera koderik gabeko lerroak Lortu gabeko eskaerak Birbideratutako eskaerak Egoera kodea informatiboa duten eskaerak Eskatutako artxibo ezberdinak Zerbitutako sistema eragile ezberdinak Logean lerro okerrak Logean eskatu gabeko sarrerak Transferentzia guztira Eguneko bataz besteko transferentzia Parentesi arteko zenbakiak zera dira, 7 egun data honetan: azken 7 egunak Joan hona Gora ## Some special phrases for particular reports. [aurkitu gabeko zenbaki helbideak] [zehaztu gabeko domeinua] [domeinu ezezaguna] [erro direktorioa] [direktoriorik gabe] [luzapenik gabe] [direktorioak] Windows ezezaguna Beste Unixen bat Errobotak Sistema Eragile ezezaguna ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) Esk. Kop. esk. 7-egun %esk. %esk 7-egun Orri. orri 7-egun %Orri. %orri. 7-egun byte ?byte byte 7-egun ?byte 7-egun %byte %byte 7-egun zki. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Lehen %sen zerrenda * * Lehen %d %sen zerrenda * * %sen zerrenda * * ## "by" in the phrase "listing the top 3 files BY number of requests" honen arabera: ## All requests WITH AT LEAST 10 requests , gutxienez zera adierazten dutela, ## Different ways of doing floors azken 7 egunetako eskaera azken 7 egunetako eskaerak azken 7 egunetako orri baten eskaera azken 7 egunetako orriko eskaera birbideratutako eskaera birbideratutako eskaerak azken 7 egunetan birbideratutako eskaera azken 7 egunetan birbideratutako eskaerak lortu gabeko eskaera lortu gabeko eskaerak azken 7 egunetan lortu gabeko eskaera azken 7 egunetan lortu gabeko eskaerak trafikoaren % azken 7 egunetako trafikoaren % gehienezko trafikoaren % azken 7 egunetako gehienezko trafikoaren % trafiko byte trafiko byte ## ?bytes represents kbytes, Mbytes etc. trafiko ?byte trafiko byte azken 7 egunetan trafiko byte azken 7 egunetan trafiko ?byte azken 7 egunetan eskaera batekin data honetatik: birbideratutako eskaera batekin data honetatik: lortu gabeko eskaera batekin data honetatik: lehen eskaera batekin data honetatik: biribideratutako lehen eskaera batekin data honetatik: lortu gabeko lehen eskaera batekin data honetatik: ## Now "sorted by": again, in m, f & n (only needed in plural though) honen arabera: * * ## Used at the top of each report Txosten honek hemengo datuak ditu: ## Used in pie charts Guneak marrazturik daude honen arabera: ## different ways of sorting trafiko kopurua azken 7 egunetako trafiko kopurua eskaera % azken 7 egunetako eskaera % gehienezko eskaeren % azken 7 egunetako gehienezko eskaeren % eskaera kopurua azken 7 egunetako eskaera kopurua orriko eskaera % azken 7 egunetako orriko eskaera % orriko gehienezko eskaera % azken 7 egunetako orriko gehienezko eskaera % orriko eskaera kopurua azken 7 egunetako orriko eskaera kopurua birbideratutako eskaera % azken 7 egunetako birbideratutako eskaera % birbideratutako gehienezko eskaeren % azken 7 egunetan birbideratutako gehienezko eskaeren % birbideratutako eskaera kopurua azken 7 egunetan birbideratutako eskaera kopurua lortu gabeko eskaera % azken 7 egunetan lortu gabeko eskaera % lortu gabeko gehienezko eskaera % azken 7 egunetan lortu gabeko gehienezko eskaera % lortu gabeko eskaera kopurua azken 7 egunetan lortu gabeko eskaera kopurua azken eskaeraren ordua birbideratutako azken eskaeraren ordua lortu gabeko azken eskaeraren ordua lehen eskaeraren ordua birbideratutakko lehen eskaeraren ordua lortu gabeko lehen eskaeraren ordua ## 3 other ways of sorting in m, f, & n alfabetikoki * * zenbakikoki * * desordenaturik * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . ' ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %Y/%m/%d for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %j:%n %a ## "Program started at" and "Analysed requests from" %w, %Y/%m/%D %j:%n %a ## In Daily Report %Y/%m/%d ## In Daily Summary %w ## In Hourly Report %Y/%m/%d %H:%n%x%I:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o %b ## In Quarter-Hour and Five-Minute Reports %Y/%m/%d %H:%n%x%I:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n%x%I:%o %b ## In Weekly Report %Y/%m/%d ## In Monthly Report %Y %m ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %Y/%m/%d ## The date & time (D) column in non-time reports %Y/%m/%d %j:%n %a ## In non-time reports: "including all files with requests since [date]" %Y/%m/%d - %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Eskaera jarraitu 101 Konmutazio protokokoak 1xx [Hainbat informazio mezu] 200 OK 201 Sortuta 202 Gero prozesatzeko onartua 203 Baimenik gabeko informazioa 204 OK, baina bidaltzekorik ez 205 Dokumentua berrezarri 206 Eduki partziala 2xx [lortutako hainbat eragiketa] 300 Hainbat dokumentu prest 301 Betiko mugitutako dokumentua 302 Beste nonbait aurkitutako dokumentua 303 Beste dokumentu bat begiratu 304 Azken atzipenatik aldatu gabe 305 Zerbitzari alternatiboa erabili 306 Zerbitzari alternatiboa aldatu 307 Dokumentua behin-behineko mugituta 3xx [Hainbat birbideratze] 400 eskaera okerra 401 Autentikazioa behar da 402 Ordainketa behar da 403 Debekatuta 404 Aurkitu gabeko dokumentua 405 Baimendu gabeko metodoa 406 Bezeroak ezin duen onartu dokumentua 407 Ordezko zerbitzariaren autentikazioa behar da 408 eskaera etenda 409 Eskaera eta baliabidearen arteko gatazka 410 Dokumentua ezin da gehiago atzitu 411 Derrigorrezko iraupena 412 Aurrebaldintzaren akatsa 413 eskaera luzeegia 414 Eskatutako artxiboaren izena luzeegia 415 Baliabide baliogabea 416 Eskatutako tartea baliogabea 417 Eskaera lortu gabea 4xx [bezeroa/erabiltzailearen hainbat akats] 500 Zerbitzariaren barne akatsa 501 Onartu gabeko eskaera 502 Zerbitzariaren helbidean akatsa 503 Zerbitzua behin-behingoz erabilezina 504 Pasarela etenda 505 HTTP bertsioa onartugabea 506 Lortu gabeko birbideratzea 5xx [Zerbitzariaren hainbat akats] xxx [Ezezaguna] analog-6.0/lang/bg.lng0000644000175000017500000003212010161303537014746 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Bulgarian translation on 2.VI.2000, Luchezar Georgiev ## http://midifiler.tsx.org ## Windows / X version ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1251 ## Abbreviations for the day and month names. ## Next some standard common words. ## Abbreviation for "week beginning" . . ## Quarter of a year ## ?bytes represents kbytes, Mbytes etc. ? ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 - - ## (= operating system, operating systems) WWW ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ## The time reports, plus "busiest" strings (at the bottom of each report) - : - : - : - : - : - : - 15 . : - 5 . : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! n n n n n n n n - n n - n - n n n n n n n n n n n n n n n n n ## Used at the bottom of the report - 1 ## Used in the time reports ## Used at the bottom of each non-time report: need m, f & n genders * * ## Used on the pie charts: again need m, f & n genders * * ## Used at the top of the report ## Used in the General Summary 7- 7 ## Some special phrases for particular reports. [ ] [ ] [ ] [ ] [ ] [ ] [] Windows Unix ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) 7-. % %7-. . 7-. . %. %7-. . ? 7-. 7-. ? % %7-. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s * * %d %s * * %s ## "by" in the phrase "listing the top 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests ## Different ways of doing floors 7 7 7 7 7 7 7 7 % % 7 % % 7 ## ?bytes represents kbytes, Mbytes etc. ? 7 7 ? 7 ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ## Used at the top of each report ## Used in pie charts ## different ways of sorting 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 ## 3 other ways of sorting in m, f, & n * * * * * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %h.%n ## "Program started at" and "Analysed requests from" %w %d %m %Y %h.%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %h.%n%x%i.%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %h.%n%x%i.%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %h.%n%x%i.%o ## In Quarter-Hour and Five-Minute Summaries %h.%n%x%i.%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %h.%n ## In non-time reports: "including all files with requests since [date]" %d %m %y %h.%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/bgdesc.txt0000644000175000017500000001075510161303537015656 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Bulgarian translation 25.I.2001 L.Georgiev # Windows-1251 (Windows / X) version # # Yearly Report . # Quarterly Report . # Monthly Report . # Weekly Report . # Daily Report . # Hourly Report . # Quarter-Hour Report . # Five-Minute Report . # Daily Summary , . # Hourly Summary , . # Hour of the Week Summary , . # Quarter-Hour Summary , . # Five-Minute Summary , . # General Summary . # Request Report . # Redirection Report , . ( CGI-, .) # Failure Report , , , . # File Type Report . # Directory Report , . ( .) # Host Report , . # Host Redirection Report , . # Host Failure Report , . # Domain Report , , . # Referrer Report ( , ). # Referring Site Report . # Redirected Referrer Report , . # Failed Referrer Report , . # Browser Report , . # Virtual Host Report . # Virtual Host Redirection Report . # Virtual Host Failure Report . # User Report , , "". # User Redirection Report , . # User Failure Report , . # Organisation Report the , , . # Search Query Report , . # Search Word Report , . # Internal Search Query Report . # Internal Search Word Report . # Browser Summary . # Operating System Report , . # File Size Report . # Status Code Report HTTP- . # Processing Time Report , . analog-6.0/lang/bgdom.tab0000644000175000017500000001323710161303537015444 0ustar sret1sret100000000000000# Bulgarian domain name translation 3.VI.2000 L.Georgiev # MIK-16 (DOS / Linux) version aero 2 arpa 1 ( ) biz 2 com 2 coop 2 edu 2 gov 2 info 2 int 2 mil 2 museum 2 name 3 net 2 org 2 pro 3 ac 1 ad 2 ae 3 af 1 ag 2 ai 1 al 1 am 2 an 1 () ao 1 aq 1 ar 3 as 1 () at 3 au 3 aw 1 az 1 ba 3 bb 2 bd 1 be 2 bf 1 bg 2 bh 1 bi 1 bj 1 bm 1 bn 1 bo 3 br 3 bs 1 bt 1 bv 1 bw 1 by 1 bz 1 ca 3 cc 1 cd 1 () cf 1 o cg 1 () ch 2 ci 1 ck 1 cl 2 cm 1 cn 3 co 3 cr 3 cu 1 cv 1 ( ) cx 2 cy 3 cz 2 de 2 dj 1 dk 2 dm 2 do 2 dz 1 ec 3 ee 2 eg 3 eh 1 er 1 es 2 et 1 fi 2 fj 3 fk 1 () fm 1 fo 1 fr 2 fx 1 ( ) ga 1 gb 1 gd 1 ge 1 gf 1 gg 1 gh 3 gi 1 gl 1 gm 1 gn 1 gp 1 gq 1 gr 2 gs 1 gt 3 gu 1 gw 1 gy 1 hk 3 hm 1 hn 2 hr 2 ht 1 hu 2 id 3 ie 2 il 3 im 1 in 3 io 1 iq 1 ir 1 is 2 it 2 je 1 jm 3 jo 3 jp 3 ke 3 kg 1 kh 1 ki 1 ( .) km 1 kn 1 . kp 1 kr 3 kw 3 ky 1 kz 1 la 1 lb 3 lc 1 . li 2 lk 1 lr 1 ls 1 lt 2 lu 2 lv 2 ly 1 ma 1 mc 2 md 1 mg 1 mh 1 mk 3 ml 1 mm 1 () mn 1 mo 1 mp 1 mq 1 mr 1 ms 1 mt 3 mu 1 mv 1 mw 1 mx 3 my 3 mz 1 na 1 nc 1 ne 1 nf 1 ng 1 ni 3 nl 2 no 2 np 1 nr 1 nu 1 () nz 3 om 1 pa 3 pe 3 pf 1 pg 3 ph 3 pk 3 pl 3 pm 1 pn 1 pr 1 ps 1 pt 2 pw 1 py 3 qa 1 re 1 ro 2 ru 2 rw 1 sa 3 sb 1 sc 1 sd 1 se 2 sg 3 sh 1 . si 2 sj 1 sk 2 sl 1 sm 1 sn 1 so 1 sr 1 st 1 su 2 sv 3 sy 1 sz 1 tc 1 td 1 tf 1 tg 1 th 3 tj 1 tk 1 tl 1 tm 1 tn 1 to 1 tp 1 tr 3 tt 3 tv 1 () tw 3 tz 1 ua 3 ug 3 uk 3 um 1 - us 4 uy 3 uz 1 va 1 vc 1 . ve 3 vg 1 () vi 1 () vn 1 vu 1 ( ) wf 1 ws 1 ye 1 yt 1 yu 3 za 3 zm 1 zr 1 ( ) zw 3 analog-6.0/lang/bgm.lng0000644000175000017500000003211210161303537015124 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Bulgarian translation on 2.VI.2000, Luchezar Georgiev ## http://midifiler.tsx.org ## DOS / Linux version ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP MIK-16 ## Abbreviations for the day and month names. ## Next some standard common words. ## Abbreviation for "week beginning" . . ## Quarter of a year ## ?bytes represents kbytes, Mbytes etc. ? ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 - - ## (= operating system, operating systems) WWW ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ## The time reports, plus "busiest" strings (at the bottom of each report) - : - : - : - : - : - : - 15 . : - 5 . : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! n n n n n n n n - n n - n - n n n n n n n n n n n n n n n n n ## Used at the bottom of the report - 1 ## Used in the time reports ## Used at the bottom of each non-time report: need m, f & n genders * * ## Used on the pie charts: again need m, f & n genders * * ## Used at the top of the report ## Used in the General Summary 7- 7 ## Some special phrases for particular reports. [ ] [ ] [ ] [ ] [ ] [ ] [] Windows Unix ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) 7-. % %7-. . 7-. . %. %7-. . ? 7-. 7-. ? % %7-. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s * * %d %s * * %s ## "by" in the phrase "listing the top 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests ## Different ways of doing floors 7 7 7 7 7 7 7 7 % % 7 % % 7 ## ?bytes represents kbytes, Mbytes etc. ? 7 7 ? 7 ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ## Used at the top of each report ## Used in pie charts ## different ways of sorting 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 ## 3 other ways of sorting in m, f, & n * * * * * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %h.%n ## "Program started at" and "Analysed requests from" %w %d %m %Y %h.%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %h.%n%x%i.%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %h.%n%x%i.%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %h.%n%x%i.%o ## In Quarter-Hour and Five-Minute Summaries %h.%n%x%i.%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %h.%n ## In non-time reports: "including all files with requests since [date]" %d %m %y %h.%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/bgmdesc.txt0000644000175000017500000001074710161303537016034 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Bulgarian translation 25.I.2001 L.Georgiev # MIK-16 (DOS / Linux) version # # Yearly Report . # Quarterly Report . # Monthly Report . # Weekly Report . # Daily Report . # Hourly Report . # Quarter-Hour Report . # Five-Minute Report . # Daily Summary , . # Hourly Summary , . # Hour of the Week Summary , . # Quarter-Hour Summary , . # Five-Minute Summary , . # General Summary . # Request Report . # Redirection Report , . ( CGI-, .) # Failure Report , , , . # File Type Report . # Directory Report , . ( .) # Host Report , . # Host Redirection Report , . # Host Failure Report , . # Domain Report , , . # Referrer Report ( , ). # Referring Site Report . # Redirected Referrer Report , . # Failed Referrer Report , . # Browser Report , . # Virtual Host Report . # Virtual Host Redirection Report . # Virtual Host Failure Report . # User Report , , "". # User Redirection Report , . # User Failure Report , . # Organisation Report the , , . # Search Query Report , . # Search Word Report , . # Internal Search Query Report . # Internal Search Word Report . # Browser Summary . # Operating System Report , . # File Size Report . # Status Code Report HTTP- . # Processing Time Report , . analog-6.0/lang/bgmdom.tab0000644000175000017500000001323610161303537015620 0ustar sret1sret100000000000000# Bulgarian domain name translation 3.VI.2000 L.Georgiev # MIK-16 (DOS / Linux) version aero 2 arpa 1 ( ) biz 2 com 2 coop 2 edu 2 gov 2 info 2 int 2 mil 2 museum 2 name 3 net 2 org 2 pro 3 ac 1 ad 2 ae 3 af 1 ag 2 ai 1 al 1 am 2 an 1 () ao 1 aq 1 ar 3 as 1 () at 3 au 3 aw 1 az 1 ba 3 bb 2 bd 1 be 2 bf 1 bg 2 bh 1 bi 1 bj 1 bm 1 bn 1 bo 3 br 3 bs 1 bt 1 bv 1 bw 1 by 1 bz 1 ca 3 cc 1 cd 1 () cf 1 o cg 1 () ch 2 ci 1 ck 1 cl 2 cm 1 cn 3 co 3 cr 3 cu 1 cv 1 ( ) cx 2 cy 3 cz 2 de 2 dj 1 dk 2 dm 2 do 2 dz 1 ec 3 ee 2 eg 3 eh 1 er 1 es 2 et 1 fi 2 fj 3 fk 1 () fm 1 fo 1 fr 2 fx 1 ( ) ga 1 gb 1 gd 1 ge 1 gf 1 gg 1 gh 3 gi 1 gl 1 gm 1 gn 1 gp 1 gq 1 gr 2 gs 1 gt 3 gu 1 gw 1 gy 1 hk 3 hm 1 hn 2 hr 2 ht 1 hu 2 id 3 ie 2 il 3 im 1 in 3 io 1 iq 1 ir 1 is 2 it 2 je 1 jm 3 jo 3 jp 3 ke 3 kg 1 kh 1 ki 1 ( .) km 1 kn 1 . kp 1 kr 3 kw 3 ky 1 kz 1 la 1 lb 3 lc 1 . li 2 lk 1 lr 1 ls 1 lt 2 lu 2 lv 2 ly 1 ma 1 mc 2 md 1 mg 1 mh 1 mk 3 ml 1 mm 1 () mn 1 mo 1 mp 1 mq 1 mr 1 ms 1 mt 3 mu 1 mv 1 mw 1 mx 3 my 3 mz 1 na 1 nc 1 ne 1 nf 1 ng 1 ni 3 nl 2 no 2 np 1 nr 1 nu 1 () nz 3 om 1 pa 3 pe 3 pf 1 pg 3 ph 3 pk 3 pl 3 pm 1 pn 1 pr 1 ps 1 pt 2 pw 1 py 3 qa 1 re 1 ro 2 ru 2 rw 1 sa 3 sb 1 sc 1 sd 1 se 2 sg 3 sh 1 . si 2 sj 1 sk 2 sl 1 sm 1 sn 1 so 1 sr 1 st 1 su 2 sv 3 sy 1 sz 1 tc 1 td 1 tf 1 tg 1 th 3 tj 1 tk 1 tl 1 tm 1 tn 1 to 1 tp 1 tr 3 tt 3 tv 1 () tw 3 tz 1 ua 3 ug 3 uk 3 um 1 - us 4 uy 3 uz 1 va 1 vc 1 . ve 3 vg 1 () vi 1 () vn 1 vu 1 ( ) wf 1 ws 1 ye 1 yt 1 yu 3 za 3 zm 1 zr 1 ( ) zw 3 analog-6.0/lang/br.lng0000644000175000017500000003353410161303537014773 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## ## Brazilian Portuguese version by Ivan F. Martinez, June 1998 - June 2001 ## based on Portuguese version by Jaime Carvalho e Silva, 11 June 1998 ## ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Dom Seg Ter Qua Qui Sex Sab Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez ## Next some standard common words. ## Abbreviation for "week beginning" semana de ano ## Quarter of a year trimestre ms dia dias h minuto minutos segundo segundos byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes requisio requisies data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data hora hora prim. data prim. horario ult. data ult. horario arquivo arquivos mquina mquinas servidor virtual servidores virtuais diretrio diretrios domnio domnios organizao organizaes extenso extenses URL URLs Browser Browsers Sistema Operacional Sistemas Operacionais ## (= operating system, operating systems) tamanho termo pesquisado termos pesquisados site sites usuario usuarios cod. estado cod. estado Estatsticas do Servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sumrio Geral ## The time reports, plus "busiest" strings (at the bottom of each report) Relatrio Anual Ano mais movimentado: Relatrio Trimestral Trimestre mais movimentado: Relatrio Mensal Ms mais movimentado: Relatrio Semanal Semana mais movimentada: semana comeando Resumo Dirio Relatrio Dirio Dia mais movimentado: Relatrio Horrio Resumo Horrio Hora do Resumo Semanal Hora mais movimentada: Relatrio de 15min Resumo de 15min 15min mais movimentado: Relatrio cada cinco minutos Resumo de 5 minutos Cinco minutos mais movimentados: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Relatrio de Mquinas mquina mquinas f Relatrio de Maquinas Redirecionadas maquina maquinas f Relatrio de Maquinas com Falha maquina maquinas f Relatrio de Diretrios diretrio diretrios m Relatrio de Tipos de Arquivo extenso extenses f Relatrio de Requisies arquivo arquivos m Relatrio de Redirecionamento arquivo arquivos m Relatrio de Falhas arquivo arquivos m Relatrio de referncia URL de referncia URLs de referncia m Relatrio do site de referncia site de referncia sites de referncia m Relatrio de referncia redirecionada URL de referncia URLs de referncia m Relatrio de referncia falhada URL de referncia URLs de referncia m Relatrio de pesquisas pesquisa pesquisas f Relatrio de pesquisa de palavras palavra pesquisada palavras pesquisadas f Relatrio de pesquisa interna pesquisa pesquisas f Relatrio de pesquisa interna de palavras palavra pesquisada palavras pesquisadas f Relatrio de Servidor Virtual servidor virtual servidores virtuais m Relatrio de Redirecionamento de Servidor Virtual servidor virtual servidores virtuais m Relatrio de Falha de Servidor Virtual servidor virtual servidores virtuais m Relatrio de Usuarios usuario usuarios m Relatrio de Redirecionamento de Usuarios usuario usuarios m Relatrio de Erros de Usuarios usuario usuarios m Resumo de Browsers browser browsers m Relatrio de Browsers browser browsers m Relatrio de Sistemas Operacionais Sistema Operacional Sistemas Operacionais m Relatrio de Domnios domnio domnios m Relatrio de organizaes organizao organizaes f Relatrio de Cdigos de Estado cdigo de estado cdigos de estado m Relatrio de tempo de processamento Relatrio de Tamanho de Arquivo ## Used at the bottom of the report Estatsticas geradas por Tempo de execuo Menos de 1 ## Used in the time reports Cada unidade representa ou frao requisio de uma pgina requisies de pginas ## Used at the bottom of each non-time report: need m, f & n genders no listados no listadas * ## Used on the pie charts: again need m, f & n genders * * Outros ## Used at the top of the report Comeo do programa em Anlise de requisies desde at ## Used in the General Summary Requisies atendidas Nmero mdio de requisies atendidas por dia Pedidos de pginas atendidas Nmero mdio de requisies de pginas atendidas por dia Linhas sem cdigo de estado no arquivo de log Requisies que falharam Requisies redirecionadas Requisies com cdigo de estado informativo Arquivos diferentes solicitados Mquinas diferentes atendidas Linhas invlidas no arquivo de log Entradas no desejadas no arquivo de log Trfego total Trfego mdio transferido por dia Os valores entre parntesis referem-se aos 7 dias at ltimos 7 dias Ir a Incio ## Some special phrases for particular reports. [endereo IP no resolvido] [domnio no indicado] [domnio desconhecido] [diretrio raiz] [sem diretrio] [sem extenso] [diretrios] Windows desconhecido Outro Unix Robos Sistema Operacional desconhecido ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) N.req reqs 7 dias % req %reqs 7 dias Pags. pags 7 dias %pags. %pags 7 dias bytes ?bytes bytes 7 dias ?bytes 7 dias %bytes %bytes 7 dias no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Mostrando o primeiro %s Mostrando a primeira %s * Mostrando os %d primeiros %s Mostrando as %d primeiras %s * Mostrando os %s Mostrando as %s * ## "by" in the phrase "listing the top 3 files BY number of requests" por ## All requests WITH AT LEAST 10 requests com pelo menos ## Different ways of doing floors requisicao nos ultimos 7 dias requisicoes nos ultimos 7 dias requisicao de pagina nos ultimos 7 dias requisicoes de paginas nos ultimos 7 dias requisio redirecionada requisies redirecionadas requisio redirecionada nos ultimos 7 dias requisies redirecionadas nos ultimos 7 dias requisio falhou requisies falararam requisio falhou nos ultimos 7 dias requisies falararam nos ultimos 7 dias % do trfego % do trfego nos ultimos 7 dias % da quantidade mxima de trfego % da quantidade mxima de trfego nos ultimos 7 dias byte de trfego bytes de trfego ## ?bytes represents kbytes, Mbytes etc. ?bytes de trfego byte de trfego nos ultimos 7 dias bytes de trfego nos ultimos 7 dias ?bytes de trfego nos ultimos 7 dias requisio desde com uma requisio redirecionada desde com uma requisio falhada desde com primeira requisio desde com primeira requisio redirecionada desde com primeira requisio falhada desde ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenados por ordenadas por * ## Used at the top of each report Este relatorio contem dados de ## Used in pie charts As partes sao definidas por ## different ways of sorting quantidade de trfego quantidade de trfego nos ultimos 7 dias % das requisies % das requisies nos ultimos 7 dias % da quantidade mxima de requisies % da quantidade mxima de requisies nos ultimos 7 dias nmero de requisies nmero de requisies nos ultimos 7 dias % das requisies de pginas % das requisies de pginas nos ultimos 7 dias % do nmero mximo de requisies de pginas % do nmero mximo de requisies de pginas nos ultimos 7 dias nmero de requisies de pginas nmero de requisies de pginas nos ultimos 7 dias % das requisies redirecionadas % das requisies redirecionadas nos ultimos 7 dias % do nmero mximo de requisies redirecionadas % do nmero mximo de requisies redirecionadas nos ultimos 7 dias nmero de requisies redirecionadas nmero de requisies redirecionadas nos ultimos 7 dias % dos requisies falhadas % dos requisies falhadas nos ultimos 7 dias % do nmero mximo de requisies falhadas % do nmero mximo de requisies falhadas nos ultimos 7 dias nmero de requisies que falharam nmero de requisies que falharam nos ultimos 7 dias horario da ltima requisio horario da ltima requisio redirecionada horario da ltima requisio que falhou horario da primeira requisio horario da primeira requisio redirecionada horario da primeira requisio que falhou ## 3 other ways of sorting in m, f, & n por ordem alfabtica por ordem alfabtica por ordem alfabtica por ordem numrica por ordem numrica por ordem numrica desordenados desordenadas * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %D/%m/%Y ## In Daily Summary %w ## In Hourly Report %D/%m/%Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %D/%m/%Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %D/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%Y ## The date & time (D) column in non-time reports %d/%m/%Y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%Y s %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/bra.lng0000644000175000017500000003353110161303537015131 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## ## Brazilian Portuguese version by Ivan F. Martinez, June 1998 - June 2001 ## based on Portuguese version by Jaime Carvalho e Silva, 11 June 1998 ## ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Dom Seg Ter Qua Qui Sex Sab Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez ## Next some standard common words. ## Abbreviation for "week beginning" semana de ano ## Quarter of a year trimestre mes dia dias h minuto minutos segundo segundos byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes requisicao requisicoes data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data hora hora prim. data prim. horario ult. data ult. horario arquivo arquivos maquina maquinas servidor virtual servidores virtuais diretorio diretorios dominio dominios organizacao organizacoes extensao extensoes URL URLs Browser Browsers Sistema Operacional Sistemas Operacionais ## (= operating system, operating systems) tamanho termo pesquisado termos pesquisados site sites usuario usuarios cod. estado cod. estado Estatisticas do Servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sumario Geral ## The time reports, plus "busiest" strings (at the bottom of each report) Relatrio Anual Ano mais movimentado: Relatrio Trimestral Trimestre mais movimentado: Relatorio Mensal Mes mais movimentado: Relatorio Semanal Semana mais movimentada: semana comecando Resumo Diario Relatorio Diario Dia mais movimentado: Relatorio Horario Resumo Horario Hora do Resumo Semanal Hora mais movimentada: Relatorio de 15min Resumo de 15min 15min mais movimentado: Relatorio cada cinco minutos Resumo de 5 minutos Cinco minutos mais movimentados: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Relatorio de Maquinas Maquina Maquinas f Relatorio de Maquinas Redirecionadas maquina maquinas f Relatorio de Maquinas com Falha maquina maquinas f Relatorio de Diretorios diretorio diretorios m Relatorio de Tipos de Arquivo extensao extensoes f Relatorio de Requisicoes arquivo arquivos m Relatorio de Redirecionamento arquivo arquivos m Relatorio de Falhas arquivo arquivos m Relatorio de referencia URL de referencia URLs de referencia m Relatorio do site de referencia site de referencia sites de referencia m Relatorio de referencia redirecionada URL de referencia URLs de referencia m Relatorio de referencia falhada URL de referencia URLs de referencia m Relatorio de pesquisas pesquisa pesquisas f Relatorio de pesquisa de palavras palavra pesquisada palavras pesquisadas f Relatorio de pesquisa interna pesquisa pesquisas f Relatorio de pesquisa interna de palavras palavra pesquisada palavras pesquisadas f Relatorio de Servidor Virtual servidor virtual servidores virtuais m Relatorio de Redirecionamento de Servidor Virtual servidor virtual servidores virtuais m Relatorio de Falha de Servidor Virtual servidor virtual servidores virtuais m Relatorio de Usuarios usuario usuarios m Relatorio de Redirecionamento de Usuarios usuario usuarios m Relatorio de Erros de Usuarios usuario usuarios m Resumo de Browsers browser browsers m Relatorio de Browsers browser browsers m Relatorio de Sistemas Operacionais Sistema Operacional Sistemas Operacionais m Relatorio de Dominios dominio dominios m Relatorio de organizacoes organizacao organizacoes f Relatorio de Codigos de Estado codigo de estado codigos de estado m Relatorio de tempo de processamento Relatorio de Tamanho de Arquivo ## Used at the bottom of the report Estatisticas geradas por Tempo de execucao Menos de 1 ## Used in the time reports Cada unidade representa ou fracao requisicao de uma pagina requisicoes de paginas ## Used at the bottom of each non-time report: need m, f & n genders nao listados nao listadas * ## Used on the pie charts: again need m, f & n genders * * Outros ## Used at the top of the report Comeco do programa em Analise de requisicoes desde ate ## Used in the General Summary Requisicoes atendidas Numero medio de requisicoes atendidas por dia Pedidos de paginas atendidas Numero medio de requisicoes de paginas atendidas por dia Linhas sem codigo de estado no arquivo de log Requisicoes que falharam Requisicoes redirecionadas Requisicoes com codigo de estado informativo Arquivos diferentes solicitados Maquinas diferentes atendidas Linhas invalidas no arquivo de log Entradas nao desejadas no arquivo de log Trafego total Trafego medio transferido por dia Os valores entre parentesis referem-se aos 7 dias ate ultimos 7 dias Ir a Inicio ## Some special phrases for particular reports. [endereco IP nao resolvido] [dominio nao indicado] [dominio desconhecido] [diretorio raiz] [sem diretorio] [sem extensao] [diretorios] Windows desconhecido Outro Unix Robos Sistema Operacional desconhecido ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) N.req reqs 7 dias % req %reqs 7 dias Pags. pags 7 dias %pags. %pags 7 dias bytes ?bytes bytes 7 dias ?bytes 7 dias %bytes %bytes 7 dias no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Mostrando o primeiro %s Mostrando a primeira %s * Mostrando os %d primeiros %s Mostrando as %d primeiras %s * Mostrando os %s Mostrando as %s * ## "by" in the phrase "listing the top 3 files BY number of requests" por ## All requests WITH AT LEAST 10 requests com pelo menos ## Different ways of doing floors requisicao nos ultimos 7 dias requisicoes nos ultimos 7 dias requisicao de pagina nos ultimos 7 dias requisicoes de paginas nos ultimos 7 dias requisicao redirecionada requisicoes redirecionadas requisicao redirecionada nos ultimos 7 dias requisicoes redirecionadas nos ultimos 7 dias requisicao falhou requisicoes falararam requisio falhou nos ultimos 7 dias requisies falararam nos ultimos 7 dias % do trafego % do trafego nos ultimos 7 dias % da quantidade maxima de trafego % da quantidade maxima de trafego nos ultimos 7 dias byte de trafego bytes de trafego ## ?bytes represents kbytes, Mbytes etc. ?bytes de trafego byte de trafego nos ultimos 7 dias bytes de trafego nos ultimos 7 dias ?bytes de trafego nos ultimos 7 dias requisicao desde com uma requisicao redirecionada desde com uma requisicao falhada desde com primeira requisicao desde com primeira requisicao redirecionada desde com primeira requisicao falhada desde ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenados por ordenadas por * ## Used at the top of each report Este relatorio contem dados de ## Used in pie charts As partes sao definidas por ## different ways of sorting quantidade de trafego quantidade de trafego nos ultimos 7 dias % das requisicoes % das requisicoes nos ultimos 7 dias % da quantidade maxima de requisicoes % da quantidade maxima de requisicoes nos ultimos 7 dias numero de requisicoes numero de requisicoes nos ultimos 7 dias % das requisicoes de paginas % das requisicoes de paginas nos ultimos 7 dias % do numero maximo de requisicoes de paginas % do numero maximo de requisicoes de paginas nos ultimos 7 dias numero de requisicoes de paginas numero de requisicoes de paginas nos ultimos 7 dias % das requisicoes redirecionadas % das requisicoes redirecionadas nos ultimos 7 dias % do numero maximo de requisicoes redirecionadas % do numero maximo de requisicoes redirecionadas nos ultimos 7 dias numero de requisicoes redirecionadas numero de requisicoes redirecionadas nos ultimos 7 dias % das requisicoes falhadas % das requisicoes falhadas nos ultimos 7 dias % do numero maximo de requisicoes falhadas % do numero maximo de requisicoes falhadas nos ultimos 7 dias numero de requisicoes que falharam numero de requisicoes que falharam nos ultimos 7 dias horario da ultima requisicao horario da ultima requisicao redirecionada horario da ultima requisicao que falhou horario da primeira requisicao horario da primeira requisicao redirecionada horario da primeira requisicao que falhou ## 3 other ways of sorting in m, f, & n por ordem alfabetica por ordem alfabetica por ordem alfabetica por ordem numerica por ordem numerica por ordem numerica desordenados desordenadas * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %D/%m/%Y ## In Daily Summary %w ## In Hourly Report %D/%m/%Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %D/%m/%Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %D/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%Y ## The date & time (D) column in non-time reports %d/%m/%Y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%Y as %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/bradesc.txt0000644000175000017500000001232010161303537016020 0ustar sret1sret100000000000000# Arquivo de descricao dos relatorios para analog 6.0. # # Este arquivo contem as descricoes para cada relatorio. # As linhas iniciadas por (#) sao comentarios. # Cada relatorio precisa ter EXATAMENTE UMA LINHA. # Este relatorio lista as atividades anuais. # Quarterly Report - Relatorio Trimestral Este relatorio lista as atividades trimestrais. # Monthly Report - Relatorio Mensal Este relatorio lista as atividades mensais. # Weekly Report - Relatorio Semanal Este relatorio lista as atividades semanais. # Daily Report - Relatorio Diario Este relatorio lista as atividades diarias. # Hourly Report - Relatorio por Hora Este relatorio lista as atividades a cada hora. # Quarter-Hour Report - Relatorio por Quinze minutos Este relatorio lista as atividades a cada quinze minutos. # Five-Minute Report - Relatorio por Cinco minutos Este relatorio lista as atividades a cada cinco minutos. # Daily Summary - Resumo Diario Este relatorio lista o total de atividades para cada dia da semana, somadas todas as semanas deste relatorio. # Hourly Summary - Resumo por Hora Este relatorio lista o total de atividades para cada hora do dia, somadas todos os dias deste relatorio. # Hour of the Week Summary - Resumo por Hora da Semana Este relatorio lista o total de atividades para cada hora da semana, somadas todas as semanas deste relatorio. # Quarter-Hour Summary - Resumo por Quinze Minutos Este relatorio lista o total de atividades diarias para cada quinze minutos, somados todos os dias deste relatorio. # Five-Minute Summary - Resumo por Cinco Minutos Este relatorio lista o total de atividades diarias para cada cinco minutos, somados todos os dias deste relatorio. # General Summary - Resumo Geral Este relatorio contem estatisticas gerais. # Request Report - Relatorio de Requisicoes Este relatorio lista os arquivos no site. # Redirection Report - Relatorio de Redirecionamentos Este relatorio lista os arquivos cujas requisicoes foram redirecionadas para outro arquivo. (Normalmente diretorios sem a ultima barra ou CGI's que forcam o redirecionamento. # Failure Report - Relatorio de Falhas Este relatorio lista os arquivos que causaram erros, por exemplo Arquivo inexistente. # File Type Report - Relatorio por Tipos de Arquivos Este relatorio lista as extensoes dos arquivos requisitados. # Directory Report - Relatorio por Diretorios Este relatorio lista os diretorios de cada arquivo requisitado. # Host Report - Relatorios por Hosts Este relatorio mostra os computadores os quais requisitaram os arquivos. # Host Redirection Report - Relatorio por Hosts Redirecionados Este relatorio lista os computadores que foram redirecionados para outro arquivo. # Host Failure Report - Relatorio por Falhas de Hosts Este relatorio lista os computadores que tiveram falha na requisicao. # Domain Report - Relatorio por Dominios Este relatorio lista os paises cujos computadores requisitaram os arquivos. # Referrer Report - Relatorio por Referencias Este relatorio lista as referencias (de onde sao os links ou paginas que incluiram a imagem deste site). # Referring Site Report - Relatorio por Referencias de Sites Este relatorio lista os servidores com links. # Redirected Referrer Report - Relatorio de Referencias Redirecionadas Este relatorio lista as referencias de requisicoes redirecionadas. # Failed Referrer Report - Relatorio de Referencias com Falhas Este relatorio lista as referencias contendo links cancelados para o site. # Browser Report - Relatorio de Navegadores Este relatorio lista os browsers usados pelos visitantes. # Virtual Host Report - Relatorio de Dominios Virtuais Este relatorio lista as atividades de cada dominio virtual no site. # Virtual Host Redirection Report - Relatorio de Redirecionamento de Dominios Virtuais Este relatorio lista as requisicoes redirecionadas para cada dominio virtual. # Virtual Host Failure Report - Relatorio de Falhas de Redirecionamento de Dominios Virtuais Este relatorio lista as requisicoes com falha para cada dominio virtual. # User Report - Relatorio de Usuarios Este relatorio lista os usuario que requisitaram arquivos, caso os usuarios tenham autenticado ou possam ser identificados por cookies. # User Redirection Report Este relatorio lista os usuarios os quais foram redirecionados para outro arquivo. # User Failure Report Este relatorio lista os usuario que obtiveram falha na requisicao. # Organization Report Este relatorio lista as organizacoes os computadores que requisitaram arquivos. # Search Query Report Este relatorio lista quais as solicitacoes usadas em mecanismos de busca para encontrar o site. # Search Word Report Este relatorio lista quais as palavras usadas em mecanismos de busca para encontrar o site. # Internal Search Query Report Este relatorio lista quais as solicitacoes usadas nos scripts com o site. # Internal Search Word Report Este relatorio lista quais as palavras usadas nos scripts com o site. # Browser Summary Este relatorio lista os fornecedores os browsers dos visitantes. # Operating System Report Este relatorio lista os sistemas operacionais usados pelos visitantes. # File Size Report Este relatorio lista os tamanhos dos arquivos. # Status Code Report Este relatorio lista o status HTTP de todas as requisicoes. # Processing Time Report Este relatorio lista o tempo tomado por cada requisicao bem sucedida. analog-6.0/lang/bradom.tab0000644000175000017500000001170310161303537015614 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emirados Arabes Unidos af 1 Afeganistao ag 2 Antigua e Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antilhas Holandesas ao 1 Angola aq 1 Antartida ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijao ba 3 Bosnia Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgica bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasil bs 1 Bahamas bt 1 Butao bv 1 Ilha Bouvet bw 1 Botswana by 1 Lituania bz 1 Belize ca 3 Canada cc 1 Ilhas Cocos (Keeling) cd 1 Congo cf 1 Republica Centro-Africana cg 1 Congo ch 2 Suica ci 1 Costa do Marfim ck 1 Ilhas Cook cl 2 Chile cm 1 Camaroes cn 3 China co 3 Colombia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Ilha Christmas cy 3 Chipre cz 2 Republica Theca de 2 Alemanha dj 1 Djibuti dk 2 Dinamarca dm 2 Dominica do 3 Republica Dominicana dz 1 Argelia ec 3 Equador edu 2 Educacional ee 2 Estonia eg 3 Egito eh 1 Saara Oriental er 1 Eriteia es 2 Espanha et 1 Etiopia fi 2 Finlandia fj 3 Fiji fk 1 Ilhas Malvinas (Falkland) fm 1 Estados Federados da Micronesia fo 1 Ilhas Faroe fr 2 Franca fx 1 Franca (Territorio Europeu) ga 1 Gabao gb 1 Gra-Bretanha gd 1 Grenada ge 1 Georgia gf 1 Guiana Francesa gg 1 Ilha de Guernsey gh 3 Gana gi 1 Gibraltar gl 1 Groelandia gm 1 Gambia gn 1 Guine gov 2 Governo norte-americano gp 1 Ilha de Guadalupe gq 1 Guine Equatorial gr 2 Grecia gs 1 Ilhas de Georgia do Sul e Sandwich do Sul gt 3 Guatemala gu 1 Ilha de Guam gw 1 Guine-Bissau gy 1 Guiana (ex. Guiana Inglesa) hk 3 Hong Kong hm 1 Ilhas Heard e McDonald hn 2 Honduras hr 2 Croacia ht 1 Haiti hu 2 Hungria id 3 Indonesia ie 2 Irlanda il 3 Israel im 1 Ilha de Man in 3 India int 1 Internacional io 1 Territorio Indico-britanico iq 1 Iraque ir 1 Ira is 2 Islandia it 2 Italia je 1 Ilha de Jersey jm 3 Jamaica jo 3 Jordania jp 3 Japao ke 3 Qenia kg 1 Kyrgyzstan kh 1 Camboja ki 1 Kiribati km 1 Ilhas Comoros kn 1 Ilhas Saint Kitts e Nevis kp 1 Coreia do Norte kr 3 Coreia do Sul kw 3 Kuwait ky 1 Ilhas Cayman kz 1 Cazaquistao la 1 Laos lb 3 Libano lc 1 Ilha de Santa Lucia li 2 Liechtenstein lk 1 Sri-Lanka lr 1 Liberia ls 1 Lesoto lt 2 Lituania lu 2 Luxemburgo lv 2 Letonia ly 1 Libia ma 1 Marrocos mc 2 Principado de Monaco md 1 Moldavia mg 1 Madagascar mh 1 Ilhas Marshall mil 2 Militar norte-americano mk 3 Macedonia (Antiga Iugoslavia) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macau mp 1 Ilhas Mariana do Norte mq 1 Martinica mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Ilhas Mauricio mv 1 Ilhas Maldivas mw 1 Malavi mx 3 Mexico my 3 Malasia mz 1 Mocambique na 1 Namibia nc 1 Nova Caledonia ne 1 Niger net 2 Redes nf 1 Ilha Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Holanda no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nova Zelandia om 1 Oma org 2 Organizacoes nao-governamentais pa 3 Panama pe 3 Peru pf 1 Polinesia Francesa pg 3 Papua Nova Guine ph 3 Filipinas pk 3 Paquistao pl 3 Polonia pm 1 Ilhas Saint Pierre e Miquelon pn 1 Ilha Pitcairn pr 1 Porto Rico ps 3 Palestina pt 2 Portugal pw 1 Palau py 3 Paraguai qa 1 Qatar re 1 Ilhas Reuniao ro 2 Romenia ru 2 Russia rw 1 Ruanda sa 3 Arabia Saudita sb 1 Ilhas Salomao sc 1 Ilhas Seychelles sd 1 Sudao se 2 Suecia sg 3 Singapura sh 1 Ilha de Santa Helena si 2 Eslovenia sj 1 Ilhas Svalbard e Jan Mayen sk 2 Eslovaquia sl 1 Serra Leoa sm 1 Principado de San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Sao Tome e Principe su 2 Antiga Uniao Sovietica sv 3 El Salvador sy 1 Siria sz 1 Suazilandia tc 1 Ilhas Turks e Caicos td 1 Chade tf 1 Territorios Franceses de Ultramar tg 1 Togo th 3 Tailandia tj 1 Tadjiquistao tk 1 Ilha Tokelau tl 1 Timor Leste tm 1 Turcomenistao tn 1 Tunisia to 1 Tonga tp 1 Timor Leste tr 3 Turquia tt 3 Trinidade e Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ucrania ug 3 Uganda uk 3 Reino Unido um 1 Territorios americanos de ultramar us 4 Estados Unidos da America uy 3 Uruguai uz 1 Uzbequistao va 1 Cidade do Vaticano vc 1 Ilhas de Saint Vincent e Grenadines ve 3 Venezuela vg 1 Ilhas Virgens Britanicas vi 1 Ilhas Virgens vn 1 Vietna vu 1 Vanuatu wf 1 Ilhas Wallis e Futuna ws 1 Samoa ye 1 Iemen yt 1 Ilha Mayotte yu 3 Iugoslavia za 3 Africa do Sul zm 1 Zambia zr 1 Republica Democratica do Congo zw 3 Zimbabue analog-6.0/lang/brdesc.txt0000644000175000017500000001232010161303537015657 0ustar sret1sret100000000000000# Arquivo de descrio dos relatrios para analog 6.0. # # Este arquivo contem as descries para cada relatrio. # As linhas iniciadas por (#) so comentrios. # Cada relatrio precisa ter EXATAMENTE UMA LINHA. # Este relatrio lista as atividades anuais. # Quarterly Report - Relatrio Trimestral Este relatrio lista as atividades trimestrais. # Monthly Report - Relatrio Mensal Este relatrio lista as atividades mensais. # Weekly Report - Relatrio Semanal Este relatrio lista as atividades semanais. # Daily Report - Relatrio Dirio Este relatrio lista as atividades dirias. # Hourly Report - Relatrio por Hora Este relatrio lista as atividades a cada hora. # Quarter-Hour Report - Relatrio por Quinze minutos Este relatrio lista as atividades a cada quinze minutos. # Five-Minute Report - Relatrio por Cinco minutos Este relatrio lista as atividades a cada cinco minutos. # Daily Summary - Resumo Dirio Este relatrio lista o total de atividades para cada dia da semana, somadas todas as semanas deste relatrio. # Hourly Summary - Resumo por Hora Este relatrio lista o total de atividades para cada hora do dia, somadas todos os dias deste relatrio. # Hour of the Week Summary - Resumo por Hora da Semana Este relatrio lista o total de atividades para cada hora da semana, somadas todas as semanas deste relatrio. # Quarter-Hour Summary - Resumo por Quinze Minutos Este relatrio lista o total de atividades dirias para cada quinze minutos, somados todos os dias deste relatrio. # Five-Minute Summary - Resumo por Cinco Minutos Este relatrio lista o total de atividades dirias para cada cinco minutos, somados todos os dias deste relatrio. # General Summary - Resumo Geral Este relatrio contem estatsticas gerais. # Request Report - Relatrio de Requisies Este relatrio lista os arquivos no site. # Redirection Report - Relatrio de Redirecionamentos Este relatrio lista os arquivos cujas requisies foram redirecionadas para outro arquivo. (Normalmente diretrios sem a ultima barra ou CGI's que forcam o redirecionamento. # Failure Report - Relatrio de Falhas Este relatrio lista os arquivos que causaram erros, por exemplo Arquivo inexistente. # File Type Report - Relatrio por Tipos de Arquivos Este relatrio lista as extenses dos arquivos requisitados. # Directory Report - Relatrio por Diretrios Este relatrio lista os diretrios de cada arquivo requisitado. # Host Report - Relatrios por Hosts Este relatrio mostra os computadores os quais requisitaram os arquivos. # Host Redirection Report - Relatrio por Hosts Redirecionados Este relatrio lista os computadores que foram redirecionados para outro arquivo. # Host Failure Report - Relatrio por Falhas de Hosts Este relatrio lista os computadores que tiveram falha na requisio. # Domain Report - Relatrio por Domnios Este relatrio lista os pases cujos computadores requisitaram os arquivos. # Referrer Report - Relatrio por Referncias Este relatrio lista as referencias (de onde so os links ou paginas que incluram a imagem deste site). # Referring Site Report - Relatrio por Referncias de Sites Este relatrio lista os servidores com links. # Redirected Referrer Report - Relatrio de Referncias Redirecionadas Este relatrio lista as referencias de requisies redirecionadas. # Failed Referrer Report - Relatrio de Referncias com Falhas Este relatrio lista as referencias contendo links cancelados para o site. # Browser Report - Relatrio de Navegadores Este relatrio lista os browsers usados pelos visitantes. # Virtual Host Report - Relatrio de Domnios Virtuais Este relatrio lista as atividades de cada domnio virtual no site. # Virtual Host Redirection Report - Relatrio de Redirecionamento de Domnios Virtuais Este relatrio lista as requisies redirecionadas para cada domnio virtual. # Virtual Host Failure Report - Relatrio de Falhas de Redirecionamento de Domnios Virtuais Este relatrio lista as requisies com falha para cada domnio virtual. # User Report - Relatrio de Usurios Este relatrio lista os usurio que requisitaram arquivos, caso os usurios tenham autenticado ou possam ser identificados por cookies. # User Redirection Report Este relatrio lista os usurios os quais foram redirecionados para outro arquivo. # User Failure Report Este relatrio lista os usurio que obtiveram falha na requisio. # Organization Report Este relatrio lista as organizaes os computadores que requisitaram arquivos. # Search Query Report Este relatrio lista quais as solicitaes usadas em mecanismos de busca para encontrar o site. # Search Word Report Este relatrio lista quais as palavras usadas em mecanismos de busca para encontrar o site. # Internal Search Query Report Este relatrio lista quais as solicitaes usadas nos scripts com o site. # Internal Search Word Report Este relatrio lista quais as palavras usadas nos scripts com o site. # Browser Summary Este relatrio lista os fornecedores os browsers dos visitantes. # Operating System Report Este relatrio lista os sistemas operacionais usados pelos visitantes. # File Size Report Este relatrio lista os tamanhos dos arquivos. # Status Code Report Este relatrio lista o status HTTP de todas as requisies. # Processing Time Report Este relatrio lista o tempo tomado por cada requisio bem sucedida. analog-6.0/lang/brdom.tab0000644000175000017500000001170310161303537015453 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emirados rabes Unidos af 1 Afeganisto ag 2 Antigua e Barbuda ai 1 Anguilla al 1 Albnia am 2 Armnia an 1 Antilhas Holandesas ao 1 Angola aq 1 Antartida ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 ustria au 3 Austrlia aw 1 Aruba az 1 Azerbaijo ba 3 Bsnia Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Blgica bf 1 Burkina Faso bg 2 Bulgria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolvia br 3 Brasil bs 1 Bahamas bt 1 Buto bv 1 Ilha Bouvet bw 1 Botswana by 1 Litunia bz 1 Belize ca 3 Canad cc 1 Ilhas Cocos (Keeling) cd 1 Congo cf 1 Repblica Centro-Africana cg 1 Congo ch 2 Sua ci 1 Costa do Marfim ck 1 Ilhas Cook cl 2 Chile cm 1 Camares cn 3 China co 3 Colmbia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Ilha Christmas cy 3 Chipre cz 2 Repblica Theca de 2 Alemanha dj 1 Djibuti dk 2 Dinamarca dm 2 Dominica do 3 Repblica Dominicana dz 1 Arglia ec 3 Equador edu 2 Educacional ee 2 Estnia eg 3 Egito eh 1 Saara Oriental er 1 Eritia es 2 Espanha et 1 Etipia fi 2 Finlndia fj 3 Fiji fk 1 Ilhas Malvinas (Falkland) fm 1 Estados Federados da Micronsia fo 1 Ilhas Faroe fr 2 Frana fx 1 Frana (Territrio Europeu) ga 1 Gabo gb 1 Gr-Bretanha gd 1 Grenada ge 1 Gergia gf 1 Guiana Francesa gg 1 Ilha de Guernsey gh 3 Gana gi 1 Gibraltar gl 1 Groelndia gm 1 Gmbia gn 1 Guin gov 2 Governo norte-americano gp 1 Ilha de Guadalupe gq 1 Guin Equatorial gr 2 Grcia gs 1 Ilhas de Gergia do Sul e Sandwich do Sul gt 3 Guatemala gu 1 Ilha de Guam gw 1 Guin-Bissau gy 1 Guiana (ex. Guiana Inglesa) hk 3 Hong Kong hm 1 Ilhas Heard e McDonald hn 2 Honduras hr 2 Crocia ht 1 Haiti hu 2 Hungria id 3 Indonsia ie 2 Irlanda il 3 Israel im 1 Ilha de Man in 3 ndia int 1 Internacional io 1 Territrio ndico-britnico iq 1 Iraque ir 1 Ir is 2 Islndia it 2 Itlia je 1 Ilha de Jersey jm 3 Jamaica jo 3 Jordnia jp 3 Japo ke 3 Qnia kg 1 Kyrgyzstan kh 1 Camboja ki 1 Kiribati km 1 Ilhas Comoros kn 1 Ilhas Saint Kitts e Nevis kp 1 Coria do Norte kr 3 Coria do Sul kw 3 Kuwait ky 1 Ilhas Cayman kz 1 Cazaquisto la 1 Laos lb 3 Lbano lc 1 Ilha de Santa Lucia li 2 Liechtenstein lk 1 Sri-Lanka lr 1 Libria ls 1 Lesoto lt 2 Litunia lu 2 Luxemburgo lv 2 Letnia ly 1 Lbia ma 1 Marrocos mc 2 Principado de Mnaco md 1 Moldvia mg 1 Madagascar mh 1 Ilhas Marshall mil 2 Militar norte-americano mk 3 Macdonia (Antiga Iugoslvia) ml 1 Mali mm 1 Myanmar mn 1 Monglia mo 1 Macau mp 1 Ilhas Mariana do Norte mq 1 Martinica mr 1 Mauritnia ms 1 Montserrat mt 3 Malta mu 1 Ilhas Mauricio mv 1 Ilhas Maldivas mw 1 Malavi mx 3 Mxico my 3 Malsia mz 1 Moambique na 1 Nambia nc 1 Nova Calednia ne 1 Nger net 2 Redes nf 1 Ilha Norfolk ng 1 Nigria ni 3 Nicargua nl 2 Holanda no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nova Zelndia om 1 Om org 2 Organizaes no-governamentais pa 3 Panam pe 3 Peru pf 1 Polinsia Francesa pg 3 Papua Nova Guin ph 3 Filipinas pk 3 Paquisto pl 3 Polnia pm 1 Ilhas Saint Pierre e Miquelon pn 1 Ilha Pitcairn pr 1 Porto Rico ps 3 Palestina pt 2 Portugal pw 1 Palau py 3 Paraguai qa 1 Qatar re 1 Ilhas Reunio ro 2 Romnia ru 2 Rssia rw 1 Ruanda sa 3 Arbia Saudita sb 1 Ilhas Salomo sc 1 Ilhas Seychelles sd 1 Sudo se 2 Sucia sg 3 Singapura sh 1 Ilha de Santa Helena si 2 Eslovnia sj 1 Ilhas Svalbard e Jan Mayen sk 2 Eslovquia sl 1 Serra Leoa sm 1 Principado de San Marino sn 1 Senegal so 1 Somlia sr 1 Suriname st 1 So Tom e Prncipe su 2 Antiga Unio Sovitica sv 3 El Salvador sy 1 Sria sz 1 Suazilndia tc 1 Ilhas Turks e Caicos td 1 Chade tf 1 Territrios Franceses de Ultramar tg 1 Togo th 3 Tailndia tj 1 Tadjiquisto tk 1 Ilha Tokelau tl 1 Timor Leste tm 1 Turcomenisto tn 1 Tunsia to 1 Tonga tp 1 Timor Leste tr 3 Turquia tt 3 Trinidade e Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanznia ua 3 Ucrnia ug 3 Uganda uk 3 Reino Unido um 1 Territrios americanos de ultramar us 4 Estados Unidos da Amrica uy 3 Uruguai uz 1 Uzbequisto va 1 Cidade do Vaticano vc 1 Ilhas de Saint Vincent e Grenadines ve 3 Venezuela vg 1 Ilhas Virgens Britnicas vi 1 Ilhas Virgens vn 1 Vietn vu 1 Vanuatu wf 1 Ilhas Wallis e Futuna ws 1 Samoa ye 1 Imen yt 1 Ilha Mayotte yu 3 Iugoslvia za 3 frica do Sul zm 1 Zmbia zr 1 Repblica Democrtica do Congo zw 3 Zimbbue analog-6.0/lang/cat.lng0000644000175000017500000003355610161303537015143 0ustar sret1sret100000000000000############################################################################### ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## ## Catalan version by Francesc Burrull i Mestres, 26 Jan 1999, 4 Dec 1999, ## 23 Jan 2001. e-mail: fburrull@mat.upc.es ## ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte Gen. Feb. Mar. Abr. Mai. Jun. Jul. Ago. Set. Oct. Nov. Des. ## Next some standard common words. ## Abbreviation for "week beginning" setm. d'inici any ## Quarter of a year trimestre mes dia dies h. minut minuts segon segons byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes petici peticions data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data hora hora primera data primera hora ltima data ltima hora fitxer fitxers mquina mquines servidor virtual servidors virtuals directori directoris domini dominis organitzaci organitzacions extensi extensions URL URLs Navegador Navegadors Sistema Operatiu Sistemes Operatius ## (= operating system, operating systems) tamany busca terme busca termes lloc llocs usuari usuaris cod. d'estat cods. d'estats Estadstiques del Servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Informe General ## The time reports, plus "busiest" strings (at the bottom of each report) Informe anual Any de mxima ocupaci: Informe trimestral Trimestre de mxima ocupaci Informe Mensual Mes de trfic mxim: Informe Setmanal Setmana de trfic mxim: Resum Diari Informe Diari Dia de trfic mxim: Informe Horari Resum Horari Hora del resum setmanal Hora de trfic mxim: Informe de quart d'hora Resum de quart d'hora Quart d'hora de trfic mxim: Informe de cada cinc minutos Resum de cinc minuts Cinc minuts de trfic mxim: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Informe de Hosts host hosts m Informe de redireccions de mquina mquina mquines f Informe de fallades de mquina mquina mquines f Informe de Directoris directori directoris m Informe de Tipus de Fitxers extensi extensins f Informe de Peticions fitxer sol.licitat fitxers sol.licitats m Informe de redireccionaments fitxer fitxers m Informe de fallades en una petici fitxer fitxers m Informe de Remitents URL remitent URLs remitents m Informe de llocs Remitents lloc remitent llocs remitents m Informe de remitents redireccionats URL remitent URLs remitents m Informe d'errors de remitents URL remitent URLs remitents m Informe de peticions buscades petici peticions m Informe de paraules buscades paraula buscada paraules buscades f Informe de peticions de cerques internes cerca cerques f Informe de paraules de cerques internes cerca paraula cerca paraules f Informe de servidors virtuals servidor virtual servidors virtuals m Informe de redireccions de mquines virtuals mquina virtual mquines virtuals f Informe de fallades de mquines virtuals mquina virtual mquines virtuals f Informe d'usuaris usuari usuaris m Informe de redireccions d'usuaris usuari usuaris m Informe d'accs d'usuaris usuari usuaris m Resum de Navegadors navegador navegadors m Informe de Navegadors navegador navegadors m Informe de sistema operatiu sistema operatiu sistemes operatius m Informe de Dominis domini dominis m Informe d'organitzacions organitzaci organitzacions m Informe de codis d'estat codi d'estat codis d'estat m Informe del temps de procs Informe del tamany de fitxers ## Used at the bottom of the report Aquesta anlisi estadstica l'ha generada Temps d'execuci Menys de 1 ## Used in the time reports Cada unitat representa o una fracci petici d'una pgina peticions de pgines ## Used at the bottom of each non-time report: need m, f & n genders no llistats no llistades * ## Used on the pie charts: again need m, f & n genders Altre Altra * ## Used at the top of the report Dia i hora de l'inicialitzaci: Anlisi de peticions des del fins al ## Used in the General Summary Peticions exitoses Promig de peticions exitoses per dia Peticions exitoses per pgina Promig de peticions exitoses per pgina per dia Lnies sense codi d'estat en el fitxer log Peticions fallades Peticions de redireccionament Peticions amb codi d'estat informatiu Fitxers diferents sol.licitats Mquines diferents ateses Lnies invlides en el fitxer log Entrades no sol.licitades en el fitxer log Transferncia total Promig de transferncia per dia Les imatges en parntesi es refereixen als 7 dies al ltims 7 dies Anar a Inici ## Some special phrases for particular reports. [adrea numrica no resolta] [domini no facilitat] [domini desconegut] [directori arrel] [sense directori] [sense extensi] [directoris] Windows desconegut Altres Unix Robots S.O. desconegut ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) Num. pet. pet. 7 dies %pet. % pet. 7 dies Pags. pgs. 7 dies %Pags. % pags. 7 dies bytes ?bytes bytes 7 dies ?bytes 7 dies %bytes % bytes 7 dies num. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Fent llistat dels primers %s Fent llistat de las primeres %s * Fent llistat de los %d primers %s Fent llistat de les %d primeres %s * Fent llistat dels %s Fent llistat de les %s * ## "by" in the phrase "listing the top 3 files BY number of requests" per ## All requests WITH AT LEAST 10 requests amb almenys ## Different ways of doing floors petici en els ltims 7 dies peticions en els ltims 7 dies petici d'una pgina en els ltims 7 dies peticions de pgines en els ltims 7 dies petici redireccionada peticions redireccionades petici redireccionada en els ltims 7 dies peticions redireccionada en els ltims 7 dies petici fallada peticions fallades petici fallada en els ltims 7 dies peticions fallades en els ltims 7 dies % del trfic en els ltims 7 dies % del trfic % del mxim volum de trfic % del mxim volum de trfic en els ltims 7 dies byte de trfic bytes de trfic ## ?bytes represents kbytes, Mbytes etc. ?bytes de trfic byte de trfic en els ltims 7 dies bytes de trfic en els ltims 7 dies ?bytes de trfic en els ltims 7 dies sol.licitat des de amb una sol.licitut redireccionada des de amb una sol.licitut fallada des de amb primera petici des de amb primera petici redireccionada des de amb primera petici fallada des de ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenats por ordenades per * ## Used at the top of each report Aquest informe cont dades de ## Used in pie charts Les porcions estan dibuixades per ## different ways of sorting quantitat de trfic quantitat de trfic en els ltims 7 dies % de peticions % de peticions en els ltims 7 dies % del nombre mxim de peticions % del nombre mxim de peticions en els ltims 7 dies nombre de peticions nombre de peticions en els ltims 7 dies % de peticions de pgines % de peticions de pgines en els ltims 7 dies % del nombre mxim de peticions de pgines % del nombre mxim de peticions de pgines en els ltims 7 dies nombre de peticions de pgines nombre de peticions de pgines en els ltims 7 dies % de peticions redireccionades % de peticions redireccionades en els ltims 7 dies % del nombre mxim de peticions redireccionades % del nombre mxim de peticions redireccionades en els ltims 7 dies nombre de peticions redireccionades nombre de peticions redireccionades en els ltims 7 dies % de peticions fallades % de peticions fallades en els ltims 7 dies % del nombre mxim de peticions fallades % del nombre mxim de peticions fallades en els ltims 7 dies nombre de peticions fallades nombre de peticions fallades en els ltims 7 dies hora de la ltima petici hora de la ltima petici redireccionada hora de la ltima petici fallada hora de la primera petici hora de la primera petici redireccionada hora de la primera petici fallada ## 3 other ways of sorting in m, f, & n per ordre alfabtic per ordre alfabtic * per ordre numric per ordre numric * desordenats desordenades * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%Y ## In Daily Summary %w ## In Hourly Report %d/%m/%Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%Y ## The date & time (D) column in non-time reports %d/%m/%Y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%Y a les %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continua amb la petici 101 Canviant protocols 1xx [Informaci miscel.lnia] 200 B 201 Creat 202 Acceptat per futur processat 203 Informaci no autoritativa 204 B, per res a enviar 205 Reset del document 206 Contingut parcial 2xx Esdeveniments diversos 300 Mltiples documents disponibles 301 El document ha canviat de lloc de manera permanent 302 El document s en un altre lloc 303 Vegeu un altre document 304 No modificat des de l'ltima descrrega 305 Utilitzeu proxy 306 Canvia proxy 307 El document ha canviat de lloc de manera temporal 3xx [Redireccions diverses] 400 Petici invlida 401 Cal autentificaci 402 Cal fer el pagament 403 Accs prohibit 404 Document no trobat 405 Mtode no perms 406 Document inacceptable pel client 407 Cal autentificaci del proxy 408 Temps de petici esgotat 409 Conflicte entre la petici i l'estat del recurs 410 Document desaparegut de manera permanent 411 Cal la longitud 412 Precondici fallada 413 Petici massa llarga 414 Nom de fitxer sol.licitat massa llarg 415 Tipus de medi no suportat 416 Rang sol.licitat invlid 417 Expectaci fallada 4xx [Errors diversos de client/usuari] 500 Error intern del servidor 501 Tipus sol.licitat no suportat 502 Error de l'enlla de pujada al servidor 503 Servei temporalment no disponible 504 Temps esgotat en la porta d'enlla (gateway) 505 Versi de HTTP no suportada 506 Redirecci fallada 5xx [Errors diversos del servidor] xxx [Desconegut] analog-6.0/lang/cata.lng0000644000175000017500000003356510161303537015304 0ustar sret1sret100000000000000############################################################################### ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## ## Catalan version by Francesc Burrull i Mestres, 26 Jan 1999, 4 Dec 1999, ## 23 Jan 2001. e-mail: fburrull@mat.upc.es ## ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Diumenge Dilluns Dimarts Dimecres Dijous Divendres Dissabte Gen. Feb. Mar. Abr. Mai. Jun. Jul. Ago. Set. Oct. Nov. Des. ## Next some standard common words. ## Abbreviation for "week beginning" setm. d'inici any ## Quarter of a year trimestre mes dia dies h. minut minuts segon segons byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes peticio peticions data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data hora hora primera data primera hora ultima data ultima hora fitxer fitxers maquina maquines servidor virtual servidors virtuals directori directoris domini dominis organitzacio organitzacions extensio extensions URL URLs Navegador Navegadors Sistema Operatiu Sistemes Operatius ## (= operating system, operating systems) tamany busca terme busca termes lloc llocs usuari usuaris cod. d'estat cods. d'estats Estadistiques del Servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Informe General ## The time reports, plus "busiest" strings (at the bottom of each report) Informe anual Any de maxima ocupacio: Informe trimestral Trimestre de maxima ocupacio Informe Mensual Mes de trafic maxim: Informe Setmanal Setmana de trafic maxim: Resum Diari Informe Diari Dia de trafic maxim: Informe Horari Resum Horari Hora del resum setmanal Hora de trafic maxim: Informe de quart d'hora Resum de quart d'hora Quart d'hora de trafic maxim: Informe de cada cinc minutos Resum de cinc minuts Cinc minuts de trafic maxim: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Informe de Hosts host hosts m Informe de redireccions de maquina maquina maquines f Informe de fallades de maquina maquina maquines f Informe de Directoris directori directoris m Informe de Tipus de Fitxers extensio extensions f Informe de Peticions fitxer sol.licitat fitxers sol.licitats m Informe de redireccionaments fitxer fitxers m Informe de fallades en una peticio fitxer fitxers m Informe de Remitents URL remitent URLs remitents m Informe de llocs Remitents lloc remitent llocs remitents m Informe de remitents redireccionats URL remitent URLs remitents m Informe d'errors de remitents URL remitent URLs remitents m Informe de peticions buscades peticio peticions m Informe de paraules buscades paraula buscada paraules buscades f Informe de peticions de cerques internes cerca cerques f Informe de paraules de cerques internes cerca paraula cerca paraules f Informe de servidors virtuals servidor virtual servidors virtuals m Informe de redireccions de maquines virtuals maquina virtual maquines virtuals f Informe de fallades de maquines virtuals maquina virtual maquines virtuals f Informe d'usuaris usuari usuaris m Informe de redireccions d'usuaris usuari usuaris m Informe d'acces d'usuaris usuari usuaris m Resum de Navegadors navegador navegadors m Informe de Navegadors navegador navegadors m Informe de sistema operatiu sistema operatiu sistemes operatius m Informe de Dominis domini dominis m Informe d'organitzacions organitzacio organitzacions m Informe de codis d'estat codi d'estat codis d'estat m Informe del temps de proces Informe del tamany de fitxers ## Used at the bottom of the report Aquesta analisi estadistica l'ha generada Temps d'execucio Menys de 1 ## Used in the time reports Cada unitat representa o una fraccio peticio d'una pagina peticions de pagines ## Used at the bottom of each non-time report: need m, f & n genders no llistats no llistades * ## Used on the pie charts: again need m, f & n genders Altre Altra * ## Used at the top of the report Dia i hora de l'inicialitzacio: Analisi de peticions des del fins al ## Used in the General Summary Peticions exitoses Promig de peticions exitoses per dia Peticions exitoses per pagina Promig de peticions exitoses per pagina per dia Linies sense codi d'estat en el fitxer log Peticions fallades Peticions de redireccionament Peticions amb codi d'estat informatiu Fitxers diferents sol.licitats Maquines diferents ateses Linies invalides en el fitxer log Entrades no sol.licitades en el fitxer log Transferencia total Promig de transferencia per dia Les imatges en parentesi es refereixen als 7 dies al ultims 7 dies Anar a Inici ## Some special phrases for particular reports. [adre(cs)a numerica no resolta] [domini no facilitat] [domini desconegut] [directori arrel] [sense directori] [sense extensio] [directoris] Windows desconegut Altres Unix Robots S.O. desconegut ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) Num. pet. pet. 7 dies %pet. % pet. 7 dies Pags. pags. 7 dies %Pags. % pags. 7 dies bytes ?bytes bytes 7 dies ?bytes 7 dies %bytes % bytes 7 dies num. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Fent llistat dels primers %s Fent llistat de las primeres %s * Fent llistat de los %d primers %s Fent llistat de les %d primeres %s * Fent llistat dels %s Fent llistat de les %s * ## "by" in the phrase "listing the top 3 files BY number of requests" per ## All requests WITH AT LEAST 10 requests amb almenys ## Different ways of doing floors peticio en els ultims 7 dies peticions en els ultims 7 dies peticio d'una pagina en els ultims 7 dies peticions de pagines en els ultims 7 dies peticio redireccionada peticions redireccionades peticio redireccionada en els ultims 7 dies peticions redireccionada en els ultims 7 dies peticio fallada peticions fallades peticio fallada en els ultims 7 dies peticions fallades en els ultims 7 dies % del trafic en els ultims 7 dies % del trafic % del maxim volum de trafic % del maxim volum de trafic en els ultims 7 dies byte de trafic bytes de trafic ## ?bytes represents kbytes, Mbytes etc. ?bytes de trafic byte de trafic en els ultims 7 dies bytes de trafic en els ultims 7 dies ?bytes de trafic en els ultims 7 dies sol.licitat des de amb una sol.licitut redireccionada des de amb una sol.licitut fallada des de amb primera peticio des de amb primera peticio redireccionada des de amb primera peticio fallada des de ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenats por ordenades per * ## Used at the top of each report Aquest informe conte dades de ## Used in pie charts Les porcions estan dibuixades per ## different ways of sorting quantitat de trafic quantitat de trafic en els ultims 7 dies % de peticions % de peticions en els ultims 7 dies % del nombre maxim de peticions % del nombre maxim de peticions en els ultims 7 dies nombre de peticions nombre de peticions en els ultims 7 dies % de peticions de pagines % de peticions de pagines en els ultims 7 dies % del nombre maxim de peticions de pagines % del nombre maxim de peticions de pagines en els ultims 7 dies nombre de peticions de pagines nombre de peticions de pagines en els ultims 7 dies % de peticions redireccionades % de peticions redireccionades en els ultims 7 dies % del nombre maxim de peticions redireccionades % del nombre maxim de peticions redireccionades en els ultims 7 dies nombre de peticions redireccionades nombre de peticions redireccionades en els ultims 7 dies % de peticions fallades % de peticions fallades en els ultims 7 dies % del nombre maxim de peticions fallades % del nombre maxim de peticions fallades en els ultims 7 dies nombre de peticions fallades nombre de peticions fallades en els ultims 7 dies hora de la ultima peticio hora de la ultima peticio redireccionada hora de la ultima peticio fallada hora de la primera peticio hora de la primera peticio redireccionada hora de la primera peticio fallada ## 3 other ways of sorting in m, f, & n per ordre alfabetic per ordre alfabetic * per ordre numeric per ordre numeric * desordenats desordenades * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%Y ## In Daily Summary %w ## In Hourly Report %d/%m/%Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%Y ## The date & time (D) column in non-time reports %d/%m/%Y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%Y a les %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continua amb la peticio 101 Canviant protocols 1xx [Informacio miscel.lania] 200 Be 201 Creat 202 Acceptat per futur processat 203 Informacio no autoritativa 204 Be, pero res a enviar 205 Reset del document 206 Contingut parcial 2xx Esdeveniments diversos 300 Multiples documents disponibles 301 El document ha canviat de lloc de manera permanent 302 El document es en un altre lloc 303 Vegeu un altre document 304 No modificat des de l'ultima descarrega 305 Utilitzeu proxy 306 Canvia proxy 307 El document ha canviat de lloc de manera temporal 3xx [Redireccions diverses] 400 Peticio invalida 401 Cal autentificacio 402 Cal fer el pagament 403 Acces prohibit 404 Document no trobat 405 Metode no permes 406 Document inacceptable pel client 407 Cal autentificacio del proxy 408 Temps de peticio esgotat 409 Conflicte entre la peticio i l'estat del recurs 410 Document desaparegut de manera permanent 411 Cal la longitud 412 Precondicio fallada 413 Peticio massa llarga 414 Nom de fitxer sol.licitat massa llarg 415 Tipus de medi no suportat 416 Rang sol.licitat invalid 417 Expectacio fallada 4xx [Errors diversos de client/usuari] 500 Error intern del servidor 501 Tipus sol.licitat no suportat 502 Error de l'enlla(cs) de pujada al servidor 503 Servei temporalment no disponible 504 Temps esgotat en la porta d'enlla(cs) (gateway) 505 Versio de HTTP no suportada 506 Redireccio fallada 5xx [Errors diversos del servidor] xxx [Desconegut] analog-6.0/lang/catadom.tab0000644000175000017500000001206610161303537015763 0ustar sret1sret100000000000000aero 2 Industria del Transport Aeri arpa 1 Arpanet (Agenc. de Invest. de Proj. Avanc.) biz 2 Negocis com 2 Comercial coop 2 Cooperatives edu 2 USA Educacional gov 2 USA Governamental info 2 Informacio int 2 Organitzacions Internacionals mil 2 USA Militar museum 2 Museus name 3 Persones net 2 XARXA (Network) org 2 Organitzacions pro 3 Professionals ac 1 Illa d'Ascensio ad 2 Andorra ae 3 Emirats Arabs Units af 1 Afganistan ag 2 Antiga i Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antillas Holandeses ao 1 Angola aq 1 Antartida ar 3 Argentina as 1 Samoa America at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijan ba 3 Bosnia-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgica bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrein bi 1 Burundi bj 1 Benin bm 1 Bermudas bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brasil bs 1 Bahamas bt 1 Bhutan bv 1 Illes de Bouvet bw 1 Botswana by 1 Bielorussia bz 1 Belice ca 3 Canada cc 1 Illes Cocos (Keeling Islands) cd 1 Republica Democratica del Congo cf 1 Republica Centreafricana cg 1 Congo ch 2 Suiza ci 1 Costa d'Ivory ck 1 Illes Cook cl 2 Chile cm 1 Camerun cn 3 China co 3 Colombia cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Illa de Nadal (Christmas Island) cy 3 Chipre cz 2 Republica Xeca de 2 Alemania dj 1 Djibouti dk 2 Dinamarca dm 2 Dominica do 3 Republica Dominicana dz 1 Argelia ec 3 Ecuador ee 2 Estonia eg 3 Egipte eh 1 Sahara Occidental er 1 Eritrea es 2 Espanya et 1 Etiopia fi 2 Finlandia fj 3 Fiji fk 1 Falkland Islands (Illes Malvinas) fm 1 Micronesia fo 1 Illes de Faroe fr 2 Franca fx 1 Franca (Territori Europeu) ga 1 Gabon gb 1 Gran Bretanya gd 1 Granada ge 1 Georgia gf 1 Guaiana Francesa gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenlandia gm 1 Gambia gn 1 Guinea gp 1 Guadelupe (Francesa) gq 1 Guinea Ecuatorial gr 2 Grecia gs 1 Illes S. Georgia & S. Sandwich gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Illes Heard y McDonald hn 2 Honduras hr 2 Croacia ht 1 Haiti hu 2 Hungria id 3 Indonesia ie 2 Irlanda il 3 Israel im 1 Illa de Man in 3 India io 1 Territori Britanic de l'Ocea Indic (British Indian Ocean Territory) iq 1 Iraq ir 1 Iran, Republica Islamica de is 2 Islandia it 2 Italia je 1 Jersey jm 3 Jamaica jo 3 Jorda (Jordania) jp 3 Japo ke 3 Kenya kg 1 Kyrgyzstan kh 1 Cambodia ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts & Nevis Anguilla kp 1 Corea del nord (PR Democratic de Corea) kr 3 Corea del sud (Republica de Corea) kw 3 Kuwait ky 1 Illes Caiman kz 1 Kazakhstan la 1 Laos (Rep. Dem. del poble Lao) lb 3 El Liba lc 1 Santa Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lithuania lu 2 Luxemburg lv 2 Latvia ly 1 Libia (Jamahiriya Arab Libi) ma 1 Marroc mc 2 Monaco md 1 Moldova (Republica de Moldova) mg 1 Madagascar mh 1 Illes Marshall mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macau mp 1 Illes Nortenyes de Mariana (Northern Mariana Islands) mq 1 Martinique (Francesa) mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Maurici mv 1 Maldives mw 1 Malawi mx 3 Mexic my 3 Malasia mz 1 Mozambic na 1 Namibia nc 1 Nueva Caledonia (Francesa) ne 1 Niger nf 1 Illa Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Holanda no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nova Zelanda om 1 Oman pa 3 Panama pe 3 Peru pf 1 Polinesia Francesa pg 3 Papua Nova Guinea ph 3 Filipinas pk 3 Pakistan pl 3 Polonia pm 1 Saint Pierre y Miquelon pn 1 Illa Pitcairn pr 1 Puerto Rico pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Rumania ru 2 Russia (Federacio Rusa) rw 1 Rwanda sa 3 Arabia Saudita sb 1 Illes Solomon sc 1 Seychelles sd 1 Sudan se 2 Suecia sg 3 Singapur sh 1 Santa Helena si 2 Elovenia sj 1 Illes Svalbard i Jan Mayen sk 2 Eslovaquia (Republica Eslovaca) sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Santo Tomas i Principe su 2 Unio Sovietica (Antiga URSS) sv 3 El Salvador sy 1 Siria sz 1 Swaziland tc 1 Illes Turcas i Caicos td 1 Chad tf 1 Territoris Francesos del Sud tg 1 Togo th 3 Tailandia tj 1 Tajikistan tk 1 Tokelau tl 1 Timor Oriental tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 Timor Oriental tr 3 Turquia tt 3 Trinidad y Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukrania ug 3 Uganda uk 3 Regne Unit um 1 USA Illes Remotes Menors (US Minor Outlying Islands) us 4 Estats Units uy 3 Uruguay uz 1 Uzbekistan va 1 Vatica vc 1 San Vincente i Granadinas ve 3 Venezuela vg 1 Illes Verges (Britaniques) vi 1 Illes Verges (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Illes Wallis i Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Yugoslavia za 3 Africa del Sud zm 1 Zambia zw 3 Zimbabwe analog-6.0/lang/catdom.tab0000644000175000017500000001206610161303537015622 0ustar sret1sret100000000000000aero 2 Indstria del Transport Aeri arpa 1 Arpanet (Agenc. de Invest. de Proj. Avan.) biz 2 Negocis com 2 Comercial coop 2 Cooperatives edu 2 USA Educacional gov 2 USA Governamental info 2 Informaci int 2 Organitzacions Internacionals mil 2 USA Militar museum 2 Museus name 3 Persones net 2 XARXA (Network) org 2 Organitzacions pro 3 Professionals ac 1 Illa d'Ascensi ad 2 Andorra ae 3 Emirats rabs Units af 1 Afganistan ag 2 Antiga i Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antillas Holandeses ao 1 Angola aq 1 Antrtida ar 3 Argentina as 1 Samoa Americ at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijan ba 3 Bosnia-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Blgica bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrein bi 1 Burundi bj 1 Benin bm 1 Bermudas bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brasil bs 1 Bahamas bt 1 Bhutan bv 1 Illes de Bouvet bw 1 Botswana by 1 Bielorussia bz 1 Belice ca 3 Canad cc 1 Illes Cocos (Keeling Islands) cd 1 Repblica Democratica del Congo cf 1 Repblica Centreafricana cg 1 Congo ch 2 Suiza ci 1 Costa d'Ivory ck 1 Illes Cook cl 2 Chile cm 1 Camern cn 3 China co 3 Colombia cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Illa de Nadal (Christmas Island) cy 3 Chipre cz 2 Repblica Xeca de 2 Alemania dj 1 Djibouti dk 2 Dinamarca dm 2 Dominica do 3 Repblica Dominicana dz 1 Argelia ec 3 Ecuador ee 2 Estonia eg 3 Egipte eh 1 Sahara Occidental er 1 Eritrea es 2 Espanya et 1 Etiopa fi 2 Finlandia fj 3 Fiji fk 1 Falkland Islands (Illes Malvinas) fm 1 Micronesia fo 1 Illes de Faroe fr 2 Frana fx 1 Frana (Territori Europeu) ga 1 Gabon gb 1 Gran Bretanya gd 1 Granada ge 1 Georgia gf 1 Guaiana Francesa gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenlandia gm 1 Gambia gn 1 Guinea gp 1 Guadelupe (Francesa) gq 1 Guinea Ecuatorial gr 2 Grecia gs 1 Illes S. Georgia & S. Sandwich gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Illes Heard y McDonald hn 2 Honduras hr 2 Croacia ht 1 Hait hu 2 Hungra id 3 Indonesia ie 2 Irlanda il 3 Israel im 1 Illa de Man in 3 India io 1 Territori Britnic de l'Oce Indic (British Indian Ocean Territory) iq 1 Iraq ir 1 Irn, Repblica Islmica de is 2 Islandia it 2 Italia je 1 Jersey jm 3 Jamaica jo 3 Jord (Jordania) jp 3 Jap ke 3 Kenya kg 1 Kyrgyzstan kh 1 Cambodia ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts & Nevis Anguilla kp 1 Corea del nord (PR Democrtic de Corea) kr 3 Corea del sud (Repblica de Corea) kw 3 Kuwait ky 1 Illes Caimn kz 1 Kazakhstan la 1 Laos (Rep. Dem. del poble Lao) lb 3 El Lba lc 1 Santa Luca li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lithuania lu 2 Luxemburg lv 2 Latvia ly 1 Libia (Jamahiriya Arab Libi) ma 1 Marroc mc 2 Mnaco md 1 Moldova (Repblica de Moldova) mg 1 Madagascar mh 1 Illes Marshall mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macau mp 1 Illes Nortenyes de Mariana (Northern Mariana Islands) mq 1 Martinique (Francesa) mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Maurici mv 1 Maldives mw 1 Malawi mx 3 Mxic my 3 Malasia mz 1 Mozambic na 1 Namibia nc 1 Nueva Caledonia (Francesa) ne 1 Niger nf 1 Illa Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Holanda no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nova Zelanda om 1 Omn pa 3 Panam pe 3 Per pf 1 Polinesia Francesa pg 3 Papua Nova Guinea ph 3 Filipinas pk 3 Pakistn pl 3 Polonia pm 1 Saint Pierre y Miquelon pn 1 Illa Pitcairn pr 1 Puerto Rico pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Rumana ru 2 Russia (Federaci Rusa) rw 1 Rwanda sa 3 Arabia Saudita sb 1 Illes Solomn sc 1 Seychelles sd 1 Sudan se 2 Suecia sg 3 Singapur sh 1 Santa Helena si 2 Elovenia sj 1 Illes Svalbard i Jan Mayen sk 2 Eslovaquia (Repblica Eslovaca) sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Santo Toms i Prncipe su 2 Uni Sovietica (Antiga URSS) sv 3 El Salvador sy 1 Siria sz 1 Swaziland tc 1 Illes Turcas i Caicos td 1 Chad tf 1 Territoris Francesos del Sud tg 1 Togo th 3 Tailandia tj 1 Tajikistan tk 1 Tokelau tl 1 Timor Oriental tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 Timor Oriental tr 3 Turquia tt 3 Trinidad y Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukrania ug 3 Uganda uk 3 Regne Unit um 1 USA Illes Remotes Menors (US Minor Outlying Islands) us 4 Estats Units uy 3 Uruguay uz 1 Uzbekistan va 1 Vatic vc 1 San Vincente i Granadinas ve 3 Venezuela vg 1 Illes Verges (Britniques) vi 1 Illes Verges (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Illes Wallis i Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Yugoslavia za 3 frica del Sud zm 1 Zambia zw 3 Zimbabwe analog-6.0/lang/cn.lng0000644000175000017500000002435510161303537014771 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ## *GB2312 ## Abbreviations for the day and month names. һ ܶ һ ʮ ʮһ ʮ ## Next some standard common words. ## Abbreviation for "week beginning" ÿ ## Quarter of a year Сʱ Byte Bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 ʱ ʱ ʱ ʱ Ŀ¼ Ŀ¼ ֯ ֯ չ չ URL URLs ϵͳ ϵͳ ## (= operating system, operating systems) С ָ վ վ ʹ ʹ ״̬ ״̬ Web Server ͳ: ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ܸҪ ## The time reports, plus "busiest" strings (at the bottom of each report) ÿ걨 ߷: ÿ ߷弾 ÿ± ߷: ÿܱ ߷: ʼ ÿձҪ ÿձ ߷: ÿСʱ ÿСʱҪ ÿСʱ ߷Сʱ: ÿ(15) ÿ(15)Ҫ ߷һ: ӱ ӱҪ ߷: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! n µ򱨸 n ʧܱ n Ŀ¼ Ŀ¼ Ŀ¼ n ļͱ չ չ n 󱨸 n µ򱨸 n ʧܱ n Դҳ URL URLs n Դվ վ վ n µ(Redirected Referrer) URL URLs n ʧ(Referrer) URL URLs n Ѱ n ֱ n ڲѰ n ڲֱ n n µ򱨸 n ʧܱ n ʹ߱ ʹ ʹ n ʹµ򱨸 ʹ ʹ n ʹʧܱ ʹ ʹ n Ҫ n n ϵͳ ϵͳ ϵͳ n 򱨸 n Դ֯λ ֯λ ֯λ n ״̬뱨 ״̬ ״̬ n ʱ䱨 С ## Used at the bottom of the report ͳԴ˲: ִʱ С1 ## Used in the time reports ÿλ δIJ ҳ ҳ ## Used at the bottom of each non-time report: need m, f & n genders * * ûг ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report ʼ ## Used in the General Summary ȫɹ ÿƽɹ ҳȫɹ ÿƽɹҳ ״̬ļ¼ ȫʧ ת ״̬ 첻ظ 첻ظ ļ¼ õļ¼ ܴ ƽÿ촫 ڵֵʾ ֱ ## Some special phrases for particular reports. [޷ĵַ] [] [δ֪] [Ŀ¼] [ûĿ¼] [չ] [Ŀ¼] δ֪ Windows Unix ҳ Robots δ֪IJϵͳ ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * г %s * * г %d %s * * г %s ## "by" in the phrase "listing the first 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests ## Different ways of doing floors ڵ ڵ ҳ ҳ µ µ µ µ ʧ ʧ ڵʧ ڵʧ % %ڵ % %ڵ (byte) (bytes) ## ?bytes represents kbytes, Mbytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days Դ µԴ ʧԴ һ һµ һʧ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * : ## Used at the top of each report ݱ ## Used in pie charts ͼλƸ: ## different ways of sorting ڵ % %ڵ % %ڵ ڵ %ҳ %ڶҳ %ҳ %ҳ ҳ ڶҳ %µ %µ %µ %µ µ µ %ʧ %ʧ %ʧ %ʧ ʧ ʧ ʱ תʱ ʧʱ һʱ һµʱ һʧʱ ## 3 other ways of sorting in m, f, & n * * ĸ˳ * * ִС * * δ ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y %H:%n ## "Program started at" and "Analysed requests from" %w, %m %D %Y %H:%n ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %H:%n-%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %H:%n-%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %m/%d/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %m/%d/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 101 תЭ 1xx [Ϣ] 200 ɹ 201 202 δ̽ 203 ȨϢ 204 ɹϢ 205 ļ 206 2xx [ֳɹ] 300 ļԤ 301 ļƶ 302 ļڱ 303 ļ 304 ϴμ޸ 305 ô 306 ת 307 ļʱƶ 3xx [ת] 400 ʧ 401 ҪȨ 402 Ҫ 403 ֹ 404 ļûҵ 405 406 Կͻ޿ɽļ 407 ҪȨ 408 ʱ 409 Դ״̬ͻ 410 ļʧ 411 Ҫ 412 ׼ʧ 413 414 ļ 415 ֵ֧ý 416 ΧϷ 417 Ԥʧ 4xx [ֿͻ/û] 500 ڲ 501 Ͳ֧ 502 η 503 ʱֹͣ 504 سʱ 505 HTTP汾֧ 506 תʧ 5xx [ַ] xxx [δ֪] analog-6.0/lang/cndesc.txt0000644000175000017500000000611710161303537015663 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report ⲿݵıΪλͳ. # Quarterly Report ⲿݵıԼΪλͳ. # Monthly Report ⲿݵıΪλͳ. # Weekly Report ⲿݵıΪλͳ. # Daily Report ⲿݵıΪλͳ. # Hourly Report ⲿݵıСʱΪλͳ. # Quarter-Hour Report ⲿݵıԿ(15)Ϊλͳ. # Five-Minute Report ⲿݵıΪλͳ. # Daily Summary ⲿݵı潫м¼ÿܸͳ. # Hourly Summary ⲿݵı潫м¼ÿСʱͳ. # Hour of the Week Summary ⲿݵı潫м¼ÿСʱͳ. # Quarter-Hour Summary ⲿݵı潫м¼ÿеÿ15ͳ. # Five-Minute Summary ⲿݵı潫м¼ÿеÿ5ͳ. # General Summary ⲿݵıʾͳϢ. # Request Report ⲿݵıгվϵĵ. # Redirection Report ⲿݵıг󱻵һĵ. (ͨɵԭ: Ŀ¼б/, ǿµ CGI ) # Failure Report ⲿݵıгʧܵļ, Ҳ. # File Type Report ⲿݵıгĵչ. # Directory Report ⲿݵıг󵵰Ŀ¼. (гĿ¼Ŀ¼ļ¼) # Host Report ⲿݵıгͳַ. # Host Redirection Report ⲿݵıгµַ. # Host Failure Report ⲿݵıгͳʧ. # Domain Report ⲿݵıгվηߵԴ. # Referrer Report ⲿݵıгվ. (Referrer, վڵҳλ, DZվаͼƬҳ) # Referring Site Report ⲿݵıгվڵͳ. # Redirected Referrer Report ⲿݵıгɱµԴ. # Failed Referrer Report ⲿݵıгվѲڵͳ. # Browser Report ⲿݵıгηʹõ. # Virtual Host Report ⲿݵıгļ¼ͳ. # Virtual Host Redirection Report ⲿݵıгµͳ. # Virtual Host Failure Report ⲿݵıгʧͳ. # User Report ⲿݵıгͳʹ(֤ cookie õ). # User Redirection Report ⲿݵıгµʹ. # User Failure Report ⲿݵıгͳʧʹ. # Organisation Report ⲿݵıгηߵַ֯. # Search Query Report ⲿݵıгηѰվʹõļ. # Search Word Report ⲿݵıгηѰվʹõļؼ. # Internal Search Query Report ⲿݵıгηվʹõļ. # Internal Search Word Report ⲿݵıгηվʹõļؼ. # Browser Summary ⲿݵıгηʹõͳ. # Operating System Report ⲿݵıгηʹõIJϵͳͳ. # File Size Report ⲿݵıгĵСͳ. # Status Code Report ⲿݵıг HTTP ״̬ͳ. # Processing Time Report ⲿݵıгɹʱ. analog-6.0/lang/cndom.tab0000644000175000017500000001705310161303537015454 0ustar sret1sret100000000000000aero 2 Air Transport Industry ҵ arpa 1 Arpanet biz 2 Businesses ҵ com 2 Commercial ҵ coop 2 Co-operatives (֯) edu 2 λ gov 2 λ info 2 Informational һϢ int 2 International Treaty Organizations ֯ mil 2 µλ museum 2 Museums ݵչ name 3 Individuals ʹ net 2 Network org 2 Ӫ֯ pro 3 Professionals רҵʿ ac 1 Ascension Island ɭ ad 2 Andorra ͹ ae 3 United Arab Emirates ϴ󹫹 af 1 Afghanistan ag 2 Antigua and Barbuda ؿͲ ai 1 Anguilla Ӣ al 1 Albania am 2 Armenia an 1 Netherlands Antilles ˹Ⱥ ao 1 Angola aq 1 Antartica ϼ ar 3 Argentina ͢ as 1 American Samoa Ħ at 3 Austria µ au 3 Australia Ĵ aw 1 Aruba ³͵ az 1 Azerbaijan Ȼ ba 3 Bosnia and Herzegovina -ȹά bb 2 Barbados ͱ bd 1 Bangladesh ϼ͹ be 2 Belgium ʱ bf 1 Burkina Faso Ƿ bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi ¡ bj 1 Benin bm 1 Bermuda ĽȺ bn 1 Brunei Darussalam bo 3 Bolivia ά br 3 Brazil bs 1 Bahamas ͹ bt 1 Bhutan bv 1 Bouvet Island bw 1 Botswana ǹ͹ by 1 Belarus ׶˹ bz 1 Belize ˹ ca 2 Canada ô cc 1 Cocos (Keeling) Islands ۿ˹Ⱥ cd 1 Democratic Republic of the Congo չ͹ cf 1 Central African Republic зǹ͹ cg 1 Republic of Congo չ ch 2 Switzerland ʿ ci 1 Ivory Coast (Cote d'Ivoire) ͹ ck 1 Cook Islands Ⱥ cl 2 Chile cm 1 Cameroon ¡ cn 3 China й co 3 Colombia ױ cr 3 Costa Rica ˹ cu 1 Cuba Ű cv 1 Cape Verde ά½ cx 1 Christmas Island ʥ cy 3 Cyprus ˹ cz 2 Czech Republic ݿ˹͹ de 2 Germany ¹ dj 1 Djibouti dk 2 Denmark dm 2 Dominica do 2 Dominican Republic ˹͹ dz 1 Algeria ec 3 Ecuador ϶ ee 2 Estonia ɳ eg 3 Egypt eh 1 Western Sahara er 1 Eritrea es 2 Spain et 1 Ethiopia fi 2 Finland fj 3 Fiji 쳼 fk 1 Falkland Islands (Malvina) ӢȺ fm 1 Federal State of Micronesia ܿ fo 1 Faroe Islands Ⱥ fr 2 France ga 1 Gabon gd 1 Grenada ɴ ge 1 Georgia gf 1 French Guiana gg 1 Guernsey Ӣ gh 3 Ghana gi 1 Gibraltar ֱ gl 1 Greenland gm 1 Gambia ʱ gn 1 Guinea gp 1 Guadeloupe (French) ϴ· gq 1 Equatorial Guinea gr 2 Greece ϣ gs 1 South Georgia and the South Sandwich Islands ǼȺ gt 3 Guatemala ϵ gu 1 Guam (USA) ص gw 1 Guinea-Bissau DZܹ͹ gy 1 Guyana hk 3 Hong Kong hm 1 Heard and McDonald Islands յȺ hn 2 Honduras 鶼˹ hr 2 Croatia (Hrvatske) ް ht 1 Haiti hu 2 Hungary id 3 Indonesia ӡ ie 2 Ireland il 3 Israel ɫ im 1 Isle of Man ǵ in 3 India ӡ io 1 British Indian Ocean Territory Ӣӡ iq 1 Iraq ir 1 Iran is 2 Iceland it 2 Italy je 1 Jersey Ӣ jm 3 Jamaica jo 3 Jordan Լ jp 3 Japan ձ ke 3 Kenya kg 1 Kyrgyzstan ˹ kh 1 Cambodia կ ki 1 Kiribati ˹͹ km 1 Comoros Ħ kn 1 Saint Kitts & Nevis ʥ˹รά˹ kp 1 North Korea (Democratic People's Republic of Korea) kr 3 South Korea (Republic of Korea) Ϻ kw 3 Kuwait ky 1 Cayman Islands Ⱥ kz 1 Kazakhstan la 1 Laos 弹 lb 3 Lebanon lc 1 Saint Lucia ʥ·ǵ li 2 Liechtenstein ֧˹ lk 1 Sri Lanka ˹ lr 1 Liberia ls 1 Lesotho lt 2 Lithuania lu 2 Luxembourg ¬ɭ lv 2 Latvia ά ly 1 Libya Arab Jamahiriya ma 1 Morocco Ħ mc 2 Monaco Ħɸ md 1 Moldova Ħά mg 1 Madagascar ˹ mh 1 Marshall Islands ܶȺ mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia ɹ mo 1 Macau mp 1 Northern Mariana Islands ﰲȺ mq 1 Martinique (French) ᵺ mr 1 Mauritania é ms 1 Montserrat ɫص mt 3 Malta mu 1 Mauritius ģ˹ mv 1 Maldives mw 1 Malawi mx 3 Mexico ī my 3 Malaysia mz 1 Mozambique Īȿ na 1 Namibia ױ nc 1 New Caledonia (French) ¿Ⱥ ne 1 Niger nf 1 Norfolk Island ŵ˵ ng 1 Nigeria μ ni 3 Nicaragua nl 2 Netherlands no 2 Norway Ų np 1 Nepal Ჴ nr 1 Nauru ŵ³ nu 2 Niue Ŧ nz 3 New Zealand Ŧ om 1 Oman pa 3 Panama pe 3 Peru ³ pf 1 Polynesia (French) pg 3 Papua New Guinea Ͳ¼ ph 3 Philippines ɱ pk 3 Pakistan ͻ˹̹ pl 3 Poland pm 1 Saint Pierre and Miquelon ʥƥ pn 1 Pitcairn Island Ƥؿ pr 1 Puerto Rico ps 1 Palestinian Territories ˹̹ pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion Island (French) ro 2 Romania ru 2 Russia ˹ rw 1 Rwanda ¬ sa 3 Saudi Arabia ɳذ sb 1 Solomon Islands Ⱥ sc 1 Seychelles ϯȺ sd 1 Sudan յ se 2 Sweden sg 3 Singapore ¼ sh 1 Saint Helena ʥõ si 2 Slovenia ˹ά sj 1 Svalbard and Jan Mayen Islands 䰶Ⱥ sk 2 Slovak Republic ˹工˹͹ sl 1 Sierra Leone ʨɽ sm 1 San Marino ʥŵ sn 1 Senegal ڼӶ so 1 Somalia sr 1 Suriname Ī st 1 Sao Tome and Principe ʥ sv 3 El Salvador ߶ sy 1 Syria Arab Republic sz 1 Swaziland ʷ߼ tc 1 Turks and Caicos Islands ˹˹Ⱥ td 1 Chad tf 1 French Southern Territories Ϸ tg 1 Togo th 3 Thailand ̩ tj 1 Tajikistan tk 1 Tokelau пȺ tl 1 East Timor tm 1 Turkmenistan tn 1 Tunisia ͻ to 1 Tonga tp 1 East Timor tr 3 Turkey tt 3 Trinidad and Tobago ǧб tv 1 Tuvalu ³Ⱥ tw 3 Taiwan ̨ tz 1 Tanzania ̹ ua 3 Ukraine ڿ ug 3 Uganda ڸɴ uk 3 United Kingdom Ӣ um 1 US Minor Outlying Islands ⵺ us 4 United States uy 3 Uruguay uz 1 Uzbekistan ȱ˹̹ va 1 Vatican City State ٸ vc 1 Saint Vincent & Grenadines ʥɭǶ ve 3 Venezuela ί vg 1 Virgin Islands (British) ӢάȺ vi 1 Virgin Islands (USA) άȺ vn 1 Vietnam Խ vu 1 Vanuatu ͼ͹ wf 1 Wallis and Futuna Islands ˹͸Ⱥ ws 1 Western Samoa Ħ ye 1 Yemen Ҷ yt 1 Mayotte Ħ yu 3 Yugoslavia ˹ za 3 South Africa Ϸ zm 1 Zambia б zr 1 Zaire zw 3 Zimbabwe analog-6.0/lang/cz.lng0000644000175000017500000003245010161303537015000 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Czech language files made by Jan Simek (Jan.Simek@email.cz) ## and Karel Fajkus (http://www.volny.cz/lomax/feedback.html) (v3 -> v4 -> v5). ## Any comments welcome ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. Ne Po t St t P So led no be dub kv er nc srp z j lis pro ## Next some standard common words. ## Abbreviation for "week beginning" tden za. rok ## Quarter of a year tvrtlet msc den dn h. minuta minuty sekunda sekund byte byt ## ?bytes represents kbytes, Mbytes etc. ?byt poadavek poadavk datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum as as prvn datum prvn as naposledy naposledy soubor soubor pota (host) pota (hosts) virtuln server virtuln servery adres adres domna domn organizace organizac ppona ppon URL URL prohle prohle operan systm operanch systm ## (= operating system, operating systems) objem hledan slovo hledanch slov server server uivatel uivatel kd kd Statistiky web serveru ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Celkov pehled ## The time reports, plus "busiest" strings (at the bottom of each report) Ron pehled Nejvytenj rok: tvrtletn pehled Nejvytenj tvrtlet: Msn pehled Nejvytenj msc: Tdenn pehled Nejvytenj tden: tden zanajc Denn souhrn Denn pehled Nejvytenj den: Hodinov pehled Hodinov souhrn Souhrn tdne po hodinch Nejvytenj hodina: tvrthodinov pehled tvrthodinov souhrn Nejvytenj tvrthodinka: Ptiminutov pehled Ptiminutov souhrn Nejvytenj ptiminutovka: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Pehled pota pota (host) pota (hosts) n Pehled pesmrovanch pota pota (host) pota (hosts) n Pehled chybujcch pota pota (host) pota (hosts) n Pehled adres adres adres n Pehled typ soubor ppona ppon n Pehled poadavk poadovan soubor poadovanch soubor n Pehled pesmrovanch soubor pesmrovan soubor pesmrovanch soubor n Pehled chybnch poadavk chybn poadavek chybnch poadavk n Pehled odkazujcch strnek odkazujc URL odkazujcch URL n Pehled odkazujcch server odkazujc server odkazujcch server n Pehled pesmrovanch odkazovanch strnek odkazovan URL odkazovanch URL n Pehled chybnch odkaz odkazovan URL odkazovanch URL n Pehled hledanch dotaz dotaz dotaz n Pehled hledanch slov slovo dotaz slov dotaz n Pehled intern hledanch dotaz dotaz dotaz n Pehled intern hledanch slov slovo dotaz slov dotaz n Pehled virtulnch server virtuln server virtulnch server n Pehled pesmrovanch virtulnch server virtuln server virtulnch server n Pehled chybujcch virtulnch server virtuln server virtulnch server n Pehled uivatel uivatel uivatel n Pehled pesmrovanch uivatel uivatel uivatel n Pehled chybujcch uivatel uivatel uivatel n Souhrn prohle prohle prohle n Pehled prohle prohle prohle n Pehled operanch systm operan systm operanch systm n Pehled domn domna domn n Pehled organizac organizace organizac n Pehled nvratovch kd nvratov kd nvratovch kd n Pehled asu zpracovn Pehled velikosti soubor ## Used at the bottom of the report Tuto analzu vytvoil as zpracovn Mn ne 1 ## Used in the time reports Kad dlek pedstavuje (pp. jejich st) poadavek na strnku poadavk na strnky ## Used at the bottom of each non-time report: need m, f & n genders neuveden neuvedena neuvedeno ## Used on the pie charts: again need m, f & n genders ostatn ostatn ostatn ## Used at the top of the report Program byl sputn: Analza poadavk od do ## Used in the General Summary spn poadavky Denn prmr spnch poadavk spn poadavky na strnky Denn prmr spnch poadavk na strnky Poet zznam v logu bez nvratovho kdu Chybn poadavky Pesmrovan poadavky Poadavky informativnho charakteru (kdy 201-206) Rznch poadovanch soubor Rznch obslouench pota (hosts) Pokozen zznamy v logu Nechtn zznamy v logu Objem penesench dat Denn prmr penesench dat Hodnoty v zvorkch odpovdaj 7 dnm ped poslednm 7 dnm Pesun na Zatek ## Some special phrases for particular reports. [nerozlien numerick adresy] [domna neudna] [neznm domna] [koenov adres] [dn adres] [dn ppona] [adrese] Neznm Windows Jin Unix Roboty OS neznm ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) poadavk poadavk za 7 dn % poadavk % poadavk za 7 dn stran stran za 7 dn % stran % stran za 7 dn byt ?byt byt za 7 dn ?byt za 7 dn % byt % byt za 7 dn poad ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Vpis prvnch %s * * Vpis prvnch %d %s * * Vpis %s ## "by" in the phrase "listing the top 3 files BY number of requests" podle ## All requests WITH AT LEAST 10 requests s alespo ## Different ways of doing floors poadavek za poslednch 7 dn poadavk za poslednch 7 dn poadavek na strnku za poslednch 7 dn poadavk na strnky za poslednch 7 dn pesmrovan poadavek pesmrovanch poadavk pesmrovan poadavek za poslednch 7 dn pesmrovanch poadavk za poslednch 7 dn chybn poadavek chybnch poadavk chybn poadavek za poslednch 7 dn chybnch poadavk za poslednch 7 dn % provozu % provozu za poslednch 7 dn % maxima provozu % maxima provozu za poslednch 7 dn bytu provozu byt provozu ## ?bytes represents kbytes, Mbytes etc. ?byt provozu bytu provozu za poslednch 7 dn byt provozu za poslednch 7 dn ?byt provozu za poslednch 7 dn poadovno od s pesmrovanm poadavkem od s chybnm poadavkem od s prvnm poadavkem od s prvnm pesmrovanm poadavkem od s prvnm chybnm poadavkem od ## Now "sorted by": again, in m, f & n (only needed in plural though) setdn podle setdna podle setdno podle ## Used at the top of each report Tento pehled obsahuje data z ## Used in pie charts Vsee jsou vykresleny podle ## different ways of sorting objemu penesench dat objemu penesench dat za poslednch 7 dn % poadavk % poadavk za poslednch 7 dn % maximlnho potu poadavk % maximlnho potu poadavk za poslednch 7 dn potu poadavk potu poadavk za poslednch 7 dn % poadavk na strnky % poadavk na strnky za poslednch 7 dn % maximlnho potu poadavk na strnky % maximlnho potu poadavk na strnky za poslednch 7 dn potu poadavk na strnky potu poadavk na strnky za poslednch 7 dn % pesmrovanch poadavk % pesmrovanch poadavk za poslednch 7 dn % maximlnho potu pesmrovanch poadavk % maximlnho potu pesmrovanch poadavk za poslednch 7 dn potu pesmrovanch poadavk potu pesmrovanch poadavk za poslednch 7 dn % chybnch poadavk % chybnch poadavk za poslednch 7 dn % maximlnho potu chybnch poadavk % maximlnho potu chybnch poadavk za poslednch 7 dn potu chybnch poadavk potu chybnch poadavk za poslednch 7 dn asu poslednho poadavku asu poslednho pesmrovanho poadavku asu poslednho chybnho poadavku asu prvnho poadavku asu prvnho pesmrovanho poadavku asu prvnho chybnho poadavku ## 3 other ways of sorting in m, f, & n setdn abecedn setdna abecedn setdno abecedn setdn numericky setdna numericky setdno numericky nesetdn nesetdna nesetdno ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m %Y %H:%n ## "Program started at" and "Analysed requests from" %w %D.%m %Y %H:%n ## In Daily Report %d.%m '%y ## In Daily Summary %w ## In Hourly Report %d.%m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d.%m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m '%y ## The date & time (D) column in non-time reports %d.%m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Rzn informan] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Rzn spn] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Rzn pesmrovn] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Rzn klientsk/uivatelsk chyby] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Rzn chyby serveru] xxx [Neznm] analog-6.0/lang/cz1.lng0000644000175000017500000003245210161303537015063 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Czech language files made by Jan Simek (Jan.Simek@email.cz) ## and Karel Fajkus (http://www.volny.cz/lomax/feedback.html) (v3 -> v4 -> v5). ## Any comments welcome ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1250 ## Abbreviations for the day and month names. Ne Po t St t P So led no be dub kv er nc srp z j lis pro ## Next some standard common words. ## Abbreviation for "week beginning" tden za. rok ## Quarter of a year tvrtlet msc den dn h. minuta minuty sekunda sekund byte byt ## ?bytes represents kbytes, Mbytes etc. ?byt poadavek poadavk datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum as as prvn datum prvn as naposledy naposledy soubor soubor pota (host) pota (hosts) virtuln server virtuln servery adres adres domna domn organizace organizac ppona ppon URL URL prohle prohle operan systm operanch systm ## (= operating system, operating systems) objem hledan slovo hledanch slov server server uivatel uivatel kd kd Statistiky web serveru ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Celkov pehled ## The time reports, plus "busiest" strings (at the bottom of each report) Ron pehled Nejvytenj rok: tvrtletn pehled Nejvytenj tvrtlet: Msn pehled Nejvytenj msc: Tdenn pehled Nejvytenj tden: tden zanajc Denn souhrn Denn pehled Nejvytenj den: Hodinov pehled Hodinov souhrn Souhrn tdne po hodinch Nejvytenj hodina: tvrthodinov pehled tvrthodinov souhrn Nejvytenj tvrthodinka: Ptiminutov pehled Ptiminutov souhrn Nejvytenj ptiminutovka: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Pehled pota pota (host) pota (hosts) n Pehled pesmrovanch pota pota (host) pota (hosts) n Pehled chybujcch pota pota (host) pota (hosts) n Pehled adres adres adres n Pehled typ soubor ppona ppon n Pehled poadavk poadovan soubor poadovanch soubor n Pehled pesmrovanch soubor pesmrovan soubor pesmrovanch soubor n Pehled chybnch poadavk chybn poadavek chybnch poadavk n Pehled odkazujcch strnek odkazujc URL odkazujcch URL n Pehled odkazujcch server odkazujc server odkazujcch server n Pehled pesmrovanch odkazovanch strnek odkazovan URL odkazovanch URL n Pehled chybnch odkaz odkazovan URL odkazovanch URL n Pehled hledanch dotaz dotaz dotaz n Pehled hledanch slov slovo dotaz slov dotaz n Pehled intern hledanch dotaz dotaz dotaz n Pehled intern hledanch slov slovo dotaz slov dotaz n Pehled virtulnch server virtuln server virtulnch server n Pehled pesmrovanch virtulnch server virtuln server virtulnch server n Pehled chybujcch virtulnch server virtuln server virtulnch server n Pehled uivatel uivatel uivatel n Pehled pesmrovanch uivatel uivatel uivatel n Pehled chybujcch uivatel uivatel uivatel n Souhrn prohle prohle prohle n Pehled prohle prohle prohle n Pehled operanch systm operan systm operanch systm n Pehled domn domna domn n Pehled organizac organizace organizac n Pehled nvratovch kd nvratov kd nvratovch kd n Pehled asu zpracovn Pehled velikosti soubor ## Used at the bottom of the report Tuto analzu vytvoil as zpracovn Mn ne 1 ## Used in the time reports Kad dlek pedstavuje (pp. jejich st) poadavek na strnku poadavk na strnky ## Used at the bottom of each non-time report: need m, f & n genders neuveden neuvedena neuvedeno ## Used on the pie charts: again need m, f & n genders ostatn ostatn ostatn ## Used at the top of the report Program byl sputn: Analza poadavk od do ## Used in the General Summary spn poadavky Denn prmr spnch poadavk spn poadavky na strnky Denn prmr spnch poadavk na strnky Poet zznam v logu bez nvratovho kdu Chybn poadavky Pesmrovan poadavky Poadavky informativnho charakteru (kdy 201-206) Rznch poadovanch soubor Rznch obslouench pota (hosts) Pokozen zznamy v logu Nechtn zznamy v logu Objem penesench dat Denn prmr penesench dat Hodnoty v zvorkch odpovdaj 7 dnm ped poslednm 7 dnm Pesun na Zatek ## Some special phrases for particular reports. [nerozlien numerick adresy] [domna neudna] [neznm domna] [koenov adres] [dn adres] [dn ppona] [adrese] Neznm Windows Jin Unix Roboty OS neznm ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) poadavk poadavk za 7 dn % poadavk % poadavk za 7 dn stran stran za 7 dn % stran % stran za 7 dn byt ?byt byt za 7 dn ?byt za 7 dn % byt % byt za 7 dn poad ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Vpis prvnch %s * * Vpis prvnch %d %s * * Vpis %s ## "by" in the phrase "listing the top 3 files BY number of requests" podle ## All requests WITH AT LEAST 10 requests s alespo ## Different ways of doing floors poadavek za poslednch 7 dn poadavk za poslednch 7 dn poadavek na strnku za poslednch 7 dn poadavk na strnky za poslednch 7 dn pesmrovan poadavek pesmrovanch poadavk pesmrovan poadavek za poslednch 7 dn pesmrovanch poadavk za poslednch 7 dn chybn poadavek chybnch poadavk chybn poadavek za poslednch 7 dn chybnch poadavk za poslednch 7 dn % provozu % provozu za poslednch 7 dn % maxima provozu % maxima provozu za poslednch 7 dn bytu provozu byt provozu ## ?bytes represents kbytes, Mbytes etc. ?byt provozu bytu provozu za poslednch 7 dn byt provozu za poslednch 7 dn ?byt provozu za poslednch 7 dn poadovno od s pesmrovanm poadavkem od s chybnm poadavkem od s prvnm poadavkem od s prvnm pesmrovanm poadavkem od s prvnm chybnm poadavkem od ## Now "sorted by": again, in m, f & n (only needed in plural though) setdn podle setdna podle setdno podle ## Used at the top of each report Tento pehled obsahuje data z ## Used in pie charts Vsee jsou vykresleny podle ## different ways of sorting objemu penesench dat objemu penesench dat za poslednch 7 dn % poadavk % poadavk za poslednch 7 dn % maximlnho potu poadavk % maximlnho potu poadavk za poslednch 7 dn potu poadavk potu poadavk za poslednch 7 dn % poadavk na strnky % poadavk na strnky za poslednch 7 dn % maximlnho potu poadavk na strnky % maximlnho potu poadavk na strnky za poslednch 7 dn potu poadavk na strnky potu poadavk na strnky za poslednch 7 dn % pesmrovanch poadavk % pesmrovanch poadavk za poslednch 7 dn % maximlnho potu pesmrovanch poadavk % maximlnho potu pesmrovanch poadavk za poslednch 7 dn potu pesmrovanch poadavk potu pesmrovanch poadavk za poslednch 7 dn % chybnch poadavk % chybnch poadavk za poslednch 7 dn % maximlnho potu chybnch poadavk % maximlnho potu chybnch poadavk za poslednch 7 dn potu chybnch poadavk potu chybnch poadavk za poslednch 7 dn asu poslednho poadavku asu poslednho pesmrovanho poadavku asu poslednho chybnho poadavku asu prvnho poadavku asu prvnho pesmrovanho poadavku asu prvnho chybnho poadavku ## 3 other ways of sorting in m, f, & n setdn abecedn setdna abecedn setdno abecedn setdn numericky setdna numericky setdno numericky nesetdn nesetdna nesetdno ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m %Y %H:%n ## "Program started at" and "Analysed requests from" %w %D.%m %Y %H:%n ## In Daily Report %d.%m '%y ## In Daily Summary %w ## In Hourly Report %d.%m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d.%m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m '%y ## The date & time (D) column in non-time reports %d.%m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Rzn informan] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Rzn spn] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Rzn pesmrovn] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Rzn klientsk/uivatelsk chyby] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Rzn chyby serveru] xxx [Neznm] analog-6.0/lang/cz1a.lng0000644000175000017500000003244610161303537015227 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Czech language files made by Jan Simek (Jan.Simek@email.cz) ## and Karel Fajkus (http://www.volny.cz/lomax/feedback.html) (v3 -> v4 -> v5). ## Any comments welcome ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Ne Po Ut St Ct Pa So led uno bre dub kve cer cnc srp zar rij lis pro ## Next some standard common words. ## Abbreviation for "week beginning" tyden zac. rok ## Quarter of a year ctvrtleti mesic den dni h. minuta minuty sekunda sekund byte bytu ## ?bytes represents kbytes, Mbytes etc. ?bytu pozadavek pozadavku datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum cas cas prvni datum prvni cas naposledy naposledy soubor souboru pocitac (host) pocitacu (hosts) virtualni server virtualni servery adresar adresaru domena domen organizace organizaci pripona pripon URL URL prohlizec prohlizecu operacni system operacnich systemu ## (= operating system, operating systems) objem hledane slovo hledanych slov server serveru uzivatel uzivatelu kod kodu Statistiky web serveru ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Celkovy prehled ## The time reports, plus "busiest" strings (at the bottom of each report) Rocni prehled Nejvytizenejsi rok: Ctvrtletni prehled Nejvytizenejsi ctvrtleti: Mesicni prehled Nejvytizenejsi mesic: Tydenni prehled Nejvytizenejsi tyden: tyden zacinajici Denni souhrn Denni prehled Nejvytizenejsi den: Hodinovy prehled Hodinovy souhrn Souhrn tydne po hodinach Nejvytizenejsi hodina: Ctvrthodinovy prehled Ctvrthodinovy souhrn Nejvytizenejsi ctvrthodinka: Petiminutovy prehled Petiminutovy souhrn Nejvytizenejsi petiminutovka: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Prehled pocitacu pocitac (host) pocitacu (hosts) n Prehled presmerovanych pocitacu pocitac (host) pocitacu (hosts) n Prehled chybujicich pocitacu pocitac (host) pocitacu (hosts) n Prehled adresaru adresar adresaru n Prehled typu souboru pripona pripon n Prehled pozadavku pozadovany soubor pozadovanych souboru n Prehled presmerovanych souboru presmerovany soubor presmerovanych souboru n Prehled chybnych pozadavku chybny pozadavek chybnych pozadavku n Prehled odkazujicich stranek odkazujici URL odkazujicich URL n Prehled odkazujicich serveru odkazujici server odkazujicich serveru n Prehled presmerovanych odkazovanych stranek odkazovane URL odkazovanych URL n Prehled chybnych odkazu odkazovane URL odkazovanych URL n Prehled hledanych dotazu dotaz dotazu n Prehled hledanych slov slovo dotazu slov dotazu n Prehled interne hledanych dotazu dotaz dotazu n Prehled interne hledanych slov slovo dotazu slov dotazu n Prehled virtualnich serveru virtualni server virtualnich serveru n Prehled presmerovanych virtualnich serveru virtualni server virtualnich serveru n Prehled chybujicich virtualnich serveru virtualni server virtualnich serveru n Prehled uzivatelu uzivatel uzivatelu n Prehled presmerovanych uzivatelu uzivatel uzivatelu n Prehled chybujicich uzivatelu uzivatel uzivatelu n Souhrn prohlizecu prohlizec prohlizecu n Prehled prohlizecu prohlizec prohlizecu n Prehled operacnich systemu operacni system operacnich systemu n Prehled domen domena domen n Prehled organizaci organizace organizaci n Prehled navratovych kodu navratovy kod navratovych kodu n Prehled casu zpracovani Prehled velikosti souboru ## Used at the bottom of the report Tuto analyzu vytvoril Cas zpracovani Mene nez 1 ## Used in the time reports Kazdy dilek predstavuje (prip. jejich cast) pozadavek na stranku pozadavku na stranky ## Used at the bottom of each non-time report: need m, f & n genders neuveden neuvedena neuvedeno ## Used on the pie charts: again need m, f & n genders ostatni ostatni ostatni ## Used at the top of the report Program byl spusten: Analyza pozadavku od do ## Used in the General Summary Uspesne pozadavky Denni prumer uspesnych pozadavku Uspesne pozadavky na stranky Denni prumer uspesnych pozadavku na stranky Pocet zaznamu v logu bez navratoveho kodu Chybne pozadavky Presmerovane pozadavky Pozadavky informativniho charakteru (kody 201-206) Ruznych pozadovanych souboru Ruznych obslouzenych pocitacu (hosts) Poskozene zaznamy v logu Nechtene zaznamy v logu Objem prenesenych dat Denni prumer prenesenych dat Hodnoty v zavorkach odpovidaji 7 dnum pred poslednim 7 dnum Presun na Zacatek ## Some special phrases for particular reports. [nerozlisene numericke adresy] [domena neudana] [neznama domena] [korenovy adresar] [zadny adresar] [zadna pripona] [adresare] Nezname Windows Jiny Unix Roboty OS neznamy ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) pozadavku pozadavku za 7 dni % pozadavku % pozadavku za 7 dni stran stran za 7 dni % stran % stran za 7 dni bytu ?bytu bytu za 7 dni ?bytu za 7 dni % bytu % bytu za 7 dni poradi ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Vypis prvnich %s * * Vypis prvnich %d %s * * Vypis %s ## "by" in the phrase "listing the top 3 files BY number of requests" podle ## All requests WITH AT LEAST 10 requests s alespon ## Different ways of doing floors pozadavek za poslednich 7 dni pozadavku za poslednich 7 dni pozadavek na stranku za poslednich 7 dni pozadavku na stranky za poslednich 7 dni presmerovany pozadavek presmerovanych pozadavku presmerovany pozadavek za poslednich 7 dni presmerovanych pozadavku za poslednich 7 dni chybny pozadavek chybnych pozadavku chybny pozadavek za poslednich 7 dni chybnych pozadavku za poslednich 7 dni % provozu % provozu za poslednich 7 dni % maxima provozu % maxima provozu za poslednich 7 dni bytu provozu bytu provozu ## ?bytes represents kbytes, Mbytes etc. ?bytu provozu bytu provozu za poslednich 7 dni bytu provozu za poslednich 7 dni ?bytu provozu za poslednich 7 dni pozadovano od s presmerovanym pozadavkem od s chybnym pozadavkem od s prvnim pozadavkem od s prvnim presmerovanym pozadavkem od s prvnim chybnym pozadavkem od ## Now "sorted by": again, in m, f & n (only needed in plural though) setriden podle setridena podle setrideno podle ## Used at the top of each report Tento prehled obsahuje data z ## Used in pie charts Vysece jsou vykresleny podle ## different ways of sorting objemu prenesenych dat objemu prenesenych dat za poslednich 7 dni % pozadavku % pozadavku za poslednich 7 dni % maximalniho poctu pozadavku % maximalniho poctu pozadavku za poslednich 7 dni poctu pozadavku poctu pozadavku za poslednich 7 dni % pozadavku na stranky % pozadavku na stranky za poslednich 7 dni % maximalniho poctu pozadavku na stranky % maximalniho poctu pozadavku na stranky za poslednich 7 dni poctu pozadavku na stranky poctu pozadavku na stranky za poslednich 7 dni % presmerovanych pozadavku % presmerovanych pozadavku za poslednich 7 dni % maximalniho poctu presmerovanych pozadavku % maximalniho poctu presmerovanych pozadavku za poslednich 7 dni poctu presmerovanych pozadavku poctu presmerovanych pozadavku za poslednich 7 dni % chybnych pozadavku % chybnych pozadavku za poslednich 7 dni % maximalniho poctu chybnych pozadavku % maximalniho poctu chybnych pozadavku za poslednich 7 dni poctu chybnych pozadavku poctu chybnych pozadavku za poslednich 7 dni casu posledniho pozadavku casu posledniho presmerovaneho pozadavku casu posledniho chybneho pozadavku casu prvniho pozadavku casu prvniho presmerovaneho pozadavku casu prvniho chybneho pozadavku ## 3 other ways of sorting in m, f, & n setriden abecedne setridena abecedne setrideno abecedne setriden numericky setridena numericky setrideno numericky nesetriden nesetridena nesetrideno ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m %Y %H:%n ## "Program started at" and "Analysed requests from" %w %D.%m %Y %H:%n ## In Daily Report %d.%m '%y ## In Daily Summary %w ## In Hourly Report %d.%m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d.%m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m '%y ## The date & time (D) column in non-time reports %d.%m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Ruzne informacni] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Ruzne uspesne] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Ruzna presmerovani] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Ruzne klientske/uzivatelske chyby] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Ruzne chyby serveru] xxx [Nezname] analog-6.0/lang/cza.lng0000644000175000017500000003244610161303537015146 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Czech language files made by Jan Simek (Jan.Simek@email.cz) ## and Karel Fajkus (http://www.volny.cz/lomax/feedback.html) (v3 -> v4 -> v5). ## Any comments welcome ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Ne Po Ut St Ct Pa So led uno bre dub kve cer cnc srp zar rij lis pro ## Next some standard common words. ## Abbreviation for "week beginning" tyden zac. rok ## Quarter of a year ctvrtleti mesic den dni h. minuta minuty sekunda sekund byte bytu ## ?bytes represents kbytes, Mbytes etc. ?bytu pozadavek pozadavku datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum cas cas prvni datum prvni cas naposledy naposledy soubor souboru pocitac (host) pocitacu (hosts) virtualni server virtualni servery adresar adresaru domena domen organizace organizaci pripona pripon URL URL prohlizec prohlizecu operacni system operacnich systemu ## (= operating system, operating systems) objem hledane slovo hledanych slov server serveru uzivatel uzivatelu kod kodu Statistiky web serveru ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Celkovy prehled ## The time reports, plus "busiest" strings (at the bottom of each report) Rocni prehled Nejvytizenejsi rok: Ctvrtletni prehled Nejvytizenejsi ctvrtleti: Mesicni prehled Nejvytizenejsi mesic: Tydenni prehled Nejvytizenejsi tyden: tyden zacinajici Denni souhrn Denni prehled Nejvytizenejsi den: Hodinovy prehled Hodinovy souhrn Souhrn tydne po hodinach Nejvytizenejsi hodina: Ctvrthodinovy prehled Ctvrthodinovy souhrn Nejvytizenejsi ctvrthodinka: Petiminutovy prehled Petiminutovy souhrn Nejvytizenejsi petiminutovka: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Prehled pocitacu pocitac (host) pocitacu (hosts) n Prehled presmerovanych pocitacu pocitac (host) pocitacu (hosts) n Prehled chybujicich pocitacu pocitac (host) pocitacu (hosts) n Prehled adresaru adresar adresaru n Prehled typu souboru pripona pripon n Prehled pozadavku pozadovany soubor pozadovanych souboru n Prehled presmerovanych souboru presmerovany soubor presmerovanych souboru n Prehled chybnych pozadavku chybny pozadavek chybnych pozadavku n Prehled odkazujicich stranek odkazujici URL odkazujicich URL n Prehled odkazujicich serveru odkazujici server odkazujicich serveru n Prehled presmerovanych odkazovanych stranek odkazovane URL odkazovanych URL n Prehled chybnych odkazu odkazovane URL odkazovanych URL n Prehled hledanych dotazu dotaz dotazu n Prehled hledanych slov slovo dotazu slov dotazu n Prehled interne hledanych dotazu dotaz dotazu n Prehled interne hledanych slov slovo dotazu slov dotazu n Prehled virtualnich serveru virtualni server virtualnich serveru n Prehled presmerovanych virtualnich serveru virtualni server virtualnich serveru n Prehled chybujicich virtualnich serveru virtualni server virtualnich serveru n Prehled uzivatelu uzivatel uzivatelu n Prehled presmerovanych uzivatelu uzivatel uzivatelu n Prehled chybujicich uzivatelu uzivatel uzivatelu n Souhrn prohlizecu prohlizec prohlizecu n Prehled prohlizecu prohlizec prohlizecu n Prehled operacnich systemu operacni system operacnich systemu n Prehled domen domena domen n Prehled organizaci organizace organizaci n Prehled navratovych kodu navratovy kod navratovych kodu n Prehled casu zpracovani Prehled velikosti souboru ## Used at the bottom of the report Tuto analyzu vytvoril Cas zpracovani Mene nez 1 ## Used in the time reports Kazdy dilek predstavuje (prip. jejich cast) pozadavek na stranku pozadavku na stranky ## Used at the bottom of each non-time report: need m, f & n genders neuveden neuvedena neuvedeno ## Used on the pie charts: again need m, f & n genders ostatni ostatni ostatni ## Used at the top of the report Program byl spusten: Analyza pozadavku od do ## Used in the General Summary Uspesne pozadavky Denni prumer uspesnych pozadavku Uspesne pozadavky na stranky Denni prumer uspesnych pozadavku na stranky Pocet zaznamu v logu bez navratoveho kodu Chybne pozadavky Presmerovane pozadavky Pozadavky informativniho charakteru (kody 201-206) Ruznych pozadovanych souboru Ruznych obslouzenych pocitacu (hosts) Poskozene zaznamy v logu Nechtene zaznamy v logu Objem prenesenych dat Denni prumer prenesenych dat Hodnoty v zavorkach odpovidaji 7 dnum pred poslednim 7 dnum Presun na Zacatek ## Some special phrases for particular reports. [nerozlisene numericke adresy] [domena neudana] [neznama domena] [korenovy adresar] [zadny adresar] [zadna pripona] [adresare] Nezname Windows Jiny Unix Roboty OS neznamy ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) pozadavku pozadavku za 7 dni % pozadavku % pozadavku za 7 dni stran stran za 7 dni % stran % stran za 7 dni bytu ?bytu bytu za 7 dni ?bytu za 7 dni % bytu % bytu za 7 dni poradi ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Vypis prvnich %s * * Vypis prvnich %d %s * * Vypis %s ## "by" in the phrase "listing the top 3 files BY number of requests" podle ## All requests WITH AT LEAST 10 requests s alespon ## Different ways of doing floors pozadavek za poslednich 7 dni pozadavku za poslednich 7 dni pozadavek na stranku za poslednich 7 dni pozadavku na stranky za poslednich 7 dni presmerovany pozadavek presmerovanych pozadavku presmerovany pozadavek za poslednich 7 dni presmerovanych pozadavku za poslednich 7 dni chybny pozadavek chybnych pozadavku chybny pozadavek za poslednich 7 dni chybnych pozadavku za poslednich 7 dni % provozu % provozu za poslednich 7 dni % maxima provozu % maxima provozu za poslednich 7 dni bytu provozu bytu provozu ## ?bytes represents kbytes, Mbytes etc. ?bytu provozu bytu provozu za poslednich 7 dni bytu provozu za poslednich 7 dni ?bytu provozu za poslednich 7 dni pozadovano od s presmerovanym pozadavkem od s chybnym pozadavkem od s prvnim pozadavkem od s prvnim presmerovanym pozadavkem od s prvnim chybnym pozadavkem od ## Now "sorted by": again, in m, f & n (only needed in plural though) setriden podle setridena podle setrideno podle ## Used at the top of each report Tento prehled obsahuje data z ## Used in pie charts Vysece jsou vykresleny podle ## different ways of sorting objemu prenesenych dat objemu prenesenych dat za poslednich 7 dni % pozadavku % pozadavku za poslednich 7 dni % maximalniho poctu pozadavku % maximalniho poctu pozadavku za poslednich 7 dni poctu pozadavku poctu pozadavku za poslednich 7 dni % pozadavku na stranky % pozadavku na stranky za poslednich 7 dni % maximalniho poctu pozadavku na stranky % maximalniho poctu pozadavku na stranky za poslednich 7 dni poctu pozadavku na stranky poctu pozadavku na stranky za poslednich 7 dni % presmerovanych pozadavku % presmerovanych pozadavku za poslednich 7 dni % maximalniho poctu presmerovanych pozadavku % maximalniho poctu presmerovanych pozadavku za poslednich 7 dni poctu presmerovanych pozadavku poctu presmerovanych pozadavku za poslednich 7 dni % chybnych pozadavku % chybnych pozadavku za poslednich 7 dni % maximalniho poctu chybnych pozadavku % maximalniho poctu chybnych pozadavku za poslednich 7 dni poctu chybnych pozadavku poctu chybnych pozadavku za poslednich 7 dni casu posledniho pozadavku casu posledniho presmerovaneho pozadavku casu posledniho chybneho pozadavku casu prvniho pozadavku casu prvniho presmerovaneho pozadavku casu prvniho chybneho pozadavku ## 3 other ways of sorting in m, f, & n setriden abecedne setridena abecedne setrideno abecedne setriden numericky setridena numericky setrideno numericky nesetriden nesetridena nesetrideno ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m %Y %H:%n ## "Program started at" and "Analysed requests from" %w %D.%m %Y %H:%n ## In Daily Report %d.%m '%y ## In Daily Summary %w ## In Hourly Report %d.%m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d.%m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m '%y ## The date & time (D) column in non-time reports %d.%m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Ruzne informacni] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Ruzne uspesne] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Ruzna presmerovani] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Ruzne klientske/uzivatelske chyby] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Ruzne chyby serveru] xxx [Nezname] analog-6.0/lang/de.lng0000644000175000017500000003346110161303537014757 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. So Mo Di Mi Do Fr Sa Jan Feb Mr Apr Mai Jun Jul Aug Sep Okt Nov Dez ## Next some standard common words. ## Abbreviation for "week beginning" Woche ab Jahr ## Quarter of a year Quartal Monate Tag Tage Stunde Minute Minuten Sekunde Sekunden Byte Bytes ## ?bytes represents kbytes, Mbytes etc. ?Bytes Anfrage Anfragen Datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 Datum Uhrzeit Zeit erster Zugriff erster Zugriff letzter Zugriff letzter Zugriff Datei Dateien Host Hosts virtueller Server virtuelle Server Verzeichnis Verzeichnisse Domne Domnen Organisation Organisationen Erweiterung Erweiterungen URL URL's Browser Browser Betriebsystem Betriebsysteme ## (= operating system, operating systems) Dateigre Suchbegriff Suchbegriffe WWW-Server WWW-Server Benutzer Benutzer Status code Status codes Server Statistiken fr ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Zusammenfassung ## The time reports, plus "busiest" strings (at the bottom of each report) Jhrlicher Bericht strkstes Jahr: Quartals Bericht strkstes Quartal: Monatsbericht Monat mit der strksten Nutzung: Wochenbericht Woche mit der strksten Nutzung: Wochentage bersicht Tagesbericht Tag mit der strksten Nutzung: Stndlicher Bericht Tageszeit bersicht Uhrzeit der Wochenbersicht Uhrzeit mit der strksten Nutzung: Viertelstndlicher Bericht Viertelstndlicher Bericht Viertelstunde mit der strksten Nutzung: 5-mintiger Bericht 5-mintiger Bericht Die 5 Minuten mit der strksten Nutzung: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Bericht Hosts Hosts m Host Umleitungs Bericht Hosts Hosts n Hosts Ausfallbericht Hosts Hosts n Verzeichnisbericht Verzeichnisses Verzeichnisse n Dateityp Bericht Dateityp Dateitypen m Anfrage Bericht verlangten Datei verlangten Dateien f Umgeleitete Anfragen Datei Dateien f Fehler Bericht Datei Dateien f Verweis Bericht verweisenden URL verweisenden URLs f Server Verweisbericht verweisenden Server verweisenden Server m Umleitungs Verweisbericht verweisenden URL verweisenden URLs f Verweis Fehlerbericht verweisenden URL verweisenden URLs f Suchanfrage Bericht Anfrage Anfragen f Suchbegriff Bericht Suchbegriffs Suchbegriffe m Interner Frage Bericht Frage Fragen n Interner Suchwort Bericht Suchwort Suchwrter n Virtueller Server Bericht Virtueller Server Virtuelle Server m Virtueller Server Umleitungsbericht Virtueller Server Virtuelle Server n Virtueller Serverfehler Bericht Virtueller Server Virtuelle Server n Benutzer Bericht Benutzers Benutzer m Benutzer Umleitungsbericht Benutzer Benutzer n Benutzer Fehlerbericht Benutzers Benutzer m Browser bersicht Browsers Browser m Browser Bericht Browsers Browser m Betriebsystem Bericht Betriebsystems Betriebsysteme n Domnen Bericht Domne Domnen f Organisationsbericht Organisation Organisationen f Statuscodebericht Statuscodes Statuscodes m Bearbeitungszeit Bericht Dateigren bersicht ## Used at the bottom of the report Diese Statistik wurde erzeugt durch Laufzeit Unter einer ## Used in the time reports Jede Einheit entspricht oder einem Teil davon Seitenanfrage Seitenanfragen ## Used at the bottom of each non-time report: need m, f & n genders nicht angezeigt nicht angezeigt nicht angezeigt ## Used on the pie charts: again need m, f & n genders Andere Andere Andere ## Used at the top of the report Programmstart: Auswertungszeitraum: bis ## Used in the General Summary Erfolgreich bearbeitete Anfragen Durchschnittlich bearbeitete Anfragen pro Tag Erfolgreich bearbeitete Seitenanfragen Durchschnittlich bearbeitete Seitenanfragen pro Tag Logfile Eintrge ohne Status Code Fehlgeschlagene Anfragen Umgeleitete Anfragen Anfragen mit informativem Status Code Anzahl unterschiedlicher verlangter Dateien Anzahl unterschiedlicher anfragender Hosts Unlesbare Zeilen in der Logdatei Nicht verwendete Eintrge in der Logdatei Menge verschickter Daten Durchschnittliche Menge verschickter Daten pro Tag Zahlen in Klammern beziehen sich auf die 7 Tage bis letzten 7 Tage Andere Statistiken Anfang ## Some special phrases for particular reports. [Nicht auflsbare numerische Adressen] [keine Domne angegeben] [unbekannte Domne] [Root-Verzeichnis] [kein Verzeichnis] [keine Extension] [Verzeichnisse] unbekannt Windows anderes Unix Robots unbekanntes Betriebsystem ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #Anf. 7 Tage Anfrage %Anf. %7-Tage Anfrage Seit. 7-Tage Seiten %Seit %7-Tage Seiten Bytes ?Bytes 7-Tage Bytes 7-Tage ?Bytes %Bytes %7-Tage Bytes Nr. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Ausgabe des ersten %s Ausgabe der ersten %s Ausgabe des ersten %s Ausgabe der ersten %d %s Ausgabe der ersten %d %s Ausgabe der ersten %d %s Ausgabe aller %s Ausgabe aller %s Ausgabe aller %s ## "by" in the phrase "listing the top 3 files BY number of requests" gewichtet nach ## All requests WITH AT LEAST 10 requests mit mindestens ## Different ways of doing floors Anfrage in den letzten 7 Tagen Anfragen in den letzten 7 Tagen Anfrage einer Seite in den letzten 7 Tagen Anfragen einer Seite in den letzten 7 Tagen umgeleitete Anfrage umgeleitete Anfragen umgeleitete Anfrage in den letzten 7 Tagen umgeleitete Anfragen in den letzten 7 Tagen fehlgeschlagene Anfrage fehlgeschlagene Anfragen fehlgeschlagene Anfrage in den letzten 7 Tagen fehlgeschlagene Anfragen in den letzten 7 Tagen % des Transfervolumens % des Transfervolumens in den letzten 7 Tagen % des grten Transfervolumens % des maximalen Transfervolumens in den letzten 7 Tagen Byte gesendeten Daten Bytes gesendeten Daten ## ?bytes represents kbytes, Mbytes etc. ?Bytes gesendeten Daten Byte gesendeten Daten in den letzten 7 Tagen Bytes gesendeten Daten in den letzten 7 Tagen ?Bytes gesendeten Daten in den letzten 7 Tagen Anfragen seit mit umgeleiteter Anfrage seit mit fehlgeschlagener Anfrage seit mit erster Anfrage seit mit erster Umleitungs-Anfrage seit mit erster fehlgeschlagener Anfrage seit ## Now "sorted by": again, in m, f & n (only needed in plural though) sortiert nach sortiert nach sortiert nach ## Used at the top of each report Dieser Bericht beinhaltet Daten aus ## Used in pie charts Grafik erstellt aus ## different ways of sorting Transfervolumen Transfervolumen in den letzten 7 Tagen % der Anfragen % der Anfragen in den letzten 7 Tagen % der maximalen Anzahl an Anfragen % der maximalen Anzahl von Anfragen in den letzten 7 Tagen Gesamtanzahl der Anfragen die Anzahl der Anfragen in den letzten 7 Tagen % der Seitenanfragen % der Seitenanfragen in den letzten 7 Tagen % der maximalen Anzahl an Seitenanfragen % der maximalen Anzahl von Seitenanfragen in den letzten 7 Tagen Anzahl der Seitenanfragen Anzahl der Anfragen auf Seiten in den letzten 7 Tagen % der umgeleiteten Anfragen % der umgeleiteten Anfragen in den letzten 7 Tagen % der maximalen Anzahl umgeleiteter Anfragen % der maximalen Anzahl von umgeleiteten Anfragen in den letzten 7 Tagen Anzahl umgeleiteter Anfragen die Anzahl der umgeleiteten Anfragen in den letzten 7 Tagen % der fehlgeschlagenen Anfragen % der fehlgeschlagenen Anfragen in den letzten 7 Tagen % der maximalen Anzahl fehlgeschlagener Anfragen % der maximalen Anzahl fehlgeschlagener Anfragen in den letzten 7 Tagen Anzahl fehlgeschlagener Anfragen die Anzahle der fehlgeschlagenen Anfragen in den letzten 7 Tagen Uhrzeit der letzten Anfrage Uhrzeit der letzten umgeleiteten Anfrage Uhrzeit der letzten fehlgeschlagenen Anfrage Uhrzeit der ersten Anfrage Uhrzeit der ersten umgeleiteten Anfrage Uhrzeit der ersten fehlgeschlagenen Anfrage ## 3 other ways of sorting in m, f, & n alphabetisch sortiert alphabetisch sortiert alphabetisch sortiert numerisch sortiert numerisch sortiert numerisch sortiert unsortiert unsortiert unsortiert ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. morgens abends ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m %Y %H:%n ## "Program started at" and "Analysed requests from" %w, %D. %m %Y %H:%n ## In Daily Report %d. %m %y ## In Daily Summary %w ## In Hourly Report %d. %m %y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d. %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m %y ## The date & time (D) column in non-time reports %d. %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Anfragen fortsetzen 101 Protokollwechsel 1xx [verschiedene Mitteilungen] 200 OK 201 Erzeugt 202 Zur weiteren Bearbeitung angenommen 203 Nicht magebliche Information 204 OK, aber nichts zu bermittteln 205 Dokument zurckgesetzt 206 Partieller Inhalt 2xx [Verschiedene Erfolgsmeldungen] 300 Mehrere Dokumente vorhanden 301 Dokument dauerhaft verlegt 302 Dokument befindet sich anderswo 303 Siehe anderes Dokument 304 Unverndert seit dem letzten Zugriff 305 Proxy benutzen 306 Proxy wechseln 307 Dokument vorbergehend verlegt 3xx [Verschiedene Umleitungen] 400 Inkorrekte Anfrage 401 Authentifizierung erforderlich 402 Bezahlung erforderlich 403 Zugriff verboten 404 Dokument nicht gefunden 405 Methode nicht erlaubt 406 Dokument vom Client nicht akzeptiert 407 Proxy-Authentifizierung erforderlich 408 Zeitberschreitung bei Anfrage 409 Anfrage widerspricht dem Zustand der Resource 410 Dokument dauerhaft entfernt 411 Lnge erforderlich 412 Voraussetzungen nicht erfllt 413 Anfrage zu lang 414 Gewnschter Dateiname zu lang 415 Nicht untersttztes Medium 416 Ungltiger Anfragebereich 417 Annahme gescheitert 4xx [Verschiedene Client-/Benutzerfehler] 500 Serverfehler 501 Anfragetyp nicht untersttzt 502 Fehler bei Server weiter oberhalb 503 Dient zeitweise nicht verfgbar 504 Zeitberschreitung am Gateway 505 HTTP-Version nicht untersttzt 506 Umleitung gescheitert 5xx [Verschiedene Serverfehler] xxx [Unbekannt] analog-6.0/lang/dea.lng0000644000175000017500000003354210161303537015120 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. So Mo Di Mi Do Fr Sa Jan Feb Mae Apr Mai Jun Jul Aug Sep Okt Nov Dez ## Next some standard common words. ## Abbreviation for "week beginning" Woche ab Jahr ## Quarter of a year Quartal Monate Tag Tage Stunde Minute Minuten Sekunde Sekunden Byte Bytes ## ?bytes represents kbytes, Mbytes etc. ?Bytes Anfrage Anfragen Datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 Datum Uhrzeit Zeit erster Zugriff erster Zugriff letzter Zugriff letzter Zugriff Datei Dateien Host Hosts virtueller Server virtuelle Server Verzeichnis Verzeichnisse Domaene Domaenen Organisation Organisationen Erweiterung Erweiterungen URL URL's Browser Browser Betriebsystem Betriebsysteme ## (= operating system, operating systems) Dateigroesse Suchbegriff Suchbegriffe WWW-Server WWW-Server Benutzer Benutzer Status code Status codes Server Statistiken fuer ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Zusammenfassung ## The time reports, plus "busiest" strings (at the bottom of each report) Jaehrlicher Bericht staerkstes Jahr: Quartals Bericht staerkstes Quartal: Monatsbericht Monat mit der staerksten Nutzung: Wochenbericht Woche mit der staerksten Nutzung: Wochentage Uebersicht Tagesbericht Tag mit der staerksten Nutzung: Stuendlicher Bericht Tageszeit Uebersicht Uhrzeit der Wochenuebersicht Uhrzeit mit der staerksten Nutzung: Viertelstuendlicher Bericht Viertelstuendlicher Bericht Viertelstunde mit der staerksten Nutzung: 5-minuetiger Bericht 5-minuetiger Bericht Die 5 Minuten mit der staerksten Nutzung: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Bericht Hosts Hosts m Host Umleitungs Bericht Hosts Hosts n Host Ausfallbericht Hosts Hosts n Verzeichnisbericht Verzeichnisses Verzeichnisse n Dateityp Bericht Dateityp Dateitypen m Anfrage Bericht verlangten Datei verlangten Dateien f Umgeleitete Anfragen Datei Dateien f Fehler Bericht Datei Dateien f Verweis Bericht verweisenden URL verweisenden URLs f Server Verweisbericht verweisenden Server verweisenden Server m Umleitungs Verweisbericht verweisenden URL verweisenden URLs f Verweis Fehlerbericht verweisenden URL verweisenden URLs f Suchanfrage Bericht Anfrage Anfragen f Suchbegriff Bericht Suchbegriffs Suchbegriffe m Interner Frage Bericht Frage Fragen n Interner Suchwort Bericht Suchwort Suchwoerter n Virtueller Server Bericht Virtueller Server Virtuelle Server m Virtueller Server Umleitungsbericht Virtueller Server Virtuelle Server n Virtueller Serverfehler Bericht Virtueller Server Virtuelle Server n Benutzer Bericht Benutzers Benutzer m Benutzer Umleitungsbericht Benutzer Benutzer n Benutzer Fehlerbericht Benutzers Benutzer m Browser Uebersicht Browsers Browser m Browser Bericht Browsers Browser m Betriebsystem Bericht Betriebsystems Betriebsysteme n Domaenen Bericht Domaene Domaenen f Organisationsbericht Organisation Organisationen f Statuscodebericht Statuscodes Statuscodes m Bearbeitungszeit Bericht Dateigroessen Uebersicht ## Used at the bottom of the report Diese Statistik wurde erzeugt durch Laufzeit Unter einer ## Used in the time reports Jede Einheit entspricht oder einem Teil davon Seitenanfrage Seitenanfragen ## Used at the bottom of each non-time report: need m, f & n genders nicht angezeigt nicht angezeigt nicht angezeigt ## Used on the pie charts: again need m, f & n genders Andere Andere Andere ## Used at the top of the report Programmstart: Auswertungszeitraum: bis ## Used in the General Summary Erfolgreich bearbeitete Anfragen Durchschnittlich bearbeitete Anfragen pro Tag Erfolgreich bearbeitete Seitenanfragen Durchschnittlich bearbeitete Seitenanfragen pro Tag Logfile Eintraege ohne Status Code Fehlgeschlagene Anfragen Umgeleitete Anfragen Anfragen mit informativem Status Code Anzahl unterschiedlicher verlangter Dateien Anzahl unterschiedlicher anfragender Hosts Unlesbare Zeilen in der Logdatei Nicht verwendete Eintraege in der Logdatei Menge verschickter Daten Durchschnittliche Menge verschickter Daten pro Tag Zahlen in Klammern beziehen sich auf die 7 Tage bis letzten 7 Tage Andere Statistiken Anfang ## Some special phrases for particular reports. [Nicht aufloesbare numerische Adressen] [keine Domaene angegeben] [unbekannte Domaene] [Root-Verzeichnis] [kein Verzeichnis] [keine Extension] [Verzeichnisse] unbekannt Windows anderes Unix Robots unbekanntes Betriebsystem ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #Anf. 7 Tage Anfrage %Anf. %7-Tage Anfrage Seit. 7-Tage Seiten %Seit %7-Tage Seiten Bytes ?Bytes 7-Tage Bytes 7-Tage ?Bytes %Bytes %7-Tage Bytes Nr. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Ausgabe des ersten %s Ausgabe der ersten %s Ausgabe des ersten %s Ausgabe der ersten %d %s Ausgabe der ersten %d %s Ausgabe der ersten %d %s Ausgabe aller %s Ausgabe aller %s Ausgabe aller %s ## "by" in the phrase "listing the top 3 files BY number of requests" gewichtet nach ## All requests WITH AT LEAST 10 requests mit mindestens ## Different ways of doing floors Anfrage in den letzten 7 Tagen Anfragen in den letzten 7 Tagen Anfrage einer Seite in den letzten 7 Tagen Anfragen einer Seite in den letzten 7 Tagen umgeleitete Anfrage umgeleitete Anfragen umgeleitete Anfrage in den letzten 7 Tagen umgeleitete Anfragen in den letzten 7 Tagen fehlgeschlagene Anfrage fehlgeschlagene Anfragen fehlgeschlagene Anfrage in den letzten 7 Tagen fehlgeschlagene Anfragen in den letzten 7 Tagen % des Transfervolumens % des Transfervolumens in den letzten 7 Tagen % des groessten Transfervolumens % des maximalen Transfervolumens in den letzten 7 Tagen Byte gesendeten Daten Bytes gesendeten Daten ## ?bytes represents kbytes, Mbytes etc. ?Bytes gesendeten Daten Byte gesendeten Daten in den letzten 7 Tagen Bytes gesendeten Daten in den letzten 7 Tagen ?Bytes gesendeten Daten in den letzten 7 Tagen Anfragen seit mit umgeleiteter Anfrage seit mit fehlgeschlagener Anfrage seit mit erster Anfrage seit mit erster Umleitungs-Anfrage seit mit erster fehlgeschlagener Anfrage seit ## Now "sorted by": again, in m, f & n (only needed in plural though) sortiert nach sortiert nach sortiert nach ## Used at the top of each report Dieser Bericht beinhaltet Daten aus ## Used in pie charts Grafik erstellt aus ## different ways of sorting Transfervolumen Transfervolumen in den letzten 7 Tagen % der Anfragen % der Anfragen in den letzten 7 Tagen % der maximalen Anzahl an Anfragen % der maximalen Anzahl von Anfragen in den letzten 7 Tagen Gesamtanzahl der Anfragen die Anzahl der Anfragen in den letzten 7 Tagen % der Seitenanfragen % der Seitenanfragen in den letzten 7 Tagen % der maximalen Anzahl an Seitenanfragen % der maximalen Anzahl von Seitenanfragen in den letzten 7 Tagen Anzahl der Seitenanfragen Anzahl der Anfragen auf Seiten in den letzten 7 Tagen % der umgeleiteten Anfragen % der umgeleiteten Anfragen in den letzten 7 Tagen % der maximalen Anzahl umgeleiteter Anfragen % der maximalen Anzahl von umgeleiteten Anfragen in den letzten 7 Tagen Anzahl umgeleiteter Anfragen die Anzahl der umgeleiteten Anfragen in den letzten 7 Tagen % der fehlgeschlagenen Anfragen % der fehlgeschlagenen Anfragen in den letzten 7 Tagen % der maximalen Anzahl fehlgeschlagener Anfragen % der maximalen Anzahl fehlgeschlagener Anfragen in den letzten 7 Tagen Anzahl fehlgeschlagener Anfragen die Anzahle der fehlgeschlagenen Anfragen in den letzten 7 Tagen Uhrzeit der letzten Anfrage Uhrzeit der letzten umgeleiteten Anfrage Uhrzeit der letzten fehlgeschlagenen Anfrage Uhrzeit der ersten Anfrage Uhrzeit der ersten umgeleiteten Anfrage Uhrzeit der ersten fehlgeschlagenen Anfrage ## 3 other ways of sorting in m, f, & n alphabetisch sortiert alphabetisch sortiert alphabetisch sortiert numerisch sortiert numerisch sortiert numerisch sortiert unsortiert unsortiert unsortiert ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. morgens abends ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m %Y %H:%n ## "Program started at" and "Analysed requests from" %w, %D. %m %Y %H:%n ## In Daily Report %d. %m %y ## In Daily Summary %w ## In Hourly Report %d. %m %y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d. %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m %y ## The date & time (D) column in non-time reports %d. %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Anfragen fortsetzen 101 Protokollwechsel 1xx [verschiedene Mitteilungen] 200 OK 201 Erzeugt 202 Zur weiteren Bearbeitung angenommen 203 Nicht massgebliche Information 204 OK, aber nichts zu uebermittteln 205 Dokument zurueckgesetzt 206 Partieller Inhalt 2xx [Verschiedene Erfolgsmeldungen] 300 Mehrere Dokumente vorhanden 301 Dokument dauerhaft verlegt 302 Dokument befindet sich anderswo 303 Siehe anderes Dokument 304 Unveraendert seit dem letzten Zugriff 305 Proxy benutzen 306 Proxy wechseln 307 Dokument voruebergehend verlegt 3xx [Verschiedene Umleitungen] 400 Inkorrekte Anfrage 401 Authentifizierung erforderlich 402 Bezahlung erforderlich 403 Zugriff verboten 404 Dokument nicht gefunden 405 Methode nicht erlaubt 406 Dokument vom Client nicht akzeptiert 407 Proxy-Authentifizierung erforderlich 408 Zeitueberschreitung bei Anfrage 409 Anfrage widerspricht dem Zustand der Resource 410 Dokument dauerhaft entfernt 411 Laenge erforderlich 412 Voraussetzungen nicht erfuellt 413 Anfrage zu lang 414 Gewuenschter Dateiname zu lang 415 Nicht unterstuetztes Medium 416 Ungueltiger Anfragebereich 417 Annahme gescheitert 4xx [Verschiedene Client-/Benutzerfehler] 500 Serverfehler 501 Anfragetyp nicht unterstuetzt 502 Fehler bei Server weiter oberhalb 503 Dient zeitweise nicht verfuegbar 504 Zeitueberschreitung am Gateway 505 HTTP-Version nicht unterstuetzt 506 Umleitung gescheitert 5xx [Verschiedene Serverfehler] xxx [Unbekannt] analog-6.0/lang/deadom.tab0000644000175000017500000001122710161303537015602 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Vereinigte Arabische Emirate af 1 Afghanistan ag 2 Antigua und Barbuda ai 1 Anguilla al 1 Albanien am 2 Armenien an 1 Niederlaendische Antillen ao 1 Angola aq 1 Antarktis ar 3 Argentinien arpa 1 Arpanet as 1 Amerikanisch-Samoa at 3 Oesterreich au 3 Australien aw 1 Aruba az 1 Aserbaidschan ba 3 Bosnien und Herzegowina bb 2 Barbados bd 1 Bangladesch be 3 Belgien bf 1 Burkina Faso bg 2 Bulgarien bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivien br 3 Brasilien bs 1 Bahamas bt 1 Bhutan bv 1 Bouvetinsel bw 1 Botsuana by 1 Belarus (Weissrussland) bz 1 Belize ca 3 Kanada cc 1 Kokosinseln cd 1 Demokratische Republik Kongo cf 1 Zentralafrikanische Republik cg 1 Kongo ch 2 Schweiz ci 1 Elfenbeinkueste ck 1 Cookinseln cl 2 Chile cm 1 Kamerun cn 3 China co 3 Kolumbien com 2 Kommerzieller Bereich cr 3 Costa Rica cs 3 Serbien und Montenegro cu 2 Kuba cv 1 Kap Verde cx 2 Weihnachtsinsel cy 3 Zypern cz 2 Tschechische Republik de 2 Deutschland dj 1 Dschibuti dk 2 Daenemark dm 2 Dominica do 3 Dominikanische Republik dz 1 Algerien ec 3 Ecuador edu 2 Bildungsbereich ee 2 Estland eg 3 Aegypten eh 1 Westsahara er 1 Eritrea es 2 Spanien et 1 Aethiopien fi 2 Finnland fj 3 Fidschi fk 1 Falklandinseln fm 1 Mikronesien fo 1 Faeroeer fr 2 Frankreich fx 1 Frankreich (Europaeisches Territorium) ga 1 Gabun gb 1 Grossbritannien gd 1 Grenada ge 1 Georgien gf 1 Franzoesisch-Guayana gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambia gn 1 Guinea gov 2 USA Regierungsbereich gp 1 Guadeloupe gq 1 Aequatorialguinea gr 2 Griechenland gs 1 Suedgeorgien und Suedliche Sandwichinseln gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 Heard und McDonaldinseln hn 2 Honduras hr 2 Kroatien ht 1 Haiti hu 2 Ungarn id 3 Indonesien ie 2 Irland il 3 Israel in 3 Indien int 1 Internationale Organisationen io 1 Britisches Territorium im Indischen Ozean iq 1 Irak ir 1 Iran is 2 Island it 2 Italien jm 3 Jamaika jo 3 Jordanien jp 3 Japan ke 3 Kenia kg 1 Kirgisistan kh 1 Kambodscha ki 1 Kiribati km 1 Komoren kn 1 St. Kitts und Nevis kp 1 Nordkorea kr 3 Suedkorea kw 3 Kuwait ky 1 Kaimaninseln kz 1 Kasachstan la 1 Laos lb 3 Libanon lc 1 St. Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litauen lu 2 Luxemburg lv 2 Lettland ly 1 Libyen ma 1 Marokko mc 2 Monaco md 1 Moldawien mg 1 Madagakar mh 1 Marshallinseln mil 2 USA Militaerbereich mk 3 Mazedonien ml 1 Mali mm 1 Myanmar mn 1 Mongolei mo 1 Macau mp 1 Noerdliche Marianen mq 1 Martinique mr 1 Mauretanien ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Malediven mw 1 Malawi mx 3 Mexico my 3 Malaysia mz 1 Mosambik na 1 Namibia nc 1 Neukaledonien ne 1 Niger net 2 Netze nf 1 Norfolkinsel ng 1 Nigeria ni 3 Nicaragua nl 2 Niederlande no 2 Norwegen np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Neuseeland om 1 Oman org 2 nichtkommerzielle Organisationen pa 3 Panama pe 3 Peru pf 1 Franzoesisch-Polynesien pg 3 Papua Neuguinea ph 3 Philippinen pk 3 Pakistan pl 3 Polen pm 1 St. Pierre und Miquelon pn 1 Pitcairninseln pr 1 Puerto Rico pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Katar re 1 Reunion ro 2 Rumaenien ru 2 Russische Foederation rw 1 Ruanda sa 3 Saudi-Arabien sb 1 Salomonen sc 1 Seychellen sd 1 Sudan se 2 Schweden sg 3 Singapur sh 1 St. Helena si 2 Slowenien sj 1 Svalbard und Jan Mayen sk 2 Slowakei sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Sao Tome und Principe su 2 ehemalige UdSSR sv 3 El Salvador sy 1 Syrien sz 1 Swasiland tc 1 Turks- und Caicosinseln td 1 Tschad tf 1 Franzoesische Gebiete im suedlichen Indischen Ozean tg 1 Togo th 3 Thailand tj 1 Tadschikistan tk 1 Tokelau tl 1 Timor-Leste tm 1 Turkmenistan tn 1 Tunesien to 1 Tonga tp 1 Timor-Leste tr 3 Tuerkei tt 3 Trinidad und Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tansania ua 3 Ukraine ug 3 Uganda uk 3 Grossbritannien um 1 Kleinere amerikanische Ueberseeinseln us 4 Vereinigte Staaten uy 3 Uruguay uz 1 Usbekistan va 1 Vatikanstadt vc 1 St. Vincent und die Grenadinen ve 3 Venezuela vg 1 Britische Jungferninseln vi 1 Amerikanische Jungferninseln vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis und Futuna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Serbien und Montenegro za 3 Suedafrika zm 1 Sambia zr 1 ehemaliges Zaire zw 3 Simbabwe analog-6.0/lang/dedom.tab0000644000175000017500000001117210161303537015440 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Vereinigte Arabische Emirate af 1 Afghanistan ag 2 Antigua und Barbuda ai 1 Anguilla al 1 Albanien am 2 Armenien an 1 Niederlndische Antillen ao 1 Angola aq 1 Antarktis ar 3 Argentinien arpa 1 Arpanet as 1 Amerikanisch-Samoa at 3 sterreich au 3 Australien aw 1 Aruba az 1 Aserbaidschan ba 3 Bosnien und Herzegowina bb 2 Barbados bd 1 Bangladesch be 3 Belgien bf 1 Burkina Faso bg 2 Bulgarien bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivien br 3 Brasilien bs 1 Bahamas bt 1 Bhutan bv 1 Bouvetinsel bw 1 Botsuana by 1 Belarus (Weiruland) bz 1 Belize ca 3 Kanada cc 1 Kokosinseln cd 1 Demokratische Republik Kongo cf 1 Zentralafrikanische Republik cg 1 Kongo ch 2 Schweiz ci 1 Elfenbeinkste ck 1 Cookinseln cl 2 Chile cm 1 Kamerun cn 3 China co 3 Kolumbien com 2 Kommerzieller Bereich cr 3 Costa Rica cs 3 Serbien und Montenegro cu 2 Kuba cv 1 Kap Verde cx 2 Weihnachtsinsel cy 3 Zypern cz 2 Tschechische Republik de 2 Deutschland dj 1 Dschibuti dk 2 Dnemark dm 2 Dominica do 3 Dominikanische Republik dz 1 Algerien ec 3 Ecuador edu 2 Bildungsbereich ee 2 Estland eg 3 gypten eh 1 Westsahara er 1 Eritrea es 2 Spanien et 1 thiopien fi 2 Finnland fj 3 Fidschi fk 1 Falklandinseln fm 1 Mikronesien fo 1 Frer fr 2 Frankreich fx 1 Frankreich (Europisches Territorium) ga 1 Gabun gb 1 Grobritannien gd 1 Grenada ge 1 Georgien gf 1 Franzsisch-Guayana gh 3 Ghana gi 1 Gibraltar gl 1 Grnland gm 1 Gambia gn 1 Guinea gov 2 USA Regierungsbereich gp 1 Guadeloupe gq 1 quatorialguinea gr 2 Griechenland gs 1 Sdgeorgien und Sdliche Sandwichinseln gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 Heard und McDonaldinseln hn 2 Honduras hr 2 Kroatien ht 1 Haiti hu 2 Ungarn id 3 Indonesien ie 2 Irland il 3 Israel in 3 Indien int 1 Internationale Organisationen io 1 Britisches Territorium im Indischen Ozean iq 1 Irak ir 1 Iran is 2 Island it 2 Italien jm 3 Jamaika jo 3 Jordanien jp 3 Japan ke 3 Kenia kg 1 Kirgisistan kh 1 Kambodscha ki 1 Kiribati km 1 Komoren kn 1 St. Kitts und Nevis kp 1 Nordkorea kr 3 Sdkorea kw 3 Kuwait ky 1 Kaimaninseln kz 1 Kasachstan la 1 Laos lb 3 Libanon lc 1 St. Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litauen lu 2 Luxemburg lv 2 Lettland ly 1 Libyen ma 1 Marokko mc 2 Monaco md 1 Moldawien mg 1 Madagakar mh 1 Marshallinseln mil 2 USA Militrbereich mk 3 Mazedonien ml 1 Mali mm 1 Myanmar mn 1 Mongolei mo 1 Macau mp 1 Nrdliche Marianen mq 1 Martinique mr 1 Mauretanien ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Malediven mw 1 Malawi mx 3 Mexico my 3 Malaysia mz 1 Mosambik na 1 Namibia nc 1 Neukaledonien ne 1 Niger net 2 Netze nf 1 Norfolkinsel ng 1 Nigeria ni 3 Nicaragua nl 2 Niederlande no 2 Norwegen np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Neuseeland om 1 Oman org 2 nichtkommerzielle Organisationen pa 3 Panama pe 3 Peru pf 1 Franzsisch-Polynesien pg 3 Papua Neuguinea ph 3 Philippinen pk 3 Pakistan pl 3 Polen pm 1 St. Pierre und Miquelon pn 1 Pitcairninseln pr 1 Puerto Rico pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Katar re 1 Runion ro 2 Rumnien ru 2 Russische Fderation rw 1 Ruanda sa 3 Saudi-Arabien sb 1 Salomonen sc 1 Seychellen sd 1 Sudan se 2 Schweden sg 3 Singapur sh 1 St. Helena si 2 Slowenien sj 1 Svalbard und Jan Mayen sk 2 Slowakei sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 So Tom und Prncipe su 2 ehemalige UdSSR sv 3 El Salvador sy 1 Syrien sz 1 Swasiland tc 1 Turks- und Caicosinseln td 1 Tschad tf 1 Franzsische Gebiete im sdlichen Indischen Ozean tg 1 Togo th 3 Thailand tj 1 Tadschikistan tk 1 Tokelau tl 1 Timor-Leste tm 1 Turkmenistan tn 1 Tunesien to 1 Tonga tp 1 Timor-Leste tr 3 Trkei tt 3 Trinidad und Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tansania ua 3 Ukraine ug 3 Uganda uk 3 Grobritannien um 1 Kleinere amerikanische berseeinseln us 4 Vereinigte Staaten uy 3 Uruguay uz 1 Usbekistan va 1 Vatikanstadt vc 1 St. Vincent und die Grenadinen ve 3 Venezuela vg 1 Britische Jungferninseln vi 1 Amerikanische Jungferninseln vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis und Futuna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Serbien und Montenegro za 3 Sdafrika zm 1 Sambia zr 1 ehemaliges Zaire zw 3 Simbabwe analog-6.0/lang/deform.html0000644000175000017500000001706610161303537016032 0ustar sret1sret100000000000000 Analog Berichtsformular

Analog Berichtsformular


1. Auswahl der Berichte

Die Bedeutung der einzelnen Berichte sind auf der analog Homepage beschrieben.

Welche Berichte sollen erstellt werden?


[Ein] [Aus] Allgemeine Übersicht
[Ein] [Aus] Monatsbericht
[Ein] [Aus] Wochenbericht
[Ein] [Aus] Tagesübersicht
[Ein] [Aus] Tagesbericht
[Ein] [Aus] Stündliche Übersicht
[Ein] [Aus] Domänenbericht
[Ein] [Aus] Hostsbericht
[Ein] [Aus] Verzeichnisbericht
[Ein] [Aus] Dateitypenbericht
[Ein] [Aus] Anfragenbericht
[Ein] [Aus] Dateigrößenbericht
[Ein] [Aus] Anfragerbericht
[Ein] [Aus] Browser Übersicht
[Ein] [Aus] Browserbericht
[Ein] [Aus] Statuscodebericht

Jetzt kann man das Programm starten:

oder die folgenden Felder ausfüllen, um individuelle Berichte zu erstellen.

Folgende Eingaben werden akzeptiert:
bedeutet: 10 Megabytes
bedeutet: die 50 (nach Bytes) größten Elemente


2. Optionen für detaillierte Berichte

Optionen für den Domänenbericht

Sortierung des Domänen Berichts
Berücksichtigung aller Domänen mit mindestens

Optionen für den Hostbericht

Sortierung des Hostberichts
Berücksichtigung aller Hosts mit mindestens

Optionen für den Verzeichnisbericht

Sortierung des Verzeichnisberichts
Berücksichtigung aller Verzeichnisse mit mindestens

Optionen für den Anfragenbericht

Sortierung des Anfragenberichts
Berücksichtigung aller Dateien mit mindestens
Anzeigen:

3. Teilauswertung der Logdatei

nach Datum:
Auswertung eines Zeitraums.Dabei das Anfangs- und Enddatum im Format yymmdd eingeben;
z.B. 980301 für den 1.März 1998
oder nur ein Feld zur Begrenzung des Zeitraums ausfüllen.
Von bis

nach Dateien:
Nur nach folgenden Dateien suchen (Liste, getrennt durch Kommata; darf Platzhalter, z.B. * , enthalten):

folgende Dateien nicht berücksichtigen:


4. Darststellung

Name ihrer Organisation (Für die Überschrift bzw. Seitentitel)

Adresse der Homepage Ihrer Organisation (falls keine vorhanden, bitte leer lassen)
URL:


analog-6.0/lang/dk.lng0000644000175000017500000003163210161303537014763 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. sn man tir ons tor fre lr jan feb mar apr maj jun jul aug sep okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" uge start r ## Quarter of a year kvartal mned dag dage kl minut minutter sekund sekunder byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes foresprgsel foresprgsler dato ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dato tidspunkt tid frste dato frste gang sidste dato sidste tidspunkt fil filer virtuel vrt virtuelle vrter vrt vrter katalog kataloger domne domner organisation organisationer filsuffiks filsuffikser URL URLs browser browsers OS OS'er ## (= operating system, operating systems) strrelse sgeterm sgetermer site sites bruger brugere statuskode statuskoder Web Server Statistik for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Generel rapport ## The time reports, plus "busiest" strings (at the bottom of each report) rlig rapport Mest travle r: Kvartalsrapport Mest travle kvartal: Mnedlig rapport Mest travle mned: Ugentlig rapport Mest travle uge: uge start: Daglig oversigt Daglig rapport Mest travle dag: Time rapport Time oversigt Tid i ugen oversigt Mest travle time: Kvartersrapport Kvarters oversigt Mest travle kvarter: Femminuttersrapport Femminutters oversigt Mest travle fem minutter: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Vrtrapport vrt vrter n Omdirigerede vrtrapport Vrt Vrter n Vrt fejlrapport Vrt Vrter n Katalog rapport katalog kataloger n Filtype rapport filsuffiks filsuffikser n Foresprgselsrapport fil filer n Omdirigeringer fil filer n Fejlrapport fil filer n Refererende adresserapport refererende URL refererende URLs n Refererende sites refererende site refererende sites n Omdirigerede refererende foresprgsler refererende URL refererende URLs n Mislykkede refererende foresprgsler refererende URL refererende URLs n Sgerapport sgning sgninger n Sgeordrapport sgeord sgeord n Intern sgerapport sgning sgninger n Intern sgeordrapport sgeord sgeord n Virtuelle vrter virtuel vrt virtuelle vrter n Omdirigerede virtuel vrt rapport Virtuel vrt Virtuelle vrter n n Virtuel vrt fejlrapport Virtuel vrt Virtuelle vrter n Brugerrapport bruger brugere n Omdirigerede brugerrapport bruger brugere n Mislykkede brugerforesprgsler bruger brugere n Browser oversigt browser browsere n Browser rapport browser browsere n Operativsystemrapport operativsystem operativsystemer n Domne rapport domne domner n Organisationsrapport organisation organisationer n Statuskode rapport statuskode statuskoder n Behandlingstidsrapport Filstrrelser ## Used at the bottom of the report Denne analyse blev produceret af Analysetid Under 1 ## Used in the time reports Hver enhed reprsenterer eller en del heraf sideforesprgsel sideforesprgsler ## Used at the bottom of each non-time report: need m, f & n genders ikke listet ikke listet ikke listet ## Used on the pie charts: again need m, f & n genders Andet Andet Andet ## Used at the top of the report Program start: Analyserede foresprgsler fra til ## Used in the General Summary ##7 dage til Totalt antal opfyldte foresprgsler Antal opfyldte foresprgsler pr. dag (gennemsnit) Totalt antal opfyldte foresprgsler for sider Antal opfyldte foresprgsler for sider pr. dag (gennemsnit) Logfil-linier uden statuskode Totalt antal uopfyldte foresprgsler Totalt antal omdirigerede foresprgsler Foresprgsler med informationsbrende statuskode Antal enkelte filer forespurgt Antal enkelte vrter betjent Ugyldige logfil linier Unskede logfil indfrsler Total mngde data overfrt Overfrte data pr. dag (gennemsnit) Tallene i parentes refererer til den sidste 7 dags periode sluttende den de sidste 7 dage G til Top ## Some special phrases for particular reports. [ikke-oversatte numeriske adresser] [domne ikke angivet] [ukendt domne] [rod katalog] [intet katalog] [intet suffiks] [kataloger] Ukendt Windows Andet Unix Robotter OS ukendt ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #henv 7-dage henv %henv %7-dage henv sider 7-dage sider %sider %7-dage sider bytes ?bytes 7-dage bytes 7-dage ?bytes %bytes %7-dage bytes ant ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Udskriver det frste %s * * Udskriver de frste %d %s * * Udskriver %s ## "by" in the phrase "listing the top 3 files BY number of requests" efter ## All requests WITH AT LEAST 10 requests med mindst ## Different ways of doing floors foresprgsel i de sidste 7 dage foresprgsler i de sidste 7 dage foresprgsel efter en side i de sidste 7 dage foresprgsler efter sider i de sidste 7 dage omdirigerede foresprgsel omdirigerede foresprgsler omdirigerede foresprgsel i de sidste 7 dage omdirigerede foresprgsler i de sidste 7 dage mislykket foresprgsel mislykkede foresprgsler mislykket foresprgsel i de sidste 7 dage mislykkede foresprgsler i de sidste 7 dage % trafik % af trafikken i de sidste 7 dage % af maks. trafikmngde % af maks. trafikken i de sidste 7 dage byte trafikken forespurgt siden ## ?bytes represents kbytes, Mbytes etc. ?bytes trafikken byte trafik i de sidste 7 dage bytes trafik i de sidste 7 dage ?bytes trafik i de sidste 7 dage med en omdirigeret foresprgsel siden med en mislykket foresprgsel siden bytes trafik med frste foresprgsel siden med frste omdirigerede foresprgsel siden med frste mislykkede foresprgsel siden ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorteret efter ## Used at the top of each report Denne rapport indeholder data fra ## Used in pie charts Skiverne viser ## different ways of sorting mngde trafik mngde trafik de sidste 7 dage % af foresprgslerne % af foresprgslene i de sidste 7 dage % af maks. antal foresprgsler % af maks. antal foresprgsler de sidste 7 dage antal foresprgsler antal foresprgsler de sidste 7 dage % af sideforesprgsler % af foresprgsler for sider de sidste 7 dage % af maks. antal sideforesprgsler % af maks. antal foresprgsler for sider de sidste 7 dage antal sideforesprgsler antal foresprgsler for sider de sidste 7 dage % af omdirigerede foresprgsler % af omdirigerede foresprgsler de sidste 7 dage % af maks. antal omdirigerede foresprgsler % af maks. antal omdirigerede foresprgsler de sidste 7 dage antal omdirigerede foresprgsler antal omdirigerede foresprgsler de sidste 7 dage % af mislykkede foresprgsler % af mislykkede foresprgsler de sidste 7 dage % af maks. antal mislykkede foresprgsler % af maks. antal af mislykkede foresprgsler de sidste 7 dage antal mislykkede foresprgsler antal mislykkede foresprgsler de sidste 7 dage tidspunkt for sidste foresprgsel tidspunkt for sidste omdirigerede foresprgsel tidspunkt for sidste mislykket foresprgsel tidspunkt for frste foresprgsel tidspunkt for frste omdirigerede foresprgsel tidspunkt for frste mislykket forsprgsel ## 3 other ways of sorting in m, f, & n * * sorteret alfabetisk * * sorteret numerisk * * usorteret ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m. %Y %H:%n ## "Program started at" and "Analysed requests from" %w %D. %m. %Y %H:%n ## In Daily Report %d.%m.%y ## In Daily Summary %w ## In Hourly Report %d.%m.%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m.%y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/dka.lng0000644000175000017500000003176510161303537015133 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. soe man tir ons tor fre lor jan feb mar apr maj jun jul aug sep okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" uge start aar ## Quarter of a year kvartal maaned dag dage kl minut minutter sekund sekunder byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes forespoergsel forespoergsler dato ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dato tidspunkt tid foerste dato foerste gang sidste dato sidste tidspunkt fil filer virtuel vaert virtuelle vaerter vaert vaerter katalog kataloger domaene domaener organisation organisationer filsuffiks filsuffikser URL URLs browser browsers OS OS'er ## (= operating system, operating systems) stoerrelse soegeterm soegetermer site sites bruger brugere statuskode statuskoder Web Server Statistik for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Generel rapport ## The time reports, plus "busiest" strings (at the bottom of each report) Aarlig rapport Mest travle aar: Kvartalsrapport Mest travle kvartal: Maanedlig rapport Mest travle maaned: Ugentlig rapport Mest travle uge: uge start: Daglig oversigt Daglig rapport Mest travle dag: Time rapport Time oversigt Tid i ugen oversigt Mest travle time: Kvartersrapport Kvarters oversigt Mest travle kvarter: Femminuttersrapport Femminutters oversigt Mest travle fem minutter: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Vaertrapport vaert vaerter n Omdirigerede vaertrapport Vaert Vaerter n Vaert fejlrapport Vaert Vaerter n Katalog rapport katalog kataloger n Filtype rapport filsuffiks filsuffikser n Forespoergselsrapport fil filer n Omdirigeringer fil filer n Fejlrapport fil filer n Refererende adresserapport refererende URL refererende URLs n Refererende sites refererende site refererende sites n Omdirigerede refererende forespoergsler refererende URL refererende URLs n Mislykkede refererende forespoergsler refererende URL refererende URLs n Soegerapport soegning soegninger n Soegeordrapport soegeord soegeord n Intern soegerapport soegning soegninger n Intern soegeordrapport soegeord soegeord n Virtuelle vaerter virtuel vaert virtuelle vaerter n Omdirigerede virtuel vaert rapport Virtuel vaert Virtuelle vaerter n n Virtuel vaert fejlrapport Virtuel vaert Virtuelle vaerter n Brugerrapport bruger brugere n Omdirigerede brugerrapport bruger brugere n Mislykkede brugerforespoergsler bruger brugere n Browser oversigt browser browsere n Browser rapport browser browsere n Operativsystemrapport operativsystem operativsystemer n Domaene rapport domaene domaener n Organisationsrapport organisation organisationer n Statuskode rapport statuskode statuskoder n Behandlingstidsrapport Filstoerrelser ## Used at the bottom of the report Denne analyse blev produceret af Analysetid Under 1 ## Used in the time reports Hver enhed repraesenterer eller en del heraf sideforespoergsel sideforespoergsler ## Used at the bottom of each non-time report: need m, f & n genders ikke listet ikke listet ikke listet ## Used on the pie charts: again need m, f & n genders Andet Andet Andet ## Used at the top of the report Program start: Analyserede forespoergsler fra til ## Used in the General Summary Totalt antal opfyldte forespoergsler Antal opfyldte forespoergsler pr. dag (gennemsnit) Totalt antal opfyldte forespoergsler for sider Antal opfyldte forespoergsler for sider pr. dag (gennemsnit) Logfil-linier uden statuskode Totalt antal uopfyldte forespoergsler Totalt antal omdirigerede forespoergsler Forespoergsler med informationsbaerende statuskode Antal enkelte filer forespurgt Antal enkelte vaerter betjent Ugyldige logfil linier Uoenskede logfil indfoersler Total maengde data overfoert Overfoerte data pr. dag (gennemsnit) Tallene i parentes refererer til 7 dage til de sidste 7 dage Gaa til Top ## Some special phrases for particular reports. [ikke-oversatte numeriske adresser] [domaene ikke angivet] [ukendt domaene] [rod katalog] [intet katalog] [intet suffiks] [kataloger] Ukendt Windows Andet Unix Robotter OS ukendt ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #henv 7-dage henv %henv %7-dage henv sider 7-dage sider %sider %7-dage sider bytes ?bytes 7-dage bytes 7-dage ?bytes %bytes %7-dage bytes ant ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Udskriver det foerste %s * * Udskriver de foerste %d %s * * Udskriver %s ## "by" in the phrase "listing the top 3 files BY number of requests" efter ## All requests WITH AT LEAST 10 requests med mindst ## Different ways of doing floors forespoergsel i de sidste 7 dage forespoergsler i de sidste 7 dage forespoergsel efter en side i de sidste 7 dage forespoergsler efter sider i de sidste 7 dage omdirigerede forespoergsel omdirigerede forespoergsler omdirigerede forespoergsel i de sidste 7 dage omdirigerede forespoergsler i de sidste 7 dage mislykket forespoergsel mislykkede forespoergsler mislykket forespoergsel i de sidste 7 dage mislykkede forespoergsler i de sidste 7 dage % trafik % af trafikken i de sidste 7 dage % af maks. trafikmaengde % af maks. trafikken i de sidste 7 dage byte trafikken forespurgt siden ## ?bytes represents kbytes, Mbytes etc. ?bytes trafikken byte trafik i de sidste 7 dage bytes trafik i de sidste 7 dage ?bytes trafik i de sidste 7 dage med en omdirigeret forespoergsel siden med en mislykket forespoergsel siden bytes trafik med foerste forespoergsel siden med foerste omdirigerede forespoergsel siden med foerste mislykkede forespoergsel siden ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorteret efter ## Used at the top of each report Denne rapport indeholder data fra ## Used in pie charts Skiverne viser ## different ways of sorting maengde trafik maengde trafik de sidste 7 dage % af forespoergslerne % af forespoergslene i de sidste 7 dage % af maks. antal forespoergsler % af maks. antal forespoergsler de sidste 7 dage antal forespoergsler antal forespoergsler de sidste 7 dage % af sideforespoergsler % af forespoergsler for sider de sidste 7 dage % af maks. antal sideforespoergsler % af maks. antal forespoergsler for sider de sidste 7 dage antal sideforespoergsler antal forespoergsler for sider de sidste 7 dage % af omdirigerede forespoergsler % af omdirigerede forespoergsler de sidste 7 dage % af maks. antal omdirigerede forespoergsler % af maks. antal omdirigerede forespoergsler de sidste 7 dage antal omdirigerede forespoergsler antal omdirigerede forespoergsler de sidste 7 dage % af mislykkede forespoergsler % af mislykkede forespoergsler de sidste 7 dage % af maks. antal mislykkede forespoergsler % af maks. antal af mislykkede forespoergsler de sidste 7 dage antal mislykkede forespoergsler antal mislykkede forespoergsler de sidste 7 dage tidspunkt for sidste forespoergsel tidspunkt for sidste omdirigerede forespoergsel tidspunkt for sidste mislykket forespoergsel tidspunkt for foerste forespoergsel tidspunkt for foerste omdirigerede forespoergsel tidspunkt for foerste mislykket forspoergsel ## 3 other ways of sorting in m, f, & n * * sorteret alfabetisk * * sorteret numerisk * * usorteret ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m. %Y %H:%n ## "Program started at" and "Analysed requests from" %w %D. %m. %Y %H:%n ## In Daily Report %d.%m.%y ## In Daily Summary %w ## In Hourly Report %d.%m.%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m.%y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/es.lng0000644000175000017500000003463510161303537015002 0ustar sret1sret100000000000000############################################################################### ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## By J. L. Garca, July 2001, based on earlier versions by Alfredo Sola, ## Alexander Velasquez, Nelson Tactuk and Javier Kohan. ## Comments and corrections to jlg@grafika.com.mx ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Dom Lun Mar Mi Jue Vie Sb Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic ## Next some standard common words. ## Abbreviation for "week beginning" com. de sem. ao ## Quarter of a year trimestre mes da das hr minuto minutos segundo segundos byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes peticin peticiones fecha ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 fecha hora hora primera fecha primera hora ltima fecha ltima hora archivo archivos sistema sistemas servidor virtual servidores virtuales directorio directorios dominio dominios organizacin organizaciones extensin extensiones URL URLs Navegador Navegadores SO SO ## (= operating system, operating systems) tamao trmino buscado trminos buscados sitio sitios usuario usuarios cd. de estado cds. de estado Estadsticas del servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Resumen general ## The time reports, plus "busiest" strings (at the bottom of each report) Reporte Anual Ao de mayor trfico: Reporte Trimestral Trimestre de mayor trfico: Informe mensual Mes de mayor trfico: Informe semanal Semana de mayor trfico: Resumen diario Informe diario Da de mayor trfico: Informe horario Resumen horario Reporte por hora de la semana Hora de mayor trfico: Informe de cuarto de hora Resumen por cuarto de hora Cuarto de hora de mayor trfico: Informe de cada cinco minutos Resumen de cada cinco minutos Cinco minutos de mayor trfico: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings. and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Informe de Sistemas sistema sistemas m Reporte de Redireccin de Sistema sistema sistemas m Reporte de Falla de Sistema sistema sistemas m Informe de Directorios directorio directorios m Informe de Tipos de Archivo extensin extensiones f Informe de peticiones archivo archivos m Informe de redireccionamientos archivo archivos m Informe de fallos en una peticin archivo archivos m Informe de remitentes URL remitente URLs remitentes m Informe de sitios remitentes sitio remitente sitios remitentes m Informe de remitentes redirecionados URL remitente URLs remitentes m Informe de errores de remitentes URL del remitente URLs de remitentes m Reporte de Preguntas de Bsqueda pregunta preguntas f Reporte de Palabras de Buscadas palabra buscada palabras buscadas f Reporte Interno de Preguntas de Bsqueda pregunta preguntas f Reporte Interno de Palabras Buscadas palabra buscada palabras buscadas f Informe de servidores virtuales servidor virtual servidores virtuales m Reporte de Redireccin de Servidores Virtuales servidor virtual servidores virtuales m Reporte de Falla de Servidor Virtual servidor virtual servidores virtuales m Informe de usuarios usuario usuarios m Reporte de Redireccin de Usuarios usuario usuarios m Informe de errores de usuarios usuario usuarios m Resumen de navegadores navegador navegadores m Informe de navegadores navegador navegadores m Informe de Sistemas Operativos sistema operativo sistemas operativos m Informe de dominios dominio dominios m Informe de organizacin organizacin organizaciones f Informe de cdigos de estado cdigo de estado cdigos de estado m Informe de tiempo de procesamiento Informe de tamao de archivos ## Used at the bottom of the report Este anlisis estadstico fue generado por Tiempo de ejecucin Menos de 1 ## Used in the time reports Cada unidad representa o fraccin peticin de una pgina peticiones por pginas ## Used at the bottom of each non-time report: need m, f & n genders no listados no listadas * ## Used on the pie charts: again need m, f & n genders Otro Otro * ## Used at the top of the report Programa iniciado a las Anlisis de peticiones del al ## Used in the General Summary Peticiones exitosas Promedio de peticiones exitosas por da Peticiones exitosas por pgina Promedio de peticiones exitosas por pgina por da Lneas sin cdigo de estado en el archivo de registros Peticiones no logradas Peticiones redireccionadas Peticiones con cdigo de estado informativo Archivos diferentes solicitados Sistemas diferentes atendidos Lneas no vlidas en el archivo de registros Entradas no solicitadas en el archivo de registros Transferencia total Promedio de transferencia por da Los nmeros entre parntesis se refieren a 7 das al los ltimos 7 das Ir a Arriba ## Some special phrases for particular reports. [direcciones numricas sin resolver] [dominio sin indicar] [dominio desconocido] [directorio raz] [sin directorio] [sin extensin] [directorios] Windows desconocido Otro Unix Robots Sistema Operativo desconocido ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) No. pet. pets. 7-dias %pet. %pets 7-dias Pgs. pgs. 7-dias %Pgs. %pgs. 7-dias bytes ?bytes bytes 7-dias ?bytes 7-dias %bytes %bytes 7-dias no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Listado de los primeros %s Listado de las primeras %s * Listado de los %d primeros %s Listado de las %d primeras %s * Listado de los %s Listado de las %s * ## "by" in the phrase "listing the top 3 files BY number of requests" por ## All requests WITH AT LEAST 10 requests que representan, por lo menos, ## Different ways of doing floors peticin en los ltimos 7 das peticiones en los ltimos 7 das peticin por una pgina en los ltimos 7 das peticiones por pgina en los ltimos 7 das peticin redireccionada peticiones redireccionadas peticin redireccionada en los ltimos 7 das peticiones redireccionadas en los ltimos 7 das peticin no lograda peticiones no logradas peticin no lograda en los ltimos 7 das peticiones no logradas en los ltimos 7 das % del trfico % del trfico en los ltimos 7 das % de la cantidad mxima de trfico % de la cantidad mxima de trfico en los ltimos 7 das byte de trfico bytes de trfico ## ?bytes represents kbytes, Mbytes etc. ?bytes de trfico byte de trfico en los ltimos 7 das bytes de trfico en los ltimos 7 das ?bytes de trfico en los ltimos 7 das con una peticin desde con una peticin redireccionada desde con una peticin no lograda desde con una primera peticin desde con una primera peticin redireccionada desde con una primera peticin no lograda desde ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenados por ordenadas por * ## Used at the top of each report Este reporte contiene datos de ## Used in pie charts Las reas estn dibujadas por ## different ways of sorting cantidad de trfico cantidad de trfico en los ltimos 7 das % de peticiones % de peticiones en los ltimos 7 das % del nmero mximo de peticiones % del nmero mximo de peticiones en los ltimos 7 das nmero de peticiones nmero de peticiones en los ltimos 7 das % de peticiones por pginas % de peticiones por pginas en los ltimos 7 das % del nmero mximo de peticiones por pginas % del nmero mximo de peticiones por pginas en los ltimos 7 das nmero de peticiones por pginas nmero de peticiones por pginas en los ltimos 7 das % de peticiones redireccionadas % de peticiones redireccionadas en los ltimos 7 das % del nmero mximo de peticiones redireccionadas % del nmero mximo de peticiones redireccionadas en los ltimos 7 das nmero de peticiones redireccionadas nmero de peticiones redireccionadas en los ltimos 7 das % de peticiones no logradas % de peticiones no logradas en los ltimos 7 das % del nmero mximo de peticiones no logradas % del nmero mximo de peticiones no logradas en los ltimos 7 das nmero de peticiones no logradas nmero de peticiones no logradas en los ltimos 7 das hora de la ltima peticin hora de la ltima peticin redireccionada hora de la ltima peticin no lograda hora de la primera peticin hora de la primera peticin redireccionada hora de la primera peticin no lograda ## 3 other ways of sorting in m, f, & n por orden alfabtico por orden alfabtico por orden alfabtico por orden numrico por orden numrico por orden numrico desordenados desordenadas * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D/%m/%Y %j:%n %a ## "Program started at" and "Analysed requests from" %w/%D/%m/%Y %j:%n %a ## In Daily Report %d/%m/%Y ## In Daily Summary %w ## In Hourly Report %d/%m/%Y %H:%n%x%I:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o %b ## In Quarter-Hour and Five-Minute Reports %d/%m/%Y %H:%n%x%I:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n%x%I:%o %b ## In Weekly Report %d/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%Y ## The date & time (D) column in non-time reports %d/%m/%Y %j:%n %a ## In non-time reports: "including all files with requests since [date]" %d/%m/%Y a las %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continuar la peticin 101 Protocolos de conmutacin 1xx [Varios mensajes informativos] 200 OK 201 Creado 202 Aceptado para procesamiento ulterior 203 Informacin no autorizada 204 OK, pero nada para enviar 205 Restablecer el documento 206 Contenido parcial 2xx [Varias operaciones logradas] 300 Mltiples documentos disponibles 301 Documento desplazado permanentemente 302 Documento encontrado en otro lado 303 Vase otro documento 304 Sin modificar desde el ltimo acceso 305 Usar un servidor alterno 306 Cambiar de servidor alterno 307 Documento desplazado temporalmente 3xx [Varios redireccionamientos] 400 peticin incorrecta 401 Se requiere autenticacin 402 Se requiere pago 403 Acceso prohibido 404 Documento no encontrado 405 Mtodo no permitido 406 Documento no aceptable para el cliente 407 Se requiere autenticacin del servidor alterno 408 peticin interrumpida 409 Conflicto de la peticin con el estado del recurso 410 Documento definitivamente inaccesible 411 Duracin requerida 412 Fallo de la precondicin 413 peticin demasiado larga 414 Nombre de archivo requerido demasiado largo 415 Tipo de medio no soportado 416 El rango solicitado no es vlido 417 Expectacin no lograda 4xx [Varios errores cliente/usuario] 500 Error interno del servidor 501 Tipo de peticin no soportada 502 Error en direccin del servidor 503 Servicio no disponible temporalmente 504 Pasarela interrumpida 505 Versin HTTP no suportada 506 Redireccin no lograda 5xx [Varios errores de servidor] xxx [Desconocido] analog-6.0/lang/esa.lng0000644000175000017500000003463310161303537015141 0ustar sret1sret100000000000000############################################################################### ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## By J. L. Garcia, July 2001, based on earlier versions by Alfredo Sola, ## Alexander Velasquez, Nelson Tactuk and Javier Kohan. ## Comments and corrections to jlg@grafika.com.mx ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Dom Lun Mar Mie Jue Vie Sab Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic ## Next some standard common words. ## Abbreviation for "week beginning" com. de sem. ano ## Quarter of a year trimestre mes dia dias hr minuto minutos segundo segundos byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes peticion peticiones fecha ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 fecha hora hora primera fecha primera hora ultima fecha ultima hora archivo archivos sistema sistemas servidor virtual servidores virtuales directorio directorios dominio dominios organizacion organizaciones extension extensiones URL URLs Navegador Navegadores SO SO ## (= operating system, operating systems) tamano termino buscado terminos buscados sitio sitios usuario usuarios cod. de estado cods. de estado Estadisticas del servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Resumen general ## The time reports, plus "busiest" strings (at the bottom of each report) Reporte Anual Ano de mayor trafico: Reporte Trimestral Trimestre de mayor trafico: Informe mensual Mes de mayor trafico: Informe semanal Semana de mayor trafico: Resumen diario Informe diario Dia de mayor trafico: Informe horario Resumen horario Reporte por hora de la semana Hora de mayor trafico: Informe de cuarto de hora Resumen por cuarto de hora Cuarto de hora de mayor trafico: Informe de cada cinco minutos Resumen de cada cinco minutos Cinco minutos de mayor trafico: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings. and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Informe de Sistemas sistema sistemas m Reporte de Redireccion de Sistema sistema sistemas m Reporte de Falla de Sistema sistema sistemas m Informe de Directorios directorio directorios m Informe de Tipos de Archivo extension extensiones f Informe de peticiones archivo archivos m Informe de redireccionamientos archivo archivos m Informe de fallos en una peticion archivo archivos m Informe de remitentes URL remitente URLs remitentes m Informe de sitios remitentes sitio remitente sitios remitentes m Informe de remitentes redirecionados URL remitente URLs remitentes m Informe de errores de remitentes URL del remitente URLs de remitentes m Reporte de Preguntas de Busqueda pregunta preguntas f Reporte de Palabras de Buscadas palabra buscada palabras buscadas f Reporte Interno de Preguntas de Busqueda pregunta preguntas f Reporte Interno de Palabras Buscadas palabra buscada palabras buscadas f Informe de servidores virtuales servidor virtual servidores virtuales m Reporte de Redireccion de Servidores Virtuales servidor virtual servidores virtuales m Reporte de Falla de Servidor Virtual servidor virtual servidores virtuales m Informe de usuarios usuario usuarios m Reporte de Redireccion de Usuarios usuario usuarios m Informe de errores de usuarios usuario usuarios m Resumen de navegadores navegador navegadores m Informe de navegadores navegador navegadores m Informe de Sistemas Operativos sistema operativo sistemas operativos m Informe de dominios dominio dominios m Informe de organizacion organizacion organizaciones f Informe de codigos de estado codigo de estado codigos de estado m Informe de tiempo de procesamiento Informe de tamano de archivos ## Used at the bottom of the report Este analisis estadistico fue generado por Tiempo de ejecucion Menos de 1 ## Used in the time reports Cada unidad representa o fraccion peticion de una pagina peticiones por paginas ## Used at the bottom of each non-time report: need m, f & n genders no listados no listadas * ## Used on the pie charts: again need m, f & n genders Otro Otro * ## Used at the top of the report Programa iniciado a las Analisis de peticiones del al ## Used in the General Summary Peticiones exitosas Promedio de peticiones exitosas por dia Peticiones exitosas por pagina Promedio de peticiones exitosas por pagina por dia Lineas sin codigo de estado en el archivo de registros Peticiones no logradas Peticiones redireccionadas Peticiones con codigo de estado informativo Archivos diferentes solicitados Sistemas diferentes atendidos Lineas no validas en el archivo de registros Entradas no solicitadas en el archivo de registros Transferencia total Promedio de transferencia por dia Los numeros entre parentesis se refieren a 7 dias al los ultimos 7 dias Ir a Arriba ## Some special phrases for particular reports. [direcciones numericas sin resolver] [dominio sin indicar] [dominio desconocido] [directorio raiz] [sin directorio] [sin extension] [directorios] Windows desconocido Otro Unix Robots Sistema Operativo desconocido ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) No. pet. pets. 7-dias %pet. %pets 7-dias Pags. pags. 7-dias %Pags. %pags. 7-dias bytes ?bytes bytes 7-dias ?bytes 7-dias %bytes %bytes 7-dias no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Listado de los primeros %s Listado de las primeras %s * Listado de los %d primeros %s Listado de las %d primeras %s * Listado de los %s Listado de las %s * ## "by" in the phrase "listing the top 3 files BY number of requests" por ## All requests WITH AT LEAST 10 requests que representan, por lo menos, ## Different ways of doing floors peticion en los ultimos 7 dias peticiones en los ultimos 7 dias peticion por una pagina en los ultimos 7 dias peticiones por pagina en los ultimos 7 dias peticion redireccionada peticiones redireccionadas peticion redireccionada en los ultimos 7 dias peticiones redireccionadas en los ultimos 7 dias peticion no lograda peticiones no logradas peticion no lograda en los ultimos 7 dias peticiones no logradas en los ultimos 7 dias % del trafico % del trafico en los ultimos 7 dias % de la cantidad maxima de trafico % de la cantidad maxima de trafico en los ultimos 7 dias byte de trafico bytes de trafico ## ?bytes represents kbytes, Mbytes etc. ?bytes de trafico byte de trafico en los ultimos 7 dias bytes de trafico en los ultimos 7 dias ?bytes de trafico en los ultimos 7 dias con una peticion desde con una peticion redireccionada desde con una peticion no lograda desde con una primera peticion desde con una primera peticion redireccionada desde con una primera peticion no lograda desde ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenados por ordenadas por * ## Used at the top of each report Este reporte contiene datos de ## Used in pie charts Las areas estan dibujadas por ## different ways of sorting cantidad de trafico cantidad de trafico en los ultimos 7 dias % de peticiones % de peticiones en los ultimos 7 dias % del numero maximo de peticiones % del numero maximo de peticiones en los ultimos 7 dias numero de peticiones numero de peticiones en los ultimos 7 dias % de peticiones por paginas % de peticiones por paginas en los ultimos 7 dias % del numero maximo de peticiones por paginas % del numero maximo de peticiones por paginas en los ultimos 7 dias numero de peticiones por paginas numero de peticiones por paginas en los ultimos 7 dias % de peticiones redireccionadas % de peticiones redireccionadas en los ultimos 7 dias % del numero maximo de peticiones redireccionadas % del numero maximo de peticiones redireccionadas en los ultimos 7 dias numero de peticiones redireccionadas numero de peticiones redireccionadas en los ultimos 7 dias % de peticiones no logradas % de peticiones no logradas en los ultimos 7 dias % del numero maximo de peticiones no logradas % del numero maximo de peticiones no logradas en los ultimos 7 dias numero de peticiones no logradas numero de peticiones no logradas en los ultimos 7 dias hora de la ultima peticion hora de la ultima peticion redireccionada hora de la ultima peticion no lograda hora de la primera peticion hora de la primera peticion redireccionada hora de la primera peticion no lograda ## 3 other ways of sorting in m, f, & n por orden alfabetico por orden alfabetico por orden alfabetico por orden numerico por orden numerico por orden numerico desordenados desordenadas * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D/%m/%Y %j:%n %a ## "Program started at" and "Analysed requests from" %w/%D/%m/%Y %j:%n %a ## In Daily Report %d/%m/%Y ## In Daily Summary %w ## In Hourly Report %d/%m/%Y %H:%n%x%I:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o %b ## In Quarter-Hour and Five-Minute Reports %d/%m/%Y %H:%n%x%I:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n%x%I:%o %b ## In Weekly Report %d/%m/%Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%Y ## The date & time (D) column in non-time reports %d/%m/%Y %j:%n %a ## In non-time reports: "including all files with requests since [date]" %d/%m/%Y a las %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continuar la peticion 101 Protocolos de conmutacion 1xx [Varios mensajes informativos] 200 OK 201 Creado 202 Aceptado para procesamiento ulterior 203 Informacion no autorizada 204 OK, pero nada para enviar 205 Restablecer el documento 206 Contenido parcial 2xx [Varias operaciones logradas] 300 Multiples documentos disponibles 301 Documento desplazado permanentemente 302 Documento encontrado en otro lado 303 Vease otro documento 304 Sin modificar desde el ultimo acceso 305 Usar un servidor alterno 306 Cambiar de servidor alterno 307 Documento desplazado temporalmente 3xx [Varios redireccionamientos] 400 peticion incorrecta 401 Se requiere autenticacion 402 Se requiere pago 403 Acceso prohibido 404 Documento no encontrado 405 Metodo no permitido 406 Documento no aceptable para el cliente 407 Se requiere autenticacion del servidor alterno 408 peticion interrumpida 409 Conflicto de la peticion con el estado del recurso 410 Documento definitivamente inaccesible 411 Duracion requerida 412 Fallo de la precondicion 413 peticion demasiado larga 414 Nombre de archivo requerido demasiado largo 415 Tipo de medio no soportado 416 El rango solicitado no es valido 417 Expectacion no lograda 4xx [Varios errores cliente/usuario] 500 Error interno del servidor 501 Tipo de peticion no soportada 502 Error en direccion del servidor 503 Servicio no disponible temporalmente 504 Pasarela interrumpida 505 Version HTTP no suportada 506 Redireccion no lograda 5xx [Varios errores de servidor] xxx [Desconocido] analog-6.0/lang/esadesc.txt0000644000175000017500000001130210161303537016023 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Este reporte enlista la actividad en cada ano. # Quarterly Report Este reporte enlista la actividad en cada trimestre. # Monthly Report Este reporte enlista la actividad en cada mes. # Weekly Report Este reporte enlista la actividad en cada semana. # Daily Report Este reporte enlista la actividad en cada dia. # Hourly Report Este reporte enlista la actividad en cada hora. # Quarter-Hour Report Este reporte enlista la actividad en periodos de cuarto de hora. # Five-Minute Report Este reporte enlista la actividad en periodos de cada cinco minutos. # Daily Summary Este reporte enlista la actividad total por cada dia de la semana, sumados por todas las semanas en el reporte. # Hourly Summary Este reporte enlista la actividad total por cada hora de la semana, sumados por todos los dias en el reporte. # Hour of the Week Summary Este reporte enlista la actividad total por cada hora de la semana, sumando todas las semanas en el reporte. # Quarter-Hour Summary Este reporte enlista la actividad total por periodos de cuarto de hora del dia, sumados por todos los dias en el reporte. # Five-Minute Summary Este reporte enlista la actividad en periodos de cada cinco minutos, sumados por todos los dias en el reporte. # General Summary Este reporte contiene estadisticas globales. # Request Report Este reporte enlista los archivos en el sitio. # Redirection Report Este reporte enlista los archivos causantes que peticiones fueran redireccionadas a otro archivo. ( Usualmente directorios sin la diagonal final, o scripts CGI que forzaron redireccionamientos.) # Failure Report Este reporte enlista los acrchivos que causaron peticiones no logradas, por ejemplo archivos no encontrados. # File Type Report Este reporte enlista las extensiones de los archivos pedidos. # Directory Report Este reporte enlista los directorios desde los cuales fueron pedidos los archivos. (Los numeros por cada directorio incluyen el total de sus subdirectorios.) # Host Report Este reporte enlista las computadoras desde las cuales se pidieron archivos. # Host Redirection Report Este reporte enlista las computadoras que fueron redireccionadas a otro archivo. # Host Failure Report Este reporte enlista las computadoras que encontraron peticiones no logradas. # Domain Report Este reporte enlista los paises de las computadoras que pidieron archivos. # Referrer Report Este reporte enlista los remitentes (de donde la gente siguio el enlace, o paginas que incluyen imagenes de este sitio). # Referring Site Report Este reporte enlista de que servidores siguio el enlace la gente. # Redirected Referrer Report este reporte enlista los remitentes que causaron peticiones redireccionadas. # Failed Referrer Report Este reporte enlista los remitentes que contienen enlaces rotos al sitio. # Browser Report Este reporte enlista los naegadores usados por los visitantes. # Virtual Host Report Este reporte enlista la actividad en cada uno de los dominios virtuales en el sitio. # Virtual Host Redirection Report Este reporte enlista las peticiones redireccionadas a cada uno de los dominios virtuales. # Virtual Host Failure Report Este reporte enlista las peticiones no logradas a cada uno de los dominios virtuales. # User Report Este reporte enlista a los usuarios que pidieron archivos, si los usuarios han sido autenticados o pueden ser identificados por galletas. # User Redirection Report Este reporte enlista a los usuarios quienes fueron redireccionados a otro archivo. # User Failure Report Este reporte enlista a los usuarios quienes encontraron peticiones no logradas. # Organisation Report Este reporte enlista las organizaciones de las computadoras quienes pidieron archivos. # Search Query Report Este reporte enlista cuales preguntas la gente uso en los motores de busqueda para encontrar el sitio. # Search Word Report Este reporte enlista cuales palabras la gente uso en los motores de busqueda para encontrar el sitio. # Internal Search Query Report Este reporte enlista cuales preguntas la gente uso en scripts dentro del sitio. # Internal Search Word Report Este reporte enlista cuales palabras la gente uso en scripts dentro del sitio. # Browser Summary Este reporte enlista los proveedores de los navegadores de los visitantes. # Operating System Report Este reporte enlista los sistemas operativos usados por los visitantes. # File Size Report Este reporte enlista los tamanos de los archivos. # Status Code Report Este reporte enlista los codigos de estado HTTP de todas las peticiones. # Processing Time Report Este reporte enlista los tiempos tomados para procesar peticiones exitosas. analog-6.0/lang/esadom.tab0000644000175000017500000001152710161303537015624 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emiratos Arabes Unidos af 1 Afganistan ag 2 Antigua y Barbuda ai 1 Anguila al 1 Albania am 2 Armenia an 1 Antillas Holandesas ao 1 Angola aq 1 Antartida ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijan ba 3 Bosnia-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgica bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazil bs 1 Bahamas bt 1 Butan bv 1 Isla Bouvet bw 1 Botswana by 1 Bielorusia bz 1 Belice ca 3 Canada cc 1 Cocos - Isla Keeling cd 1 Zaire cf 1 Republica de Africa Central cg 1 Republica de Congo (Zaire) ch 2 Suiza ci 1 Costa de Marfil ck 1 Islas de Cook (Rarotonga) cl 2 Chile cm 1 Camerun cn 3 China co 3 Colombia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Islas Navidad cy 3 Chipre cz 2 Republica Checa de 2 Alemania dj 1 Yibuti dk 2 Dinamarca dm 2 Dominica do 3 Republica Dominicana dz 1 Algeria ec 3 Ecuador edu 2 Educativo ee 2 Estonia eg 3 Egipto eh 1 Sahara Occidental er 1 Eritrea es 2 Espana et 1 Etiopia fi 2 Finlandia fj 3 Fiji fk 1 Islas Malvinas fm 1 Micronesia fo 1 Islas Faroe fr 2 Francia fx 1 Francia (Territorio Europeo) ga 1 Gabon gb 1 Reino Unido gd 1 Granada ge 1 Georgia gf 1 Guyana Francesa gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenlandia gm 1 Gambia gn 1 Guinea gov 2 Gobierno gp 1 Guadalupe gq 1 Guinea Ecuatorial gr 2 Grecia gs 1 Georgia del Sur e Islas Sandwich del Sur gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Islas Heard y McDonald hn 2 Honduras hr 2 Croacia ht 1 Haiti hu 2 Hungria id 3 Indonesia ie 2 Irlanda il 3 Israel im 1 Isla de Man in 3 India int 1 Internacional io 1 Territorio Oceanico Indio-Britanico iq 1 Irak ir 1 Iran is 2 Islandia it 2 Italia je 1 Jersey jm 3 Jamaica jo 3 Jordania jp 3 Japon ke 3 Kenya kg 1 Kyrgyzstan kh 1 Camboya ki 1 Kiribati km 1 Comoros kn 1 San Kitts y Nevis kp 1 Korea del Norte kr 3 Korea del Sur kw 3 Kuwait ky 1 Islas Caiman kz 1 Kazakhstan la 1 Laos lb 3 Libano lc 1 Santa Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lituania lu 2 Luxemburgo lv 2 Letonia ly 1 Libia ma 1 Marruecos mc 2 Monaco md 1 Moldova mg 1 Madagascar mh 1 Islas Marshall mil 2 Militar mk 3 Macedonia (Antigua Republica Yugoslava) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macau mp 1 Islas Marianas del Norte mq 1 Martinica mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Isla Mauricio mv 1 Islas Maldivas mw 1 Malawi mx 3 Mexico my 3 Malasia mz 1 Mozambique na 1 Namibia nc 1 Nueva Caledonia ne 1 Niger net 2 Red nf 1 Isla Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Paises Bajos (Holanda) no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Isla Niue nz 3 Nueva Zelanda om 1 Oman org 2 Organizaciones sin fines de lucro pa 3 Panama pe 3 Peru pf 1 Polinesia Francesa pg 3 Papua Nueva-Guinea ph 3 Filipinas pk 3 Pakistan pl 3 Polonia pm 1 San Pierre y Miquelon pn 1 Isla Pitcairn pr 1 Puerto Rico ps 3 Territorio Palestino Ocupado pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Catar re 1 Isla Reunion ro 2 Rumania ru 2 Rusia rw 1 Rwanda sa 3 Arabia Saudita sb 1 Islas Salomon sc 1 Islas Seychelles sd 1 Sudan se 2 Suecia sg 3 Singapur sh 1 Santa Helena si 2 Eslovenia sj 1 Islas Svalbard y Jan Mayen sk 2 Eslovaquia sl 1 Sierra Leona sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Saint Tome and Principe su 2 Antigua USSR sv 3 El Salvador sy 1 Siria sz 1 Swazilandia tc 1 Islas Turks y Caicos td 1 Chad tf 1 Territorios Surenos de Francia tg 1 Togo th 3 Tailandia tj 1 Tajikistan tk 1 Islas Tokelau tl 1 Timor Oriental tm 1 Turkmenistan tn 1 Tunez to 1 Tonga tp 1 Timor Oriental tr 3 Turquia tt 3 Trinidad y Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ucrania ug 3 Uganda uk 3 Reino Unido um 1 Islas menores remotas de USA us 4 Estados Unidos uy 3 Uruguay uz 1 Uzbekistan va 1 Ciudad del Vaticano vc 1 San Vicente y Granadinas ve 3 Venezuela vg 1 Islas Virgenes (Britanicas) vi 1 Islas Virgenes (USA) vn 1 Vietnam vu 1 Vanautu (Nuevas Hebridas) wf 1 Islas Wallis y Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Yugoeslavia za 3 Africa del Sur zm 1 Zambia zr 1 Zaire zw 3 Zimbabwe analog-6.0/lang/esdesc.txt0000644000175000017500000001130210161303537015662 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Este reporte enlista la actividad en cada ao. # Quarterly Report Este reporte enlista la actividad en cada trimestre. # Monthly Report Este reporte enlista la actividad en cada mes. # Weekly Report Este reporte enlista la actividad en cada semana. # Daily Report Este reporte enlista la actividad en cada da. # Hourly Report Este reporte enlista la actividad en cada hora. # Quarter-Hour Report Este reporte enlista la actividad en perodos de cuarto de hora. # Five-Minute Report Este reporte enlista la actividad en perodos de cada cinco minutos. # Daily Summary Este reporte enlista la actividad total por cada da de la semana, sumados por todas las semanas en el reporte. # Hourly Summary Este reporte enlista la actividad total por cada hora de la semana, sumados por todos los das en el reporte. # Hour of the Week Summary Este reporte enlista la actividad total por cada hora de la semana, sumando todas las semanas en el reporte. # Quarter-Hour Summary Este reporte enlista la actividad total por perodos de cuarto de hora del da, sumados por todos los das en el reporte. # Five-Minute Summary Este reporte enlista la actividad en perodos de cada cinco minutos, sumados por todos los das en el reporte. # General Summary Este reporte contiene estadsticas globales. # Request Report Este reporte enlista los archivos en el sitio. # Redirection Report Este reporte enlista los archivos causantes que peticiones fueran redireccionadas a otro archivo. ( Usualmente directorios sin la diagonal final, o scripts CGI que forzaron redireccionamientos.) # Failure Report Este reporte enlista los acrchivos que causaron peticiones no logradas, por ejemplo archivos no encontrados. # File Type Report Este reporte enlista las extensiones de los archivos pedidos. # Directory Report Este reporte enlista los directorios desde los cules fueron pedidos los archivos. (Los nmeros por cada directorio incluyen el total de sus subdirectorios.) # Host Report Este reporte enlista las computadoras desde las cules se pidieron archivos. # Host Redirection Report Este reporte enlista las computadoras que fueron redireccionadas a otro archivo. # Host Failure Report Este reporte enlista las computadoras que encontraron peticiones no logradas. # Domain Report Este reporte enlista los pases de las computadoras que pidieron archivos. # Referrer Report Este reporte enlista los remitentes (de donde la gente sigui el enlace, o pginas que incluyen imgenes de ste sitio). # Referring Site Report Este reporte enlista de qu servidores sigui el enlace la gente. # Redirected Referrer Report este reporte enlista los remitentes que causaron peticiones redireccionadas. # Failed Referrer Report Este reporte enlista los remitentes que contienen enlaces rotos al sitio. # Browser Report Este reporte enlista los naegadores usados por los visitantes. # Virtual Host Report Este reporte enlista la actividad en cada uno de los dominios virtuales en el sitio. # Virtual Host Redirection Report Este reporte enlista las peticiones redireccionadas a cada uno de los dominios virtuales. # Virtual Host Failure Report Este reporte enlista las peticiones no logradas a cada uno de los dominios virtuales. # User Report Este reporte enlista a los usuarios que pidieron archivos, si los usuarios han sido autenticados o pueden ser identificados por galletas. # User Redirection Report Este reporte enlista a los usuarios quienes fueron redireccionados a otro archivo. # User Failure Report Este reporte enlista a los usuarios quienes encontraron peticiones no logradas. # Organisation Report Este reporte enlista las organizaciones de las computadoras quienes pidieron archivos. # Search Query Report Este reporte enlista cules preguntas la gente us en los motores de bsqueda para encontrar el sitio. # Search Word Report Este reporte enlista cules palabras la gente us en los motores de bsqueda para encontrar el sitio. # Internal Search Query Report Este reporte enlista cules preguntas la gente us en scripts dentro del sitio. # Internal Search Word Report Este reporte enlista cules palabras la gente us en scripts dentro del sitio. # Browser Summary Este reporte enlista los proveedores de los navegadores de los visitantes. # Operating System Report Este reporte enlista los sistemas operativos usados por los visitantes. # File Size Report Este reporte enlista los tamaos de los archivos. # Status Code Report Este reporte enlista los cdigos de estado HTTP de todas las peticiones. # Processing Time Report Este reporte enlista los tiempos tomados para procesar peticiones exitosas. analog-6.0/lang/esdom.tab0000644000175000017500000001152710161303537015463 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emiratos Arabes Unidos af 1 Afganistn ag 2 Antigua y Barbuda ai 1 Anguila al 1 Albania am 2 Armenia an 1 Antillas Holandesas ao 1 Angola aq 1 Antrtida ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijn ba 3 Bosnia-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Blgica bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazil bs 1 Bahamas bt 1 Butn bv 1 Isla Bouvet bw 1 Botswana by 1 Bielorusia bz 1 Belice ca 3 Canada cc 1 Cocos - Isla Keeling cd 1 Zaire cf 1 Repblica de Africa Central cg 1 Repblica de Congo (Zaire) ch 2 Suiza ci 1 Costa de Marfil ck 1 Islas de Cook (Rarotonga) cl 2 Chile cm 1 Camern cn 3 China co 3 Colombia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Islas Navidad cy 3 Chipre cz 2 Repblica Checa de 2 Alemania dj 1 Yibuti dk 2 Dinamarca dm 2 Dominica do 3 Repblica Dominicana dz 1 Algeria ec 3 Ecuador edu 2 Educativo ee 2 Estonia eg 3 Egipto eh 1 Sahara Occidental er 1 Eritrea es 2 Espaa et 1 Etiopa fi 2 Finlandia fj 3 Fiji fk 1 Islas Malvinas fm 1 Micronesia fo 1 Islas Faroe fr 2 Francia fx 1 Francia (Territorio Europeo) ga 1 Gabn gb 1 Reino Unido gd 1 Granada ge 1 Georgia gf 1 Guyana Francesa gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenlandia gm 1 Gambia gn 1 Guinea gov 2 Gobierno gp 1 Guadalupe gq 1 Guinea Ecuatorial gr 2 Grecia gs 1 Georgia del Sur e Islas Sandwich del Sur gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Islas Heard y McDonald hn 2 Honduras hr 2 Croacia ht 1 Hait hu 2 Hungra id 3 Indonesia ie 2 Irlanda il 3 Israel im 1 Isla de Man in 3 India int 1 Internacional io 1 Territorio Ocenico Indio-Britnico iq 1 Irak ir 1 Irn is 2 Islandia it 2 Italia je 1 Jersey jm 3 Jamaica jo 3 Jordania jp 3 Japn ke 3 Kenya kg 1 Kyrgyzstn kh 1 Camboya ki 1 Kiribati km 1 Comoros kn 1 San Kitts y Nevis kp 1 Korea del Norte kr 3 Korea del Sur kw 3 Kuwait ky 1 Islas Caimn kz 1 Kazakhstn la 1 Laos lb 3 Lbano lc 1 Santa Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lituania lu 2 Luxemburgo lv 2 Letonia ly 1 Libia ma 1 Marruecos mc 2 Mnaco md 1 Moldova mg 1 Madagascar mh 1 Islas Marshall mil 2 Militar mk 3 Macedonia (Antigua Repblica Yugoslava) ml 1 Mal mm 1 Myanmar mn 1 Mongolia mo 1 Macau mp 1 Islas Marianas del Norte mq 1 Martinica mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Isla Mauricio mv 1 Islas Maldivas mw 1 Malawi mx 3 Mxico my 3 Malasia mz 1 Mozambique na 1 Namibia nc 1 Nueva Caledonia ne 1 Nger net 2 Red nf 1 Isla Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Pases Bajos (Holanda) no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Isla Niue nz 3 Nueva Zelanda om 1 Omn org 2 Organizaciones sin fines de lucro pa 3 Panam pe 3 Per pf 1 Polinesia Francesa pg 3 Papua Nueva-Guinea ph 3 Filipinas pk 3 Pakistn pl 3 Polonia pm 1 San Pierre y Miquelon pn 1 Isla Pitcairn pr 1 Puerto Rico ps 3 Territorio Palestino Ocupado pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Catar re 1 Isla Reunin ro 2 Rumania ru 2 Rusia rw 1 Rwanda sa 3 Arabia Saudita sb 1 Islas Salomn sc 1 Islas Seychelles sd 1 Sudn se 2 Suecia sg 3 Singapur sh 1 Santa Helena si 2 Eslovenia sj 1 Islas Svalbard y Jan Mayen sk 2 Eslovaquia sl 1 Sierra Leona sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Saint Tome and Principe su 2 Antigua USSR sv 3 El Salvador sy 1 Siria sz 1 Swazilandia tc 1 Islas Turks y Caicos td 1 Chad tf 1 Territorios Sureos de Francia tg 1 Togo th 3 Tailandia tj 1 Tajikistn tk 1 Islas Tokelau tl 1 Timor Oriental tm 1 Turkmenistn tn 1 Tnez to 1 Tonga tp 1 Timor Oriental tr 3 Turqua tt 3 Trinidad y Tobago tv 1 Tuvalu tw 3 Taiwn tz 1 Tanzania ua 3 Ucrania ug 3 Uganda uk 3 Reino Unido um 1 Islas menores remotas de USA us 4 Estados Unidos uy 3 Uruguay uz 1 Uzbekistn va 1 Ciudad del Vaticano vc 1 San Vicente y Granadinas ve 3 Venezuela vg 1 Islas Vrgenes (Britnicas) vi 1 Islas Vrgenes (USA) vn 1 Vietnam vu 1 Vanautu (Nuevas Hbridas) wf 1 Islas Wallis y Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Yugoeslavia za 3 Africa del Sur zm 1 Zambia zr 1 Zaire zw 3 Zimbabwe analog-6.0/lang/esform.html0000644000175000017500000002315310161303537016043 0ustar sret1sret100000000000000 Interfaz de Formularios de Analog

Interfaz de Formularios de Analog


1. Selección de Informes

Consulte la página principal de analog para la descripción de los distintos informes.

Que informes desea ver ?


[Si] [No] Resumen General
[Si] [No] Informe Mensual
[Si] [No] Informe Semanal
[Si] [No] Resumen Diario
[Si] [No] Informe Diario
[Si] [No] Resumen por Horas
[Si] [No] Informe por Dominios
[Si] [No] Informe por Organizaciones
[Si] [No] Informe por Directorios
[Si] [No] Informe por tipo de Archivos.
[Si] [No] Informe por Peticiones
[Si] [No] Informe por Tamaño de Archivos
[Si] [No] Informe por Remitentes
[Si] [No] Informe por Consultas de Búsquedas
[Si] [No] Informe por Búsquedas de palabras.
[Si] [No] Resumen por Navegador.
[Si] [No] Informe por Sistema Operativo.
[Si] [No] Informe por Código de Retorno

Ahora ya puede ejecutar el programa:
O puede completar las siguientes opciones para informes individuales. Puede usar bytes para indicar 10 Megabytes; también para indicar los 50 items con más bytes.


2. Opciones para el informe detallado

Opciones del Informe por Dominios

Ordenar el Informe por Dominios
Incluir todos los dominios con al menos

Opciones del Informe por Organizaciones

Ordenar el Informe por Organizaciones
Incluir todas las Organizaciones con al menos

Opciones del Informe por Directorios

Ordenar el Informe por Directorios
Incluir todos los directorios con al menos

Opciones del Informe por Peticiones

Ordenar el Informe por Peticiones
Incluir todos los archivos con al menos
Mostrar

Opciones del Informe por Remitentes

Ordenar el Informe por Remitentes
Incluir todos los Remitentes con al menos

3. Analizando sólo una parte del archivo de registro

Sólo ciertas fechas
Puede analizar sólo las peticiones entre ciertas fechas. Ingrese el rango de fechas más abajo de la siguiente manera aammdd; ej., 980301 para el 1ro de Marzo de 1998 (o llene sólo una casilla para limitar el rango de fechas en un solo sentido).
Desde hasta

Sólo ciertos archivos
Sólo considerar los siguientes archivos (lista, separada por comas; puede contener el caracter comodín *)

Ignorar los siguientes archivos


4. Presentación

El nombre de su organización (para el título de la página)

La página principal de su Organización
URL:


analog-6.0/lang/fi.lng0000644000175000017500000003237310161303537014766 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Su Ma Ti Ke To Pe La Tam Hel Maa Huh Tou Kes Hei Elo Syy Lok Mar Jou ## Next some standard common words. ## Abbreviation for "week beginning" viikko alk. vuosi ## Quarter of a year vuosineljnnes kuukausi piv piv tunti minuutti minuuttia sekunti sekuntia tavu tavut ## ?bytes represents kbytes, Mbytes etc. ?tavua pyynt pyynnt pvm. ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 piv aika aika ensimminen pvm. ensimminen aika viimeinen pvm. viimeinen aika tiedosto tiedostot isntkone isntkoneet nenniskone nenniskoneet hakemisto hakemistot domain domainit organisaatio organisaatiot pte ptteet URL URLit selain selaimet kyttjrjestelm kyttjrjestelmt ## (= operating system, operating systems) koko hakusana hakusanat sivusto sivustot kyttj kyttjt paluukoodi paluukoodit WWW-palvelintilastot osoitteelle ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Tiivistelm ## The time reports, plus "busiest" strings (at the bottom of each report) Vuosiraportti Kiireisin vuosi: Neljnnesvuosiraportti Kiireisin vuosineljnnes: Kuukausiraportti Kiireisin kuukausi: Viikkoraportti Kiireisin viikko: viikon alku Pivyhteenveto Pivraportti Kiireisin piv: Tuntiraportti Tuntiyhteenveto Tunnit viikoittain yhteenveto Kiireisin tunti: Neljnnestuntiraportti Neljnnestuntiyhteenveto Tunnin kiireisin neljnnes: Viisiminuuttisraportti Viisiminuuttisyhteenveto Kiireisimmt viisi minuuttia: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Isntkoneraportti isntkone isntkonetta n Uudelleenohjausraportti isntkone isntkonetta n Isntkoneen eponnistumisraportti isntkone isntkonetta n Hakemistoraportti hakemisto hakemistoa n Tiedostolajiraportti pte ptett n Pyyntraportti tiedosto tiedostoa n Uudelleenohjausraportti tiedosto tiedostoa n Virheraportti tiedosto tiedostoa n Viittausraportti viittaava URL viittaavaa URLia n Viittaussivustoraportti viittaava sivusto viittaavaa sivustoa n Uudelleenohjattujen viitteusten raportti viittaava URL viittaavaa URLia n Eponnistuneiden viittausten raportti viittaava URL viittaavaa URLia n Hakukyselyraportti haku hakua n Hakusanaraportti hakusana hakusanaa n Sisinen hakukyselyraportti haku hakua n Sisinen hakusanaraportti hakusana hakusanaa n Nenniskoneraportti nenniskone nenniskonetta n Nenniskoneen uudelleenohjausraportti nenniskone nenniskonetta n Nenniskoneen eponnistumisraportti nenniskone nenniskonetta n Kyttjraportti kyttj kyttj n Kyttjn uudelleenohjausraportti kyttj kyttj n Kyttjn virheraportti kyttj kyttj n Selainyhteenveto selain selainta n Seleinraportti selain selainta n Kyttjrjestelmraportti kyttjrjestelm kyttjrjestelm n Domainraportti domain domainia n Organisaatioraportti organisaatio organisaatiota n Paluukoodiraportti paluukoodi paluukoodia n Suoritusaikaraportti Tiedostokokoraportti ## Used at the bottom of the report Tmn analyysin teki Suoritusaika Alle 1 ## Used in the time reports Kukin yksikk vastaa tai sen osaa sivun pyynt sivun pyynt ## Used at the bottom of each non-time report: need m, f & n genders * * ei luetteloitu ## Used on the pie charts: again need m, f & n genders * * Muut ## Used at the top of the report Ohjelman kynnistysaika Analysoidut pyynnt ajalta - ## Used in the General Summary Onnistuneet pyynnt Keskimrin onnistuneita pyyntj pivss Onnistuneita sivujen pyyntj Onnistuneita sivujen pyyntj keskimrin pivss Lokitiedoston rivej ilman tilakoodia Eponnistuneet pyynnt Uudelleenohjatut pyynnt Pyynnt joissa tiedottava paluukoodi Erilliset tiedostojen pyynnt Erillisi isntkoneita palveltu Virheellisi lokitiedoston rivej Ei-toivottuja lokitiedoston rivej Tietoa siirretty Keskimrinen tiedonsiirto pivss Suluissa olevat lukumrt viittaavat 7 pivn jaksoon, joka pttyi edelliseen 7 pivn Mene Alkuun ## Some special phrases for particular reports. [tunnistamattomat numeromuotoiset osoitteet] [piirinimi ei saatu] [tuntemattomat hallintapiirit] [juurihakemisto] [ei hakemistoa] [ei ptett] [hakemistot] Tuntematon Windows Muu Unix Robotit Tuntematon kyttjrjestelm ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) pyynnt 7 pivn pyynnt %pyynnt %7 pivn pyynnt sivut 7 pivn sivut %sivut %7 pivn sivut tavut ?tavut 7 pivn tavut 7 pivn ?tavut %tavut %7 pivn tavut nro. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Luettelossa suosituimmat %s * * Luettelossa suosituimmat %d %s * * Luettelossa %s ## "by" in the phrase "listing the top 3 files BY number of requests" numerona ## All requests WITH AT LEAST 10 requests joissa vhintn ## Different ways of doing floors pyynt viimeisin 7 pivn pyynnt viimeisin 7 pivn sivun pyynt viimeisin 7 pivn sivun pyynnt viimeisin 7 pivn uudelleenohjattu pyynt uudelleenohjatut pyynnt uudelleenohjattu pyynt viimeisin 7 pivn uudelleenohjatut pyynnt viimeisin 7 pivn eponnistunut pyynt eponnistuneet pyynnt eponnistunut pyynt viimeisin 7 pivn eponnistuneet pyynnt viimeisin 7 pivn % liikenteest % liikenteest viimeisin 7 pivn % maksimi liikennemrst % maksimi liikennemrst viimeisin 7 pivn tavu liikennett tavua liikennett ## ?bytes represents kbytes, Mbytes etc. ?tavua liikennett tavu liikennett viimeisin 7 pivn tavua liikennett viimeisin 7 pivn ?tavua liikennett viimeisin 7 pivn jossa pyynt lhtien jossa uudelleenohjattu pyynt lhtien jossa eponnistunut pyynt lhtien jossa ensimminen pyynt lhtien jossa ensimminen uudelleenohjattu pyynt lhtien jossa ensimminen eponnistunut pyynt lhtien ## Now "sorted by": again, in m, f & n (only needed in plural though) * * jrjestysperusteena ## Used at the top of each report Tss raportissa on tietoa: ## Used in pie charts Kiilojen kuvaus: ## different ways of sorting liikennemr liikennemr viimeisin 7 pivn % pyynnist % pyynnist viimeisin 7 pivn % maksimimrst pyyntj % maksimimrst pyyntj viimeisin 7 pivn pyyntjen mr pyyntjen mr viimeisin 7 pivn % sivun pyynnist % sivun pyynnist viimeisin 7 pivn % maksimimrst sivun pyyntj % maksimimrst sivun pyyntj viimeisin 7 pivn sivun pyyntjen mr sivun pyyntjen mr viimeisin 7 pivn % uudelleenohjatuista pyynnist % uudelleenohjatuista pyynnist viimeisin 7 pivn % maksimimrst uudelleenohjattuja pyyntj % maksimimrst uudelleenohjattuja pyyntj viimeisin 7 pivn uudelleenohjattujen pyyntjen mr uudelleenohjattujen pyyntjen mr viimeisin 7 pivn % eponnistuneista pyynnist % eponnistuneista pyynnist viimeisin 7 pivn % maksimimrst eponnistuneita pyyntj % maksimimrst eponnistuneita pyyntj viimeisin 7 pivn eponnistuneiden pyyntjen mr eponnistuneiden pyyntjen mr viimeisin 7 pivn viimeisen pyynnn ajankohta viimeisen uudelleenohjatun pyynnn ajankohta viimeisen eponnistuneen pyynnn ajankohta ensimmisen pyynnn ajankohta ensimmisen uudelleenohjatun pyynnn ajankohta ensimmisen eponnistuneen pyynnn ajankohta ## 3 other ways of sorting in m, f, & n * * aakkosjrjestyksess * * numerojrjestyksess * * jrjestmtt ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m.%Y %H:%n ## "Program started at" and "Analysed requests from" %w, %D.%m.%Y %H:%n ## In Daily Report %d. %m %Y ## In Daily Summary %w ## In Hourly Report %d. %m %Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m %Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m %Y ## The date & time (D) column in non-time reports %d. %m %Y %H:%n ## In non-time reports: "listing files with requests since [date]" %d. %m %Y klo %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Jatka 101 Protokollavaihto 1xx [Tiedoteluontoinen] 200 OK 201 Luotu 202 Hyvksytty toimenpiteit varten 203 Auktorisiomaton tieto 204 OK, ei lhetettv 205 Tyhjennetty dokumentti 206 Osittainen sislt 2xx [Onnistunut pyynt (mrittelemtn)] 300 Useita dokumentteja saatavilla 301 Siirretty pysyvsti 302 Tieto on muualla 303 Viite toiseen dokumenttiin 304 Ei muutosta edellisen pyynnn jlkeen 305 Kyt vlityspalvelinta 306 Vaihda vlityspalvelinta 307 Siirretty vliaikaisesti 3xx [Sekalaisia oheita] 400 Virheellinen pyynt 401 Salasanaa tarvitaan 402 Maksua tarvitaan 403 Psy kielletty 404 Dokumenttia ei lytynyt 405 Menetelm ei sallita 406 Selain ei hyvksy dokumenttia 407 Vlityspalvelimen tulee lhett tunnistetiedot 408 Aikakatkaisu 409 Pyynt on ristiriidassa resurssin kanssa 410 Dokumentti pysyvsti poistettu 411 Pituus on mritettv 412 Ehto ei toteutunut 413 Liian pitk pyynt 414 Tiedostonimi liian pitk 415 Tuntematon tiedostomuoto 416 Sopimaton pyyntalue 417 Odotus eponnistui 4xx [Sekalaisia virheit] 500 Palvelimen sisinen virhe 501 Pyynt ei tueta 502 Vastaanottopalvelimen virhe 503 Palvelu vliaikaisesti poissa kytst 504 Vlitysaikakatkaisu 505 HTTP versio ei tuettu 506 Uudelleenohjaus eponnistui 5xx [Sekalaisia palvelinvirheit] xxx [Tuntemattomia] analog-6.0/lang/fia.lng0000644000175000017500000003237110161303537015125 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Su Ma Ti Ke To Pe La Tam Hel Maa Huh Tou Kes Hei Elo Syy Lok Mar Jou ## Next some standard common words. ## Abbreviation for "week beginning" viikko alk. vuosi ## Quarter of a year vuosineljannes kuukausi paiva paivaa tunti minuutti minuuttia sekunti sekuntia tavu tavut ## ?bytes represents kbytes, Mbytes etc. ?tavua pyynto pyynnot pvm. ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 paiva aika aika ensimmainen pvm. ensimmainen aika viimeinen pvm. viimeinen aika tiedosto tiedostot isantakone isantakoneet naennaiskone naennaiskoneet hakemisto hakemistot domain domainit organisaatio organisaatiot paate paatteet URL URLit selain selaimet kayttojarjestelma kayttojarjestelmat ## (= operating system, operating systems) koko hakusana hakusanat sivusto sivustot kayttaja kayttajat paluukoodi paluukoodit WWW-palvelintilastot osoitteelle ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Tiivistelma ## The time reports, plus "busiest" strings (at the bottom of each report) Vuosiraportti Kiireisin vuosi: Neljannesvuosiraportti Kiireisin vuosineljannes: Kuukausiraportti Kiireisin kuukausi: Viikkoraportti Kiireisin viikko: viikon alku Paivayhteenveto Paivaraportti Kiireisin paiva: Tuntiraportti Tuntiyhteenveto Tunnit viikoittain yhteenveto Kiireisin tunti: Neljannestuntiraportti Neljannestuntiyhteenveto Tunnin kiireisin neljannes: Viisiminuuttisraportti Viisiminuuttisyhteenveto Kiireisimmat viisi minuuttia: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Isantakoneraportti isantakone isantakonetta n Uudelleenohjausraportti isantakone isantakonetta n Isantakoneen epaonnistumisraportti isantakone isantakonetta n Hakemistoraportti hakemisto hakemistoa n Tiedostolajiraportti paate paatetta n Pyyntoraportti tiedosto tiedostoa n Uudelleenohjausraportti tiedosto tiedostoa n Virheraportti tiedosto tiedostoa n Viittausraportti viittaava URL viittaavaa URLia n Viittaussivustoraportti viittaava sivusto viittaavaa sivustoa n Uudelleenohjattujen viitteusten raportti viittaava URL viittaavaa URLia n Epaonnistuneiden viittausten raportti viittaava URL viittaavaa URLia n Hakukyselyraportti haku hakua n Hakusanaraportti hakusana hakusanaa n Sisainen hakukyselyraportti haku hakua n Sisainen hakusanaraportti hakusana hakusanaa n Naennaiskoneraportti naennaiskone naennaiskonetta n Naennaiskoneen uudelleenohjausraportti naennaiskone naennaiskonetta n Naennaiskoneen epaonnistumisraportti naennaiskone naennaiskonetta n Kayttajaraportti kayttaja kayttajaa n Kayttajan uudelleenohjausraportti kayttaja kayttajaa n Kayttajan virheraportti kayttaja kayttajaa n Selainyhteenveto selain selainta n Seleinraportti selain selainta n Kayttojarjestelmaraportti kayttojarjestelma kayttojarjestelmaa n Domainraportti domain domainia n Organisaatioraportti organisaatio organisaatiota n Paluukoodiraportti paluukoodi paluukoodia n Suoritusaikaraportti Tiedostokokoraportti ## Used at the bottom of the report Taman analyysin teki Suoritusaika Alle 1 ## Used in the time reports Kukin yksikko vastaa tai sen osaa sivun pyyntoa sivun pyyntoa ## Used at the bottom of each non-time report: need m, f & n genders * * ei luetteloitu ## Used on the pie charts: again need m, f & n genders * * Muut ## Used at the top of the report Ohjelman kaynnistysaika Analysoidut pyynnot ajalta - ## Used in the General Summary Onnistuneet pyynnot Keskimaarin onnistuneita pyyntoja paivassa Onnistuneita sivujen pyyntoja Onnistuneita sivujen pyyntoja keskimaarin paivassa Lokitiedoston riveja ilman tilakoodia Epaonnistuneet pyynnot Uudelleenohjatut pyynnot Pyynnot joissa tiedottava paluukoodi Erilliset tiedostojen pyynnot Erillisia isantakoneita palveltu Virheellisia lokitiedoston riveja Ei-toivottuja lokitiedoston riveja Tietoa siirretty Keskimaarainen tiedonsiirto paivassa Suluissa olevat lukumaarat viittaavat 7 paivan jaksoon, joka paattyi edelliseen 7 paivaan Mene Alkuun ## Some special phrases for particular reports. [tunnistamattomat numeromuotoiset osoitteet] [piirinimia ei saatu] [tuntemattomat hallintapiirit] [juurihakemisto] [ei hakemistoa] [ei paatetta] [hakemistot] Tuntematon Windows Muu Unix Robotit Tuntematon kayttojarjestelma ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) pyynnot 7 paivan pyynnot %pyynnot %7 paivan pyynnot sivut 7 paivan sivut %sivut %7 paivan sivut tavut ?tavut 7 paivan tavut 7 paivan ?tavut %tavut %7 paivan tavut nro. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Luettelossa suosituimmat %s * * Luettelossa suosituimmat %d %s * * Luettelossa %s ## "by" in the phrase "listing the top 3 files BY number of requests" numerona ## All requests WITH AT LEAST 10 requests joissa vahintaan ## Different ways of doing floors pyynto viimeisina 7 paivana pyynnot viimeisina 7 paivana sivun pyynto viimeisina 7 paivana sivun pyynnot viimeisina 7 paivana uudelleenohjattu pyynto uudelleenohjatut pyynnot uudelleenohjattu pyynto viimeisina 7 paivana uudelleenohjatut pyynnot viimeisina 7 paivana epaonnistunut pyynto epaonnistuneet pyynnot epaonnistunut pyynto viimeisina 7 paivana epaonnistuneet pyynnot viimeisina 7 paivana % liikenteesta % liikenteesta viimeisina 7 paivana % maksimi liikennemaarasta % maksimi liikennemaarasta viimeisina 7 paivana tavu liikennetta tavua liikennetta ## ?bytes represents kbytes, Mbytes etc. ?tavua liikennetta tavu liikennetta viimeisina 7 paivana tavua liikennetta viimeisina 7 paivana ?tavua liikennetta viimeisina 7 paivana jossa pyynto lahtien jossa uudelleenohjattu pyynto lahtien jossa epaonnistunut pyynto lahtien jossa ensimmainen pyynto lahtien jossa ensimmainen uudelleenohjattu pyynto lahtien jossa ensimmainen epaonnistunut pyynto lahtien ## Now "sorted by": again, in m, f & n (only needed in plural though) * * jarjestysperusteena ## Used at the top of each report Tassa raportissa on tietoa: ## Used in pie charts Kiilojen kuvaus: ## different ways of sorting liikennemaara liikennemaara viimeisina 7 paivana % pyynnoista % pyynnoista viimeisina 7 paivana % maksimimaarasta pyyntoja % maksimimaarasta pyyntoja viimeisina 7 paivana pyyntojen maara pyyntojen maara viimeisina 7 paivana % sivun pyynnoista % sivun pyynnoista viimeisina 7 paivana % maksimimaarasta sivun pyyntoja % maksimimaarasta sivun pyyntoja viimeisina 7 paivana sivun pyyntojen maara sivun pyyntojen maara viimeisina 7 paivana % uudelleenohjatuista pyynnoista % uudelleenohjatuista pyynnoista viimeisina 7 paivana % maksimimaarasta uudelleenohjattuja pyyntoja % maksimimaarasta uudelleenohjattuja pyyntoja viimeisina 7 paivana uudelleenohjattujen pyyntojen maara uudelleenohjattujen pyyntojen maara viimeisina 7 paivana % epaonnistuneista pyynnoista % epaonnistuneista pyynnoista viimeisina 7 paivana % maksimimaarasta epaonnistuneita pyyntoja % maksimimaarasta epaonnistuneita pyyntoja viimeisina 7 paivana epaonnistuneiden pyyntojen maara epaonnistuneiden pyyntojen maara viimeisina 7 paivana viimeisen pyynnon ajankohta viimeisen uudelleenohjatun pyynnon ajankohta viimeisen epaonnistuneen pyynnon ajankohta ensimmaisen pyynnon ajankohta ensimmaisen uudelleenohjatun pyynnon ajankohta ensimmaisen epaonnistuneen pyynnon ajankohta ## 3 other ways of sorting in m, f, & n * * aakkosjarjestyksessa * * numerojarjestyksessa * * jarjestamatta ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m.%Y %H:%n ## "Program started at" and "Analysed requests from" %w, %D.%m.%Y %H:%n ## In Daily Report %d. %m %Y ## In Daily Summary %w ## In Hourly Report %d. %m %Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m %Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m %Y ## The date & time (D) column in non-time reports %d. %m %Y %H:%n ## In non-time reports: "listing files with requests since [date]" %d. %m %Y klo %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Jatka 101 Protokollavaihto 1xx [Tiedoteluontoinen] 200 OK 201 Luotu 202 Hyvaksytty toimenpiteita varten 203 Auktorisiomaton tieto 204 OK, ei lahetettavaa 205 Tyhjennetty dokumentti 206 Osittainen sisalto 2xx [Onnistunut pyynto (maarittelematon)] 300 Useita dokumentteja saatavilla 301 Siirretty pysyvasti 302 Tieto on muualla 303 Viite toiseen dokumenttiin 304 Ei muutosta edellisen pyynnon jalkeen 305 Kayta valityspalvelinta 306 Vaihda valityspalvelinta 307 Siirretty valiaikaisesti 3xx [Sekalaisia oheita] 400 Virheellinen pyynto 401 Salasanaa tarvitaan 402 Maksua tarvitaan 403 Paasy kielletty 404 Dokumenttia ei loytynyt 405 Menetelmaa ei sallita 406 Selain ei hyvaksy dokumenttia 407 Valityspalvelimen tulee lahettaa tunnistetiedot 408 Aikakatkaisu 409 Pyynto on ristiriidassa resurssin kanssa 410 Dokumentti pysyvasti poistettu 411 Pituus on maaritettava 412 Ehto ei toteutunut 413 Liian pitka pyynto 414 Tiedostonimi liian pitka 415 Tuntematon tiedostomuoto 416 Sopimaton pyyntoalue 417 Odotus epaonnistui 4xx [Sekalaisia virheita] 500 Palvelimen sisainen virhe 501 Pyyntoa ei tueta 502 Vastaanottopalvelimen virhe 503 Palvelu valiaikaisesti poissa kaytosta 504 Valitysaikakatkaisu 505 HTTP versio ei tuettu 506 Uudelleenohjaus epaonnistui 5xx [Sekalaisia palvelinvirheita] xxx [Tuntemattomia] analog-6.0/lang/fiadom.tab0000644000175000017500000001203610161303537015607 0ustar sret1sret100000000000000aero 2 ilmakuljetus arpa 1 Arpanetin vanha tunnus biz 2 liiketoiminta com 2 kaupalliset yritykset coop 2 osuustoiminta edu 2 USA:n tutkimus ja koulutus gov 2 USA:n hallinto info 2 informaatio int 2 kansainvaliset jarjestot mil 2 USA:n puolustushallinto museum 2 museot name 3 yksityishenkilot net 2 tietoverkot org 2 jarjestot pro 3 ammatinharjoittajat ac 1 Ascension ad 2 Andorra ae 3 Arabiemiirikunnat af 1 Afganistan ag 2 Antigua ja Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Alankomaiden Antillit ao 1 Angola aq 1 Antarktis ar 3 Argentiina as 1 Amerikan Samoa at 3 Itavalta au 3 Australia aw 1 Aruba az 1 Azerbaidzhan ba 3 Bosnia-Hertsegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgia bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasilia bs 1 Bahama bt 1 Bhutan bv 1 Bouvet'nsaari bw 1 Botswana by 1 Valko-Venaja bz 1 Belize ca 3 Kanada cc 1 Kookossaaret cd 1 Kongon demokraattinen tasavalta cf 1 Keski-Afrikka cg 1 Kongo ch 2 Sveitsi ci 1 Norsunluurannikko ck 1 Cookin saaret cl 2 Chile cm 1 Kamerun cn 3 Kiina co 3 Kolumbia cr 3 Costa Rica cu 2 Kuuba cv 1 Kap Verde cx 2 Joulusaari cy 3 Kypros cz 2 Tshekki de 2 Saksa dj 1 Djibouti dk 2 Tanska dm 2 Dominica do 3 Dominikaaninen tasavalta dz 1 Algeria ec 3 Ecuador ee 2 Viro eg 3 Egypti eh 1 Lansi-Sahara er 1 Eritrea es 2 Espanja et 1 Etiopia fi 2 Suomi fj 3 Fidzhi fk 1 Falklandinsaaret fm 1 Mikronesia fo 1 Farsaaret fr 2 Ranska fx 1 Ranska (emamaa) ga 1 Gabon gb 1 Yhdistynyt kuningaskunta gd 1 Grenada ge 1 Georgia gf 1 Ranskan Guayana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Gronlanti gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Paivantasaajan Guinea gr 2 Kreikka gs 1 Etela-Georgia ja Etela-Sandwichsaaret gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 Heard- ja McDonaldsaaret hn 2 Honduras hr 2 Kroatia ht 1 Haiti hu 2 Unkari id 3 Indonesia ie 2 Irlanti il 3 Israel im 1 Mansaari in 3 Intia io 1 Brittilainen Intian valtameren alue iq 1 Irak ir 1 Iran is 2 Islanti it 2 Italia je 1 Jersey jm 3 Jamaika jo 3 Jordania jp 3 Japani ke 3 Kenia kg 1 Kirgisia kh 1 Kambodzha ki 1 Kiribati km 1 Komorit kn 1 Saint Kitts ja Nevis kp 1 Korean kansantasavalta kr 3 Korean tasavalta kw 3 Kuwait ky 1 Caymansaaret kz 1 Kazakstan la 1 Laos lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Liettua lu 2 Luxemburg lv 2 Latvia ly 1 Libya ma 1 Marokko mc 2 Monaco md 1 Moldova mg 1 Madagaskar mh 1 Marshallsaaret mk 3 Makedonia (entinen Jugoslavian tasavalta) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Pohjois-Mariaanit mq 1 Martinique mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Malediivit mw 1 Malawi mx 3 Meksiko my 3 Malesia mz 1 Mosambik na 1 Namibia nc 1 Uusi-Kaledonia ne 1 Niger nf 1 Norfolkinsaari ng 1 Nigeria ni 3 Nicaragua nl 2 Alankomaat no 2 Norja np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Uusi-Seelanti om 1 Oman pa 3 Panama pe 3 Peru pf 1 Ranskan Polynesia pg 3 Papua-Uusi-Guinea ph 3 Filippiinit pk 3 Pakistan pl 3 Puola pm 1 Saint-Pierre ja Miquelon pn 1 Pitcairn pr 1 Puerto Rico ps 3 Palestiinan itsehallintoalue pt 2 Portugali pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Romania ru 2 Venaja rw 1 Ruanda sa 3 Saudi-Arabia sb 1 Salomonsaaret sc 1 Seychellit sd 1 Sudan se 2 Ruotsi sg 3 Singapore sh 1 Saint Helena si 2 Slovenia sj 1 Huippuvuoret ja Jan Mayen sk 2 Slovakia sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Sao Tome ja Principe su 2 entinen Neuvostoliitto sv 3 El Salvador sy 1 Syyria sz 1 Swazimaa tc 1 Turks- ja Caicossaaret td 1 Tshad tf 1 Ranskan etelaiset alueet tg 1 Togo th 3 Thaimaa tj 1 Tadzhikistan tk 1 Tokelau tl 1 Ita-Timor tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 Ita-Timor tr 3 Turkki tt 3 Trinidad ja Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tansania ua 3 Ukraina ug 3 Uganda uk 3 Yhdistynyt kuningaskunta um 1 Yhdysvaltain Tyynenmeren erillissaaret us 4 Yhdysvallat uy 3 Uruguay uz 1 Uzbekistan va 1 Vatikaani vc 1 Saint Vincent ja Grenadiinit ve 3 Venezuela vg 1 Brittilaiset Neitsytsaaret vi 1 Yhdysvaltain Neitsytsaaret vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis- ja Futunasaaret ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavia za 3 Etela-Afrikka zm 1 Sambia zr 1 Kongon kansantasavalta zw 3 Zimbabwe analog-6.0/lang/fidom.tab0000644000175000017500000001203610161303537015446 0ustar sret1sret100000000000000aero 2 ilmakuljetus arpa 1 Arpanetin vanha tunnus biz 2 liiketoiminta com 2 kaupalliset yritykset coop 2 osuustoiminta edu 2 USA:n tutkimus ja koulutus gov 2 USA:n hallinto info 2 informaatio int 2 kansainvliset jrjestt mil 2 USA:n puolustushallinto museum 2 museot name 3 yksityishenkilt net 2 tietoverkot org 2 jrjestt pro 3 ammatinharjoittajat ac 1 Ascension ad 2 Andorra ae 3 Arabiemiirikunnat af 1 Afganistan ag 2 Antigua ja Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Alankomaiden Antillit ao 1 Angola aq 1 Antarktis ar 3 Argentiina as 1 Amerikan Samoa at 3 Itvalta au 3 Australia aw 1 Aruba az 1 Azerbaidzhan ba 3 Bosnia-Hertsegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgia bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasilia bs 1 Bahama bt 1 Bhutan bv 1 Bouvet'nsaari bw 1 Botswana by 1 Valko-Venj bz 1 Belize ca 3 Kanada cc 1 Kookossaaret cd 1 Kongon demokraattinen tasavalta cf 1 Keski-Afrikka cg 1 Kongo ch 2 Sveitsi ci 1 Norsunluurannikko ck 1 Cookin saaret cl 2 Chile cm 1 Kamerun cn 3 Kiina co 3 Kolumbia cr 3 Costa Rica cu 2 Kuuba cv 1 Kap Verde cx 2 Joulusaari cy 3 Kypros cz 2 Tshekki de 2 Saksa dj 1 Djibouti dk 2 Tanska dm 2 Dominica do 3 Dominikaaninen tasavalta dz 1 Algeria ec 3 Ecuador ee 2 Viro eg 3 Egypti eh 1 Lnsi-Sahara er 1 Eritrea es 2 Espanja et 1 Etiopia fi 2 Suomi fj 3 Fidzhi fk 1 Falklandinsaaret fm 1 Mikronesia fo 1 Frsaaret fr 2 Ranska fx 1 Ranska (emmaa) ga 1 Gabon gb 1 Yhdistynyt kuningaskunta gd 1 Grenada ge 1 Georgia gf 1 Ranskan Guayana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Grnlanti gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Pivntasaajan Guinea gr 2 Kreikka gs 1 Etel-Georgia ja Etel-Sandwichsaaret gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 Heard- ja McDonaldsaaret hn 2 Honduras hr 2 Kroatia ht 1 Haiti hu 2 Unkari id 3 Indonesia ie 2 Irlanti il 3 Israel im 1 Mansaari in 3 Intia io 1 Brittilinen Intian valtameren alue iq 1 Irak ir 1 Iran is 2 Islanti it 2 Italia je 1 Jersey jm 3 Jamaika jo 3 Jordania jp 3 Japani ke 3 Kenia kg 1 Kirgisia kh 1 Kambodzha ki 1 Kiribati km 1 Komorit kn 1 Saint Kitts ja Nevis kp 1 Korean kansantasavalta kr 3 Korean tasavalta kw 3 Kuwait ky 1 Caymansaaret kz 1 Kazakstan la 1 Laos lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Liettua lu 2 Luxemburg lv 2 Latvia ly 1 Libya ma 1 Marokko mc 2 Monaco md 1 Moldova mg 1 Madagaskar mh 1 Marshallsaaret mk 3 Makedonia (entinen Jugoslavian tasavalta) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Pohjois-Mariaanit mq 1 Martinique mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Malediivit mw 1 Malawi mx 3 Meksiko my 3 Malesia mz 1 Mosambik na 1 Namibia nc 1 Uusi-Kaledonia ne 1 Niger nf 1 Norfolkinsaari ng 1 Nigeria ni 3 Nicaragua nl 2 Alankomaat no 2 Norja np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Uusi-Seelanti om 1 Oman pa 3 Panama pe 3 Peru pf 1 Ranskan Polynesia pg 3 Papua-Uusi-Guinea ph 3 Filippiinit pk 3 Pakistan pl 3 Puola pm 1 Saint-Pierre ja Miquelon pn 1 Pitcairn pr 1 Puerto Rico ps 3 Palestiinan itsehallintoalue pt 2 Portugali pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Runion ro 2 Romania ru 2 Venj rw 1 Ruanda sa 3 Saudi-Arabia sb 1 Salomonsaaret sc 1 Seychellit sd 1 Sudan se 2 Ruotsi sg 3 Singapore sh 1 Saint Helena si 2 Slovenia sj 1 Huippuvuoret ja Jan Mayen sk 2 Slovakia sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 So Tom ja Prncipe su 2 entinen Neuvostoliitto sv 3 El Salvador sy 1 Syyria sz 1 Swazimaa tc 1 Turks- ja Caicossaaret td 1 Tshad tf 1 Ranskan eteliset alueet tg 1 Togo th 3 Thaimaa tj 1 Tadzhikistan tk 1 Tokelau tl 1 It-Timor tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 It-Timor tr 3 Turkki tt 3 Trinidad ja Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tansania ua 3 Ukraina ug 3 Uganda uk 3 Yhdistynyt kuningaskunta um 1 Yhdysvaltain Tyynenmeren erillissaaret us 4 Yhdysvallat uy 3 Uruguay uz 1 Uzbekistan va 1 Vatikaani vc 1 Saint Vincent ja Grenadiinit ve 3 Venezuela vg 1 Brittiliset Neitsytsaaret vi 1 Yhdysvaltain Neitsytsaaret vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis- ja Futunasaaret ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavia za 3 Etel-Afrikka zm 1 Sambia zr 1 Kongon kansantasavalta zw 3 Zimbabwe analog-6.0/lang/fr.lng0000644000175000017500000003372210161303540014770 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## Fichier de langue francaise pour analog 6.0. ## Peut ou non fonctionner avec une autre version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Dim Lun Mar Mer Jeu Ven Sam Jan Fv Mars Avr Mai Juin Juil Aot Sept Oct Nov Dc ## Next some standard common words. ## Abbreviation for "week beginning" sem dbut. Anne ## Quarter of a year trimestre mois jour jours heure minute minutes seconde secondes octet octets ## ?bytes represents kbytes, Mbytes etc. ?octets requte requtes date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date heure heure premire date premire heure dernire date dernire heure fichier fichiers hte htes hte virtuel htes virtuels rpertoire rpertoires domaine domaines organisation organisations extension extensions URL URL navigateur navigateur OS OS ## (= operating system, operating systems) taille Terme recherch Termes recherchs site sites utilisateur utilisateurs code statut codes statut Statistiques du serveur Web ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo- mga- giga- tera- peta- exa- zeta- yotta- ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Rsum gnral ## The time reports, plus "busiest" strings (at the bottom of each report) Rapport annuel Anne la plus active Rapport trimestriel Trimestre le plus actif Rapport mensuel Mois le plus actif : Rapport hebdomadaire Semaine la plus active : commenant le Rsum quotidien Rapport quotidien Jour le plus actif : Rapport horaire Rsum horaire Rsum horaire par semaine Heure la plus active : Rapport par quart d'heure Rsum par quart d'heure Quart d'heure le plus actif de l'heure : Rapport par 5 minutes Rsum par tranche de 5 minutes 5 minutes les plus actives : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Rapport par hte hte htes m Rapport de redirection des htes hte htes m Rapport d'chec par hte hte htes m Rapport par rpertoire rpertoire rpertoires m Rapport par type de fichier extension extensions f Rapport par fichier demand fichier fichiers m Rapport par redirection fichier fichiers m Rapport par fichiers en erreur fichier fichiers m Rapport par provenance URL de provenance URL de provenance m Rapport par site de provenance site de provenance sites de provenance m Rapport par redirection de provenance URL de provenance URL de provenance m Rapport par erreur de provenance URL de provenance URL de provenance m Rapport par requte de recherche requte requtes f Rapport par mot-cl de recherche mot-cl mot-cls m Rapport par requte de recherche interne requte requtes f Rapport par mot-cl de recherche interne mot-cl mot-cls m Rapport par hte virtuel hte virtuel htes virtuels m Rapport par redirection d'hte virtuel hte virtuel htes virtuels m Rapport d'chec par hte virtuel hte virtuel htes virtuels m Rapport par utilisateur utilisateur utilisateurs m Rapport par redirection d'utilisateur utilisateur utilisateurs m Rapport des erreurs par utilisateur utilisateur utilisateurs m Rsum par navigateur navigateur navigateurs m Rapport par navigateur navigateur navigateurs m Rapport par systme d'exploitation systme d'exploitation systmes d'exploitation m Rapport par domaine domaine domaines m Rapport par organisation organisation organisations f Rapport par code statut code statut codes statut m Rapport par temps de traitement Rapport par taille de fichier ## Used at the bottom of the report Cette analyse a t produite par Temps d'excution Moins d'une ## Used in the time reports Chaque unit reprsente ou une fraction requte d'une page requtes de pages ## Used at the bottom of each non-time report: need m, f & n genders non lists non listes non lists ## Used on the pie charts: again need m, f & n genders Autres Autres Autres ## Used at the top of the report Programme lanc le Requtes analyses du au ## Used in the General Summary Requtes russies Moyenne journalire des requtes russies Requtes de pages russies Moyenne journalire des requtes de pages russies Lignes de journal sans code statut Requtes ayant chou Requtes rediriges Requtes avec statut informatif Fichiers distincts demands Htes distincts servis Lignes invalides dans le fichier journal Lignes non dsires dans le fichier journal Donnes transfres Quantit moyenne journalire de donnes transfres Les chiffres entre parenthses font rfrence aux 7 jours se terminant le 7 derniers jours Aller Dbut ## Some special phrases for particular reports. [Adresses numriques non rsolues] [domaine non indiqu] [domaine inconnu] [rpertoire racine] [pas de rpertoire] [pas d'extension] [rpertoires] Windows inconnu Autre Unix Robots OS inconnu ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) Nb de req. req/7 jours % de req. req/7 jours pages pages/7 jours % de pages % pages/7 jr octets ?octets octets/7 jr ?octets/7 jr % octets % octets/7 jr nb. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Affichage des %s premiers Affichage des %s premires * Affichage des %d premiers %s Affichage des %d premires %s * Affichage des %s Affichage des %s * ## "by" in the phrase "listing the top 3 files BY number of requests" par ## All requests WITH AT LEAST 10 requests reprsentant au moins ## Different ways of doing floors requte dans les 7 derniers jours requtes dans les 7 derniers jours requte de page dans les 7 derniers jours requtes de page dans les 7 derniers jours requte redirige requtes rediriges requte redirige dans les 7 derniers jours requtes rediriges dans les 7 derniers jours requte en erreur requtes en erreur requte en erreur dans les 7 derniers jours requtes en erreur dans les 7 derniers jours % du trafic % du trafic dans les 7 derniers jours % du trafic maximum % du trafic maximum dans les 7 derniers jours octet de trafic octets de trafic ## ?bytes represents kbytes, Mbytes etc. ?octets de trafic octet de trafic dans les 7 derniers jours octets de trafic dans les 7 derniers jours ?octets de trafic dans les 7 derniers jours demandes depuis avec une requte redirige depuis avec une requte en erreur depuis avec la premire requte depuis avec la premire requte redirige depuis avec la premire requte en erreur depuis ## Now "sorted by": again, in m, f & n (only needed in plural though) tris par tries par * ## Used at the top of each report Ce rapport contient les donnes sur ## Used in pie charts Les parts sont traces par ## different ways of sorting la quantit de trafic la quantit de trafic dans les 7 derniers jours % des requtes % des requtes dans les 7 derniers jours % du nombre maximum de requtes % du nombre maximum de requtes dans les 7 derniers jours le nombre de requtes le nombre de requtes dans les 7 derniers jours % des requtes de pages % des requtes de pages dans les 7 derniers jours % du nombre maximum de requtes de pages % du nombre maximum de requtes de pages dans les 7 derniers jours le nombre de requtes de pages le nombre de requtes de pages dans les 7 derniers jours % des requtes rediriges % des requtes rediriges dans les 7 derniers jours % du nombre maximum des requtes rediriges % du nombre maximum des requtes rediriges dans les 7 derniers jours le nombre de requtes rediriges le nombre de requtes rediriges dans les 7 derniers jours % des requtes ayant chou % des requtes ayant chou dans les 7 derniers jours % du nombre maximum des requtes ayant chou % du nombre maximum des requtes ayant chou dans les 7 derniers jours le nombre de requtes ayant chou le nombre de requtes ayant chou dans les 7 derniers jours l'heure de la dernire requte l'heure de la dernire requte redirige l'heure de la dernire requte ayant chou l'heure de la premire requte l'heure de la premire requte redirige l'heure de la premire requte ayant chou ## 3 other ways of sorting in m, f, & n tris par ordre alphabtique tries par ordre alphabtique * tris par ordre numrique tries par ordre numrique * non tris non tries * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w %D %m %Y %H:%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %H:%n%x%I:%o ## In Hourly Summary %H ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continuez la requte 101 Changement de protocole accept 1xx [Divers messages informatifs] 200 OK 201 Cr 202 Accept pour traitement ultrieur 203 Information de seconde main (Non-authoritative) 204 OK, mais rien envoyer 205 Reset document 206 Contenu partiel 2xx [Diverses oprations russies] 300 Multiples documents disponibles 301 Document dfinitivement dplac 302 Document trouv ailleurs 303 Voir autre document 304 Non modifi depuis le dernier accs 305 Utiliser un proxy 306 Changer de proxy 307 Document dplac temporairement 3xx [Diverses redirections] 400 Requte incorrecte 401 Authentification requise 402 Paiement requis 403 Accs interdit 404 Document non trouv 405 Mthode non autorise 406 Document non acceptable par le client 407 Identifiez vous sur le proxy 408 Requte : temps depass 409 La requte est en conflit avec l'tat de la ressource 410 Document dfinitivement inaccessible 411 Longueur requise 412 Echec de la prcondition 413 Requte trop longue 414 Nom de fichier demand trop long 415 Type de media non support 416 L'en-tte "range" requis est invalide 417 L'en-tte "Expect" ne peut tre satisfait 4xx [Diverses erreurs du client/utilisateur] 500 Erreur interne du serveur 501 Type de requte non support 502 Erreur du serveur amont 503 Service temporairement indisponible 504 Passerelle : Temps depass 505 Version de HTTP non supporte 506 Echec de la redirection 5xx [Diverses erreurs du serveur] xxx [Inconnu] analog-6.0/lang/fra.lng0000644000175000017500000003372010161303540015127 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## Fichier de langue francaise pour analog 6.0. ## Peut ou non fonctionner avec une autre version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Dim Lun Mar Mer Jeu Ven Sam Jan Fev Mars Avr Mai Juin Juil Aout Sept Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" sem debut. Annee ## Quarter of a year trimestre mois jour jours heure minute minutes seconde secondes octet octets ## ?bytes represents kbytes, Mbytes etc. ?octets requete requetes date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date heure heure premiere date premiere heure derniere date derniere heure fichier fichiers hote hotes hote virtuel hotes virtuels repertoire repertoires domaine domaines organisation organisations extension extensions URL URL navigateur navigateur OS OS ## (= operating system, operating systems) taille Terme recherche Termes recherches site sites utilisateur utilisateurs code statut codes statut Statistiques du serveur Web ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo- mega- giga- tera- peta- exa- zeta- yotta- ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Resume general ## The time reports, plus "busiest" strings (at the bottom of each report) Rapport annuel Annee la plus active Rapport trimestriel Trimestre le plus actif Rapport mensuel Mois le plus actif : Rapport hebdomadaire Semaine la plus active : commencant le Resume quotidien Rapport quotidien Jour le plus actif : Rapport horaire Resume horaire Resume horaire par semaine Heure la plus active : Rapport par quart d'heure Resume par quart d'heure Quart d'heure le plus actif de l'heure : Rapport par 5 minutes Resume par tranche de 5 minutes 5 minutes les plus actives : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Rapport par hote hote hotes m Rapport de redirection des hotes hote hotes m Rapport d'echec par hote hote hotes m Rapport par repertoire repertoire repertoires m Rapport par type de fichier extension extensions f Rapport par fichier demande fichier fichiers m Rapport par redirection fichier fichiers m Rapport par fichiers en erreur fichier fichiers m Rapport par provenance URL de provenance URL de provenance m Rapport par site de provenance site de provenance sites de provenance m Rapport par redirection de provenance URL de provenance URL de provenance m Rapport par erreur de provenance URL de provenance URL de provenance m Rapport par requete de recherche requete requetes f Rapport par mot-cle de recherche mot-cle mot-cles m Rapport par requete de recherche interne requete requetes f Rapport par mot-cle de recherche interne mot-cle mot-cles m Rapport par hote virtuel hote virtuel hotes virtuels m Rapport par redirection d'hote virtuel hote virtuel hotes virtuels m Rapport d'echec par hote virtuel hote virtuel hotes virtuels m Rapport par utilisateur utilisateur utilisateurs m Rapport par redirection d'utilisateur utilisateur utilisateurs m Rapport des erreurs par utilisateur utilisateur utilisateurs m Resume par navigateur navigateur navigateurs m Rapport par navigateur navigateur navigateurs m Rapport par systeme d'exploitation systeme d'exploitation systemes d'exploitation m Rapport par domaine domaine domaines m Rapport par organisation organisation organisations f Rapport par code statut code statut codes statut m Rapport par temps de traitement Rapport par taille de fichier ## Used at the bottom of the report Cette analyse a ete produite par Temps d'execution Moins d'une ## Used in the time reports Chaque unite represente ou une fraction requete d'une page requetes de pages ## Used at the bottom of each non-time report: need m, f & n genders non listes non listees non listes ## Used on the pie charts: again need m, f & n genders Autres Autres Autres ## Used at the top of the report Programme lance le Requetes analysees du au ## Used in the General Summary Requetes reussies Moyenne journaliere des requetes reussies Requetes de pages reussies Moyenne journaliere des requetes de pages reussies Lignes de journal sans code statut Requetes ayant echoue Requetes redirigees Requetes avec statut informatif Fichiers distincts demandes Hotes distincts servis Lignes invalides dans le fichier journal Lignes non desirees dans le fichier journal Donnees transferees Quantite moyenne journaliere de donnees transferees Les chiffres entre parentheses font reference aux 7 jours se terminant le 7 derniers jours Aller a Debut ## Some special phrases for particular reports. [Adresses numeriques non resolues] [domaine non indique] [domaine inconnu] [repertoire racine] [pas de repertoire] [pas d'extension] [repertoires] Windows inconnu Autre Unix Robots OS inconnu ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) Nb de req. req/7 jours % de req. req/7 jours pages pages/7 jours % de pages % pages/7 jr octets ?octets octets/7 jr ?octets/7 jr % octets % octets/7 jr nb. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Affichage des %s premiers Affichage des %s premieres * Affichage des %d premiers %s Affichage des %d premieres %s * Affichage des %s Affichage des %s * ## "by" in the phrase "listing the top 3 files BY number of requests" par ## All requests WITH AT LEAST 10 requests representant au moins ## Different ways of doing floors requete dans les 7 derniers jours requetes dans les 7 derniers jours requete de page dans les 7 derniers jours requetes de page dans les 7 derniers jours requete redirigee requetes redirigees requete redirigee dans les 7 derniers jours requetes redirigees dans les 7 derniers jours requete en erreur requetes en erreur requete en erreur dans les 7 derniers jours requetes en erreur dans les 7 derniers jours % du trafic % du trafic dans les 7 derniers jours % du trafic maximum % du trafic maximum dans les 7 derniers jours octet de trafic octets de trafic ## ?bytes represents kbytes, Mbytes etc. ?octets de trafic octet de trafic dans les 7 derniers jours octets de trafic dans les 7 derniers jours ?octets de trafic dans les 7 derniers jours demandees depuis avec une requete redirigee depuis avec une requete en erreur depuis avec la premiere requete depuis avec la premiere requete redirigee depuis avec la premiere requete en erreur depuis ## Now "sorted by": again, in m, f & n (only needed in plural though) tries par triees par * ## Used at the top of each report Ce rapport contient les donnees sur ## Used in pie charts Les parts sont tracees par ## different ways of sorting la quantite de trafic la quantite de trafic dans les 7 derniers jours % des requetes % des requetes dans les 7 derniers jours % du nombre maximum de requetes % du nombre maximum de requetes dans les 7 derniers jours le nombre de requetes le nombre de requetes dans les 7 derniers jours % des requetes de pages % des requetes de pages dans les 7 derniers jours % du nombre maximum de requetes de pages % du nombre maximum de requetes de pages dans les 7 derniers jours le nombre de requetes de pages le nombre de requetes de pages dans les 7 derniers jours % des requetes redirigees % des requetes redirigees dans les 7 derniers jours % du nombre maximum des requetes redirigees % du nombre maximum des requetes redirigees dans les 7 derniers jours le nombre de requetes redirigees le nombre de requetes redirigees dans les 7 derniers jours % des requetes ayant echoue % des requetes ayant echoue dans les 7 derniers jours % du nombre maximum des requetes ayant echoue % du nombre maximum des requetes ayant echoue dans les 7 derniers jours le nombre de requetes ayant echoue le nombre de requetes ayant echoue dans les 7 derniers jours l'heure de la derniere requete l'heure de la derniere requete redirigee l'heure de la derniere requete ayant echoue l'heure de la premiere requete l'heure de la premiere requete redirigee l'heure de la premiere requete ayant echoue ## 3 other ways of sorting in m, f, & n tries par ordre alphabetique triees par ordre alphabetique * tries par ordre numerique triees par ordre numerique * non tries non triees * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w %D %m %Y a %H:%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %H:%n%x%I:%o ## In Hourly Summary %H ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continuez la requete 101 Changement de protocole accepte 1xx [Divers messages informatifs] 200 OK 201 Cree 202 Accepte pour traitement ulterieur 203 Information de seconde main (Non-authoritative) 204 OK, mais rien a envoyer 205 Reset document 206 Contenu partiel 2xx [Diverses operations reussies] 300 Multiples documents disponibles 301 Document definitivement deplace 302 Document trouve ailleurs 303 Voir autre document 304 Non modifie depuis le dernier acces 305 Utiliser un proxy 306 Changer de proxy 307 Document deplace temporairement 3xx [Diverses redirections] 400 Requete incorrecte 401 Authentification requise 402 Paiement requis 403 Acces interdit 404 Document non trouve 405 Methode non autorisee 406 Document non acceptable par le client 407 Identifiez vous sur le proxy 408 Requete : temps depasse 409 La requete est en conflit avec l'etat de la ressource 410 Document definitivement inaccessible 411 Longueur requise 412 Echec de la precondition 413 Requete trop longue 414 Nom de fichier demande trop long 415 Type de media non supporte 416 L'en-tete "range" requis est invalide 417 L'en-tete "Expect" ne peut etre satisfait 4xx [Diverses erreurs du client/utilisateur] 500 Erreur interne du serveur 501 Type de requete non supporte 502 Erreur du serveur amont 503 Service temporairement indisponible 504 Passerelle : Temps depasse 505 Version de HTTP non supportee 506 Echec de la redirection 5xx [Diverses erreurs du serveur] xxx [Inconnu] analog-6.0/lang/fradesc.txt0000644000175000017500000001103310161303540016016 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Ce rapport liste l'activite de chaque annee. # Quarterly Report Ce rapport liste l'activite de chaque trimestre. # Monthly Report Ce rapport liste l'activite de chaque mois. # Weekly Report Ce rapport liste l'activite de chaque semaine. # Daily Report Ce rapport liste l'activite de chaque jour. # Hourly Report Ce rapport liste l'activite de chaque heure. # Quarter-Hour Report Ce rapport liste l'activite par periodes de 4 heures. # Five-Minute Report Ce rapport liste l'activite par periodes de 5 minutes. # Daily Summary Ce rapport liste l'activite totale par jour de la semaine, additionnee sur toutes les semaines du rapport. # Hourly Summary Ce rapport liste l'activite totale par heure du jour, additionnee sur tous les jours du rapport. # Hour of the Week Summary Ce rapport liste l'activite totale par heure de la semaine, additionnee sur toutes les semaines du rapport. # Quarter-Hour Summary Ce rapport liste l'activite totale par periodes quotidiennes de 4 heures, additionnee sur tous les jours du rapport. # Five-Minute Summary Ce rapport liste l'activite totale par periodes quotidiennes de 5 minutes, additionnee sur tous les jours du rapport. # General Summary Ce rapport contient des statistiques generales. # Request Report Ce rapport liste les fichiers du site. # Redirection Report Ce rapport liste les fichiers pour lesquelles les requetes ont ete redirigees vers un autre fichier. (En general des repertoires auxquels manque le slash '/' final, ou des scripts CGI qui forcent des redirections.) # Failure Report Ce rapport liste les fichiers qui ont cause des erreurs, par exemple les fichiers non trouves. # File Type Report Ce rapport liste les extensions des fichiers demandes. # Directory Report Ce rapport liste les repertoires contenant les fichiers demandes. (Les chiffres de chaque repertoire incluent tous ceux de ses sous-repertoires). # Host Report Ce rapport liste les ordinateurs qui ont demande des fichiers. # Host Redirection Report Ce rapport liste les ordinateurs qui ont ete rediriges vers d'autres fichiers. # Host Failure Report Ce rapport liste les ordinateurs qui ont vu des requetes d'echec. # Domain Report Ce rapport liste les pays des ordinateurs qui ont demande des fichiers. # Referrer Report Ce rapport liste les referents (liens que les gens ont suivis ou pages qui incluaient des images de ce site). # Referring Site Report Ce rapport liste les serveurs a partir desquels les gens ont suivi des liens. # Redirected Referrer Report Ce rapport liste les referents qui ont provoque des requetes de redirection. # Failed Referrer Report Ce rapport liste les referents qui contenaient des liens brises vers ce site. # Browser Report Ce rapport liste les navigateurs utilises par les visiteurs. # Virtual Host Report Ce rapport liste l'activite de chaque domaine virtuel de ce site. # Virtual Host Redirection Report Ce rapport liste les requetes de redirection de chaque domaine virtuel. # Virtual Host Failure Report Ce rapport liste les requetes d'echec de chaque domaine virtuel. # User Report Ce rapport liste les utilisateurs qui ont demande des fichiers, s'ils ont ete authentifies ou s'ils ont pu etre identifies par des cookies. # User Redirection Report Ce rapport liste les utilisateurs qui ont ete rediriges vers un autre fichier. # User Failure Report Ce rapport liste les utilisateurs ayant rencontre des requetes d'echec. # Organisation Report Ce rapport liste les organisations des ordinateurs ayant demande des fichiers. # Search Query Report Ce rapport liste les termes de recherche que les gens ont utilises dans les moteurs de recherche pour trouver ce site. # Search Word Report Ce rapport liste quels mots les gens ont utilises dans les moteurs de recherche pour trouver ce site. # Internal Search Query Report Ce rapport liste quels termes de recherche les gens ont utilises dans les scripts de ce site. # Internal Search Word Report Ce rapport liste quels mots les gens ont utilises dans les scripts de ce site. # Browser Summary Ce rapport liste les fournisseurs des navigateurs utilises par les visiteurs. # Operating System Report Ce rapport liste les systemes d'exploitation utilises par les visiteurs. # File Size Report Ce rapport liste les tailles des fichiers. # Status Code Report Ce rapport liste les codes de statut HTTP pour toutes les requetes. # Processing Time Report Ce rapport liste les temps pris pour traiter les requetes reussies. analog-6.0/lang/fradom.tab0000644000175000017500000001162610161303540015616 0ustar sret1sret100000000000000aero 2 industrie aeronautique arpa 1 Arpanet biz 2 entreprises com 2 commercial coop 2 cooperatives edu 2 education (E.-U.) gov 2 gouvernement (E.-U.) info 2 renseignements int 1 organisations internationales mil 2 militaire (E.-U.) museum 2 musees name 3 personnes net 2 network (reseau) org 2 organisations non commerciales pro 3 professionnels ac 1 Ile de l'Ascension ad 2 Andorre ae 3 Emirats Arabes Unis af 1 Afghanistan ag 2 Antigua-et-Barbuda ai 1 Anguilla al 1 Albanie am 2 Armenie an 1 Antilles Neerlandaises ao 1 Angola aq 1 Antarctique ar 3 Argentine as 1 Samoa Americain at 3 Autriche au 3 Australie aw 1 Aruba az 1 Azerbaidjan ba 3 Bosnie-Herzegovine bb 2 La Barbade bd 1 Bangladesh be 3 Belgique bf 1 Burkina Faso bg 2 Bulgarie bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermudes bn 1 Brunei Darussalam bo 3 Bolivie br 3 Bresil bs 1 Bahamas bt 1 Bhoutan bv 1 Ile Bouvet bw 1 Botswana by 1 Bielorussie bz 1 Belize ca 3 Canada cc 1 Iles Cocos (Keeling) cd 1 Republique democratique du Congo cf 1 Republique Centrafricaine cg 1 Congo ch 2 Suisse ci 1 Cote D'Ivoire ck 1 Iles Cook cl 2 Chili cm 1 Cameroun cn 3 Chine co 3 Colombie cr 3 Costa Rica cs 3 Serbie et Montenegro cu 2 Cuba cv 1 Cap-Vert cx 2 Ile Christmas cy 3 Chypre cz 2 Republique Tcheque de 2 Allemagne dj 1 Djibouti dk 2 Danemark dm 2 Dominique do 3 Republique Dominicaine dz 1 Algerie ec 3 Equateur ee 2 Estonie eg 3 Egypte eh 1 Sahara Occidental er 1 Erythree es 2 Espagne et 1 Ethiopie fi 2 Finlande fj 3 Fidji fk 1 Malouines (Iles Falkland) fm 1 Micronesie fo 1 Iles Feroe fr 2 France fx 1 France (metropolitaine) ga 1 Gabon gb 1 Grande-Bretagne gd 1 Grenade ge 1 Georgie gf 1 Guyane Francaise gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambie gn 1 Guinee gp 1 Guadeloupe (France) gq 1 Guinee-Equatoriale gr 2 Grece gs 1 Iles Georgie du Sud et Sandwich du Sud gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinee-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Iles Heard et McDonald hn 2 Honduras hr 2 Croatie ht 1 Haiti hu 2 Hongrie id 3 Indonesie ie 2 Irlande il 3 Israel im 1 Ile de Man in 3 Inde io 1 Territoire Britannique de l'Ocean Indien iq 1 Iraq ir 1 Iran is 2 Islande it 2 Italie je 1 Jersey jm 3 Jamaique jo 3 Jordanie jp 3 Japon ke 3 Kenya kg 1 Kirghizstan kh 1 Cambodge ki 1 Kiribati km 1 Iles Comores kn 1 Saint-Kitts-et-Nevis kp 1 Coree du Nord kr 3 Coree du Sud kw 3 Koweit ky 1 Iles Cayman kz 1 Kazakhstan la 1 Laos lb 3 Liban lc 1 Sainte-Lucie li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lithuanie lu 2 Luxembourg lv 2 Lettonie ly 1 Libye ma 1 Maroc mc 2 Monaco md 1 Moldavie mg 1 Madagascar mh 1 Iles Marshall mk 3 Macedoine ml 1 Mali mm 1 Myanmar mn 1 Mongolie mo 1 Macao mp 1 Iles Mariannes du Nord mq 1 Martinique (France) mr 1 Mauritanie ms 1 Montserrat mt 3 Malte mu 1 Ile Maurice mv 1 Maldives mw 1 Malawi mx 3 Mexique my 3 Malaysie mz 1 Mozambique na 1 Namibie nc 1 Nouvelle Caledonie (France) ne 1 Niger nf 1 Ile Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Pays-Bas no 2 Norvege np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nouvelle-Zelande om 1 Oman pa 3 Panama pe 3 Perou pf 1 Polynesie Francaise pg 3 Papouasie Nouvelle-Guinee ph 3 Philippines pk 3 Pakistan pl 3 Pologne pm 1 Saint-Pierre-et-Miquelon pn 1 Ile Pitcairn pr 1 Porto Rico ps 3 Territoire Palestinien Occupe pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion (France) ro 2 Roumanie ru 2 Russie rw 1 Rwanda sa 3 Arabie Saoudite sb 1 Iles Salomon sc 1 Seychelles sd 1 Soudan se 2 Suede sg 3 Singapour sh 1 Sainte-Helene si 2 Slovenie sj 1 Iles Svalbard et Jan Mayen sk 2 Republique Slovaque sl 1 Sierra Leone sm 1 Saint-Marin sn 1 Senegal so 1 Somalie sr 1 Surinam st 1 Sao Tome e Principe su 2 ex-URSS sv 3 Salvador sy 1 Syrie sz 1 Swaziland tc 1 Iles Turks-et-Caicos td 1 Tchad tf 1 Territoires Francais du Sud tg 1 Togo th 3 Thailande tj 1 Tadjikistan tk 1 Tokelau tl 1 Timor Oriental tm 1 Turkmenistan tn 1 Tunisie to 1 Tonga tp 1 Timor Oriental tr 3 Turquie tt 3 Trinite-et-Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzanie ua 3 Ukraine ug 3 Ouganda uk 3 Royaume-Uni um 1 Iles Mineures Eloignees des E.-U. us 4 Etats-Unis uy 3 Uruguay uz 1 Ouzbekistan va 1 Vatican vc 1 Saint-Vincent-et-les-Grenadines ve 3 Venezuela vg 1 Iles Vierges (R.-U.) vi 1 Iles Vierges (E.-U.) vn 1 Vietnam vu 1 Vanuatu wf 1 Iles Wallis-et-Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Yougoslavie za 3 Afrique du Sud zm 1 Zambie zr 1 Republique Democratique du Congo zw 3 Zimbabwe analog-6.0/lang/frdesc.txt0000644000175000017500000001103310161303540015655 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Ce rapport liste l'activit de chaque anne. # Quarterly Report Ce rapport liste l'activit de chaque trimestre. # Monthly Report Ce rapport liste l'activit de chaque mois. # Weekly Report Ce rapport liste l'activit de chaque semaine. # Daily Report Ce rapport liste l'activit de chaque jour. # Hourly Report Ce rapport liste l'activit de chaque heure. # Quarter-Hour Report Ce rapport liste l'activit par priodes de 4 heures. # Five-Minute Report Ce rapport liste l'activit par priodes de 5 minutes. # Daily Summary Ce rapport liste l'activit totale par jour de la semaine, additionne sur toutes les semaines du rapport. # Hourly Summary Ce rapport liste l'activit totale par heure du jour, additionne sur tous les jours du rapport. # Hour of the Week Summary Ce rapport liste l'activit totale par heure de la semaine, additionne sur toutes les semaines du rapport. # Quarter-Hour Summary Ce rapport liste l'activit totale par priodes quotidiennes de 4 heures, additionne sur tous les jours du rapport. # Five-Minute Summary Ce rapport liste l'activit totale par priodes quotidiennes de 5 minutes, additionne sur tous les jours du rapport. # General Summary Ce rapport contient des statistiques gnrales. # Request Report Ce rapport liste les fichiers du site. # Redirection Report Ce rapport liste les fichiers pour lesquelles les requtes ont t rediriges vers un autre fichier. (En gnral des rpertoires auxquels manque le slash '/' final, ou des scripts CGI qui forcent des redirections.) # Failure Report Ce rapport liste les fichiers qui ont caus des erreurs, par exemple les fichiers non trouvs. # File Type Report Ce rapport liste les extensions des fichiers demands. # Directory Report Ce rapport liste les rpertoires contenant les fichiers demands. (Les chiffres de chaque rpertoire incluent tous ceux de ses sous-rpertoires). # Host Report Ce rapport liste les ordinateurs qui ont demand des fichiers. # Host Redirection Report Ce rapport liste les ordinateurs qui ont t redirigs vers d'autres fichiers. # Host Failure Report Ce rapport liste les ordinateurs qui ont vu des requtes d'chec. # Domain Report Ce rapport liste les pays des ordinateurs qui ont demand des fichiers. # Referrer Report Ce rapport liste les rfrents (liens que les gens ont suivis ou pages qui incluaient des images de ce site). # Referring Site Report Ce rapport liste les serveurs partir desquels les gens ont suivi des liens. # Redirected Referrer Report Ce rapport liste les rfrents qui ont provoqu des requtes de redirection. # Failed Referrer Report Ce rapport liste les rfrents qui contenaient des liens briss vers ce site. # Browser Report Ce rapport liste les navigateurs utiliss par les visiteurs. # Virtual Host Report Ce rapport liste l'activit de chaque domaine virtuel de ce site. # Virtual Host Redirection Report Ce rapport liste les requtes de redirection de chaque domaine virtuel. # Virtual Host Failure Report Ce rapport liste les requtes d'chec de chaque domaine virtuel. # User Report Ce rapport liste les utilisateurs qui ont demand des fichiers, s'ils ont t authentifis ou s'ils ont pu tre identifis par des cookies. # User Redirection Report Ce rapport liste les utilisateurs qui ont t redirigs vers un autre fichier. # User Failure Report Ce rapport liste les utilisateurs ayant rencontr des requtes d'chec. # Organisation Report Ce rapport liste les organisations des ordinateurs ayant demand des fichiers. # Search Query Report Ce rapport liste les termes de recherche que les gens ont utiliss dans les moteurs de recherche pour trouver ce site. # Search Word Report Ce rapport liste quels mots les gens ont utiliss dans les moteurs de recherche pour trouver ce site. # Internal Search Query Report Ce rapport liste quels termes de recherche les gens ont utiliss dans les scripts de ce site. # Internal Search Word Report Ce rapport liste quels mots les gens ont utiliss dans les scripts de ce site. # Browser Summary Ce rapport liste les fournisseurs des navigateurs utiliss par les visiteurs. # Operating System Report Ce rapport liste les systmes d'exploitation utiliss par les visiteurs. # File Size Report Ce rapport liste les tailles des fichiers. # Status Code Report Ce rapport liste les codes de statut HTTP pour toutes les requtes. # Processing Time Report Ce rapport liste les temps pris pour traiter les requtes russies. analog-6.0/lang/frdom.tab0000644000175000017500000001162610161303540015455 0ustar sret1sret100000000000000aero 2 industrie aronautique arpa 1 Arpanet biz 2 entreprises com 2 commercial coop 2 coopratives edu 2 ducation (.-U.) gov 2 gouvernement (.-U.) info 2 renseignements int 1 organisations internationales mil 2 militaire (.-U.) museum 2 muses name 3 personnes net 2 network (rseau) org 2 organisations non commerciales pro 3 professionnels ac 1 le de l'Ascension ad 2 Andorre ae 3 mirats Arabes Unis af 1 Afghanistan ag 2 Antigua-et-Barbuda ai 1 Anguilla al 1 Albanie am 2 Armnie an 1 Antilles Nerlandaises ao 1 Angola aq 1 Antarctique ar 3 Argentine as 1 Samoa Amricain at 3 Autriche au 3 Australie aw 1 Aruba az 1 Azerbadjan ba 3 Bosnie-Herzgovine bb 2 La Barbade bd 1 Bangladesh be 3 Belgique bf 1 Burkina Faso bg 2 Bulgarie bh 1 Bahrain bi 1 Burundi bj 1 Bnin bm 1 Bermudes bn 1 Brunei Darussalam bo 3 Bolivie br 3 Brsil bs 1 Bahamas bt 1 Bhoutan bv 1 le Bouvet bw 1 Botswana by 1 Bilorussie bz 1 Belize ca 3 Canada cc 1 les Cocos (Keeling) cd 1 Rpublique dmocratique du Congo cf 1 Rpublique Centrafricaine cg 1 Congo ch 2 Suisse ci 1 Cte D'Ivoire ck 1 les Cook cl 2 Chili cm 1 Cameroun cn 3 Chine co 3 Colombie cr 3 Costa Rica cs 3 Serbie et Montngro cu 2 Cuba cv 1 Cap-Vert cx 2 le Christmas cy 3 Chypre cz 2 Rpublique Tchque de 2 Allemagne dj 1 Djibouti dk 2 Danemark dm 2 Dominique do 3 Rpublique Dominicaine dz 1 Algrie ec 3 quateur ee 2 Estonie eg 3 Egypte eh 1 Sahara Occidental er 1 Erythre es 2 Espagne et 1 Ethiopie fi 2 Finlande fj 3 Fidji fk 1 Malouines (les Falkland) fm 1 Micronsie fo 1 les Fro fr 2 France fx 1 France (mtropolitaine) ga 1 Gabon gb 1 Grande-Bretagne gd 1 Grenade ge 1 Gorgie gf 1 Guyane Franaise gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambie gn 1 Guine gp 1 Guadeloupe (France) gq 1 Guine-quatoriale gr 2 Grce gs 1 les Georgie du Sud et Sandwich du Sud gt 3 Guatemala gu 1 Guam (USA) gw 1 Guine-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 les Heard et McDonald hn 2 Honduras hr 2 Croatie ht 1 Hati hu 2 Hongrie id 3 Indonsie ie 2 Irlande il 3 Isral im 1 le de Man in 3 Inde io 1 Territoire Britannique de l'Ocan Indien iq 1 Iraq ir 1 Iran is 2 Islande it 2 Italie je 1 Jersey jm 3 Jamaque jo 3 Jordanie jp 3 Japon ke 3 Kenya kg 1 Kirghizstan kh 1 Cambodge ki 1 Kiribati km 1 les Comores kn 1 Saint-Kitts-et-Nevis kp 1 Core du Nord kr 3 Core du Sud kw 3 Kowet ky 1 les Cayman kz 1 Kazakhstan la 1 Laos lb 3 Liban lc 1 Sainte-Lucie li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lithuanie lu 2 Luxembourg lv 2 Lettonie ly 1 Libye ma 1 Maroc mc 2 Monaco md 1 Moldavie mg 1 Madagascar mh 1 les Marshall mk 3 Macdoine ml 1 Mali mm 1 Myanmar mn 1 Mongolie mo 1 Macao mp 1 les Mariannes du Nord mq 1 Martinique (France) mr 1 Mauritanie ms 1 Montserrat mt 3 Malte mu 1 le Maurice mv 1 Maldives mw 1 Malawi mx 3 Mexique my 3 Malaysie mz 1 Mozambique na 1 Namibie nc 1 Nouvelle Caldonie (France) ne 1 Niger nf 1 le Norfolk ng 1 Nigria ni 3 Nicaragua nl 2 Pays-Bas no 2 Norvge np 1 Npal nr 1 Nauru nu 2 Niue nz 3 Nouvelle-Zlande om 1 Oman pa 3 Panama pe 3 Prou pf 1 Polynsie Franaise pg 3 Papouasie Nouvelle-Guine ph 3 Philippines pk 3 Pakistan pl 3 Pologne pm 1 Saint-Pierre-et-Miquelon pn 1 le Pitcairn pr 1 Porto Rico ps 3 Territoire Palestinien Occup pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Runion (France) ro 2 Roumanie ru 2 Russie rw 1 Rwanda sa 3 Arabie Saoudite sb 1 les Salomon sc 1 Seychelles sd 1 Soudan se 2 Sude sg 3 Singapour sh 1 Sainte-Hlne si 2 Slovnie sj 1 les Svalbard et Jan Mayen sk 2 Rpublique Slovaque sl 1 Sierra Leone sm 1 Saint-Marin sn 1 Sngal so 1 Somalie sr 1 Surinam st 1 So Tom e Prncipe su 2 ex-URSS sv 3 Salvador sy 1 Syrie sz 1 Swaziland tc 1 les Turks-et-Caicos td 1 Tchad tf 1 Territoires Franais du Sud tg 1 Togo th 3 Thalande tj 1 Tadjikistan tk 1 Tokelau tl 1 Timor Oriental tm 1 Turkmnistan tn 1 Tunisie to 1 Tonga tp 1 Timor Oriental tr 3 Turquie tt 3 Trinit-et-Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzanie ua 3 Ukraine ug 3 Ouganda uk 3 Royaume-Uni um 1 les Mineures loignes des .-U. us 4 tats-Unis uy 3 Uruguay uz 1 Ouzbkistan va 1 Vatican vc 1 Saint-Vincent-et-les-Grenadines ve 3 Venezuela vg 1 les Vierges (R.-U.) vi 1 les Vierges (.-U.) vn 1 Vietnam vu 1 Vanuatu wf 1 les Wallis-et-Futuna ws 1 Samoa ye 1 Ymen yt 1 Mayotte yu 3 Yougoslavie za 3 Afrique du Sud zm 1 Zambie zr 1 Rpublique Dmocratique du Congo zw 3 Zimbabwe analog-6.0/lang/frform.html0000644000175000017500000002177210161303540016042 0ustar sret1sret100000000000000 Interface formulaire d'Analog

Interface formulaire d'Analog


1. Choix des rapports à éditer

N.B. Ce formulaire ne fonctionnera pas - les boutons n'apparatront peut-être même pas - jusqu' ce que vous l'ayiez configur conformment aux instructions. Aprs quoi vous pourrez retirer ce paragraphe.
Voir la home page de Analog pour la signification des diffrents rapports.

Quels rapports voulez-vous obtenir ?


[On] [Off] Résumé général
[On] [Off] Rapport mensuel
[On] [Off] Rapport hebdomadaire
[On] [Off] Résumé journalier
[On] [Off] Rapport journalier
[On] [Off] Résumé horaire
[On] [Off] Rapport par domaine
[On] [Off] Rapport par organisation
[On] [Off] Rapport par répertoire
[On] [Off] Rapport par type de fichier
[On] [Off] Rapport par requête
[On] [Off] Rapport par taille de fichier
[On] [Off] Rapport par provenance
[On] [Off] Rapport par requête de recherche
[On] [Off] Rapport par mot-clé de recherche
[On] [Off] Résumé par navigateur
[On] [Off] Rapport par système d'exploitation
[On] [Off] Rapport par code statut

Vous pouvez maintenant lancer le programme:
Ou vous pouvez compléter les options ci dessous pour chaque rapport. Vous pouvez utiliser octets pour 10 Méga-octets; ou bien pour les 50 premiers éléments en nombre d'octets.


2. Options détaillées

Options du rapport par domaine

Trier le rapport par domaine
Inclure les domaines ayant au moins

Options du rapport par organisation

Trier le rapport par organisation
Inclure les organisations ayant au moins

Options du rapport par répertoire

Trier le rapport par répertoire
Inclure les répertoires ayant au moins

Options du rapport par fichier demandé

Trier le rapport par fichier demandé
Inclure les fichiers ayant au moins
Montrer

Options du rapport par provenance

Trier le rapport par provenance
Inclure les provenances ayant au moins

3. Analyser partiellement le fichier log

Seulement certaines dates
Vous pouvez n'analyser que les requêtes faites à certaines dates.
Entrez les dates de début et de fin ci-dessous sous la forme aammjj;
par exemple, 980301 pour le 1er Mars 1998, ou seulement l'une des deux dates
pour n'avoir qu'une date de début ou une date de fin.
De Jusqu'à

Seulement certains fichiers
Ne traiter que les fichiers suivants (entrez une liste de fichiers, séparés par des virgules; les noms peuvent contenir le caractère joker '*')

Ignorer les fichiers suivants


4. Disposition

Nom de votre organisation (pour le titre de la page)

Home page de votre organisation (laisser en blanc si aucune)
URL:


analog-6.0/lang/gr.lng0000644000175000017500000003465210161303540014774 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## , 1998 1999. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-7 ## Abbreviations for the day and month names. ## Next some standard common words. ## Abbreviation for "week beginning" . . ++year++ ## Quarter of a year ++quarter++ ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 ++time++ URL URLs ## (= operating system, operating systems) Web ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ : : : ++Hour of the Week Summary++ : ++Quarter-Hour Summary++ : ++Five-Minute Summary++ : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! m ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ m f n n n URL URL n f URL URL n URL URL n n f ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ m ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ m ++User Redirection Report++ ++user++ ++users++ ++n++ m m m n f m m ## Used at the bottom of the report 1 ## Used in the time reports ## Used at the bottom of each non-time report: need m, f & n genders ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report ## Used in the General Summary Logfile logfile logfile 7 7 ## Some special phrases for particular reports. [ ] [ ] [ ] [ (root) ] [ ] [ ] [] Windows Unix ++Robots++ ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #. ++7-day reqs++ %. ++%7-day reqs++ . ++7-day pages++ %. ++%7-day pages++ ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ % ++%7-day bytes++ . ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n %s %s %s %d %s %d %s %d %s E %s E %s E %s ## "by" in the phrase "listing the top 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % ++% of the traffic in the last 7 days++ % ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting ++the amount of traffic in the last 7 days++ % ++% of the requests in the last 7 days++ % ++% of the maximum number of requests in the last 7 days++ ++the number of requests in the last 7 days++ % ++% of the requests for pages in the last 7 days++ % ++% of the maximum number of requests for pages in the last 7 days++ ++the number of requests for pages in the last 7 days++ % ++% of the redirected requests in the last 7 days++ % ++% of the maximum number of redirected requests in the last 7 days++ ++the number of redirected requests in the last 7 days++ % ++% of the failed requests in the last 7 days++ % ++% of the maximum number of failed requests in the last 7 days++ ++the number of failed requests in the last 7 days++ ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary ++%w++ ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 101 1xx [ ] 200 201 202 203 204 , 205 (Reset) 206 2xx [ ] 300 301 302 303 304 305 306 307 3xx [ ] 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 4xx [ /] 500 501 502 (upstream) 503 504 505 HTTP 506 5xx [ ] xxx [] analog-6.0/lang/gra.lng0000644000175000017500000003514010161303540015126 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Translation into Greek and transliteration into (terrible) 'Greenglish': ## Dimitris Xenakis, June 1998 and October 1999. ## For the tranliteration of greek to ASCII, I just followed the position ## of the keys on the US keyboard. Hope that makes sense. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Kyr Deu Tri Tet Pem Par Sab Ian Feb Mar Apr Mai Ion Iol Ayg Sep Okt Noe Dek ## Next some standard common words. ## Abbreviation for "week beginning" ebd. arx. ++year++ ## Quarter of a year ++quarter++ mhnas hmera hmeres vr lepto lepta deyterolepto deyterolepta chfiolejh chfiolejeis ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ aithsh aithseis hmeromhnia ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 hmeromhnia vra ++time++ prvth hmeromhnia prvth vra prohgoymenh hmeromhnia prohgoymenh vra arxeio arxeia jenisths jenistes eikonikos jenisths eikonikoi jenistes fakelos fakeloi perioxh perioxes organismos organismoi epektash epektaseis URL URLs fyllometrhths fyllometrhtes leitoyrgiko leitoyrgika ## (= operating system, operating systems) megeuos oros anazhthshs oroi anazhthshs topos topoi xrhsths xrhstes kvdikos katastashs kvdikoi katastashs Statistika stoixeia ejyphrethth Web toy ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Genikh Synoch ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Mhniaia Anafora Mhnas me thn ychloterh drasthriothta: Ebdomadiaia Anafora Ebdomada me thn ychloterh drasthriothta: Ebdomada poy arxizei apo Kauhmerinh Synoch Kauhmerinh Anafora Hmera me thn ychloterh drasthriothta: Vriaia Anafora Vriaia Synoch ++Hour of the Week Summary++ Vra me thn ychloterh drasthriothta: Anafora ana tetarto ++Quarter-Hour Summary++ Tetarto me thn ychloterh drasthriothta: Anafora ana pentalepto ++Five-Minute Summary++ Pentalepto me thn ychloterh drasthriothta: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Anafora Jenistvn jenisth jenistvn m ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Anafora Fakelvn fakeloy fakelvn m Anafora Eidvn Arxeioy epektashs epektasevn f Anafora aithsevn arxeioy arxeivn n Anafora anadromologhsevn arxeioy rxeivn n Anafora apotyxivn arxeioy rxeivn n Anafora Parapompvn URL parapomphs URL parapomphs n Anafora topouesivn poy parepemcan topouesias poy parepemce topouesivn poy parepemcan f Anafora Anadromologhmenoy Parapempth URL parapomphs URL parapomphs n Anafora Apotyxhmenvn Parapompvn URL parapomphs URL parapomphs n Anafora Ervthmatvn ervthmatos ervthmatvn n Anafora Lexevn Anazhthshs lejhs ervthmatos lejevn ervthmatos f ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Anafora Eikonikvn Jenistvn eikonikoy jenisth eikonikvn jenistvn m ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Anafora Xrhstvn xrhsth xrhstvn m ++User Redirection Report++ ++user++ ++users++ ++n++ Anafora Sfalmatvn Xrhsth xrhsth xrhstvn m Synoch Fyllometrhtvn fyllometrhth fyllometrhtvn m Anafora Fyllometrhtvn fyllometrhth fyllometrhtvn m Anafora Leitoyrgikvn Systhmatvn leitoyrgikoy systhmatos leitoyrgikvn systhmatvn n Anafora Perioxvn perioxhs perioxvn f Anafora Organismvn organismoy organismvn m Anafora Kvdikvn Katastashs kvdikoy katastashs kvdikvn katastashs m Anafora Xronoy Epejergasias Anafora megeuoys arxeivn ## Used at the bottom of the report Ayth h analysh parhxuh apo to Xronos ekteleshs Ligotero apo 1 ## Used in the time reports Kaue monada antistoixei se h meros aithsh gia istioselida aithseis gia istioselides ## Used at the bottom of each non-time report: need m, f & n genders den fainontai analytika den fainontai analytika den fainontai analytika ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report To programma jekinhse Analyuhkan aithseis apo evs ## Used in the General Summary Epityxhmenes aithseis Mesos oros epityxhmenvn aithsevn ana hmera Epityxhmenes aithseis gia istioselides Mesos oros epityxhmenvn aithsevn gia istioselides ana hmera Grammes arxeioy Logfile xvris kvdiko katastashs Apotyxhmenes aithseis Anadromologhmenes aithseis Aithseis me plhroforiako kvdiko katastashs Jexvrista arxeia poy anazhthuhkan Jexvristoi jenistes poy ejyphrethuhkan Katestrammenes grammes arxeioy logfile Mh xrhsimes kataxvrhseis arxeioy logfile Synolo dedomenvn poy metaferuhkan Mesos oros dedomenvn poy metaferuhkan ana hmera Oi ariumoi se parenuesh anaferontai se 7 hmeres evs teleytaies 7 hmeres Phgaine Koryfh ## Some special phrases for particular reports. [ariumhtikes dieuynseis xvris antistoixia] [den douhke perioxh] [agvsth perioxh] [arxikos (root) fakelos] [xvris fakelo] [xvris epektash] [fakeloi] Agnvsto Windows Allo Unix ++Robots++ Leitoyrgiko agnvsto ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #ait. ++7-day reqs++ %ait. ++%7-day reqs++ sel. ++7-day pages++ %sel. ++%7-day pages++ lejeis ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %lejevn ++%7-day bytes++ ar. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Ektypvsh tvn prvtvn %s Ektypvsh tvn prvtvn %s Ektypvsh tvn prvtvn %s Ektypvsh tvn prvtvn %d %s Ektypvsh tvn prvtvn %d %s Ektypvsh tvn prvtvn %d %s Ektypvsh %s Ektypvsh %s Ektypvsh %s ## "by" in the phrase "listing the top 3 files BY number of requests" kata ## All requests WITH AT LEAST 10 requests me toylaxiston ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ anadromologhmenh aithsh anadromologhmenes aithseis ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ apotyxhmenh aithsh apotyxhmenes aithseis ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % toy fortioy ++% of the traffic in the last 7 days++ % toy megistoy megeuoys fortioy ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ chfiolejeis kinhshs ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ aithuhkan apo me mia andromologhmenh aithsh apo me mia apotyxhmenh aithsh apo ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) tajinomhmemoi kata tajinomhmenes kata tajinomhmena kata ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting to megeuos toy fortioy ++the amount of traffic in the last 7 days++ % tvn aithsevn ++% of the requests in the last 7 days++ % toy megistoy ariumoy aithsevn ++% of the maximum number of requests in the last 7 days++ ton ariumo aithsevn ++the number of requests in the last 7 days++ % tvn aithsevn gia istioselides ++% of the requests for pages in the last 7 days++ % toy megistoy ariumoy aithsevn gia istioselides ++% of the maximum number of requests for pages in the last 7 days++ ton ariumo aithsevn gia istioselides ++the number of requests for pages in the last 7 days++ % tvn anadromologhmenvn aithsevn ++% of the redirected requests in the last 7 days++ % toy megistoy ariumoy anadromologhmenvn aithsevn ++% of the maximum number of redirected requests in the last 7 days++ ton ariumo anadromologhmenvn aithsevn ++the number of redirected requests in the last 7 days++ % tvn apotyxhmenvn aithsevn ++% of the failed requests in the last 7 days++ % toy megistoy ariumoy apotyxhmenvn aithsevn ++% of the maximum number of failed requests in the last 7 days++ ton ariumo apotyxhmenvn aithsevn ++the number of failed requests in the last 7 days++ o xronos ths teleytaias aithshs o xronos ths teleytaias anadromologhmenhs aithshs o xronos ths teleytaias apotyxhmenhs aithshs ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n tajinomhmenoi alfabhtika tajinomhmenes alfabhtika tajinomhmena alfabhtika tajinomhmenoi ariumhtika tajinomhmenes ariumhtika tajinomhmena ariumhtika atajinomhtoi atajinomhtes atajinomhta ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary ++%w++ ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Synexeia aithshs 101 Metagvgh prvtokolon 1xx [Diafora plhroforiaka] 200 OK 201 Dhmioyrghuhke 202 Apodekto gia mellontikh epejergasia 203 Mh ejoysiodothmenh plhroforia 204 OK, alla tipota pros apostolh 205 Epanauesh (reset) eggrafoy 206 Meriko periexomeno 2xx [Diafores epityxies] 300 Pollapla eggrafa diauesima 301 To eggrafo metakinhuhke monima 302 To eggrafo breuhke alloy 303 Deite allo eggrafo 304 Den exei allaxei apo thn prohgoymenh anaklhsh 305 Xrhsimopoihste endiameso diakomisth 306 Metagvgh endiamsoy diakomisth 307 To eggrafo metakinhuhke prosvrina 3xx [Diafores anadromologhseis] 400 Lauos aithsh 401 Aparaithth h ejakribvsh taytothtas 402 Aparaithth h plhrvmh 403 Apagoreymenh h prosbash 404 To eggrafo den breuhke 405 Mh epitrepth meuodos 406 To eggrafo den einai apodekto apo ton pelath 407 Xreiazetai ejakribvsh taytothtas endiamesoy diakomisth 408 Lhjh xronikoy orioy aithshs 409 H aithsh sygkroyetai me thn katastash toy poroy 410 To eggrafo exei fygei monima 411 Aparaithto to mhkos 412 Proypouesh apetyxe 413 H aithsh poly megalh 414 To zhtoymeno onoma arxeioy poly megalo 415 To eidos mesoy den yposthrizetai 416 To aitoymeno eyros timvn den isxyei 417 H prosdokia apetyxe 4xx [Diafora sfalmata pelath/xrhsth] 500 Esvteriko sfalma diakomisth 501 To eidos aithshs den yposthrizetai 502 Sfalma se prohgoymeno (upstream) diakomisth 503 H yphresia prosvrina den einai diauesimh 504 Lhjh xronikoy orioy pylhs 505 H ekdosh HTTP den yposthrizetai 506 H anadromologhsh apetyxe 5xx [Diafora sfalmata diakomisth] xxx [Agnvsto] analog-6.0/lang/hr.lng0000644000175000017500000003245610161303540014775 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## This Croatian translation was made by Tomo Sombolac . ## This is a preliminary version which still contains a few English phrases: ## suggestions for improvement welcome. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. Ned Pon Uto Sri et Pet Sub Sij Vel Ou Tra Svi Lip Srp Kol Ruj Lis Stu Pro ## Next some standard common words. ## Abbreviation for "week beginning" Po.tjed. ++year++ ## Quarter of a year ++quarter++ mjes. dan dani st minuta minute sekunda sekunde byte bytes ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ zahtjev zahtjevi dat. ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dan sat ++time++ prvi dan prvi sat poslj.dan poslj.sat dat. dat. dom. dom. prividni dom. prividni dom. mapa mape domena domene organizacija organizacije extension extensions URL URLi pregl. pregl. OS OSi ## (= operating system, operating systems) vel. traeni pojam traeni pojam site site kor. kor. stanje stanje Web Server statistika za ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Openiti saet. ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Mjeseno izvj. Najzaposleniji Tjedno izvj. Najzaposl.: po. tjedna Dnevno izvj. Dnevno izvj. Najzaposl.: Satno izvj. Satni saetak ++Hour of the Week Summary++ Najzaposl.: 15-minutno izvj. ++Quarter-Hour Summary++ Najzaposlenije: Pet-minutno izvj. ++Five-Minute Summary++ Najzaposlenijie: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Izvjee o domacinu domacin domacini n ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Izvjee o direktoriju direktorij direktoriji n Izvjee o vrsti datoteka ekstenzija ekstenzije n Izvjee o zahtjevu datoteka datoteke n Izvjee o preusmjeravanju datoteka datoteke n Izvjee o neuspjehu datoteka datoteke n Izvjee o Referreru referring URL referring URLs n Izvjee o Referring Site referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Izvjee o upitu za traenje upit upiti n Izvjee o rijei za traenje trazena rijec trazene rijeci n ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Izvjee o prividnom domainu virtual host virtual hosts n ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Izvjee o korisniku korisnik korisnici n ++User Redirection Report++ ++user++ ++users++ ++n++ Izvjee o neuspjehu korisnika korisnik korisnici n Saetak o preglednicima preglednik preglednici n Izvjee o preglednicima preglednik preglednici n Izvjee o operacijskim sustavima operacijski sustav operacijski sustavi n Izvjee o domenama domena domene n Izvjee o organizacijama organizacija organizacije n Izvjee o ifri stanja ifra stanja ifre stanja n Izvjee o vremenu obrade Izvjee o veliini datoteke ## Used at the bottom of the report Ovu analizu je napravio Vrijeme obvrade Manje od 1 ## Used in the time reports Svaka jedinica predstavlja or part thereof zahtjev za stranicom zahtjevi za stranicama ## Used at the bottom of each non-time report: need m, f & n genders * * nije ispisano ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report Program zapoeo u Analizirani zahtjevi od do ## Used in the General Summary Uspjenih zahtjeva Prosjeno uspjenih zahtjeva na dan Uspjenih zahtjeva za stranicama Uspjenih zahtjeva za stranicama na dan Linije u log-datoteci bez ifre stanja Neuspjelih zahtjeva preusmjerenih zahtjeva Zahtjeva s informativnom ifrom stanja Distinct files requested Distinct hosts served Oteenih linija u log-datoteci Neeljene stavke u log-datotekci Podataka prebaeno Prosjeno podataka prebaeno na dan Brojke u zagradama odnose se na 7 dana do posljednjih 7 dana Idi na Vrh ## Some special phrases for particular reports. [nerijeene brojane adrese] [domena nije zadana] [nepoznata domena] [korijenski direktorij] [nema direktorija] [nema ekstenzije] [direktoriji] Nepoznati Windowsi Ostali Unix ++Robots++ OS nepoznat ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) zaht ++7-day reqs++ %zaht ++%7-day reqs++ str. ++7-day pages++ %str. ++%7-day pages++ byteova ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %byteova ++%7-day bytes++ br. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Ispisujem prvih %s * * Ispisujem prvih %d %s * * Ispisujem %s ## "by" in the phrase "listing the top 3 files BY number of requests" prema ## All requests WITH AT LEAST 10 requests s najmanje ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ preusmjerenih zahtjeva preusmjerenih zahtjeva ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ nauspjelih zahtjeva nauspjelih zahtjeva ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % prometa ++% of the traffic in the last 7 days++ % navee koliine prometa ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ byteova prometa ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ zatraeno od s preusmjerenim zahtjevom od s neuspjelim zahtjevom od ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortirano prema ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting koliini prometa ++the amount of traffic in the last 7 days++ % broju zahtjeva ++% of the requests in the last 7 days++ % najveoj koliini zahtjeva ++% of the maximum number of requests in the last 7 days++ broju zahtjeva ++the number of requests in the last 7 days++ % zahtjeva za stranicama ++% of the requests for pages in the last 7 days++ % najveeg broja zahtjeva za stranicama ++% of the maximum number of requests for pages in the last 7 days++ broju zahtjeva za stranicama ++the number of requests for pages in the last 7 days++ % preusmjerenih zahtjeva ++% of the redirected requests in the last 7 days++ % najveeg broja preusmjerenih zahtjeva ++% of the maximum number of redirected requests in the last 7 days++ broj preusmjerenih zahtjeva ++the number of redirected requests in the last 7 days++ % neuspjelih zahtjeva ++% of the failed requests in the last 7 days++ % najveeg broja neuspjelih zahtjeva ++% of the maximum number of failed requests in the last 7 days++ broj neuspjelih zahtjeva ++the number of failed requests in the last 7 days++ vrijeme zadnjeg zahtjeva vrijeme zadnjeg preusmjerenog zahtjeva vrijeme zadnjeg neuspjelog zahtjeva ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n * * svrstano po abecedi * * svrstano po brojevima * * nesvrstano ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m.%Y. %H:%n ## "Program started at" and "Analysed requests from" %w %D.%m.%Y. %H:%n ## In Daily Report %D.%m.%Y. ## In Daily Summary ++%w++ ## In Hourly Report %D.%m.%Y. %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %D.%m.%Y. %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %D.%m.%Y. ## In Monthly Report %m/%Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %D.%m.%Y. ## The date & time (D) column in non-time reports %D.%m.%Y. %H:%n ## In non-time reports: "including all files with requests since [date]" %D.%m.%Y. u %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/hu.cfg0000644000175000017500000000324710161303540014753 0ustar sret1sret100000000000000LANGUAGE HUNGARIAN TYPEOUTPUTALIAS .html ".html [Hypertext dokumentum]" TYPEOUTPUTALIAS .htm ".htm [Hypertext dokumentum]" TYPEOUTPUTALIAS .ps ".ps [PostScript]" TYPEOUTPUTALIAS .gz ".gz [Gzip tmrtett file]" TYPEOUTPUTALIAS .html.gz ".html.gz [Gzippelt HTML]" TYPEOUTPUTALIAS .ps.gz ".ps.gz [Gzippelt PostScript]" TYPEOUTPUTALIAS .xbm ".xbm [X11 bittrkp]" TYPEOUTPUTALIAS .tar.gz ".tar.gz [Tmrtett archvum]" TYPEOUTPUTALIAS .jpg ".jpg [JPEG kp]" TYPEOUTPUTALIAS .jpeg ".jpeg [JPEG kp]" TYPEOUTPUTALIAS .gif ".gif [GIF kp]" TYPEOUTPUTALIAS .xbm ".xbm [X bittrkp]" TYPEOUTPUTALIAS .txt ".txt [ASCII szveg]" TYPEOUTPUTALIAS .class ".class [Java osztly]" TYPEOUTPUTALIAS .pdf ".pdf [Adobe Portable Document Format]" TYPEOUTPUTALIAS .zip ".zip [Zip archvum]" TYPEOUTPUTALIAS .hqx ".hqx [Macintosh archvum]" TYPEOUTPUTALIAS .exe ".exe [Program]" TYPEOUTPUTALIAS .wav ".wav [WAV hang]" TYPEOUTPUTALIAS .png ".png [PNG grafika]" TYPEOUTPUTALIAS .avi ".avi [AVI film]" TYPEOUTPUTALIAS .arc ".arc [Tmrtett archvum]" TYPEOUTPUTALIAS .mid ".mid [MIDI zene]" TYPEOUTPUTALIAS .doc ".doc [Microsoft Word dokumentum]" TYPEOUTPUTALIAS .xls ".xls [Microsoft Excel dokumentum]" TYPEOUTPUTALIAS .ppt ".ppt [Microsoft PowerPoint dokumentum]" TYPEOUTPUTALIAS .rtf ".rtf [Rich Text]" TYPEOUTPUTALIAS .mov ".mov [Quick Time film]" TYPEOUTPUTALIAS .mpg ".mpg [MPEG film]" TYPEOUTPUTALIAS .mpeg ".mpeg [MPEG film]" TYPEOUTPUTALIAS .mp2 ".mp2 [MP2 audifjl]" TYPEOUTPUTALIAS .mp3 ".mp3 [MP3 audifjl]" TYPEOUTPUTALIAS .m3u ".m3u [WinAmp lejtszsi lista]" analog-6.0/lang/hu.lng0000644000175000017500000003273010161303540014773 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Hungarian translation for version 3 done by Laszlo Nemeth ## ## Corrected & updated for versions 4 and 5 by Andras Kemeny ## ## This language file hasn't been tested thoroughly, corrections are welcome! ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. vas ht kedd sze cst pn szo jan feb mrc pr mj jn jl aug szept okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" ht eleje v ## Quarter of a year negyedv hnap nap nap . perc perc msodperc msodperc byte byte ## ?bytes represents kbytes, Mbytes etc. ?byte krelem krelem dtum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dtum id id els dtum els alkalom utols dtum utols alkalom fjl fjl host host virtulis host virtulis host knyvtr knyvtr domain domain szervezet szervezet kiterjeszts kiterjeszts URL URL bngsz bngsz op.rsz. op.rsz. ## (= operating system, operating systems) mret keresett kulcssz keresett kulcssz site site felhasznl felhasznl sttuszkd sttuszkd Web Szerver Statisztika: ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ltalnos sszests ## The time reports, plus "busiest" strings (at the bottom of each report) ves Jelents Legaktvabb v: Negyedves Jelents Legaktvabb negyedv: Havi jelents Legforgalmasabb hnap: Heti jelents Legforgalmasabb ht: ht eleje Napi sszests Napi jelents Legforgalmasabb nap: rnknti jelents rnknti sszests A ht ri szerinti sszests Legforgalmasabb ra: Negyedrnknti jelents Negyedrnknti sszests Legforgalmasabb negyedra: tpercenknti jelents tpercenknti sszests Legforgalmasabb t perc: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host szerinti jelents host host n Host tirnyts szerinti jelents host host n Host hibk szerinti jelents host host n Knyvtr szerinti jelents knyvtar knyvtar n Fjltpus szerinti jelents kiterjeszts kiterjeszts n Krelem szerinti jelents fjl fjl n tirnytsok jelentse fjl fjl n Hibs lekrsek jelentse fjl fjl n Hivatkozs szerinti jelents hivatkoz URL hivatkoz URL n Hivatkoz site-ok jelentse hivatkoz site hivatkoz site n tirnytott hivatkozsok szerinti jelents hivatkoz URL hivatkoz URL n Hibs hivatkozsok jelentse hivatkoz URL hivatkoz URL n Keresett kifejezsek szerinti jelents keresett kifejezs keresett kifejezs n Keresett kulcsszavak szerinti jelents kulcssz kulcssz n Bels keressi krelmek szerinti jelents krelem krelem n Bels keressi kulcsszavak szerinti jelents kulcssz kulcssz n Virtulis host szerinti jelents virtulis host virtulis host n Virtulis host tirnytsok szerinti jelents virtulis host virtulis host n Virtulis host hibk szerinti jelents virtulis host virtulis host n Felhasznl szerinti jelents felhasznl felhasznl n Felhasznli tirnytsok szerinti jelents felhasznl felhasznl n Felhasznl szerinti hiba jelentse felhasznl felhasznl n Bngszk szerinti sszests bngsz bngsz n Bngszk szerinti jelents bngsz bngsz n A bngsz opercis rendszere szerinti jelents op.rsz. op.rsz. n Domain szerinti jelents domain domain n Szervezet szerinti jelents szervezet szervezet n Sttuszkdok szerinti jelents sttuszkd sttuszkd n Feldolgozsi id szerinti jelents File mret szerinti jelents ## Used at the bottom of the report Az elemzst ksztette: Futsi id Kevesebb mint 1 ## Used in the time reports Minden egysg vagy egy rszt jelkpezi oldal krelmet oldal krelmeit ## Used at the bottom of each non-time report: need m, f & n genders * * nincs felsorolva ## Used on the pie charts: again need m, f & n genders * * egyb ## Used at the top of the report Futs kezdete Krelmek analizlva: - ## Used in the General Summary sszes sikeres krelem tlagos sikeres napi krelem sszes sikeres oldal krelem tlagos sikeres napi oldal krelem Naplsorok sttuszkd nlkl Sikertelen krelem tirnytott krelem Krelem informcios sttuszkddal Klnbz krt fjlok Klnbz kiszolglt host-ok Hibs sorok a naplfjlban Nemkvant naplfjl bejegyzsek tvitt adat tlagos napi adattvitel A zrjeles szmok utalnak: 7 nap utols 7 nap Ugrs Oldal teteje ## Some special phrases for particular reports. [feloldatlan IP-cmek] [domain nincs megadva] [ismeretlen domain] [fknyvtr] [nincs knyvtr] [nincs kiterjeszts] [knyvtrak] ismeretlen verzij Windows egyb Unix varins keresrobotok ismeretlen opercis rendszer ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) kr. 7napos kr. %kr 7napos kr. oldal 7napos oldalak %oldal 7napos oldalak byte ?byte 7napos byte 7napos ?byte %byte 7napos byte srsz. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Az els %s listzsa * * Az els %d %s listzsa * * %s listzsa ## "by" in the phrase "listing the top 3 files BY number of requests" a kvetkez szerint: ## All requests WITH AT LEAST 10 requests legalbb ## Different ways of doing floors krelem az elmlt 7 nap sorn krelem az elmlt 7 nap sorn krelem egy lapra az elmlt 7 nap sorn krelem lapokra az elmlt 7 nap sorn tirnytott krelem tirnytott krelem tirnytott krelem az elmlt 7 nap sorn tirnytott krelem az elmlt 7 nap sorn hibs krelem hibs krelem hibs krelem az elmlt 7 nap sorn hibs krelem az elmlt 7 nap sorn % forgalommal % forgalommal az elmlt 7 nap sorn a maximlis forgalom %-a a maximlis forgalom %-a az elmlt 7 nap sorn byte-nyi forgalom byte-nyi forgalom ?byte-nyi forgalom byte-nyi forgalom az elmlt 7 nap sorn byte-nyi forgalom az elmlt 7 nap sorn ?byte-nyi forgalom az elmlt 7 nap sorn krelmezve tirnytott krelemmel hibs krelemmel az els krssel ez id ta: az els tirnytott krssel ez id ta: az els hibs krssel ez id ta: ## Now "sorted by": again, in m, f & n (only needed in plural though) * * rendezve: ## Used at the top of each report E jelents adatainak forrsa: ## Used in pie charts A krcikkek felbontsnak alapja: ## different ways of sorting forgalom a forgalom mrtke az elmlt 7 nap sorn krelmek %-a a krelmek %-a az elmlt 7 nap sorn maximlis krelemszm %-a a maximlis krelemszm %-a az elmlt 7 nap sorn krelmek szma a krelmek szma az elmlt 7 nap sorn oldalkrelmek %-a az oldalkrelmek %-a az elmlt 7 nap sorn maximlis oldalkrelem-szm %-a a maximlis oldalkrelem-szm %-a az elmlt 7 nap sorn oldalkrelem-szm az oldalkrelmek szma az elmlt 7 nap sorn tirnytott krelmek %-a az tirnytott krelmek %-a az elmlt 7 nap sorn tirnytott krelmek maximlis szmnak %-a az tirnytott krelmek maximlis szmnak %-a az elmlt 7 nap sorn tirnytott krelmek szma az tirnytott krelmek szma az elmlt 7 nap sorn hibs krelmek %-a a hibs krelmek %-a az elmlt 7 nap sorn hibs krelmek maximalis szmnak %-a a hibs krelmek maximalis szmnak %-a az elmlt 7 nap sorn hibs krelmek szma a hibs krelmek szma az elmlt 7 nap sorn az utols krelem ideje az utols tirnytott krelem ideje az utols hibs krelem ideje az els krelem ideje az els tirnytott krelem ideje az els hibs krelem ideje ## 3 other ways of sorting in m, f, & n * * betrend szerint rendezve * * szmsorrend szerint rendezve * * rendezetlen ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. de. du. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y. %m. %D. %H:%n ## "Program started at" and "Analysed requests from" %w, %Y. %m. %D. %H:%n ## In Daily Report %y.%m.%d ## In Daily Summary %w ## In Hourly Report %y.%m.%d %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %y.%m.%d %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %y.%m.%d ## In Monthly Report %Y. %m. ## In Quarterly Report %Y %m%x%l ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %y.%m.%d ## The date & time (D) column in non-time reports %y.%m.%d %H:%n ## In non-time reports: "including all files with requests since [date]" %y.%m.%d %H:%n ta ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Folytassa a krelmet 101 Protokollvlts 1xx [egyb informatv jelleg] 200 Rendben (OK) 201 Ltrehozva 202 Tovbbfeldolgozsra felvve 203 Nemhivatalos informci 204 Rendben, de nincs mit kldeni 205 Dokumentum alaphelyzetbe lltva 206 Rszleges tartalom 2xx [egyb sikeres jelleg] 300 Tbb dokumentum is lekrhet 301 A dokumentum vgrvnyesen ms helyre kerlt 302 A dokumentum mshol tallhat 303 Lsd msik dokumentum 304 Utols letlts ta nem vltozott 305 Hasznljon proxy-t 306 Vltson proxy-t 307 A dokumentum tmenetileg ms helyre kerlt 3xx [egyb tirnyts jelleg] 400 Hibs krelem 401 Azonosts szksges 402 Csak fizets ellenben 403 Hozzfrs megtiltva 404 A dokumentum nem tallhat 405 Nem engedlyezett mdszer 406 A dokumentumot a kliens nem tudja fogadni 407 Proxy azonosts szksges 408 Megadott idhatron tli krelem 409 A krelem tkzik az erforrs llapotval 410 A dokumentum vgrvnyesen eltnt 411 Ktelez hosszmegads 412 Teljesthetetlen elfelttel 413 Tl hossz krelem 414 A krelmezett fjlnv tl hossz 415 Nem tmogatott mdium 416 rvnytelen krelmezsi tartomny 417 Hibs elvrs 4xx [egyb kliens/szerver hiba] 500 Szerveren belli hiba 501 Nem tmogatott krelemtpus 502 Hiba az upstream szerverben 503 A szolgltats tmenetileg sznetel 504 tjr idtllps 505 Nem tmogatott HTTP verzi 506 Hibs tirnyts 5xx [egyb szerveroldali hiba] xxx [ismeretlen sttuszkd] analog-6.0/lang/hudom.tab0000644000175000017500000001170410161303540015457 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Egyeslt Arab Emirtus af 1 Afganisztn ag 2 Antigua s Barbados ai 1 Anguilla al 1 Albnia am 2 rmnyorszg an 1 Holland Antillk ao 1 Angola aq 1 Antarktisz ar 3 Argentna arpa 1 Arpanet as 1 Amerikai Szamoa at 3 Ausztria au 3 Ausztrlia aw 1 Aruba az 1 Azerbajdzsn ba 3 Bosznia-Hercegovina bb 2 Barbados bd 1 Banglades be 3 Belgium bf 1 Burkina Faso bg 2 Bulgria bh 1 Bahrein bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolvia br 3 Brazlia bs 1 Bahamk bt 1 Bhutn bv 1 Bouvet-sziget bw 1 Botswana by 1 Belorusszia bz 1 Belize ca 3 Kanada cc 1 Cocos (Keeling) Szigetek cd 1 Kong Demokratikus Kztrsasg cf 1 Kzpafrikai Kztrsasg cg 1 Kong ch 2 Svjc ci 1 Elefntcsontpart ck 1 Cook-szigetek cl 2 Chile cm 1 Kamerun cn 3 Kna co 3 Kolumbia com 2 Kereskedelmi domain cr 3 Costa Rica cu 2 Kuba cv 1 Cape Verde cx 2 Karcsony-sziget cy 3 Ciprus cz 2 Csehorszg de 2 Nmetorszg dj 1 Djibouti dk 2 Dnia dm 2 Dominika do 3 Dominikai Kztrsasg dz 1 Algria ec 3 Ecuador edu 2 USA oktatsi domain ee 2 sztorszg eg 3 Egyiptom eh 1 Nyugat-Szahara er 1 Eritrea es 2 Spanyolorszg et 1 Etipia fi 2 Finnorszg fj 3 Fidzsi fk 1 Falkland-szigetek fm 1 Mikronzia fo 1 Faroe-szigetek fr 2 Franciaorszg fx 1 Franciaorszg (eurpai terletek) ga 1 Gabon gb 1 Egyeslt Kirlysg gd 1 Grenada ge 1 Georgia gf 1 Francia Guyana gg 1 Guernsey gh 3 Ghna gi 1 Gibraltr gl 1 Grnland gm 1 Gambia gn 1 Guinea gov 2 USA kormnyzati domain gp 1 Guadeloupe (Franciaorszg) gq 1 Egyenlti Guinea gr 2 Grgorszg gs 1 D.-Georgia \& D-Szendvics-szigetek gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heard s McDonald szigetek hn 2 Honduras hr 2 Horvtorszg ht 1 Haiti hu 2 Magyarorszg id 3 Indonzia ie 2 rorszg il 3 Izrael im 1 Man-sziget in 3 India int 1 Nemzetkzi io 1 Brit Indiai ceniai Terlet iq 1 Irak ir 1 Irn is 2 Izland it 2 Olaszorszg je 1 Jersey jm 3 Jamaica jo 3 Jordnia jp 3 Japn ke 3 Kenya kg 1 Kirgizisztn kh 1 Kambodzsa ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts \& Nevis kp 1 szak-Korea kr 3 Dl-Korea kw 3 Kuvait ky 1 Kajmn-szigetek kz 1 Kazahsztn la 1 Laosz lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sr Lanka lr 1 Libria ls 1 Lesotho lt 2 Litvnia lu 2 Luxemburg lv 2 Lettorszg ly 1 Lbia ma 1 Marokk mc 2 Monaco md 1 Moldvia mg 1 Madagaszkr mh 1 Marshall-szigetek mil 2 USA Katonai domain mk 3 Macednia ml 1 Mali mm 1 Myanmar mn 1 Monglia mo 1 Maka mp 1 szak-Mariana Szigetek mq 1 Martinique (Franciaorszg) mr 1 Mauritnia ms 1 Montserrat mt 3 Mlta mu 1 Mauritius mv 1 Maldv-szigetek mw 1 Malawi mx 3 Mexik my 3 Malaysia (Maljfld) mz 1 Mozambique na 1 Nambia nc 1 j-Kalednia (Franciaorszg) ne 1 Nigria net 2 Hlzat nf 1 Norfolk-szigetek ng 1 Nigria ni 3 Nicaragua nl 2 Hollandia no 2 Norvgia np 1 Nepl nr 1 Nauru nu 2 Niue nz 3 j-Zland om 1 Omn org 2 Nonprofit szervezet pa 3 Panama pe 3 Peru pf 1 Polinzia (Franciaorszg) pg 3 Ppua j-Guinea ph 3 Philippinek pk 3 Pakisztn pl 3 Lengyelorszg pm 1 Saint Pierre s Miquelon pn 1 Pitcairn-sziget pr 1 Puerto Rico pt 2 Portuglia pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion (Franciaorszg) ro 2 Romnia ru 2 Oroszorszg rw 1 Ruanda sa 3 Szaud-Arbia sb 1 Salamon-szigetek sc 1 Seychelles sd 1 Szudn se 2 Svdorszg sg 3 Szingapr sh 1 Szent Helna si 2 Szlovnia sj 1 Svalbard s Jan Mayen Szigetek sk 2 Szlovkia sl 1 Sierra Leone sm 1 San Marino sn 1 Szenegl so 1 Szomlia sr 1 Suriname st 1 Saint Tome s Principe su 2 volt Szovjetni sv 3 El Salvador sy 1 Szria sz 1 Szvzifld tc 1 Turks s Caicos Szigetek td 1 Csd tf 1 Francia Dli Terletek tg 1 Togo th 3 Thaifld tj 1 Tadzsikisztn tk 1 Tokelau tl 1 Kelet-Timor tm 1 Trkmenisztn tn 1 Tunzia to 1 Tonga tp 1 Kelet-Timor tr 3 Trkorszg tt 3 Trinidad s Tobago tv 1 Tuvalu tw 3 Tajvan tz 1 Tanznia ua 3 Ukrajna ug 3 Uganda uk 3 Anglia um 1 USA kisebb kintfekv szigetek us 4 Egyeslt llamok uy 3 Uruguay uz 1 zbegisztn va 1 Vatikn vc 1 Saint Vincent \& Grenadines ve 3 Venezuela vg 1 Virgin-szigetek (Anglia) vi 1 Virgin-szigetek (USA) vn 1 Vietnm vu 1 Vanuatu wf 1 Wallis s Futuna Szigetek ws 1 Szamoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoszlvia za 3 Dl-Afrika zm 1 Zambia zr 1 Kongi Demokratikus Kztrsasg zw 3 Zimbabwe analog-6.0/lang/id.lng0000644000175000017500000003172410161303540014755 0ustar sret1sret100000000000000## Translated to Indonesian by Haris Hasanudin 2002-11-07 ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Minggu Senin Selasa Rabu Kamis Jumat Sabtu Jan Feb Mar Apr Mei Jun Jul Aug Sep Okt Nov Des ## Next some standard common words. ## Abbreviation for "week beginning" awal minggu tahun ## Quarter of a year kwartal bulan hari hari jam menit minutes detik detik byte bytes ## ?bytes represents kbytes, Mbytes etc. ?byte request requests tanggal ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 tanggal waktu waktu tanggal awal waktu awal tanggal akhir waktu akhir file files host hosts virtual host virtual hosts direktori direktori-direktori domain domains organisasi organisasi-organisasi ekstensi ekstensi-ekstensi URL URLs browser browsers OS OS's ## (= operating system, operating systems) ukuran search term search terms site sites user users status code status codes Statistik Web Server untuk ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Rangkuman Umum ## The time reports, plus "busiest" strings (at the bottom of each report) Laporan Tahunan Tahun tersibuk: Laporan Kwartal Kwartal tersibuk: Laporan Bulanan Bulan Tersibuk: Laporan Mingguan Minggu Tersibuk: minggu awal Rangkuman Harian Laporan Harian Hari Tersibuk: Laporan per Jam Rangkuman per Jam Rangkuman per Jam dalam Seminggu Jam Tersibuk: Laporan per Seperempat Jam Rangkuman per Seperempat Jam Tersibuk per Seperempat Jam: Laporan per Lima Menit Rangkuman per Lima Menit Tersibuk per Lima Menit: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Laporan Host host hosts n Laporan Host Redirection host hosts n Laporan Host Failure host hosts n Laporan Direktori directory directories n Laporan File Type extension extensions n Laporan Request file files n Laporan Redirection file files n Laporan Failure file files n Laporan Referrer referring URL referring URLs n Laporan Referring Site referring site referring sites n Laporan Redirected Referrer referring URL referring URLs n Laporan Failed Referrer referring URL referring URLs n Laporan Search Query query queries n Laporan Search Word query word query words n Laporan Internal Search Query query queries n Laporan Internal Search Word query word query words n Laporan Virtual Host virtual host virtual hosts n Laporan Virtual Host Redirection virtual host virtual hosts n Laporan Virtual Host Failure virtual host virtual hosts n Laporan User user users n Laporan User Redirection user users n Laporan User Failure user users n Rangkuman Browser browser browsers n Laporan Browser browser browsers n Laporan Operating System operating system operating systems n Laporan Domain domain domains n Laporan Organisasi organisasi organizations n Laporan Status Code status code status codes n Laporan Waktu Processing Laporan Ukuran File ## Used at the bottom of the report Analisis ini dibuat dengan Waktu Running Kurang dari 1 ## Used in the time reports Dalam unit menunjukkan atau bagian darinya request untuk satu page requests untuk beberapa pages ## Used at the bottom of each non-time report: need m, f & n genders * * tidak ada di list ## Used on the pie charts: again need m, f & n genders * * Lainnya ## Used at the top of the report Program mulai pada Analisa dilakukan dari sampai ## Used in the General Summary Requests yang sukses Rata-rata requests yang sukses per hari Requests yang sukses untuk pages Rata-rata requests yang sukses untuk pages per hari Logfile lines tanpa status code Requests gagal Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data yang ditransfer Rata-rata data yang ditransfer per hari Gambar dalam parentheses menunjukkan 7-hari period ending 7 hari terakhir Go To Top ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS tidak diketahui ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" dengan menggunakan ## All requests WITH AT LEAST 10 requests dengan sedikitnya ## Different ways of doing floors request dalam 7 hari terakhir requests dalam 7 hari terakhir request for a page dalam 7 hari terakhir requests for pages dalam 7 hari terakhir redirected request redirected requests redirected request dalam 7 hari terakhir redirected requests dalam 7 hari terakhir failed request failed requests failed request dalam 7 hari terakhir failed requests dalam 7 hari terakhir % dari traffic % dari traffic dalam 7 hari terakhir % dari maximum amount of traffic % dari maximum amount of traffic dalam 7 hari terakhir byte dari traffic bytes dari traffic ## ?bytes represents kbytes, Mbytes etc. ?bytes dari traffic byte dari traffic dalam 7 hari terakhir bytes dari traffic dalam 7 hari terakhir ?bytes dari traffic dalam 7 hari terakhir with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * diurut berdasarkan ## Used at the top of each report Laporan ini mengandung data dari ## Used in pie charts The wedges diplot dengan ## different ways of sorting jumlah traffic jumlah traffic dalam 7 hari terakhir % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days jumlah requests jumlah requests dalam 7 hari terakhir % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days jumlah requests for pages jumlah requests for pages dalam 7 hari terakhir % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests dalam 7 hari terakhir jumlah redirected requests jumlah redirected requests dalam 7 hari terakhir % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days jumlah failed requests jumlah failed requests dalam 7 hari terakhir waktu last request waktu last redirected request waktu last failed request waktu first request waktu first redirected request waktu first failed request ## 3 other ways of sorting in m, f, & n * * diurut berdasar abjad * * diurut berdasar nomor * * tidak diurut ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. AM PM ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y at %j:%n %a ## "Program started at" and "Analysed requests from" %w, %m %D %Y at %j:%n %a ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %j:%n %a%x%k:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n %a%x%k:%o %b ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %m/%d/%y ## The date & time (D) column in non-time reports %m/%d/%y %j:%n %a ## In non-time reports: "listing files with requests since [date]" %m/%d/%y at %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Berlanjut dengan request 101 Protokol Switching 1xx [Lain-lain : yang bersifat informasi] 200 OK 201 Tercipta 202 Diterima untuk proses selanjutnya 203 Bukan informasi yang terpercaya 204 OK, tapi tak ada yang dikirim 205 Reset dokumen 206 Bagian content 2xx [Lain-lain : successes] 300 Multiple dokumen tersedia 301 Dokumen pindah tetap 302 Dokumen ditemukan di lain tempat 303 Lihat dokumen lain 304 Tidak dirubah sejak last retrieval 305 Menggunakan proxy 306 Switch proxy 307 Dokumen pindah sementara 3xx [Lain-lain : redirections] 400 Bad request 401 Perlu keabsahan 402 Perlu pembayaran 403 Dilarang Access 404 Dokumen tidak ditemukan 405 Method tidak diizinkan 406 Dokumen tak bisa diterima client 407 Perlu Keabsahan Proxy 408 Request timeout 409 Request conflicts with state of resource 410 Dokumen hilang tetap 411 Perlu Panjang yang sesuai 412 Precondition failed 413 Request terlalu panjang 414 Requested filename too long 415 Media type tidak tersupport 416 Requested range not valid 417 Expectation failed 4xx [Lain-lain : client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 Versi HTTP tidak tersupport 506 Redirection failed 5xx [Lain-lain : server errors] xxx [Tidak dikenal] analog-6.0/lang/ida.lng0000644000175000017500000003172210161303540015114 0ustar sret1sret100000000000000## Translated to Indonesian by Haris Hasanudin 2002-11-07 ## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Minggu Senin Selasa Rabu Kamis Jumat Sabtu Jan Feb Mar Apr Mei Jun Jul Aug Sep Okt Nov Des ## Next some standard common words. ## Abbreviation for "week beginning" awal minggu tahun ## Quarter of a year kwartal bulan hari hari jam menit minutes detik detik byte bytes ## ?bytes represents kbytes, Mbytes etc. ?byte request requests tanggal ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 tanggal waktu waktu tanggal awal waktu awal tanggal akhir waktu akhir file files host hosts virtual host virtual hosts direktori direktori-direktori domain domains organisasi organisasi-organisasi ekstensi ekstensi-ekstensi URL URLs browser browsers OS OS's ## (= operating system, operating systems) ukuran search term search terms site sites user users status code status codes Statistik Web Server untuk ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Rangkuman Umum ## The time reports, plus "busiest" strings (at the bottom of each report) Laporan Tahunan Tahun tersibuk: Laporan Kwartal Kwartal tersibuk: Laporan Bulanan Bulan Tersibuk: Laporan Mingguan Minggu Tersibuk: minggu awal Rangkuman Harian Laporan Harian Hari Tersibuk: Laporan per Jam Rangkuman per Jam Rangkuman per Jam dalam Seminggu Jam Tersibuk: Laporan per Seperempat Jam Rangkuman per Seperempat Jam Tersibuk per Seperempat Jam: Laporan per Lima Menit Rangkuman per Lima Menit Tersibuk per Lima Menit: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Laporan Host host hosts n Laporan Host Redirection host hosts n Laporan Host Failure host hosts n Laporan Direktori directory directories n Laporan File Type extension extensions n Laporan Request file files n Laporan Redirection file files n Laporan Failure file files n Laporan Referrer referring URL referring URLs n Laporan Referring Site referring site referring sites n Laporan Redirected Referrer referring URL referring URLs n Laporan Failed Referrer referring URL referring URLs n Laporan Search Query query queries n Laporan Search Word query word query words n Laporan Internal Search Query query queries n Laporan Internal Search Word query word query words n Laporan Virtual Host virtual host virtual hosts n Laporan Virtual Host Redirection virtual host virtual hosts n Laporan Virtual Host Failure virtual host virtual hosts n Laporan User user users n Laporan User Redirection user users n Laporan User Failure user users n Rangkuman Browser browser browsers n Laporan Browser browser browsers n Laporan Operating System operating system operating systems n Laporan Domain domain domains n Laporan Organisasi organisasi organizations n Laporan Status Code status code status codes n Laporan Waktu Processing Laporan Ukuran File ## Used at the bottom of the report Analisis ini dibuat dengan Waktu Running Kurang dari 1 ## Used in the time reports Dalam unit menunjukkan atau bagian darinya request untuk satu page requests untuk beberapa pages ## Used at the bottom of each non-time report: need m, f & n genders * * tidak ada di list ## Used on the pie charts: again need m, f & n genders * * Lainnya ## Used at the top of the report Program mulai pada Analisa dilakukan dari sampai ## Used in the General Summary Requests yang sukses Rata-rata requests yang sukses per hari Requests yang sukses untuk pages Rata-rata requests yang sukses untuk pages per hari Logfile lines tanpa status code Requests gagal Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data yang ditransfer Rata-rata data yang ditransfer per hari Gambar dalam parentheses menunjukkan 7-hari period ending 7 hari terakhir Go To Top ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS tidak diketahui ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" dengan menggunakan ## All requests WITH AT LEAST 10 requests dengan sedikitnya ## Different ways of doing floors request dalam 7 hari terakhir requests dalam 7 hari terakhir request for a page dalam 7 hari terakhir requests for pages dalam 7 hari terakhir redirected request redirected requests redirected request dalam 7 hari terakhir redirected requests dalam 7 hari terakhir failed request failed requests failed request dalam 7 hari terakhir failed requests dalam 7 hari terakhir % dari traffic % dari traffic dalam 7 hari terakhir % dari maximum amount of traffic % dari maximum amount of traffic dalam 7 hari terakhir byte dari traffic bytes dari traffic ## ?bytes represents kbytes, Mbytes etc. ?bytes dari traffic byte dari traffic dalam 7 hari terakhir bytes dari traffic dalam 7 hari terakhir ?bytes dari traffic dalam 7 hari terakhir with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * diurut berdasarkan ## Used at the top of each report Laporan ini mengandung data dari ## Used in pie charts The wedges diplot dengan ## different ways of sorting jumlah traffic jumlah traffic dalam 7 hari terakhir % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days jumlah requests jumlah requests dalam 7 hari terakhir % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days jumlah requests for pages jumlah requests for pages dalam 7 hari terakhir % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests dalam 7 hari terakhir jumlah redirected requests jumlah redirected requests dalam 7 hari terakhir % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days jumlah failed requests jumlah failed requests dalam 7 hari terakhir waktu last request waktu last redirected request waktu last failed request waktu first request waktu first redirected request waktu first failed request ## 3 other ways of sorting in m, f, & n * * diurut berdasar abjad * * diurut berdasar nomor * * tidak diurut ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. AM PM ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y at %j:%n %a ## "Program started at" and "Analysed requests from" %w, %m %D %Y at %j:%n %a ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %j:%n %a%x%k:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n %a%x%k:%o %b ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %m/%d/%y ## The date & time (D) column in non-time reports %m/%d/%y %j:%n %a ## In non-time reports: "listing files with requests since [date]" %m/%d/%y at %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Berlanjut dengan request 101 Protokol Switching 1xx [Lain-lain : yang bersifat informasi] 200 OK 201 Tercipta 202 Diterima untuk proses selanjutnya 203 Bukan informasi yang terpercaya 204 OK, tapi tak ada yang dikirim 205 Reset dokumen 206 Bagian content 2xx [Lain-lain : successes] 300 Multiple dokumen tersedia 301 Dokumen pindah tetap 302 Dokumen ditemukan di lain tempat 303 Lihat dokumen lain 304 Tidak dirubah sejak last retrieval 305 Menggunakan proxy 306 Switch proxy 307 Dokumen pindah sementara 3xx [Lain-lain : redirections] 400 Bad request 401 Perlu keabsahan 402 Perlu pembayaran 403 Dilarang Access 404 Dokumen tidak ditemukan 405 Method tidak diizinkan 406 Dokumen tak bisa diterima client 407 Perlu Keabsahan Proxy 408 Request timeout 409 Request conflicts with state of resource 410 Dokumen hilang tetap 411 Perlu Panjang yang sesuai 412 Precondition failed 413 Request terlalu panjang 414 Requested filename too long 415 Media type tidak tersupport 416 Requested range not valid 417 Expectation failed 4xx [Lain-lain : client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 Versi HTTP tidak tersupport 506 Redirection failed 5xx [Lain-lain : server errors] xxx [Tidak dikenal] analog-6.0/lang/is.lng0000644000175000017500000003154610161303540014776 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Sun Mn ri Mi Fim Fs Lau Jan Feb Mar Apr Ma Jn Jl g Sep Okt Nv Des ## Next some standard common words. ## Abbreviation for "week beginning" vika byr. ++year++ ## Quarter of a year ++quarter++ mnuur dagur dagar klst. mnta mntur seknda sekndur biti bitar ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ beini beinir dags. ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dags tmi ++time++ upphafs dagsetning upphafs tmasetning s. dags s. tmi skr skrr hsill hslar sndar hsill sndar hslar skrarsafn skrarsfn ln lni fyrirtki fyrirtki vibt vibtur vefsl vefslir rpari rparar strikerfi strikerfi ## (= operating system, operating systems) str leitar skilyri leitar skilyri netsetur netsetur notandi notendur stands tkn stands tkn Vefjns Tkntlur fyrir ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Yfirlit ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Mnaarleg skrsla Virkasti mnuur: Vikuleg skrsla Virkasta vika: Vika byrjar Daglegt Yfirlit Dagleg skrsla Virkasti dagur: Klukkustundar skrsla Klukkustundar Yfirlit ++Hour of the Week Summary++ Virkasti Klukkutmi: Korters Skrsla ++Quarter-Hour Summary++ Virkasta korter: Fimm-Mntna skrsla ++Five-Minute Summary++ Virkustu Fimm mnturnar: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Hsil Skrsla hsill hslar n ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Skrarsafns Skrsla skrarsafn skrarsfn n Tegund skrar Skrsla tegund tegundir n Beina Skrsla skr skra n Beint anna Skrsla skr skra n Mistaka Skrsla skr skra n Vsunar Skrsla Vsun Vefslar Vsun Vefsla n Vsun Netseta Skrsla Vsun netseturs Vsun netseta n Beint anna-Vsunar Skrsla Vsun Vefslar Vsun Vefsla n Mistkst Vsun Skrsla Vsun Vefslar Vsun Vefsla n Leitar skrsla leit leit n Leitarora skrsla leitaror leitaror n ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Sndar Hsils Skrsla sndar hsill sndar hslar n ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Notenda Skrsla notandi notendur n ++User Redirection Report++ ++user++ ++users++ ++n++ Notanda Mistkst Skrsla notandi notendur n Rpara Yfirlit rpari rparar n Rpara Skrsla rpari rparar n Strikerfa skrsla strikerfi strikerfi n Ln Skrsla ln lni n Fyrirtkja skrsla fyrirtki fyrirtki n stands Tkna Skrsla stands tkn stands tkn n Vinnslutma skrsla Str skra Skrsla ## Used at the bottom of the report essi greining var ger af Keyrslutmi Minna en 1 ## Used in the time reports Hver eining tknar ea a hluta af beinir su beinir sur ## Used at the bottom of each non-time report: need m, f & n genders * * Ekki skr ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report Forrit fr gang Greindi beinir fr til ## Used in the General Summary rangurrkar beinir Meal rangursrkar beinir dag rangursrkar beinir sur Meal rangursrkar beinir sur dag Skrar lnur n standstkns Beinir sem mistkust Beint fram beinir Beinir me formlegum standstknum Beinir um kvenar skrr kvenum hslum jna Brenglaar skrargeymslulnur velkomnar skrargeymsluvibtur Ggn flutt Mealmagn gagna flutt dag Tlur sviga vsa 7 dagar til sustu 7 daga Fara til Efst ## Some special phrases for particular reports. [leystar ip-nmera addressur] [domain ekki gefi] [ekkt domain] [rtar skr] [engin skr] [engin framlenging] [skrr] ekkt Windows tgfa Arar Unix tgfur ++Robots++ Strikerfi ekkt ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #beinir ++7-day reqs++ %beinir ++%7-day reqs++ sur ++7-day pages++ %sur ++%7-day pages++ bitar ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %bitar ++%7-day bytes++ nmer ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Birting fyrstu %s * * Birting fyrstu %d %s * * Birting %s ## "by" in the phrase "listing the top 3 files BY number of requests" me ## All requests WITH AT LEAST 10 requests me a.m.k. ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ beint fram beini beint fram beinum ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ beini mistkst beinir mistkust ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % af virkni ++% of the traffic in the last 7 days++ % af mgulegri virkni ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ bitar af virkni ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ beinir san me framvsari beini san me lukkari beini san ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * raa af ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting magn virkni ++the amount of traffic in the last 7 days++ % af beini ++% of the requests in the last 7 days++ % af hmarksbeini ++% of the maximum number of requests in the last 7 days++ magn beina ++the number of requests in the last 7 days++ % af beinum sur ++% of the requests for pages in the last 7 days++ % af hmarks beinum sur ++% of the maximum number of requests for pages in the last 7 days++ magn beina sur ++the number of requests for pages in the last 7 days++ % af framvsuum beinum ++% of the redirected requests in the last 7 days++ % af hmarks framvsuum beinum ++% of the maximum number of redirected requests in the last 7 days++ magn framvsara beina ++the number of redirected requests in the last 7 days++ % af beinum sem mistkust ++% of the failed requests in the last 7 days++ % af hmarks beinum sem mistkust ++% of the maximum number of failed requests in the last 7 days++ magn beina sem mistkust ++the number of failed requests in the last 7 days++ tmi sustu beini tmi sustu framvsunar beini tmi sustu beini sem mistkst ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n * * raa stafrfsr * * raa nmerar * * raa ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary ++%w++ ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/isa.lng0000644000175000017500000003156310161303540015136 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Sun Man Thr Mid Fim Fos Lau Jan Feb Mar Apr Mai Jun Jul Agu Sep Okt Nov Des ## Next some standard common words. ## Abbreviation for "week beginning" vika byr. ++year++ ## Quarter of a year ++quarter++ manudur dagur dagar klst. minuta minutur sekunda sekundur biti bitar ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ beidni beidnir dags. ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dags timi ++time++ upphafs dagsetning upphafs timasetning sid. dags sid. timi skra skrar hysill hyslar syndar hysill syndar hyslar skraarsafn skraarsofn len leni fyrirtaeki fyrirtaeki vidbot vidbaetur vefslod vefslodir rapari raparar styrikerfi styrikerfi ## (= operating system, operating systems) staerd leitar skilyrdi leitar skilyrdi netsetur netsetur notandi notendur astands takn astands takn Vefthjons Takntolur fyrir ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Yfirlit ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Manadarleg skyrsla Virkasti manudur: Vikuleg skyrsla Virkasta vika: Vika byrjar Daglegt Yfirlit Dagleg skyrsla Virkasti dagur: Klukkustundar skyrsla Klukkustundar Yfirlit ++Hour of the Week Summary++ Virkasti Klukkutimi: Korters Skyrsla ++Quarter-Hour Summary++ Virkasta korter: Fimm-Minutna skyrsla ++Five-Minute Summary++ Virkustu Fimm minuturnar: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Hysil Skyrsla hysill hyslar n ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Skraarsafns Skyrsla skraarsafn skraarsofn n Tegund skraar Skyrsla tegund tegundir n Beidna Skyrsla skra skraa n Beint annad Skyrsla skra skraa n Mistaka Skyrsla skra skraa n Visunar Skyrsla Visun Vefslodar Visun Vefsloda n Visun Netseta Skyrsla Visun netseturs Visun netseta n Beint annad-Visunar Skyrsla Visun Vefslodar Visun Vefsloda n Mistokst Visun Skyrsla Visun Vefslodar Visun Vefsloda n Leitar skyrsla leit leit n Leitarorda skyrsla leitarord leitarord n ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Syndar Hysils Skyrsla syndar hysill syndar hyslar n ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Notenda Skyrsla notandi notendur n ++User Redirection Report++ ++user++ ++users++ ++n++ Notanda Mistokst Skyrsla notandi notendur n Rapara Yfirlit rapari raparar n Rapara Skyrsla rapari raparar n Styrikerfa skyrsla styrikerfi styrikerfi n Len Skyrsla len leni n Fyrirtaekja skyrsla fyrirtaeki fyrirtaeki n Astands Takna Skyrsla astands takn astands takn n Vinnslutima skyrsla Staerd skraa Skyrsla ## Used at the bottom of the report Thessi greining var gerd af Keyrslutimi Minna en 1 ## Used in the time reports Hver eining taknar eda ad hluta af beidnir a sidu beidnir a sidur ## Used at the bottom of each non-time report: need m, f & n genders * * Ekki skrad ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report Forrit for i gang Greindi beidnir fra til ## Used in the General Summary Arangurrikar beidnir Medal arangursrikar beidnir a dag Arangursrikar beidnir a sidur Medal arangursrikar beidnir a sidur a dag Skradar linur an astandstakns Beidnir sem mistokust Beint afram beidnir Beidnir med oformlegum Astandstaknum Beidnir um akvednar skrar Akvednum hyslum thjonad Brengladar skraargeymslulinur Ovelkomnar skraargeymsluvidbaetur Gogn flutt Medalmagn gagna flutt a dag Tolur i sviga visa i 7 dagar til sidustu 7 daga Fara til Efst ## Some special phrases for particular reports. [oleystar ip-numera addressur] [domain ekki gefid] [othekkt domain] [rotar skra] [engin skra] [engin framlenging] [skrar] Othekkt Windows utgafa Adrar Unix utgafur ++Robots++ Styrikerfi othekkt ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #beidnir ++7-day reqs++ %beidnir ++%7-day reqs++ sidur ++7-day pages++ %sidur ++%7-day pages++ bitar ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %bitar ++%7-day bytes++ numer ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Birting fyrstu %s * * Birting fyrstu %d %s * * Birting %s ## "by" in the phrase "listing the top 3 files BY number of requests" med ## All requests WITH AT LEAST 10 requests med a.m.k. ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ beint afram beidni beint afram beidnum ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ beidni mistokst beidnir mistokust ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % af virkni ++% of the traffic in the last 7 days++ % af mogulegri virkni ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ bitar af virkni ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ beidnir sidan med aframvisadri beidni sidan med olukkadri beidni sidan ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * radad af ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting magn virkni ++the amount of traffic in the last 7 days++ % af beidni ++% of the requests in the last 7 days++ % af hamarksbeidni ++% of the maximum number of requests in the last 7 days++ magn beidna ++the number of requests in the last 7 days++ % af beidnum i sidur ++% of the requests for pages in the last 7 days++ % af hamarks beidnum i sidur ++% of the maximum number of requests for pages in the last 7 days++ magn beidna i sidur ++the number of requests for pages in the last 7 days++ % af aframvisudum beidnum ++% of the redirected requests in the last 7 days++ % af hamarks aframvisudum beidnum ++% of the maximum number of redirected requests in the last 7 days++ magn aframvisadra beidna ++the number of redirected requests in the last 7 days++ % af beidnum sem mistokust ++% of the failed requests in the last 7 days++ % af hamarks beidnum sem mistokust ++% of the maximum number of failed requests in the last 7 days++ magn beidna sem mistokust ++the number of failed requests in the last 7 days++ timi sidustu beidni timi sidustu aframvisunar beidni timi sidustu beidni sem mistokst ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n * * radad i stafrofsrod * * radad i numerarod * * oradad ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary ++%w++ ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/it.lng0000644000175000017500000003317710161303540015001 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Dom Lun Mar Mer Gio Ven Sab Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic ## Next some standard common words. ## Abbreviation for "week beginning" in. sett. anno ## Quarter of a year trimestre mese gio giorni hh minuto minuti secondo secondi byte byte ## ?bytes represents kbytes, Mbytes etc. ?bytes richiesta richieste data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data ora ora data primo accesso ora primo accesso data ultimo accesso ora ultimo accesso file file host host host virtuale host virtuali directory directory dominio domini organizzazione organizzazioni estensione estensioni URL URL browser browser sist.op. sist.op. ## (= operating system, operating systems) lunghezza chiave ricerca chiavi ricerca sito siti utente utenti codice di stato codici di stato Statistiche del Web Server per ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sommario generale ## The time reports, plus "busiest" strings (at the bottom of each report) Resoconto anni Anno con maggior traffico: Resoconto trimestri Trimestre con maggior traffico: Resoconto mesi Mese con maggior traffico: Resoconto settimane Settimana con maggior traffico: quella che inizia il Sommario giorni della settimana Resoconto giorni Giorno con maggior traffico: Resoconto ore Sommario ore del giorno Resoconto per ore della settimana Ora con maggior traffico: Resoconto quarti d'ora Resoconto per quarti d'ora Quarto d'ora con maggior traffico: Resoconto cinque minuti Resoconto per periodi di cinque minuti Cinque minuti con maggior traffico: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Resoconto host host host m Resoconto host richieste reindirizzate host host m Resoconto host richieste fallite host host m Resoconto directory directory directory f Resoconto tipi di file estensione estensioni f Resoconto richieste file file m Resoconto reindirizzamenti file file m Resoconto insuccessi file file m Resoconto provenienze richieste URL di provenienza URL di provenienza f Resoconto siti di provenienza sito di provenienza siti di provenienza m Resoconto provenienze richieste reindirizzate URL di provenienza URL di provenienza f Resoconto provenienze richieste fallite URL di provenienza URL di provenienza f Resoconto richieste ricerca ricerca ricerche f Resoconto parole ricerca parola cercata parole cercate f Resoconto ricerche interne ricerca ricerche f Resoconto chiavi per ricerche interne chiave di ricerca chiavi di ricerca f Resoconto host virtuali host virtuale host virtuali m Resoconto redirezione host virtuali host virtuale host virtuali m Resoconto insuccessi host virtuali host virtuale host virtuali m Resoconto utenti utente utenti m Resoconto redirezione utenti utente utenti m Resoconto insuccessi utenti utente utenti m Sommario browser browser browser m Resoconto browser browser browser m Resoconto sistemi operativi sistema operativo sistemi operativi m Resoconto domini dominio domini m Resoconto organizzazioni organizzazione organizzazioni f Resoconto codici di stato codice di stato codici di stato m Resoconto tempi di esecuzione Resoconto dimensione dei file ## Used at the bottom of the report Queste statistiche sono state prodotte da Tempo di esecuzione Meno di un ## Used in the time reports Ogni unit rappresenta o frazione richiesta di pagina richieste di pagine ## Used at the bottom of each non-time report: need m, f & n genders non elencati non elencate non elencati ## Used on the pie charts: again need m, f & n genders * * Altro ## Used at the top of the report Programma attivato Analizzate le richieste da a ## Used in the General Summary Richieste soddisfatte Media giornaliera di richieste soddisfatte Richieste di pagine soddisfatte Media giornaliera di richieste di pagine soddisfatte Linee nel log file senza codice di stato Richieste fallite Richieste reindirizzate Richieste con codice di stato informativo File distinti richiesti Host distinti serviti Linee non valide nel log file Registrazioni nel log file non desiderate Quantit totale di traffico Traffico medio giornaliero I valori in parentesi si riferiscono a i 7 giorni fino al gli ultimi 7 giorni Altre statistiche Inizio ## Some special phrases for particular reports. [indirizzo numerico non risolto] [dominio non fornito] [dominio sconosciuto] [directory principale] [nessuna directory] [nessuna estensione] [directory] Windows sconosciuto Altro Unix Robot Sist. op. sconosciuto ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7 giorni versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #rich rich 7 gg %rich %rich 7 gg #pag. pag. 7 gg %pag. %pag. 7 gg byte ?bytes byte 7 gg ?byte 7 gg %byte %byte 7 gg n. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Elenco del primo %s Elenco della prima %s * Elenco dei primi %d %s Elenco delle prime %d %s * Elenco dei %s Elenco delle %s Elenco degli %s ## "by" in the phrase "listing the top 3 files BY number of requests" in ordine di ## All requests WITH AT LEAST 10 requests con almeno ## Different ways of doing floors richiesta negli ultimi 7 giorni richieste negli ultimi 7 giorni richiesta di una pagina negli ultimi 7 giorni richieste di pagine negli ultimi 7 giorni richiesta reindirizzata richieste reindirizzate richiesta reindirizzata negli ultimi 7 giorni richieste reindirizzate negli ultimi 7 giorni richiesta fallita richieste fallite richiesta fallita negli ultimi 7 giorni richieste fallite negli ultimi 7 giorni % del traffico % del traffico negli ultimi 7 giorni % della massima quantit di traffico % della massima quantit di traffico negli ultimi 7 giorni byte di traffico byte di traffico ## ?bytes represents kbytes, Mbytes etc. ?byte di traffico byte di traffico negli ultimi 7 giorni byte di traffico negli ultimi 7 giorni ?byte di traffico negli ultimi 7 giorni richieste dal con una richiesta reindirizzata dal con una richiesta fallita dal con la prima richiesta dal con la prima richiesta reindirizzata dal con la prima richiesta fallita dal ## Now "sorted by": again, in m, f & n (only needed in plural though) in ordine di in ordine di in ordine di ## Used at the top of each report Questo resoconto contiene dati dal ## Used in pie charts Le aree sono disegnate per ## different ways of sorting traffico la quantit di traffico negli ultimi 7 giorni % delle richieste % delle richieste negli ultimi 7 giorni % del massimo numero di richieste % del numero massimo di richieste negli ultimi 7 giorni numero di richieste il numero of richieste negli ultimi 7 giorni % delle richieste di pagine % delle richieste di pagine negli ultimi 7 giorni % del massimo numero di richieste di pagine % del numero massimo di richieste di pagine negli ultimi 7 giorni numero di richieste di pagine il numero di richieste di pagine negli ultimi 7 giorni % di richieste reindirizzate % di richieste reindirizzate negli ultimi 7 giorni % del massimo numero di richieste reindirizzate % del massimo numero di richieste reindirizzate negli ultimi 7 giorni numero di richieste reindirizzate il numero di richieste reindirizzate negli ultimi 7 giorni % delle richieste fallite % delle richieste fallite negli ultimi 7 giorni % del massimo numero di richieste fallite % del numero massimo di richieste fallite negli ultimi 7 giorni numero di richieste fallite numero di richieste fallite negli ultimi 7 giorni momento dell'ultima richiesta momento dell'ultima richiesta reindirizzata momento dell'ultima richiesta fallita momento della prima richiesta momento della prima richiesta reindirizzata momento della prima richiesta fallita ## 3 other ways of sorting in m, f, & n in ordine alfabetico in ordine alfabetico in ordine alfabetico in ordine numerico in ordine numerico in ordine numerico in ordine casuale in ordine casuale in ordine casuale ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w %D-%m-%Y alle %H:%n ## In Daily Report %d-%m-%y ## In Daily Summary %w ## In Hourly Report %d-%m-%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d-%m-%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d-%m-%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d-%m-%y ## The date & time (D) column in non-time reports %d-%m-%y %H:%n ## In non-time reports: "including all files with requests since [date]" %w %D-%m-%Y alle %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/ita.lng0000644000175000017500000003320210161303540015127 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Dom Lun Mar Mer Gio Ven Sab Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic ## Next some standard common words. ## Abbreviation for "week beginning" in. sett. anno ## Quarter of a year trimestre mese gio giorni hh minuto minuti secondo secondi byte byte ## ?bytes represents kbytes, Mbytes etc. ?bytes richiesta richieste data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data ora ora data primo accesso ora primo accesso data ultimo accesso ora ultimo accesso file file host host host virtuale host virtuali directory directory dominio domini organizzazione organizzazioni estensione estensioni URL URL browser browser sist.op. sist.op. ## (= operating system, operating systems) lunghezza chiave ricerca chiavi ricerca sito siti utente utenti codice di stato codici di stato Statistiche del Web Server per ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sommario generale ## The time reports, plus "busiest" strings (at the bottom of each report) Resoconto anni Anno con maggior traffico: Resoconto trimestri Trimestre con maggior traffico: Resoconto mesi Mese con maggior traffico: Resoconto settimane Settimana con maggior traffico: quella che inizia il Sommario giorni della settimana Resoconto giorni Giorno con maggior traffico: Resoconto ore Sommario ore del giorno Resoconto per ore della settimana Ora con maggior traffico: Resoconto quarti d'ora Resoconto per quarti d'ora Quarto d'ora con maggior traffico: Resoconto cinque minuti Resoconto per periodi di cinque minuti Cinque minuti con maggior traffico: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Resoconto host host host m Resoconto host richieste reindirizzate host host m Resoconto host richieste fallite host host m Resoconto directory directory directory f Resoconto tipi di file estensione estensioni f Resoconto richieste file file m Resoconto reindirizzamenti file file m Resoconto insuccessi file file m Resoconto provenienze richieste URL di provenienza URL di provenienza f Resoconto siti di provenienza sito di provenienza siti di provenienza m Resoconto provenienze richieste reindirizzate URL di provenienza URL di provenienza f Resoconto provenienze richieste fallite URL di provenienza URL di provenienza f Resoconto richieste ricerca ricerca ricerche f Resoconto parole ricerca parola cercata parole cercate f Resoconto ricerche interne ricerca ricerche f Resoconto chiavi per ricerche interne chiave di ricerca chiavi di ricerca f Resoconto host virtuali host virtuale host virtuali m Resoconto redirezione host virtuali host virtuale host virtuali m Resoconto insuccessi host virtuali host virtuale host virtuali m Resoconto utenti utente utenti m Resoconto redirezione utenti utente utenti m Resoconto insuccessi utenti utente utenti m Sommario browser browser browser m Resoconto browser browser browser m Resoconto sistemi operativi sistema operativo sistemi operativi m Resoconto domini dominio domini m Resoconto organizzazioni organizzazione organizzazioni f Resoconto codici di stato codice di stato codici di stato m Resoconto tempi di esecuzione Resoconto dimensione dei file ## Used at the bottom of the report Queste statistiche sono state prodotte da Tempo di esecuzione Meno di un ## Used in the time reports Ogni unita` rappresenta o frazione richiesta di pagina richieste di pagine ## Used at the bottom of each non-time report: need m, f & n genders non elencati non elencate non elencati ## Used on the pie charts: again need m, f & n genders * * Altro ## Used at the top of the report Programma attivato Analizzate le richieste da a ## Used in the General Summary Richieste soddisfatte Media giornaliera di richieste soddisfatte Richieste di pagine soddisfatte Media giornaliera di richieste di pagine soddisfatte Linee nel log file senza codice di stato Richieste fallite Richieste reindirizzate Richieste con codice di stato informativo File distinti richiesti Host distinti serviti Linee non valide nel log file Registrazioni nel log file non desiderate Quantita` totale di traffico Traffico medio giornaliero I valori in parentesi si riferiscono a i 7 giorni fino al gli ultimi 7 giorni Altre statistiche Inizio ## Some special phrases for particular reports. [indirizzo numerico non risolto] [dominio non fornito] [dominio sconosciuto] [directory principale] [nessuna directory] [nessuna estensione] [directory] Windows sconosciuto Altro Unix Robot Sist. op. sconosciuto ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7 giorni versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #rich rich 7 gg %rich %rich 7 gg #pag. pag. 7 gg %pag. %pag. 7 gg byte ?bytes byte 7 gg ?byte 7 gg %byte %byte 7 gg n. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Elenco del primo %s Elenco della prima %s * Elenco dei primi %d %s Elenco delle prime %d %s * Elenco dei %s Elenco delle %s Elenco degli %s ## "by" in the phrase "listing the top 3 files BY number of requests" in ordine di ## All requests WITH AT LEAST 10 requests con almeno ## Different ways of doing floors richiesta negli ultimi 7 giorni richieste negli ultimi 7 giorni richiesta di una pagina negli ultimi 7 giorni richieste di pagine negli ultimi 7 giorni richiesta reindirizzata richieste reindirizzate richiesta reindirizzata negli ultimi 7 giorni richieste reindirizzate negli ultimi 7 giorni richiesta fallita richieste fallite richiesta fallita negli ultimi 7 giorni richieste fallite negli ultimi 7 giorni % del traffico % del traffico negli ultimi 7 giorni % della massima quantita` di traffico % della massima quantita` di traffico negli ultimi 7 giorni byte di traffico byte di traffico ## ?bytes represents kbytes, Mbytes etc. ?byte di traffico byte di traffico negli ultimi 7 giorni byte di traffico negli ultimi 7 giorni ?byte di traffico negli ultimi 7 giorni richieste dal con una richiesta reindirizzata dal con una richiesta fallita dal con la prima richiesta dal con la prima richiesta reindirizzata dal con la prima richiesta fallita dal ## Now "sorted by": again, in m, f & n (only needed in plural though) in ordine di in ordine di in ordine di ## Used at the top of each report Questo resoconto contiene dati dal ## Used in pie charts Le aree sono disegnate per ## different ways of sorting traffico la quantita` di traffico negli ultimi 7 giorni % delle richieste % delle richieste negli ultimi 7 giorni % del massimo numero di richieste % del numero massimo di richieste negli ultimi 7 giorni numero di richieste il numero of richieste negli ultimi 7 giorni % delle richieste di pagine % delle richieste di pagine negli ultimi 7 giorni % del massimo numero di richieste di pagine % del numero massimo di richieste di pagine negli ultimi 7 giorni numero di richieste di pagine il numero di richieste di pagine negli ultimi 7 giorni % di richieste reindirizzate % di richieste reindirizzate negli ultimi 7 giorni % del massimo numero di richieste reindirizzate % del massimo numero di richieste reindirizzate negli ultimi 7 giorni numero di richieste reindirizzate il numero di richieste reindirizzate negli ultimi 7 giorni % delle richieste fallite % delle richieste fallite negli ultimi 7 giorni % del massimo numero di richieste fallite % del numero massimo di richieste fallite negli ultimi 7 giorni numero di richieste fallite numero di richieste fallite negli ultimi 7 giorni momento dell'ultima richiesta momento dell'ultima richiesta reindirizzata momento dell'ultima richiesta fallita momento della prima richiesta momento della prima richiesta reindirizzata momento della prima richiesta fallita ## 3 other ways of sorting in m, f, & n in ordine alfabetico in ordine alfabetico in ordine alfabetico in ordine numerico in ordine numerico in ordine numerico in ordine casuale in ordine casuale in ordine casuale ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w %D-%m-%Y alle %H:%n ## In Daily Report %d-%m-%y ## In Daily Summary %w ## In Hourly Report %d-%m-%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d-%m-%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d-%m-%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d-%m-%y ## The date & time (D) column in non-time reports %d-%m-%y %H:%n ## In non-time reports: "including all files with requests since [date]" %w %D-%m-%Y alle %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/itadesc.txt0000644000175000017500000001127510161303540016033 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Questo rapporto elenca l'attivita` annuale. # Quarterly Report Questo rapporto elenca l'attivita` trimestrale. # Monthly Report Questo rapporto elenca l'attivita` mensile. # Weekly Report Questo rapporto elenca l'attivita` settimanale. # Daily Report Questo rapporto elenca l'attivita` giornaliera. # Hourly Report Questo rapporto elenca l'attivita` oraria. # Quarter-Hour Report Questo rapporto elenca l'attivita` per ogni periodo di 15 minuti. # Five-Minute Report Questo rapporto elenca l'attivita` per ogni periodo di 5 minuti. # Daily Summary Questo rapporto elenca l'attivita` per ogni giorno della settimana, calcolata cumulativamente su tutte le settimane analizzate. # Hourly Summary Questo rapporto elenca l'attivita` per ogni ora del giorno, calcolata cumulativamente su tutti i giorni analizzati. # Hour of the Week Summary Questo rapporto elenca l'attivita` per ogni ora della settimana, calcolata cumulativamente su tutte le settimane analizzate. # Quarter-Hour Summary Questo rapporto elenca l'attivita` per ogni quarto d'ora del giorno, calcolata cumulativamente su tutti i giorni analizzati. # Five-Minute Summary Questo rapporto elenca l'attivita` per ogni periodo di 5 minuti del giorno, calcolata cumulativamente su tutti i giorni analizzati. # General Summary Questo rapporto elenca le statistiche riepilogative generali. # Request Report Questo rapporto elenca i files richiesti sul sito. # Redirection Report Questo rapporto elenca i files che hanno richiesto una redirezione ad un altro file (solitamente directory senza la sbarra finale, o script CGI che forzano la redirezione). # Failure Report Questo rapporto elenca i files che hanno causato un insuccesso, per esempio files non trovati. # File Type Report Questo rapporto elenca le estensioni dei files richiesti sul sito. # Directory Report Questo rapporto elenca le directory dalle quali sono stati richiesti i files, comprese tutte le loro sottodirectory. # Host Report Questo rapporto elenca i computer che hanno richiesto files. # Host Redirection Report Questo rapporto elenca i computer che sono stati rediretti ad un altro file. # Host Failure Report Questo rapporto elenca i computer per i quali sono fallite le richieste. # Domain Report Questo rapporto elenca il dominio, geografico o internazionale, di provenienza delle richieste. # Referrer Report Questo rapporto elenca i referenti (da quali pagine sono stati inviati i visitatori, oppure le pagine che includono immagini di questo sito). # Referring Site Report Questo rapporto elenca da quali server i visitatori sono stati inviati. # Redirected Referrer Report Questo rapporto elenca i referenti che hanno causato una richiesta di redirezione. # Failed Referrer Report Questo rapporto elenca i referenti contenenti collegamenti errati a questo sito. # Browser Report Questo rapporto elenca la versione dettagliata dei browser usati dai visitatori. # Virtual Host Report Questo rapporto elenca l'attivita` di ognuno dei domini virtuali di questo server. # Virtual Host Redirection Report Questo rapporto elenca le richieste redirette ad ognuno dei domini virtuali di questo server. # Virtual Host Failure Report Questo rapporto elenca le richieste fallite per ognuno dei domini virtuali di questo server. # User Report Questo rapporto elenca gli utenti che hanno richiesto files, se sono stati autenticati con password o identificati con cookies. # User Redirection Report Questo rapporto elenca gli utenti che sono stati rediretti ad un altro file. # User Failure Report Questo rapporto elenca gli utenti ai quali sono fallite le richieste. # Organisation Report Questo rapporto elenca le organizzazioni dai cui computer sono stati richiesti files. # Search Query Report Questo rapporto elenca le richieste usate nei motori di ricerca per trovare questo sito. # Search Word Report Questo rapporto elenca le parole usate nei motori di ricerca per trovare questo sito. # Internal Search Query Report Questo rapporto elenca le richieste effettuate ai motori di ricerca interni a questo sito. # Internal Search Word Report Questo rapporto elenca le parole richieste ai motori di ricerca interni a questo sito. # Browser Summary Questo rapporto elenca il produttore dei browser usati dai visitatori. # Operating System Report Questo rapporto elenca i sistemi operativi usati dai visitatori. # File Size Report Questo rapporto elenca le dimensioni dei files. # Status Code Report Questo rapporto elenca il codice di stato HTTP di tutte le richieste. # Processing Time Report Questo rapporto elenca il tempo impiegato per processare le richieste. analog-6.0/lang/itadom.tab0000644000175000017500000001104110161303540015612 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emirati Arabi Uniti af 1 Afghanistan ag 2 Antigua e Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antille Olandesi ao 1 Angola aq 1 Antartide ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americane at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaidjan ba 3 Bosnia-Erzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgio bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasile bs 1 Bahamas bt 1 Bhutan bv 1 Bouvet bw 1 Botswana by 1 Bielorussia bz 1 Belize ca 3 Canada cc 1 Isole Cocos (Keeling) cd 1 Repubblica Democratica del Congo cf 1 Repubblica Centafricana cg 1 Congo ch 2 Svizzera ci 1 Costa d'Avorio ck 1 Isole Cook cl 2 Cile cm 1 Camerun cn 3 Cina co 3 Colombia com 2 Commerciale cr 3 Costarica cu 2 Cuba cv 1 Capo Verde cx 2 Christmas Island cy 3 Cipro cz 2 Repubblica Ceca de 2 Germania dj 1 Gibuti dk 2 Danimarca dm 2 Dominica do 3 Repubblica Dominicana dz 1 Algeria ec 3 Ecuador edu 2 USA Educational ee 2 Estonia eg 3 Egitto eh 1 Sahara Occidentale er 1 Eritrea es 2 Spagna et 1 Etiopia fi 2 Finlandia fj 3 Isole Figi fk 1 Isole Falkland fm 1 Micronesia fo 1 Isole Faroer fr 2 Francia fx 1 Francia (Territorio Europeo) ga 1 Gabon gb 1 Regno Unito gd 1 Grenada ge 1 Georgia gf 1 Guyana Francese gg 1 Guernsey gh 3 Ghana gi 1 Gibilterra gl 1 Groenlandia gm 1 Gambia gn 1 Guinea gov 2 USA Governativi gp 1 Guadalupa (Francese) gq 1 Guinea Equatoriale gr 2 Grecia gs 1 Isole S. Georgia & S. Sandwich gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Isole Heard and McDonald hn 2 Honduras hr 2 Croazia ht 1 Haiti hu 2 Ungheria id 3 Indonesia ie 2 Irlanda il 3 Israele im 1 Isola di Man in 3 India int 1 Internazionale io 1 Territorio Inglese dell'Oceano Indiano iq 1 Iraq ir 1 Iran is 2 Islanda it 2 Italia je 1 Jersey jm 3 Giamaica jo 3 Giordania jp 3 Giappone ke 3 Kenya kg 1 Kyrgyzstan kh 1 Cambogia ki 1 Kiribati km 1 Comore kn 1 Saint Kitts & Nevis kp 1 Corea del Nord kr 3 Corea del Sud kw 3 Kuwait ky 1 Isole Cayman kz 1 Kazakhistan la 1 Laos lb 3 Libano lc 1 Santa Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lituania lu 2 Lussemburgo lv 2 Latvia ly 1 Libia ma 1 Marocco mc 2 Monaco md 1 Moldavia mg 1 Madagascar mh 1 Isole Marshall mil 2 USA Militare mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Isole Northern Mariana mq 1 Martinica (Francese) mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Maurizio mv 1 Maldive mw 1 Malawi mx 3 Messico my 3 Malesia mz 1 Mozambico na 1 Namibia nc 1 Nuova Caledonia (Francese) ne 1 Niger net 2 Network nf 1 Isola Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Olanda no 2 Norvegia np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nuova Zelanda om 1 Oman org 2 Organizzazioni Non-Profit pa 3 Panama pe 3 Peru` pf 1 Polinesia (Francese) pg 3 Papua Nuova Guinea ph 3 Filippine pk 3 Pakistan pl 3 Polonia pm 1 Saint Pierre e Miquelon pn 1 Isola Pitcairn pr 1 Portorico ps 3 Palestina pt 2 Portogallo pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion (Francese) ro 2 Romania ru 2 Russia rw 1 Ruanda sa 3 Arabia Saudita sb 1 Isole Solomon sc 1 Seychelles sd 1 Sudan se 2 Svezia sg 3 Singapore sh 1 Sant'Elena si 2 Slovenia sj 1 Isole Svalbard e Jan Mayen sk 2 Slovacchia sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Sao Tome` e Principe su 2 Ex Unione Sovietica sv 3 El Salvador sy 1 Siria sz 1 Swaziland tc 1 Isole Turks e Caicos td 1 Ciad tf 1 Territori della Francia del Sud tg 1 Togo th 3 Thailandia tj 1 Tadjikistan tk 1 Tokelau tl 1 Timor Est tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 Timor Est tr 3 Turchia tt 3 Trinidad e Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ucraina ug 3 Uganda uk 3 Regno Unito um 1 USA Isole Minori us 4 Stati Uniti uy 3 Uruguay uz 1 Uzbekistan va 1 Citta` del Vaticano vc 1 Saint Vincent & Grenadines ve 3 Venezuela vg 1 Isole Vergini (Britanniche) vi 1 Isole Vergini (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Isole Wallis e Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Jugoslavia za 3 Sudafrica zm 1 Zambia zr 1 Repubblica Democratica del Congo zw 3 Zimbabwe analog-6.0/lang/itdesc.txt0000644000175000017500000001125710161303540015672 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Questo rapporto elenca l'attivit annuale. # Quarterly Report Questo rapporto elenca l'attivit trimestrale. # Monthly Report Questo rapporto elenca l'attivit mensile. # Weekly Report Questo rapporto elenca l'attivit settimanale. # Daily Report Questo rapporto elenca l'attivit giornaliera. # Hourly Report Questo rapporto elenca l'attivit oraria. # Quarter-Hour Report Questo rapporto elenca l'attivit per ogni periodo di 15 minuti. # Five-Minute Report Questo rapporto elenca l'attivit per ogni periodo di 5 minuti. # Daily Summary Questo rapporto elenca l'attivit per ogni giorno della settimana, calcolata cumulativamente su tutte le settimane analizzate. # Hourly Summary Questo rapporto elenca l'attivit per ogni ora del giorno, calcolata cumulativamente su tutti i giorni analizzati. # Hour of the Week Summary Questo rapporto elenca l'attivit per ogni ora della settimana, calcolata cumulativamente su tutte le settimane analizzate. # Quarter-Hour Summary Questo rapporto elenca l'attivit per ogni quarto d'ora del giorno, calcolata cumulativamente su tutti i giorni analizzati. # Five-Minute Summary Questo rapporto elenca l'attivit per ogni periodo di 5 minuti del giorno, calcolata cumulativamente su tutti i giorni analizzati. # General Summary Questo rapporto elenca le statistiche riepilogative generali. # Request Report Questo rapporto elenca i files richiesti sul sito. # Redirection Report Questo rapporto elenca i files che hanno richiesto una redirezione ad un altro file (solitamente directory senza la sbarra finale, o script CGI che forzano la redirezione). # Failure Report Questo rapporto elenca i files che hanno causato un insuccesso, per esempio files non trovati. # File Type Report Questo rapporto elenca le estensioni dei files richiesti sul sito. # Directory Report Questo rapporto elenca le directory dalle quali sono stati richiesti i files, comprese tutte le loro sottodirectory. # Host Report Questo rapporto elenca i computer che hanno richiesto files. # Host Redirection Report Questo rapporto elenca i computer che sono stati rediretti ad un altro file. # Host Failure Report Questo rapporto elenca i computer per i quali sono fallite le richieste. # Domain Report Questo rapporto elenca il dominio, geografico o internazionale, di provenienza delle richieste. # Referrer Report Questo rapporto elenca i referenti (da quali pagine sono stati inviati i visitatori, oppure le pagine che includono immagini di questo sito). # Referring Site Report Questo rapporto elenca da quali server i visitatori sono stati inviati. # Redirected Referrer Report Questo rapporto elenca i referenti che hanno causato una richiesta di redirezione. # Failed Referrer Report Questo rapporto elenca i referenti contenenti collegamenti errati a questo sito. # Browser Report Questo rapporto elenca la versione dettagliata dei browser usati dai visitatori. # Virtual Host Report Questo rapporto elenca l'attivit di ognuno dei domini virtuali di questo server. # Virtual Host Redirection Report Questo rapporto elenca le richieste redirette ad ognuno dei domini virtuali di questo server. # Virtual Host Failure Report Questo rapporto elenca le richieste fallite per ognuno dei domini virtuali di questo server. # User Report Questo rapporto elenca gli utenti che hanno richiesto files, se sono stati autenticati con password o identificati con cookies. # User Redirection Report Questo rapporto elenca gli utenti che sono stati rediretti ad un altro file. # User Failure Report Questo rapporto elenca gli utenti ai quali sono fallite le richieste. # Organisation Report Questo rapporto elenca le organizzazioni dai cui computer sono stati richiesti files. # Search Query Report Questo rapporto elenca le richieste usate nei motori di ricerca per trovare questo sito. # Search Word Report Questo rapporto elenca le parole usate nei motori di ricerca per trovare questo sito. # Internal Search Query Report Questo rapporto elenca le richieste effettuate ai motori di ricerca interni a questo sito. # Internal Search Word Report Questo rapporto elenca le parole richieste ai motori di ricerca interni a questo sito. # Browser Summary Questo rapporto elenca il produttore dei browser usati dai visitatori. # Operating System Report Questo rapporto elenca i sistemi operativi usati dai visitatori. # File Size Report Questo rapporto elenca le dimensioni dei files. # Status Code Report Questo rapporto elenca il codice di stato HTTP di tutte le richieste. # Processing Time Report Questo rapporto elenca il tempo impiegato per processare le richieste. analog-6.0/lang/itdom.tab0000644000175000017500000001103610161303540015455 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emirati Arabi Uniti af 1 Afghanistan ag 2 Antigua e Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antille Olandesi ao 1 Angola aq 1 Antartide ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americane at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaidjan ba 3 Bosnia-Erzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgio bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasile bs 1 Bahamas bt 1 Bhutan bv 1 Bouvet bw 1 Botswana by 1 Bielorussia bz 1 Belize ca 3 Canada cc 1 Isole Cocos (Keeling) cd 1 Repubblica Democratica del Congo cf 1 Repubblica Centafricana cg 1 Congo ch 2 Svizzera ci 1 Costa d'Avorio ck 1 Isole Cook cl 2 Cile cm 1 Camerun cn 3 Cina co 3 Colombia com 2 Commerciale cr 3 Costarica cu 2 Cuba cv 1 Capo Verde cx 2 Christmas Island cy 3 Cipro cz 2 Repubblica Ceca de 2 Germania dj 1 Gibuti dk 2 Danimarca dm 2 Dominica do 3 Repubblica Dominicana dz 1 Algeria ec 3 Ecuador edu 2 USA Educational ee 2 Estonia eg 3 Egitto eh 1 Sahara Occidentale er 1 Eritrea es 2 Spagna et 1 Etiopia fi 2 Finlandia fj 3 Isole Figi fk 1 Isole Falkland fm 1 Micronesia fo 1 Isole Faroer fr 2 Francia fx 1 Francia (Territorio Europeo) ga 1 Gabon gb 1 Regno Unito gd 1 Grenada ge 1 Georgia gf 1 Guyana Francese gg 1 Guernsey gh 3 Ghana gi 1 Gibilterra gl 1 Groenlandia gm 1 Gambia gn 1 Guinea gov 2 USA Governativi gp 1 Guadalupa (Francese) gq 1 Guinea Equatoriale gr 2 Grecia gs 1 Isole S. Georgia & S. Sandwich gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Isole Heard and McDonald hn 2 Honduras hr 2 Croazia ht 1 Haiti hu 2 Ungheria id 3 Indonesia ie 2 Irlanda il 3 Israele im 1 Isola di Man in 3 India int 1 Internazionale io 1 Territorio Inglese dell'Oceano Indiano iq 1 Iraq ir 1 Iran is 2 Islanda it 2 Italia je 1 Jersey jm 3 Giamaica jo 3 Giordania jp 3 Giappone ke 3 Kenya kg 1 Kyrgyzstan kh 1 Cambogia ki 1 Kiribati km 1 Comore kn 1 Saint Kitts & Nevis kp 1 Corea del Nord kr 3 Corea del Sud kw 3 Kuwait ky 1 Isole Cayman kz 1 Kazakhistan la 1 Laos lb 3 Libano lc 1 Santa Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lituania lu 2 Lussemburgo lv 2 Latvia ly 1 Libia ma 1 Marocco mc 2 Monaco md 1 Moldavia mg 1 Madagascar mh 1 Isole Marshall mil 2 USA Militare mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Isole Northern Mariana mq 1 Martinica (Francese) mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Maurizio mv 1 Maldive mw 1 Malawi mx 3 Messico my 3 Malesia mz 1 Mozambico na 1 Namibia nc 1 Nuova Caledonia (Francese) ne 1 Niger net 2 Network nf 1 Isola Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Olanda no 2 Norvegia np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nuova Zelanda om 1 Oman org 2 Organizzazioni Non-Profit pa 3 Panama pe 3 Per pf 1 Polinesia (Francese) pg 3 Papua Nuova Guinea ph 3 Filippine pk 3 Pakistan pl 3 Polonia pm 1 Saint Pierre e Miquelon pn 1 Isola Pitcairn pr 1 Portorico ps 3 Palestina pt 2 Portogallo pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion (Francese) ro 2 Romania ru 2 Russia rw 1 Ruanda sa 3 Arabia Saudita sb 1 Isole Solomon sc 1 Seychelles sd 1 Sudan se 2 Svezia sg 3 Singapore sh 1 Sant'Elena si 2 Slovenia sj 1 Isole Svalbard e Jan Mayen sk 2 Slovacchia sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 So Tom e Principe su 2 Ex Unione Sovietica sv 3 El Salvador sy 1 Siria sz 1 Swaziland tc 1 Isole Turks e Caicos td 1 Ciad tf 1 Territori della Francia del Sud tg 1 Togo th 3 Thailandia tj 1 Tadjikistan tk 1 Tokelau tl 1 Timor Est tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 Timor Est tr 3 Turchia tt 3 Trinidad e Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ucraina ug 3 Uganda uk 3 Regno Unito um 1 USA Isole Minori us 4 Stati Uniti uy 3 Uruguay uz 1 Uzbekistan va 1 Citt del Vaticano vc 1 Saint Vincent & Grenadines ve 3 Venezuela vg 1 Isole Vergini (Britanniche) vi 1 Isole Vergini (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Isole Wallis e Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Jugoslavia za 3 Sudafrica zm 1 Zambia zr 1 Repubblica Democratica del Congo zw 3 Zimbabwe analog-6.0/lang/itform.html0000644000175000017500000002060310161303540016037 0ustar sret1sret100000000000000 Analog - Interfaccia Web

Interfaccia Web per Analog


1. Selezione dei resoconti

Vedi la home page di analog per la spiegazione dei vari report.

Quali report vuoi visualizzare?


[On] [Off] Sommario generale
[On] [Off] Resoconto mesi
[On] [Off] Resoconto settimane
[On] [Off] Sommario giorni della settimana
[On] [Off] Resoconto giorni
[On] [Off] Sommario ore del giorno
[On] [Off] Resoconto domini
[On] [Off] Resoconto organizzazioni
[On] [Off] Resoconto directory
[On] [Off] Resoconto tipi di file
[On] [Off] Resoconto richieste
[On] [Off] Resoconto dimensioni file
[On] [Off] Resoconto provenienze
[On] [Off] Resoconto richeste ricerca
[On] [Off] Resoconto parole ricerca
[On] [Off] Sommario browser
[On] [Off] Resoconto sistemi operativi
[On] [Off] Status Code Resoconto codici di stato

È ora possibile eseguire il programma:
Oppure si possono modificare le seguenti opzioni per report individuali. Si può usare bytes per indicare 10 Megabytes; oppure per indicare i primi 50 elementi in ordine di bytes.


2. Opzioni per resoconti dettagliati

Opzioni per resoconto domini

Ordina il resoconto domini
Includi tutti i domini con almeno

Opzioni per resoconto organizzazioni

Ordina il resoconto organizzazioni
Includi tutte le organizzazioni con almeno

Opzioni per resoconto directory

Ordina il resoconto directory
Includi tutte le directory con almeno

Opzioni per resoconto richieste

Ordina il resoconto richieste
Includi tutti i files con almeno
Visualizza

Opzioni resoconto provenienze

Ordina il resoconto provenienze
Includi tutte le provenienze con almeno

3. Analisi parziale del log

Solo determinati periodi
È possibile analizzare solo le richieste per determinati periodi. Inserire di seguito il periodo nella forma aammgg (anno, mese, giorno, tutti a 2 cifre); per esempio, 980301 per il primo marzo 1998. È possibile usare un solo campo per limitare il periodo da un solo lato.
Dalla data alla data

Solo determinati files
Cerca solo questi files (lista, separata da virgole; può contenere il carattere jolly *)

Ignora questi files


4. Impaginazione

Nome dell'organizzazione (per il titolo della pagina)

home page dell'organizzazione
URL:


analog-6.0/lang/jpe.cfg0000644000175000017500000000341410161303540015111 0ustar sret1sret100000000000000LANGUAGE JAPANESE-EUC SUBDOMAIN ad.jp ȿ SUBDOMAIN ac.jp ءعʤ SUBDOMAIN co.jp SUBDOMAIN go.jp ܵ SUBDOMAIN or.jp Ƽˡ SUBDOMAIN ne.jp ͥåȥӥ SUBDOMAIN gr.jp Ǥ SUBDOMAIN ed.jp Ƽع SUBDOMAIN hokkaido.jp ̳ƻ SUBDOMAIN aomori.jp Ŀ SUBDOMAIN iwate.jp 긩 SUBDOMAIN miyagi.jp ܾ븩 SUBDOMAIN akita.jp ĸ SUBDOMAIN yamagata.jp SUBDOMAIN fukushima.jp ʡ縩 SUBDOMAIN ibaraki.jp 븩 SUBDOMAIN tochigi.jp ڸ SUBDOMAIN gunma.jp ϸ SUBDOMAIN saitama.jp ̸ SUBDOMAIN chiba.jp ո SUBDOMAIN tokyo.jp SUBDOMAIN kanagawa.jp  SUBDOMAIN niigata.jp 㸩 SUBDOMAIN toyama.jp ٻ SUBDOMAIN ishikawa.jp  SUBDOMAIN fukui.jp ʡ温 SUBDOMAIN yamanashi.jp SUBDOMAIN nagano.jp Ĺ SUBDOMAIN gifu.jp 츩 SUBDOMAIN shizuoka.jp Ų SUBDOMAIN aichi.jp θ SUBDOMAIN mie.jp Ÿ SUBDOMAIN shiga.jp 츩 SUBDOMAIN kyoto.jp SUBDOMAIN osaka.jp SUBDOMAIN hyogo.jp ʼ˸ SUBDOMAIN nara.jp ɸ SUBDOMAIN wakayama.jp ²λ SUBDOMAIN tottori.jp Ļ踩 SUBDOMAIN shimane.jp 纬 SUBDOMAIN okayama.jp SUBDOMAIN hiroshima.jp 縩 SUBDOMAIN yamaguchi.jp SUBDOMAIN tokushima.jp 縩 SUBDOMAIN kagawa.jp  SUBDOMAIN ehime.jp ɲ SUBDOMAIN kochi.jp θ SUBDOMAIN fukuoka.jp ʡ SUBDOMAIN saga.jp 츩 SUBDOMAIN nagasaki.jp Ĺ긩 SUBDOMAIN kumamoto.jp ܸ SUBDOMAIN oita.jp ʬ SUBDOMAIN miyazaki.jp ܺ긩 SUBDOMAIN kagoshima.jp 縩 SUBDOMAIN okinawa.jp 츩 SUBDOMAIN sapporo.jp ڻ SUBDOMAIN sendai.jp SUBDOMAIN yokohama.jp ͻ SUBDOMAIN kawasaki.jp SUBDOMAIN nagoya.jp ̾Ų SUBDOMAIN kobe.jp ͻ SUBDOMAIN kitakyushu.jp ̶彣 analog-6.0/lang/jpe.lng0000644000175000017500000003027210161303540015134 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Japanese version by Kaori Chikenji, ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp), ## Motonobu Takahashi (monyo@home.monyo.com), ## and Kazuto Ishigaki (ishigaki-ml@factory.gr.jp) 2002 Feb. 24 ## ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp) 2004 Feb. 18 ## ## Note: Be careful to use the same character set in all the configuration ## files, i.e., jp?.lng (this file), jp?.cfg, jp?dom.tab, jp?desc.txt. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP *EUC-JP ## Abbreviations for the day and month names. 1 2 3 4 5 6 7 8 9 10 11 12 ## Next some standard common words. ## Abbreviation for "week beginning" Ƭ ǯ ## Quarter of a year 4Ⱦ ʬ ʬ Х Х ## ?bytes represents kbytes, Mbytes etc. ?Х ꥯ ꥯ ǯ ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 ǯ ϻ ǽ ǽ ե ե ۥ ۥ ۥۥ ۥۥ ǥ쥯ȥ ǥ쥯ȥ ɥᥤ ɥᥤ ȿ ȿ ĥ ĥ URL URL ֥饦 ֥饦 OS OS ## (= operating system, operating systems) 桼 桼 ֥ ֥ ֥Ф ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. ᥬ (10) ƥ (1) ڥ (1) (100) (10Զ) å (1ͽ) ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Τγ ## The time reports, plus "busiest" strings (at the bottom of each report) ǯ̥ݡ Ǥ⺮ǯ : 4Ⱦ̥ݡ Ǥ⺮4Ⱦ : ̥ݡ Ǥ⺮ : ̥ݡ Ǥ⺮ (դ飱) ̽ ̥ݡ Ǥ⺮ : ̥ݡ ̽ ֽ̻ Ǥ⺮ : 15ʬֳ֥ݡ 15ʬֳֽ Ǥ⺮15ʬ : 5ʬֳ֥ݡ 5ʬֳֽ Ǥ⺮5ʬ : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! ۥȥݡ ۥ ۥ n ۥȥ쥯ݡ ۥ ۥ n ۥݡ ۥ ۥ n ǥ쥯ȥݡ ǥ쥯ȥ ǥ쥯ȥ n ե̥ݡ ĥ ĥ n ꥯȥݡ ե ե n 쥯ݡ ե ե n ꥯݡ ե ե n ȸݡ ȸURL ȸURL n ȸȥݡ ȸ ȸ n ȸ쥯ݡ ȸURL ȸURL n ȸݡ ȸURL ȸURL n ݡ n ݡ n ݡ n ݡ n ۥۥȥݡ ۥۥ ۥۥ n ۥۥȥ쥯ݡ ۥۥ ۥۥ n ۥۥݡ ۥۥ ۥۥ n 桼ݡ 桼 桼 n 桼쥯ݡ 桼 桼 n 桼ݡ 桼 桼 n ֥饦 ֥饦 ֥饦 n ֥饦ݡ ֥饦 ֥饦 n OSݡ OS OS n ɥᥤݡ ɥᥤ ɥᥤ n ȿ̥ݡ ȿ ȿ n ơɥݡ ơ ơ n ׻֥ݡ ե륵ݡ ## Used at the bottom of the report ݡȽϥե : <1 ## Used in the time reports 1ñ 뤤Ϥ̤ɽ ڡꥯȷ ڡꥯȷ ## Used at the bottom of each non-time report: need m, f & n genders * * ¾ ## Used on the pie charts: again need m, f & n genders * * ¾ ## Used at the top of the report ׳ : оݴ : ## Used in the General Summary ꥯ 嵭ʿ ڡꥯ 嵭ʿ ơԺߥԿ ꥯ ꥯȥ쥯 ơդꥯȷ ۤʤꥯȥե ۤʤ륵ӥۥȿ ۾Կ ɬץܿ ǡž 嵭ʿ ο ޤǤľ7֤ν : ľ7 Go To Ƭ ## Some special phrases for particular reports. ## Note to self: these phrases also occur in anlghea3.h and Pnextname(). [̤IPɥ쥹] [ɥᥤ̤̾Ϳ] [̤Υɥᥤ̾] [롼ȥǥ쥯ȥ] [̵ǥ쥯ȥ] [̵ĥ] [ǥ쥯ȥ] ¾Windows ¾UNIX ܥå ̤OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) ꥯȷ ֥ꥯȷ ꥯȷ (%) ֥ꥯȷ (%) ڡ ֥ڡ ڡ (%) ֥ڡ (%) Х ? Х Х () ? Х () Х (%) Х () (%) ֹ ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s ɽ : * * %d %s ɽ : * * %s ɽ : ## "by" in the phrase "listing the top 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests Ǿ ## Different ways of doing floors ꥯȷ (ľ7) ꥯȷ (ľ7) ڡ (ľ7) ڡ (ľ7) 쥯ꥯȷ 쥯ꥯȷ 쥯ꥯȷ (ľ7) 쥯ꥯȷ (ľ7) ꥯȷ ꥯȷ ꥯȷ (ľ7) ꥯȷ (ľ7) % ̿ % ̿ (ľ7) % κ̿ % κ̿ (ľ7) (ž) Х (ž) Х ## ?bytes represents kbytes, Mbytes etc. ? ХȤΥǡž (ž) Х (ľ7) (ž) Х (ľ7) ? (ž) Х (ľ7) ǽΥꥯ : ǽΥ쥯ꥯ : ǽΥꥯ : ǽΥꥯ : ǽΥ쥯ꥯ : ǽꥯ : ## Now "sorted by": again, in m, f & n (only needed in plural though) * * Ƚ ## Used at the top of each report ΥݡȤΥǡ״ : ## Used in pie charts 𷿤γ : ## different ways of sorting ̿ ľ7֤Υǡž % Υꥯȷ ľ7֤ % Υꥯȷ % κꥯȷ ľ7֤ % κꥯȷ ꥯȿ ľ7֤Υꥯȷ % Υڡꥯȷ ľ7֤ % Υڡȷ % κڡꥯȷ ľ7֤ % κڡꥯȷ ڡꥯȷ ľ7֤Υڡꥯȷ % Υ쥯ꥯȷ ľ7֤ % Υ쥯ꥯȷ % κ쥯ꥯȷ ľ7֤ % κ쥯ꥯȷ 쥯ꥯȿ ľ7֤Υ쥯ꥯȷ % ꥯȷ ľ7֤ % ꥯȷ % κꥯȷ ľ7֤ % κꥯȷ ꥯȷ ľ7֤ꥯȷ ǽꥯȻ ǽ쥷ꥯȻ ǽꥯȻ ǽΥꥯȻ ǽΥ쥯ꥯȻ ǽꥯȻ ## 3 other ways of sorting in m, f, & n * * Ƚϥե٥å * * ȽϾ֥ * * ̵ ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Yǯ%m%D %H%nʬ ## "Program started at" and "Analysed requests from" %Yǯ%m%D(%w) %H%nʬ ## In Daily Report %Yǯ%m%d ## In Daily Summary %w ## In Hourly Report %Yǯ%m%d %H%nʬ%x%I%oʬ ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%nʬ%x%I%oʬ ## In Quarter-Hour and Five-Minute Reports %Yǯ%m%d %H%nʬ%x%I%oʬ ## In Quarter-Hour and Five-Minute Summaries %H%nʬ%x%I%oʬ ## In Weekly Report %Yǯ%m%d ## In Monthly Report %Yǯ%m ## In Quarterly Report %Yǯ %m%x%l ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Yǯ ## The date (d) column in non-time reports %Yǯ%m%D ## The date & time (D) column in non-time reports %Yǯ%m%D %H%nʬ ## In non-time reports: "including all files with requests since [date]" %Yǯ%m%D %H%nʬ ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 ³ 101 ץȥѹ 1xx [ξ] 200 OK 201 202 νȤƼ 203 ǧ 204 ̵ 205 ǡν 206 Ҿ 2xx [] 300 ʣ 301 Ūư 302 ¾˰ư 303 ¾򻲾 304 Ƕθѹ̵ 305 ץѤ 306 ץѹ 307 Ūư 3xx [Υ쥯] 400 ˡꥯ 401 ǧ 402 ׻ʧ 403 ػ 404 ڡԺ 405 ˡ᥽å 406 ڡԵ 407 ץˤǧ 408 ڤ 409 ꥯȤϥڡ̷ 410 ڡ 411 Ĺ 412 Ω 413 ꥯȥǡĶ 414 ꥯȥե̾ĹĶ 415 ̤ݡȤΥǥ 416 ꥯΰ۾ 417 ׵ 4xx [Υ桼顼] 500 顼 501 ̤ݡȥꥯ 502 г顼 503 Ūǽ 504 ȥڤ 505 ̤ݡHTTPС 506 쥯 5xx [ΥХ顼] xxx [¾] analog-6.0/lang/jpedesc.txt0000644000175000017500000001002110161303540016020 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report ΥݡȤϡǯ̤פɽޤ # Quarterly Report ΥݡȤϡ4Ⱦפɽޤ # Monthly Report ΥݡȤϡ̤פɽޤ # Weekly Report ΥݡȤϡ̤פɽޤ # Daily Report ΥݡȤϡ̤פɽޤ # Hourly Report ΥݡȤϡ̤פɽޤ # Quarter-Hour Report ΥݡȤϡ15ʬֳ֤פɽޤ # Five-Minute Report ΥݡȤϡ5ʬֳ֤פɽޤ # Daily Summary ΥݡȤϡƤν¤פɽޤ # Hourly Summary ΥݡȤϡƤλ¤פɽޤ # Hour of the Week Summary ΥݡȤϡƤνλ¤פɽޤ # Quarter-Hour Summary ΥݡȤϡƤ15ʬֳ֤¤פɽޤ # Five-Minute Summary ΥݡȤϡƤ5ʬֳ֤¤פɽޤ # General Summary ΥݡȤϡΤפɽޤ # Request Report ΥݡȤϡȤΥեפɽޤ # Redirection Report ΥݡȤϡ̤Υեإ쥯󤷤եפɽޤ(̾쥯롢Ǹ˥å̵ǥ쥯ȥ꤫CGI ץȤǤ롣) # Failure Report ΥݡȤϡ֥ե뤬ĤʤΥ顼եפɽޤ # File Type Report ΥݡȤϡեγĥҤפɽޤ # Directory Report ΥݡȤϡե뤬ꥯȤ줿ǥ쥯ȥפɽޤ(ƥǥ쥯ȥοͤƤΥ֥ǥ쥯ȥޤߤޤ) # Host Report ΥݡȤϡեꥯȤԥ塼פɽޤ # Host Redirection Report ΥݡȤϡ̥եإ쥯󤵤줿ԥ塼פɽޤ # Host Failure Report ΥݡȤϡꥯȤ˼Ԥԥ塼פɽޤ # Domain Report ΥݡȤϡեꥯȤԥ塼ιפɽޤ # Referrer Report ΥݡȤϡ(󥯡뤤ϤΥȤβޤڡéäƤ) ȸפɽޤ # Referring Site Report ΥݡȤϡȸΥФפɽޤ # Redirected Referrer Report ΥݡȤϡ쥯򵯤ȸפɽޤ # Failed Referrer Report ΥݡȤϡΥȤؤΥڤλȸפɽޤ # Browser Report ΥݡȤϡ桼Υ֥饦פɽޤ # Virtual Host Report ΥݡȤϡΥȤγƲۥɥᥤפɽޤ # Virtual Host Redirection Report ΥݡȤϡƲۥɥᥤإ쥯󤵤줿ꥯȤפɽޤ # Virtual Host Failure Report ΥݡȤϡƲۥɥᥤؤꥯȤפɽޤ # User Report ΥݡȤϡ桼ǧڤ뤫åǧꤵ줿ȤեꥯȤ桼פɽޤ # User Redirection Report ΥݡȤϡ̥եإ쥯󤵤줿桼פɽޤ # User Failure Report ΥݡȤϡꥯȤ˼Ԥ桼פɽޤ # Organisation Report ΥݡȤϡեꥯȤ򤷤ԥ塼Υɥᥤפɽޤ # Search Query Report ΥݡȤϡ桼ΥȤȯΤˡ󥸥ǻѤפɽޤ # Search Word Report ΥݡȤϡ桼ΥȤȯΤˡ󥸥ǻѤñפɽޤ # Internal Search Query Report ΥݡȤϡ桼ΥǡץȤǻѤפɽޤ # Internal Search Word Report ΥݡȤϡ桼ΥǡץȤǻѤñפɽޤ # Browser Summary ΥݡȤϡ桼λѤ֥饦Υ٥פɽޤ # Operating System Report ΥݡȤϡ桼λѤ OS פɽޤ # File Size Report ΥݡȤϡե礭פɽޤ # Status Code Report ΥݡȤϡƤΥꥯȤ HTTP ֥ɤפɽޤ # Processing Time Report ΥݡȤϡꥯȤν֤פɽޤ analog-6.0/lang/jpedom.tab0000644000175000017500000001253610161303540015625 0ustar sret1sret100000000000000# ̤Ӵץɥᥤ aero 2 Ҷ͢ȳ arpa 1 󥿡ͥåȥե biz 2 ӥͥ com 2 ȿ coop 2 Ʊȹ edu 2 ƹ鵡 gov 2 ƹܵ info 2 ̡ʾ int 2 ݵ mil 2 ƹ񷳻 museum 2 ʪ/Ѵ name 3 Ŀ̾ net 2 ͥåȥ org 2 ȿ pro 3 # ̥ɥɥᥤ̾ ac 1 󥷥 ad 2 ɥ鲦 ae 3 ּĹϢˮ af 1 ե˥ ag 2 ƥС֡ ai 1 󥮥 al 1 Х˥ am 2 ˥ an 1 Υƥ ao 1 󥴥 aq 1 ar 3 를 as 1 ꥫ󥵥⥢ at 3 ȥꥢ au 3 ȥꥢ aw 1 az 1 Х ba 3 ܥ˥إĥӥ bb 2 ХХɥ bd 1 Х󥰥ǥ be 2 ٥륮 bf 1 ֥륭ʥե bg 2 ֥륬ꥢ bh 1 С졼 bi 1 ֥ bj 1 ٥ʥ (ۡ) bm 1 Сߥ塼 bn 1 ֥ͥ bo 3 ܥӥ br 3 ֥饸 bs 1 Хϥ bt 1 ֡ bv 1 ֡ bw 1 ܥĥ by 1 ٥롼 bz 1 ٥꡼ ca 3 ʥ cc 1 () cd 1 ̱綦¹ (쥶) cf 1 եꥫ¹ cg 1 ch 2 ci 1 ȥܥ (ݲ糤) ck 1 å cl 2 cm 1 롼 cn 3 ڿ̱¹ co 3 ӥ cr 3 ꥫ cs 1 ӥ뤤ϥƥͥ cu 1 塼 cv 1 ݥ٥ cx 1 ꥹޥ cy 3 ץ cz 2 de 2 ɥ dj 1 ֥ dk 2 ǥޡ dm 2 ɥߥ˥ do 2 ɥߥ˥¹ dz 1 른ꥢ ec 3 ɥ ee 2 ȥ˥ eg 3 ץ eh 1 ϥ er 1 ȥꥢ es 2 ڥ et 1 ԥ fi 2 ե fj 3 ե fk 1 եɽ fm 1 ߥͥ fo 1 ե fr 2 ե fx 1 ե (Ϣ) ga 1 ܥ gb 1 ֥ƥ gd 1 ʥ ge 1 른 gf 1 եΥ˥ gg 1 ͥ祬󥸥 gh 3 gi 1 ֥륿 gl 1 ꡼ gm 1 ӥ gn 1 ˥ gp 1 롼 gq 1 ƻ˥ gr 2 ꥷ gs 1 硼ɥå gt 3 ƥޥ gu 1 gw 1 ˥ӥ gy 1 hk 3 hm 1 ϡɡޥɥʥɽ hn 2 ۥ󥸥饹 hr 2 ht 1 ϥ hu 2 ϥ󥬥꡼ id 3 ɥͥ ie 2 il 3 饨 im 1 ޥ in 3 io 1 Υϰ iq 1 饯 ir 1 is 2 it 2 ꥢ je 1 ͥ祸㡼 jm 3 ޥ jo 3 jp 3 ke 3 ˥ kg 1 륮 kh 1 ܥ ki 1 Х km 1 kn 1 ȥꥹȥեͥӥ kp 1 ī̱¹ kr 3 ̱ kw 3 ky 1 ޥ kz 1 ե la 1 饪 lb 3 ХΥ lc 1 ȥ륷 li 2 ҥƥ󥷥奿 lk 1 lr 1 ٥ꥢ ls 1 쥽 lt 2 ȥ˥ lu 2 륯֥륯 lv 2 ȥӥ ly 1 ӥ ma 1 å mc 2 ʥ md 1 ɥ mg 1 ޥ mh 1 ޡ mk 3 ޥɥ˥ ml 1 ޥ mm 1 ߥޡ mn 1 󥴥 mo 1 ޥ mp 1 ̥ޥꥢʽ mq 1 ޥˡ mr 1 ⡼꥿˥ ms 1 ȥ mt 3 ޥ륿 mu 1 ⡼ꥷ㥹 mv 1 ǥ mw 1 ޥ饦 mx 3 ᥭ my 3 ޥ졼 mz 1 ⥶ӡ na 1 ʥߥӥ nc 1 ˥塼ɥ˥ ne 1 ˥ nf 1 Ρե ng 1 ʥꥢ ni 3 ˥饰 nl 2 no 2 Υ륦 np 1 ͥѡ nr 1 ʥ nu 1 ˥ nz 3 ˥塼 om 1 ޡ pa 3 ѥʥ pe 3 ڥ롼 pf 1 եΥݥͥ pg 3 ѥץ˥塼˥ ph 3 եԥ pk 3 ѥ pl 3 ݡ pm 1 ԥ硦ߥ pn 1 ԥȥ pr 1 ץȥꥳ ps 1 ѥ쥹 pt 2 ݥȥ pw 1 ѥ饪 py 3 ѥ饰 qa 1 re 1 ˥ ro 2 롼ޥ˥ ru 2 Ϣˮ rw 1 sa 3 ӥ sb 1 sc 1 sd 1 se 2 ǥ sg 3 󥬥ݡ sh 1 ȥإ si 2 ٥˥ sj 1 СХ硦ޥ sk 2 Х sl 1 쥪 sm 1 ޥ sn 1 ͥ so 1 ޥꥢ sr 1 ʥ st 1 ȥᡦץ󥷥 su 2 쥽ӥϢˮ sv 3 륵Хɥ sy 1 ꥢ sz 1 兩 tc 1 硦 td 1 tf 1 եζ tg 1 ȡ th 3 tj 1 tk 1 ȥ饦 tl 1 ⡼ tm 1 ȥ륯˥ tn 1 ˥ to 1 ȥ tp 1 ƥ⡼ tr 3 ȥ륳 tt 3 ȥ˥ɡȥХ tv 1 ĥХ tw 3 tz 1 󥶥˥ ua 3 饤 ug 3 uk 3 ꥹ um 1 ʿν us 4 ꥫ罰 uy 3 륰 uz 1 ٥ va 1 ХԹ vc 1 ȥӥ󥻥Ȥӥʥǥ ve 3 ٥ͥ vg 1 ΥС vi 1 ΥС vn 1 ٥ȥʥ vu 1 Х̥ wf 1 ꥹեƥʽ ws 1 ⥢ ye 1 yt 1 ޥå yu 3 桼ӥ za 3 եꥫ¹ zm 1 ӥ zr 1 ̱綦¹ (쥶) zw 3 Х֥ analog-6.0/lang/jpeform.html0000644000175000017500000002105210161303540016200 0ustar sret1sret100000000000000 Analog եࡦ󥿥ե

Analog եࡦ󥿥ե


1. ݡȤ

: ʲλؼ˽äƴĶꤷޤǡ ΥեưʤǤ礦㤨Сܥ󤵤ʤ⤷ޤ Ķλ塢ʸƤ
ġΥݡȤξܺ٤ʰ̣ˤĤƤ analog Υۡڡ 򻲾ȤƤ

ɤΥݡȤɽޤ?


[On] [Off] Τγ
[On] [Off] ̥ݡ
[On] [Off] ̥ݡ
[On] [Off] ̳
[On] [Off] ̥ݡ
[On] [Off] ̳
[On] [Off] ̥ݡ
[On] [Off] 15ʬֳ֥ݡ
[On] [Off] ɥᥤݡ
[On] [Off] ȿ̥ݡ
[On] [Off] ǥ쥯ȥݡ
[On] [Off] ե̥ݡ
[On] [Off] ꥯȥݡ
[On] [Off] ե륵ݡ
[On] [Off] ȸݡ
[On] [Off] ݡ
[On] [Off] ݡ
[On] [Off] ۥȥݡ
[On] [Off] ֥饦ݡ
[On] [Off] ֥饦γ
[On] [Off] OS ݡ
[On] [Off] ơɥݡ

ץμ¹ :
⤷ϡġΥݡȤˤĤơ ʲΥץꤹǤޤ ϡ10MХȰʾιܤɽޤƱͤ ϡХȿ¿ 50 ̤ɽޤ


2. ݡȤξܺ٥ץ

ɥᥤݡȤΥץ

ɥᥤݡȤΥȽ
ʤȤ ʾΥɥᥤƴޤࡣ

ȿ̥ݡȤΥץ

ȿ̥ݡȤΥȽ
ʤȤ ʾȿƴޤࡣ

ǥ쥯ȥݡȤΥץ

ǥ쥯ȥݡȤΥȽ
ʤȤ ʾΥǥ쥯ȥƴޤࡣ

ꥯȥݡȤΥץ

ꥯȥݡȤΥȽ
ʤȤ ʾΥեƴޤࡣ
ɽϡ оݤȤ롣

ȸݡȤΥץ

ȸݡȤΥȽ
ʤȤ ʾλȸ URL ƴޤࡣ

3. եʬ

Τ
ΥꥯȤϤǽǤ ϤդϰϤʲΤ褦 yymmdd ηϤƤ : 980301 1998ǯ31 (ϰϤ¤ϡ ΥեɤƤ)
ޤ

ΥեΤ
ʲΥեΤߤоݤȤޤ (ޤǶڤä󤷤Ƥ 磻ɥɤȤ * ޤǤޤ)

ʲΥեϽޤ


4. 쥤

ʤȿ̾ (ڡΥȥ)

ȿΥۡڡ (פξ϶ΤޤޤˤƤ)
URL :


analog-6.0/lang/jpj.cfg0000644000175000017500000000420010161303540015110 0ustar sret1sret100000000000000LANGUAGE JAPANESE-JIS SUBDOMAIN ad.jp $B4IM}AH?%(J SUBDOMAIN ac.jp $BBg3X!&@lLg3X9;$J$I(J SUBDOMAIN co.jp $B4k6H(J SUBDOMAIN go.jp $B@/I\5!4X(J SUBDOMAIN or.jp $B3Fk8)(J SUBDOMAIN akita.jp $B=)ED8)(J SUBDOMAIN yamagata.jp $B;37A8)(J SUBDOMAIN fukushima.jp $BJ!Eg8)(J SUBDOMAIN ibaraki.jp $B0q>k8)(J SUBDOMAIN tochigi.jp $BFJLZ8)(J SUBDOMAIN gunma.jp $B72GO8)(J SUBDOMAIN saitama.jp $B:k6L8)(J SUBDOMAIN chiba.jp $B@iMU8)(J SUBDOMAIN tokyo.jp $BEl5~ET(J SUBDOMAIN kanagawa.jp $B?@F`@n8)(J SUBDOMAIN niigata.jp $B?73c8)(J SUBDOMAIN toyama.jp $BIY;38)(J SUBDOMAIN ishikawa.jp $B@P@n8)(J SUBDOMAIN fukui.jp $BJ!0f8)(J SUBDOMAIN yamanashi.jp $B;3M|8)(J SUBDOMAIN nagano.jp $BD9Ln8)(J SUBDOMAIN gifu.jp $B4tIl8)(J SUBDOMAIN shizuoka.jp $B@E2,8)(J SUBDOMAIN aichi.jp $B0&CN8)(J SUBDOMAIN mie.jp $B;0=E8)(J SUBDOMAIN shiga.jp $B<"2l8)(J SUBDOMAIN kyoto.jp $B5~ETI\(J SUBDOMAIN osaka.jp $BBg:eI\(J SUBDOMAIN hyogo.jp $BJ<8K8)(J SUBDOMAIN nara.jp $BF`NI8)(J SUBDOMAIN wakayama.jp $BOB2N;38)(J SUBDOMAIN tottori.jp $BD;8E20;T(J SUBDOMAIN kobe.jp $B?@8M;T(J SUBDOMAIN kitakyushu.jp $BKL6e=#;T(J analog-6.0/lang/jpj.lng0000644000175000017500000003576310161303540015153 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Japanese version by Kaori Chikenji, ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp), ## Motonobu Takahashi (monyo@home.monyo.com), ## and Kazuto Ishigaki (ishigaki-ml@factory.gr.jp) 2002 Feb. 24 ## ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp) 2004 Feb. 18 ## ## Note: Be careful to use the same character set in all the configuration ## files, i.e., jp?.lng (this file), jp?.cfg, jp?dom.tab, jp?desc.txt. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP *ISO-2022-JP ## Abbreviations for the day and month names. $BF|(B $B7n(B $B2P(B $B?e(B $BLZ(B $B6b(B $BEZ(B 1 2 3 4 5 6 7 8 9 10 11 12 ## Next some standard common words. ## Abbreviation for "week beginning" $B=5@hF,F|(B $BG/(B ## Quarter of a year 4$BH>4|(B $B7n(B $BF|(B $BF|(B $B;~4V(B $BJ,(B $BJ,(B $BIC(B $BIC(B $B%P%$%H(B $B%P%$%H(B ## ?bytes represents kbytes, Mbytes etc. ?$B%P%$%H(B $B%j%/%(%9%H(B $B%j%/%(%9%H(B $BG/7nF|(B ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 $BG/7nF|(B $B;~4VBS(B $B;~(B $B3+;OF|(B $B3+;O;~9o(B $B:G=*%"%/%;%9F|;~(B $B:G=*%"%/%;%9;~9o(B $B%U%!%$%k(B $B%U%!%$%k(B $B%[%9%H(B $B%[%9%H(B $B2>A[%[%9%H(B $B2>A[%[%9%H(B $B%G%#%l%/%H%j(B $B%G%#%l%/%H%j(B $B%I%a%$%s(B $B%I%a%$%s(B $BAH?%(B $BAH?%(B $B3HD%;R(B $B3HD%;R(B URL URL $B%V%i%&%6(B $B%V%i%&%6(B OS OS ## (= operating system, operating systems) $B%5%$%:(B $B8!:w8l(B $B8!:w9`L\(B $B%5%$%H(B $B%5%$%H(B $B%f!<%6(B $B%f!<%6(B $B>uBV%3!<%I(B $B>uBV%3!<%I(B $B%&%'%V%5!<%P$NE}7W(B ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. $B%-%m(B $B%a%,(B $B%.%,(B (10$B2/(B) $B%F%i(B (1$BC{(B) $B%Z%?(B (1$B@iC{(B) $B%(%/%5(B (100$B5~(B) $B% 1GB ## Now the names of reports $BA4BN$N35MW(B ## The time reports, plus "busiest" strings (at the bottom of each report) $BG/JL%l%]!<%H(B $B:G$b:.;($7$?G/(B : 4$BH>4|JL%l%]!<%H(B $B:G$b:.;($7$?(B4$BH>4|(B : $B7nJL%l%]!<%H(B $B:G$b:.;($7$?7n(B : $B=5JL%l%]!<%H(B $B:G$b:.;($7$?=5(B ($B1&$NF|IU$+$i#1=54V(B)$B!'(B $BMKF|JL=87W(B $BF|JL%l%]!<%H(B $B:G$b:.;($7$?F|(B : $B;~4VJL%l%]!<%H(B $B;~4VJL=87W(B $BMKF|JL;~4V=87W(B $B:G$b:.;($7$?;~4V(B : 15$BJ,4V3V%l%]!<%H(B 15$BJ,4V3V=87W(B $B:G$b:.;($7$?(B15$BJ,4V(B : 5$BJ,4V3V%l%]!<%H(B 5$BJ,4V3V=87W(B $B:G$b:.;($7$?(B5$BJ,4V(B : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! $B%[%9%H%l%]!<%H(B $B%[%9%H(B $B%[%9%H(B n $B%[%9%H%j%@%$%l%/%7%g%s%l%]!<%H(B $B%[%9%H(B $B%[%9%H(B n $B%[%9%HIT@.8y%l%]!<%H(B $B%[%9%H(B $B%[%9%H(B n $B%G%#%l%/%H%j%l%]!<%H(B $B%G%#%l%/%H%j(B $B%G%#%l%/%H%j(B n $B%U%!%$%kH85%l%]!<%H(B $B;2>H85(BURL $B;2>H85(BURL n $B;2>H85%5%$%H%l%]!<%H(B $B;2>H85%5%$%H(B $B;2>H85%5%$%H(B n $B;2>H85%j%@%$%l%/%7%g%s%l%]!<%H(B $B;2>H85(BURL $B;2>H85(BURL n $B;2>H85IT@.8y%l%]!<%H(B $B;2>H85(BURL $B;2>H85(BURL n $B8!:w8l6g%l%]!<%H(B $B8!:w8l6g(B $B8!:w8l6g(B n $B8!:w8l%l%]!<%H(B $B8!:w8l(B $B8!:w8l(B n $BFbIt8!:w8l6g%l%]!<%H(B $B8!:w8l6g(B $B8!:w8l6g(B n $BFbIt8!:w8l%l%]!<%H(B $B8!:w8l(B $B8!:w8l(B n $B2>A[%[%9%H%l%]!<%H(B $B2>A[%[%9%H(B $B2>A[%[%9%H(B n $B2>A[%[%9%H%j%@%$%l%/%7%g%s%l%]!<%H(B $B2>A[%[%9%H(B $B2>A[%[%9%H(B n $B2>A[%[%9%HIT@.8y%l%]!<%H(B $B2>A[%[%9%H(B $B2>A[%[%9%H(B n $B%f!<%6%l%]!<%H(B $B%f!<%6(B $B%f!<%6(B n $B%f!<%6%j%@%$%l%/%7%g%s%l%]!<%H(B $B%f!<%6(B $B%f!<%6(B n $B%f!<%6IT@.8y%l%]!<%H(B $B%f!<%6(B $B%f!<%6(B n $B%V%i%&%6=87W(B $B%V%i%&%6(B $B%V%i%&%6(B n $B%V%i%&%6%l%]!<%H(B $B%V%i%&%6(B $B%V%i%&%6(B n OS$B%l%]!<%H(B OS OS n $B%I%a%$%s%l%]!<%H(B $B%I%a%$%s(B $B%I%a%$%s(B n $BAH?%JL%l%]!<%H(B $BAH?%(B $BAH?%(B n $B%9%F!<%?%9%3!<%I%l%]!<%H(B $B%9%F!<%?%9%3!<%I(B $B%9%F!<%?%9%3!<%I(B n $B=jMW;~4V%l%]!<%H(B $B%U%!%$%k%5%$%:%l%]!<%H(B ## Used at the bottom of the report $B%l%]!<%H=PNO%=%U%H(B : $B=hM};~4V(B <1 ## Used in the time reports 1$BC10L(B $B$O(B $B$"$k$$$O$=$NCML$K~$rI=$9(B $B%Z!<%8%j%/%(%9%H7o?t(B $B%Z!<%8%j%/%(%9%H7o?t(B ## Used at the bottom of each non-time report: need m, f & n genders * * $B$=$NB>(B ## Used on the pie charts: again need m, f & n genders * * $B$=$NB>(B ## Used at the top of the report $BE}7W3+;OF|;~(B : $B2r@OBP>]4|4V(B : $B!A(B ## Used in the General Summary $B%j%/%(%9%H@.8y7o?t(B $B>e5-$NF|JLJ?6Q(B $B%Z!<%8%j%/%(%9%H@.8y7o?t(B $B>e5-$NF|JLJ?6Q(B $B%9%F!<%?%9%3!<%IIT:_%m%09T?t(B $B%j%/%(%9%HIT@.8y7o?t(B $B%j%/%(%9%H%j%@%$%l%/%7%g%s7o?t(B $B%9%F!<%?%9%3!<%IIU$-%j%/%(%9%H7o?t(B $B0[$J$k%j%/%(%9%H%U%!%$%k?t(B $B0[$J$k%5!<%S%9%[%9%H?t(B $B0[>o%m%09T?t(B $BITI,MW%m%09`L\?t(B $B%G!<%?E>AwNL(B $B>e5-$NF|JLJ?6Q(B $B3g8LFb$N?t;z$O(B $B1&$NF|;~$^$G$ND>6a(B7$BF|4V$N=87W(B : $BD>6a(B7$BF|4V(B Go To $B@hF,(B ## Some special phrases for particular reports. ## Note to self: these phrases also occur in anlghea3.h and Pnextname(). [$BL$2r7h(BIP$B%"%I%l%9(B] [$B%I%a%$%sL>L$IUM?(B] [$BL$CN%I%a%$%sL>(B] [$B%k!<%H%G%#%l%/%H%j(B] [$BL5%G%#%l%/%H%j(B] [$BL53HD%;R(B] [$B%G%#%l%/%H%j(B] $B$=$NB>$N(BWindows $B$=$NB>$N(BUNIX $B%m%\%C%H(B $BL$CN(BOS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) $B%j%/%(%9%H7o?t(B $B=54V%j%/%(%9%H7o?t(B $B%j%/%(%9%H7o?t(B (%) $B=54V%j%/%(%9%H7o?t(B (%) $B%Z!<%8?t(B $B=54V%Z!<%8?t(B $B%Z!<%8?t(B (%) $B=54V%Z!<%8?t(B (%) $B%P%$%H(B ? $B%P%$%H(B $B%P%$%H(B ($B=54V(B) ? $B%P%$%H(B ($B=54V(B) $B%P%$%H(B (%) $B%P%$%H(B ($B=54V(B) (%) $BHV9f(B ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * $B>e0L(B %s $B$NI=(B : * * $B>e0L(B %d %s $B$NI=(B : * * %s $B$NI=(B : ## "by" in the phrase "listing the top 3 files BY number of requests" $B4p=`$O(B ## All requests WITH AT LEAST 10 requests $B:G>.$O(B ## Different ways of doing floors $B%j%/%(%9%H7o?t(B ($BD>6a(B7$BF|4V(B) $B%j%/%(%9%H7o?t(B ($BD>6a(B7$BF|4V(B) $B%Z!<%8?t(B ($BD>6a(B7$BF|4V(B) $B%Z!<%8?t(B ($BD>6a(B7$BF|4V(B) $B%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B $B%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B $B%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B ($BD>6a(B7$BF|4V(B) $B%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B ($BD>6a(B7$BF|4V(B) $BIT@.8y%j%/%(%9%H7o?t(B $BIT@.8y%j%/%(%9%H7o?t(B $BIT@.8y%j%/%(%9%H7o?t(B ($BD>6a(B7$BF|4V(B) $BIT@.8y%j%/%(%9%H7o?t(B ($BD>6a(B7$BF|4V(B) % $B$NDL?.NL(B % $B$NDL?.NL(B ($BD>6a(B7$BF|4V(B) % $B$N:GBgDL?.NL(B % $B$N:GBgDL?.NL(B ($BD>6a(B7$BF|4V(B) ($BE>Aw(B) $B%P%$%H(B ($BE>Aw(B) $B%P%$%H(B ## ?bytes represents kbytes, Mbytes etc. ? $B%P%$%H$N%G!<%?E>AwNL(B ($BE>Aw(B) $B%P%$%H(B ($BD>6a(B7$BF|4V(B) ($BE>Aw(B) $B%P%$%H(B ($BD>6a(B7$BF|4V(B) ? ($BE>Aw(B) $B%P%$%H(B ($BD>6a(B7$BF|4V(B) $B:G=*$N%j%/%(%9%HF|;~(B : $B:G=*$N%j%@%$%l%/%7%g%s%j%/%(%9%HF|;~(B : $B:G=*$N%j%/%(%9%HIT@.8yF|;~(B : $B:G=i$N%j%/%(%9%HF|;~(B : $B:G=i$N%j%@%$%l%/%7%g%s%j%/%(%9%HF|;~(B : $B:G=i$NIT@.8y%j%/%(%9%HF|;~(B : ## Now "sorted by": again, in m, f & n (only needed in plural though) * * $B%=!<%H=g$O(B ## Used at the top of each report $B$3$N%l%]!<%H$N%G!<%?=87W4|4V(B : ## Used in pie charts $B@p7?$N3QEY(B : ## different ways of sorting $BDL?.NL(B $BD>6a(B7$BF|4V$N%G!<%?E>AwNL(B % $B$N%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N%j%/%(%9%H7o?t(B % $B$N:GBg%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N:GBg%j%/%(%9%H7o?t(B $B%j%/%(%9%H?t(B $BD>6a(B7$BF|4V$N%j%/%(%9%H7o?t(B % $B$N%Z!<%8%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N%Z!<%8%/%(%9%H7o?t(B % $B$N:GBg%Z!<%8%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N:GBg%Z!<%8%j%/%(%9%H7o?t(B $B%Z!<%8%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N%Z!<%8%j%/%(%9%H7o?t(B % $B$N%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B % $B$N:GBg%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N:GBg%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B $B%j%@%$%l%/%7%g%s%j%/%(%9%H?t(B $BD>6a(B7$BF|4V$N%j%@%$%l%/%7%g%s%j%/%(%9%H7o?t(B % $B$NIT@.8y%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$NIT@.8y%j%/%(%9%H7o?t(B % $B$N:GBgIT@.8y%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$N(B % $B$N:GBgIT@.8y%j%/%(%9%H7o?t(B $BIT@.8y%j%/%(%9%H7o?t(B $BD>6a(B7$BF|4V$NIT@.8y%j%/%(%9%H7o?t(B $B:G=*%j%/%(%9%H;~9o(B $B:G=*%j%@%$%l%7%g%s%j%/%(%9%H;~9o(B $B:G=*IT@.8y%j%/%(%9%H;~9o(B $B:G=i$N%j%/%(%9%H;~9o(B $B:G=i$N%j%@%$%l%/%7%g%s%j%/%(%9%H;~9o(B $B:G=i$NIT@.8y%j%/%(%9%H;~9o(B ## 3 other ways of sorting in m, f, & n * * $B%=!<%H=g$O%"%k%U%!%Y%C%H(B * * $B%=!<%H=g$O>uBV%3!<%I(B * * $B%=!<%HL5$7(B ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. $B8aA0(B $B8a8e(B ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y$BG/(B%m$B7n(B%D$BF|(B %H$B;~(B%n$BJ,(B ## "Program started at" and "Analysed requests from" %Y$BG/(B%m$B7n(B%D$BF|(B(%w) %H$B;~(B%n$BJ,(B ## In Daily Report %Y$BG/(B%m$B7n(B%d$BF|(B ## In Daily Summary %w ## In Hourly Report %Y$BG/(B%m$B7n(B%d$BF|(B %H$B;~(B%n$BJ,(B%x%I$B;~(B%o$BJ,(B ## In Hourly Summary %h$B;~(B ## In Hour of the Week Summary %w$BMKF|(B %H$B;~(B%n$BJ,(B%x%I$B;~(B%o$BJ,(B ## In Quarter-Hour and Five-Minute Reports %Y$BG/(B%m$B7n(B%d$BF|(B %H$B;~(B%n$BJ,(B%x%I$B;~(B%o$BJ,(B ## In Quarter-Hour and Five-Minute Summaries %H$B;~(B%n$BJ,(B%x%I$B;~(B%o$BJ,(B ## In Weekly Report %Y$BG/(B%m$B7n(B%d$BF|(B ## In Monthly Report %Y$BG/(B%m$B7n(B ## In Quarterly Report %Y$BG/(B %m$B7n(B%x%l$B7n(B ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y$BG/(B ## The date (d) column in non-time reports %Y$BG/(B%m$B7n(B%D$BF|(B ## The date & time (D) column in non-time reports %Y$BG/(B%m$B7n(B%D$BF|(B %H$B;~(B%n$BJ,(B ## In non-time reports: "including all files with requests since [date]" %Y$BG/(B%m$B7n(B%D$BF|(B %H$B;~(B%n$BJ,(B ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 $B7QB3(B 101 $B%W%m%H%3%kJQ99(B 1xx [$BpJs(B] 200 OK 201 $B:n@.@.8y(B 202 $B>-Mh$N=hM}$H$7$FpJsL5$7(B 205 $B%G!<%?$N=i4|2=(B 206 $BCGJR>pJs(B 2xx [$B$K0\F0(B 303 $BB>$r;2>H(B 304 $B:G6a$N8!:w0JMhJQ99L5$7(B 305 $B%W%m%/%7$r;HMQ$;$h(B 306 $B%W%m%/%7$rJQ99$;$h(B 307 $B0l;~E*0\F0(B 3xx [$BZ(B 402 $BMW;YJ'(B 403 $B%"%/%;%96X;_(B 404 $B%Z!<%8IT:_(B 405 $BITK!%a%=%C%I(B 406 $B%Z!<%8$NIT5v2D(B 407 $B%W%m%/%7$K$h$kMWG'>Z(B 408 $B;~4V@Z$l(B 409 $B%j%/%(%9%H$O%Z!<%8$HL7=b(B 410 $B%Z!<%8:o=|:Q(B 411 $BMWD9$5(B 412 $B;vA0>r7oIT@.N)(B 413 $B%j%/%(%9%H%G!<%?$ND62a(B 414 $B%j%/%(%9%H%U%!%$%kL>$ND9$5D62a(B 415 $BL$%5%]!<%H$N%a%G%#%"(B 416 $B%j%/%(%9%HNN0h0[>o(B 417 $BMW5aIT@.8y(B 4xx [$B(B] analog-6.0/lang/jpjdesc.txt0000644000175000017500000001054110161303540016034 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report $B$3$N%l%]!<%H$O!"G/EYJL$NE}7W$rI=$7$^$9!#(B # Quarterly Report $B$3$N%l%]!<%H$O!"(B4$BH>4|Kh$NE}7W$rI=$7$^$9!#(B # Monthly Report $B$3$N%l%]!<%H$O!"7nJL$NE}7W$rI=$7$^$9!#(B # Weekly Report $B$3$N%l%]!<%H$O!"=5JL$NE}7W$rI=$7$^$9!#(B # Daily Report $B$3$N%l%]!<%H$O!"F|JL$NE}7W$rI=$7$^$9!#(B # Hourly Report $B$3$N%l%]!<%H$O!";~4VJL$NE}7W$rI=$7$^$9!#(B # Quarter-Hour Report $B$3$N%l%]!<%H$O!"(B15$BJ,4V3V$NE}7W$rI=$7$^$9!#(B # Five-Minute Report $B$3$N%l%]!<%H$O!"(B5$BJ,4V3V$NE}7W$rI=$7$^$9!#(B # Daily Summary $B$3$N%l%]!<%H$O!"A4$F$N=5$NMKF|JLAmOB$NE}7W$rI=$7$^$9!#(B # Hourly Summary $B$3$N%l%]!<%H$O!"A4$F$NF|$N;~4VJLAmOB$NE}7W$rI=$7$^$9!#(B # Hour of the Week Summary $B$3$N%l%]!<%H$O!"A4$F$N=5$N;~4VJLAmOB$NE}7W$rI=$7$^$9!#(B # Quarter-Hour Summary $B$3$N%l%]!<%H$O!"A4$F$NF|$N(B15$BJ,4V3V$NAmOB$NE}7W$rI=$7$^$9!#(B # Five-Minute Summary $B$3$N%l%]!<%H$O!"A4$F$NF|$N(B5$BJ,4V3V$NAmOB$NE}7W$rI=$7$^$9!#(B # General Summary $B$3$N%l%]!<%H$O!"A4BN$NE}7W$rI=$7$^$9!#(B # Request Report $B$3$N%l%]!<%H$O!"%5%$%H$N%U%!%$%k$NE}7W$rI=$7$^$9!#(B # Redirection Report $B$3$N%l%]!<%H$O!"JL$N%U%!%$%k$X%j%@%$%l%/%7%g%s$7$?%U%!%$%k$NE}7W$rI=$7$^$9!#(B($BDL>o!"%j%@%$%l%/%7%g%s$r6/@)$5$;$k!":G8e$K%9%i%C%7%e$NL5$$%G%#%l%/%H%j$+!"(BCGI $B%9%/%j%W%H$G$"$k!#(B) # Failure Report $B$3$N%l%]!<%H$O!"!V%U%!%$%k$,8+$D$+$i$J$$!WEy$N%(%i!<$r@8$8$5$;$k%U%!%$%k$NE}7W$rI=$7$^$9!#(B # File Type Report $B$3$N%l%]!<%H$O!"%U%!%$%k$N3HD%;R$NE}7W$rI=$7$^$9!#(B # Directory Report $B$3$N%l%]!<%H$O!"%U%!%$%k$,%j%/%(%9%H$5$l$?%G%#%l%/%H%j$NE}7W$rI=$7$^$9!#(B($B3F%G%#%l%/%H%j$N?tCM$OA4$F$N%5%V%G%#%l%/%H%j$b4^$_$^$9!#(B) # Host Report $B$3$N%l%]!<%H$O!"%U%!%$%k$r%j%/%(%9%H$7$?%3%s%T%e!<%?$NE}7W$rI=$7$^$9!#(B # Host Redirection Report $B$3$N%l%]!<%H$O!"JL%U%!%$%k$X%j%@%$%l%/%7%g%s$5$l$?%3%s%T%e!<%?$NE}7W$rI=$7$^$9!#(B # Host Failure Report $B$3$N%l%]!<%H$O!"%j%/%(%9%H$K<:GT$7$?%3%s%T%e!<%?$NE}7W$rI=$7$^$9!#(B # Domain Report $B$3$N%l%]!<%H$O!"%U%!%$%k$r%j%/%(%9%H$7$?%3%s%T%e!<%?$N9qJLE}7W$rI=$7$^$9!#(B # Referrer Report $B$3$N%l%]!<%H$O!"(B($B%j%s%/!"$"$k$$$O$3$N%5%$%H$N2hA|$r4^$`%Z!<%8$rC)$C$F$-$?(B) $B;2>H85$NE}7W$rI=$7$^$9!#(B # Referring Site Report $B$3$N%l%]!<%H$O!";2>H85$N%5!<%P$NE}7W$rI=$7$^$9!#(B # Redirected Referrer Report $B$3$N%l%]!<%H$O!"%j%@%$%l%/%7%g%s$r5/$3$7$?;2>H85$NE}7W$rI=$7$^$9!#(B # Failed Referrer Report $B$3$N%l%]!<%H$O!"$3$N%5%$%H$X$N%j%s%/@Z$l$N;2>H85$NE}7W$rI=$7$^$9!#(B # Browser Report $B$3$N%l%]!<%H$O!"%f!<%6$N%V%i%&%6!<$NE}7W$rI=$7$^$9!#(B # Virtual Host Report $B$3$N%l%]!<%H$O!"$3$N%5%$%H$N3F2>A[%I%a%$%s$NE}7W$rI=$7$^$9!#(B # Virtual Host Redirection Report $B$3$N%l%]!<%H$O!"3F2>A[%I%a%$%s$X%j%@%$%l%/%7%g%s$5$l$?%j%/%(%9%H$NE}7W$rI=$7$^$9!#(B # Virtual Host Failure Report $B$3$N%l%]!<%H$O!"3F2>A[%I%a%$%s$X$NIT@.8y%j%/%(%9%H$NE}7W$rI=$7$^$9!#(B # User Report $B$3$N%l%]!<%H$O!"%f!<%6$,G'>Z$5$l$k$+%/%C%-!<$GG'Dj$5$l$?$H$-!"%U%!%$%k$r%j%/%(%9%H$7$?%f!<%6$NE}7W$rI=$7$^$9!#(B # User Redirection Report $B$3$N%l%]!<%H$O!"JL%U%!%$%k$X%j%@%$%l%/%7%g%s$5$l$?%f!<%6$NE}7W$rI=$7$^$9!#(B # User Failure Report $B$3$N%l%]!<%H$O!"%j%/%(%9%H$K<:GT$7$?%f!<%6$NE}7W$rI=$7$^$9!#(B # Organisation Report $B$3$N%l%]!<%H$O!"%U%!%$%k$r%j%/%(%9%H$r$7$?%3%s%T%e!<%?$N%I%a%$%s$NE}7W$rI=$7$^$9!#(B # Search Query Report $B$3$N%l%]!<%H$O!"%f!<%6$,$3$N%5%$%H$rH/8+$9$k$N$K!"8!:w%(%s%8%s$G;HMQ$7$?8!:w8l6g$NE}7W$rI=$7$^$9!#(B # Search Word Report $B$3$N%l%]!<%H$O!"%f!<%6$,$3$N%5%$%H$rH/8+$9$k$N$K!"8!:w%(%s%8%s$G;HMQ$7$?C18l$NE}7W$rI=$7$^$9!#(B # Internal Search Query Report $B$3$N%l%]!<%H$O!"%f!<%6$,$3$N%5%$%HFb$G!"%9%/%j%W%H$G;HMQ$7$?8!:w8l6g$NE}7W$rI=$7$^$9!#(B # Internal Search Word Report $B$3$N%l%]!<%H$O!"%f!<%6$,$3$N%5%$%HFb$G!"%9%/%j%W%H$G;HMQ$7$?C18l$NE}7W$rI=$7$^$9!#(B # Browser Summary $B$3$N%l%]!<%H$O!"%f!<%6$N;HMQ$7$?%V%i%&%6!<$N%Y%s%@!<$NE}7W$rI=$7$^$9!#(B # Operating System Report $B$3$N%l%]!<%H$O!"%f!<%6$N;HMQ$7$?(B OS $B$NE}7W$rI=$7$^$9!#(B # File Size Report $B$3$N%l%]!<%H$O!"%U%!%$%k$NBg$-$5$NE}7W$rI=$7$^$9!#(B # Status Code Report $B$3$N%l%]!<%H$O!"A4$F$N%j%/%(%9%H$N(B HTTP $B>uBV%3!<%I$NE}7W$rI=$7$^$9!#(B # Processing Time Report $B$3$N%l%]!<%H$O!"@.8y%j%/%(%9%H$N=hM};~4V$NE}7W$rI=$7$^$9!#(B analog-6.0/lang/jpjdom.tab0000644000175000017500000001571210161303540015631 0ustar sret1sret100000000000000# $B0lHL$*$h$S4pHW%I%a%$%s(J aero 2 $B9R6u1?M"6H3&(J arpa 1 $B%$%s%?!<%M%C%H%$%s%U%i(J biz 2 $B%S%8%M%9(J com 2 $B>&6HAH?%(J coop 2 $B6(F1AH9g(J edu 2 $BJF9q9bEy650i5!4X(J gov 2 $BJF9q@/I\5!4X(J info 2 $B0lHL!J>pJs!K(J int 2 $B9q:]5!4X(J mil 2 $BJF9q73;v5!4X(J museum 2 $BGnJ*4[(J/$BH~=Q4[(J name 3 $B8D?ML>(J net 2 $B%M%C%H%o!<%/(J org 2 $BHs1DMxAH?%(J pro 3 $B@lLg2H(J # $B9qJL%3!<%I%I%a%$%sL>(J ac 1 $B%"%;%s%7%g%sEg(J ad 2 $B%"%s%I%i2&9q(J ae 3 $B%"%i%V]2g3$4_(J) ck 1 $B%/%C%/=tEg(J cl 2 $B%A%j(J cm 1 $B%+%a%k!<%s(J cn 3 $BCf2Z?ML16&OB9q(J co 3 $B%3%m%s%S%"(J cr 3 $B%3%9%?%j%+(J cs 1 $B%;%k%S%"$"$k$$$O%b%s%F%M%0%m(J cu 1 $B%-%e!<%P(J cv 1 $B%+!<%]%Y%k%G(J cx 1 $B%/%j%9%^%9Eg(J cy 3 $B%-%W%m%9(J cz 2 $B%A%'%3(J de 2 $B%I%$%D(J dj 1 $B%8%V%A(J dk 2 $B%G%s%^!<%/(J dm 2 $B%I%_%K%+(J do 2 $B%I%_%K%+6&OB9q(J dz 1 $B%"%k%8%'%j%"(J ec 3 $B%(%/%"%I%k(J ee 2 $B%(%9%H%K%"(J eg 3 $B%(%8%W%H(J eh 1 $B@>%5%O%i(J er 1 $B%(%j%H%j%"(J es 2 $B%9%Z%$%s(J et 1 $B%(%A%*%T%"(J fi 2 $B%U%#%s%i%s%I(J fj 3 $B%U%#%8!<(J fk 1 $B%U%)!<%/%i%s%I=tEg(J fm 1 $B%_%/%m%M%7%"(J fo 1 $B%U%'%m!<=tEg(J fr 2 $B%U%i%s%9(J fx 1 $B%U%i%s%9(J ($B2$=#O"9gK\It(J) ga 1 $B%,%\%s(J gb 1 $B%V%j%F%s(J gd 1 $B%0%l%J%@(J ge 1 $B%0%k%8%"(J gf 1 $B%U%i%s%9NN%.%K%"(J gg 1 $B%A%c%M%k=tEg%,!<%s%8%#Eg(J gh 3 $B%,!<%J(J gi 1 $B%8%V%i%k%?%k(J gl 1 $B%0%j!<%s%i%s%I(J gm 1 $B%,%s%S%"(J gn 1 $B%.%K%"(J gp 1 $B%0%"%@%k!<%W(J gq 1 $B@VF;%.%K%"(J gr 2 $B%.%j%7%c(J gs 1 $B%5%&%9%8%g!<%8%"!&%5%&%9%5%s%I%$%C%A=tEg(J gt 3 $B%0%"%F%^%i(J gu 1 $B%0%"%`(J gw 1 $B%.%K%"%S%5%*(J gy 1 $B%,%$%"%J(J hk 3 $B9a9A(J hm 1 $B%O!<%I!&%^%/%I%J%k%I=tEg(J hn 2 $B%[%s%8%e%i%9(J hr 2 $B%/%m%"%A%"(J ht 1 $B%O%$%A(J hu 2 $B%O%s%,%j!<(J id 3 $B%$%s%I%M%7%"(J ie 2 $B%"%$%k%i%s%I(J il 3 $B%$%9%i%(%k(J im 1 $B%^%sEg(J in 3 $B%$%s%I(J io 1 $B1QNN%$%s%IMNCO0h(J iq 1 $B%$%i%/(J ir 1 $B%$%i%s(J is 2 $B%"%$%9%i%s%I(J it 2 $B%$%?%j%"(J je 1 $B%A%c%M%k=tEg%8%c!<%8!%5%b%"(J ye 1 $B%$%(%a%s(J yt 1 $B%^%h%C%HEg(J yu 3 $B%f!<%4%9%i%S%"(J za 3 $BFn%"%U%j%+6&OB9q(J zm 1 $B%6%s%S%"(J zr 1 $B%3%s%4L1 Analog $B%U%)!<%`!&%$%s%?%U%'!<%9(B

Analog $B%U%)!<%`!&%$%s%?%U%'!<%9(B


1. $B%l%]!<%H$NA*Br(B

$BCm0U(B : $B0J2<$N;X<($K=>$C$F4D6-$r@_Dj$7=*$o$k$^$G!"(B $B$3$N%U%)!<%`$OF0:n$7$J$$$G$7$g$&!#Nc$($P!"%\%?%s$5$(8=$l$J$$$+$b$7$l$^$;$s!#(B $B4D6-@_Dj$r=*N;$7$?8e!"$3$NJ8@a$r:o=|$7$F$/$@$5$$!#(B
$B8D!9$N%l%]!<%H$N>\:Y$J0UL#$K$D$$$F$O(B analog $B$N%[!<%`%Z!<%8(B $B$r;2>H$7$F$/$@$5$$!#(B

$B$I$N%l%]!<%H$rI=<($7$^$9$+(B?


[On] [Off] $BA4BN$N35MW(B
[On] [Off] $B7nJL%l%]!<%H(B
[On] [Off] $B=5JL%l%]!<%H(B
[On] [Off] $BMKF|JL35MW(B
[On] [Off] $BF|JL%l%]!<%H(B
[On] [Off] $B;~4VJL35MW(B
[On] [Off] $B;~4VJL%l%]!<%H(B
[On] [Off] 15$BJ,4V3V%l%]!<%H(B
[On] [Off] $B%I%a%$%s%l%]!<%H(B
[On] [Off] $BAH?%JL%l%]!<%H(B
[On] [Off] $B%G%#%l%/%H%j%l%]!<%H(B
[On] [Off] $B%U%!%$%k [On] [Off] $B%j%/%(%9%H%l%]!<%H(B
[On] [Off] $B%U%!%$%k%5%$%:%l%]!<%H(B
[On] [Off] $B;2>H85%l%]!<%H(B
[On] [Off] $B8!:w8l6g%l%]!<%H(B
[On] [Off] $B8!:w8l%l%]!<%H(B
[On] [Off] $B%[%9%H%l%]!<%H(B
[On] [Off] $B%V%i%&%6%l%]!<%H(B
[On] [Off] $B%V%i%&%6$N35MW(B
[On] [Off] OS $B%l%]!<%H(B
[On] [Off] $B%9%F!<%?%9%3!<%I%l%]!<%H(B

$B%W%m%0%i%`$N
$B$b$7$/$O!"8D!9$N%l%]!<%H$K$D$$$F!"(B $B0J2<$N%*%W%7%g%s$r;XDj$9$k;v$,$G$-$^$9!#(B $B$O!"(B10M$B%P%$%H0J>e$N9`L\$rI=<($7$^$9!#F1MM$K(B $B$O!"%P%$%H?t$,B?$$J}$+$i>e0L(B 50 $B0L$rI=<($7$^$9!#(B


2. $B%l%]!<%H$N>\:Y%*%W%7%g%s(B

$B%I%a%$%s%l%]!<%H$N%*%W%7%g%s(B

$B%I%a%$%s%l%]!<%H$N%=!<%H=g(B
$B>/$J$/$H$b(B $B0J>e$N%I%a%$%s$rA4$F4^$`!#(B

$BAH?%JL%l%]!<%H$N%*%W%7%g%s(B

$BAH?%JL%l%]!<%H$N%=!<%H=g(B
$B>/$J$/$H$b(B $B0J>e$NAH?%$rA4$F4^$`!#(B

$B%G%#%l%/%H%j%l%]!<%H$N%*%W%7%g%s(B

$B%G%#%l%/%H%j%l%]!<%H$N%=!<%H=g(B
$B>/$J$/$H$b(B $B0J>e$N%G%#%l%/%H%j$rA4$F4^$`!#(B

$B%j%/%(%9%H%l%]!<%H$N%*%W%7%g%s(B

$B%j%/%(%9%H%l%]!<%H$N%=!<%H=g(B
$B>/$J$/$H$b(B $B0J>e$N%U%!%$%k$rA4$F4^$`!#(B
$BI=<($O!"(B $B$rBP>]$H$9$k!#(B

$B;2>H85%l%]!<%H$N%*%W%7%g%s(B

$B;2>H85%l%]!<%H$N%=!<%H=g(B
$B>/$J$/$H$b(B $B0J>e$N;2>H85(B URL $B$rA4$F4^$`!#(B

3. $B%m%0%U%!%$%k$NItJ,2r@O(B

$BFCDjF|;~$N$_(B
$BFCDjF|;~$N%j%/%(%9%H$@$1$r2r@O$9$k;v$b2DG=$G$9!#(B $B2r@O$9$kF|IU$NHO0O$r0J2<$N$h$&$K(B yymmdd $B$N7A$GF~NO$7$F$/$@$5$$!#Nc(B : 980301 $B$O(B 1998$BG/(B3$B7n(B1$BF|(B ($B0lJ}$NHO0O$@$1$r@)8B$7$?$$>l9g$O!"(B $BJRJ}$N%U%#!<%k%I$@$1$rKd$a$F$/$@$5$$(B)
$B$+$i(B $B$^$G(B

$BFCDj$N%U%!%$%k$N$_(B
$B0J2<$N%U%!%$%k$N$_$rBP>]$H$7$^$9(B ($B%3%s%^$G6h@Z$C$FNs5s$7$F$/$@$5$$!#(B $B%o%$%k%I%+!<%I$H$7$F(B * $B$r4^$a$k;v$,$G$-$^$9(B)

$B0J2<$N%U%!%$%k$O=|30$7$^$9!#(B


4. $B%l%$%"%&%H(B

$B$"$J$?$NAH?%L>(B ($B%Z!<%8$N%?%$%H%kMQ(B)

$BAH?%$N%[!<%`%Z!<%8(B ($BITMW$N>l9g$O6uGr$N$^$^$K$7$F$/$@$5$$(B)
URL :


analog-6.0/lang/jps.cfg0000644000175000017500000000341510161303540015130 0ustar sret1sret100000000000000LANGUAGE JAPANESE-SJIS SUBDOMAIN ad.jp ǗgD SUBDOMAIN ac.jp wEwZȂ SUBDOMAIN co.jp SUBDOMAIN go.jp {@ SUBDOMAIN or.jp e@lc SUBDOMAIN ne.jp lbg[NT[rX SUBDOMAIN gr.jp CӒc SUBDOMAIN ed.jp ewZ SUBDOMAIN hokkaido.jp kC SUBDOMAIN aomori.jp X SUBDOMAIN iwate.jp 茧 SUBDOMAIN miyagi.jp {錧 SUBDOMAIN akita.jp Hc SUBDOMAIN yamagata.jp R` SUBDOMAIN fukushima.jp SUBDOMAIN ibaraki.jp 錧 SUBDOMAIN tochigi.jp Ȗ، SUBDOMAIN gunma.jp Qn SUBDOMAIN saitama.jp ʌ SUBDOMAIN chiba.jp t SUBDOMAIN tokyo.jp s SUBDOMAIN kanagawa.jp _ސ쌧 SUBDOMAIN niigata.jp V SUBDOMAIN toyama.jp xR SUBDOMAIN ishikawa.jp ΐ쌧 SUBDOMAIN fukui.jp 䌧 SUBDOMAIN yamanashi.jp R SUBDOMAIN nagano.jp 쌧 SUBDOMAIN gifu.jp 򕌌 SUBDOMAIN shizuoka.jp É SUBDOMAIN aichi.jp m SUBDOMAIN mie.jp Od SUBDOMAIN shiga.jp ꌧ SUBDOMAIN kyoto.jp s{ SUBDOMAIN osaka.jp { SUBDOMAIN hyogo.jp Ɍ SUBDOMAIN nara.jp ޗnj SUBDOMAIN wakayama.jp a̎R SUBDOMAIN tottori.jp 挧 SUBDOMAIN shimane.jp SUBDOMAIN okayama.jp R SUBDOMAIN hiroshima.jp L SUBDOMAIN yamaguchi.jp R SUBDOMAIN tokushima.jp SUBDOMAIN kagawa.jp 쌧 SUBDOMAIN ehime.jp Q SUBDOMAIN kochi.jp m SUBDOMAIN fukuoka.jp SUBDOMAIN saga.jp ꌧ SUBDOMAIN nagasaki.jp 茧 SUBDOMAIN kumamoto.jp F{ SUBDOMAIN oita.jp 啪 SUBDOMAIN miyazaki.jp {茧 SUBDOMAIN kagoshima.jp SUBDOMAIN okinawa.jp ꌧ SUBDOMAIN sapporo.jp Dys SUBDOMAIN sendai.jp s SUBDOMAIN yokohama.jp ls SUBDOMAIN kawasaki.jp s SUBDOMAIN nagoya.jp És SUBDOMAIN kobe.jp _ˎs SUBDOMAIN kitakyushu.jp kBs analog-6.0/lang/jps.lng0000644000175000017500000003027510161303540015155 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Japanese version by Kaori Chikenji, ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp), ## Motonobu Takahashi (monyo@home.monyo.com), ## and Kazuto Ishigaki (ishigaki-ml@factory.gr.jp) 2002 Feb. 24 ## ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp) 2004 Feb. 18 ## ## Note: Be careful to use the same character set in all the configuration ## files, i.e., jp?.lng (this file), jp?.cfg, jp?dom.tab, jp?desc.txt. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP *SHIFT_JIS ## Abbreviations for the day and month names. y 1 2 3 4 5 6 7 8 9 10 11 12 ## Next some standard common words. ## Abbreviation for "week beginning" T擪 N ## Quarter of a year 4 b b oCg oCg ## ?bytes represents kbytes, Mbytes etc. ?oCg NGXg NGXg N ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 N ԑ Jn Jn ŏIANZX ŏIANZX t@C t@C zXg zXg zzXg zzXg fBNg fBNg hC hC gD gD gq gq URL URL uEU uEU OS OS ## (= operating system, operating systems) TCY TCg TCg [U [U ԃR[h ԃR[h EFuT[o̓v ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. L K MK (10) e (1) y^ (1璛) GNT (100) [[^ (10) b^ (1ї\) ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Ŝ̊Tv ## The time reports, plus "busiest" strings (at the bottom of each report) Nʃ|[g łGN : 4ʃ|[g łG4 : ʃ|[g łG : Tʃ|[g łGT (E̓tPT)F jʏWv ʃ|[g łG : ԕʃ|[g ԕʏWv jʎԏWv łG : 15Ԋu|[g 15ԊuWv łG15 : 5Ԋu|[g 5ԊuWv łG5 : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! zXg|[g zXg zXg n zXg_CNV|[g zXg zXg n zXgs|[g zXg zXg n fBNg|[g fBNg fBNg n t@Cޕʃ|[g gq gq n NGXg|[g t@C t@C n _CNV|[g t@C t@C n NGXgs|[g t@C t@C n Qƌ|[g QƌURL QƌURL n QƌTCg|[g QƌTCg QƌTCg n Qƌ_CNV|[g QƌURL QƌURL n Qƌs|[g QƌURL QƌURL n 僌|[g n ꃌ|[g n 僌|[g n ꃌ|[g n zzXg|[g zzXg zzXg n zzXg_CNV|[g zzXg zzXg n zzXgs|[g zzXg zzXg n [U|[g [U [U n [U_CNV|[g [U [U n [Us|[g [U [U n uEUWv uEU uEU n uEU|[g uEU uEU n OS|[g OS OS n hC|[g hC hC n gDʃ|[g gD gD n Xe[^XR[h|[g Xe[^XR[h Xe[^XR[h n vԃ|[g t@CTCY|[g ## Used at the bottom of the report |[go̓\tg : <1 ## Used in the time reports 1P 邢͂̒l\ y[WNGXg y[WNGXg ## Used at the bottom of each non-time report: need m, f & n genders * * ̑ ## Used on the pie charts: again need m, f & n genders * * ̑ ## Used at the top of the report vJn : ͑Ώۊ : ` ## Used in the General Summary NGXg L̓ʕ y[WNGXg L̓ʕ Xe[^XR[hs݃Os NGXgs NGXg_CNV Xe[^XR[htNGXg قȂ郊NGXgt@C قȂT[rXzXg ُ탍Os sKvOڐ f[^] L̓ʕ ʓ̐ E̓܂ł̒7Ԃ̏Wv : 7 Go To 擪 ## Some special phrases for particular reports. ## Note to self: these phrases also occur in anlghea3.h and Pnextname(). [IPAhX] [hCt^] [mhC] [[gfBNg] [fBNg] [gq] [fBNg] ̑Windows ̑UNIX {bg mOS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) NGXg TԃNGXg NGXg (%) TԃNGXg (%) y[W Tԃy[W y[W (%) Tԃy[W (%) oCg ? oCg oCg (T) ? oCg (T) oCg (%) oCg (T) (%) ԍ ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s ̕\ : * * %d %s ̕\ : * * %s ̕\ : ## "by" in the phrase "listing the top 3 files BY number of requests"  ## All requests WITH AT LEAST 10 requests ŏ ## Different ways of doing floors NGXg (7) NGXg (7) y[W (7) y[W (7) _CNVNGXg _CNVNGXg _CNVNGXg (7) _CNVNGXg (7) sNGXg sNGXg sNGXg (7) sNGXg (7) % ̒ʐM % ̒ʐM (7) % ̍őʐM % ̍őʐM (7) (]) oCg (]) oCg ## ?bytes represents kbytes, Mbytes etc. ? oCg̃f[^] (]) oCg (7) (]) oCg (7) ? (]) oCg (7) ŏĨNGXg : ŏĨ_CNVNGXg : ŏĨNGXgs : ŏ̃NGXg : ŏ̃_CNVNGXg : ŏ̕sNGXg : ## Now "sorted by": again, in m, f & n (only needed in plural though) * * \[g ## Used at the top of each report ̃|[g̃f[^Wv : ## Used in pie charts ^̊px : ## different ways of sorting ʐM 7Ԃ̃f[^] % ̃NGXg 7Ԃ % ̃NGXg % ̍ő僊NGXg 7Ԃ % ̍ő僊NGXg NGXg 7Ԃ̃NGXg % ̃y[WNGXg 7Ԃ % ̃y[WNGXg % ̍őy[WNGXg 7Ԃ % ̍őy[WNGXg y[WNGXg 7Ԃ̃y[WNGXg % ̃_CNVNGXg 7Ԃ % ̃_CNVNGXg % ̍ő僊_CNVNGXg 7Ԃ % ̍ő僊_CNVNGXg _CNVNGXg 7Ԃ̃_CNVNGXg % ̕sNGXg 7Ԃ % ̕sNGXg % ̍ősNGXg 7Ԃ % ̍ősNGXg sNGXg 7Ԃ̕sNGXg ŏINGXg ŏI_CVNGXg ŏIsNGXg ŏ̃NGXg ŏ̃_CNVNGXg ŏ̕sNGXg ## 3 other ways of sorting in m, f, & n * * \[g̓At@xbg * * \[g͏ԃR[h * * \[g ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ߑO ߌ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %YN%m%D %H%n ## "Program started at" and "Analysed requests from" %YN%m%D(%w) %H%n ## In Daily Report %YN%m%d ## In Daily Summary %w ## In Hourly Report %YN%m%d %H%n%x%I%o ## In Hourly Summary %h ## In Hour of the Week Summary %wj %H%n%x%I%o ## In Quarter-Hour and Five-Minute Reports %YN%m%d %H%n%x%I%o ## In Quarter-Hour and Five-Minute Summaries %H%n%x%I%o ## In Weekly Report %YN%m%d ## In Monthly Report %YN%m ## In Quarterly Report %YN %m%x%l ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %YN ## The date (d) column in non-time reports %YN%m%D ## The date & time (D) column in non-time reports %YN%m%D %H%n ## In non-time reports: "including all files with requests since [date]" %YN%m%D %H%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 p 101 vgRύX 1xx [X̏] 200 OK 201 쐬 202 ̏ƂĎ 203 F 204 M񖳂 205 f[^̏ 206 fЏ 2xx [X̐] 300 Y 301 PvIړ 302 Ɉړ 303 Q 304 ŋ߂̌ȗύX 305 vNVgp 306 vNVύX 307 ꎞIړ 3xx [X̃_CNg] 400 s@NGXg 401 vF 402 vx 403 ANZX֎~ 404 y[Ws 405 s@\bh 406 y[W̕s 407 vNVɂvF 408 Ԑ؂ 409 NGXg̓y[WƖ 410 y[W폜 411 v 412 Os 413 NGXgf[^̒ 414 NGXgt@C̒ 415 T|[g̃fBA 416 NGXgُ̈ 417 vs 4xx [X̃[UG[] 500 T[oG[ 501 T|[gNGXg 502 T[oOG[ 503 ꎞIs\ 504 Q[gEFCԐ؂ 505 T|[gHTTPo[W 506 _CNgs 5xx [X̃T[oG[] xxx [̑] analog-6.0/lang/jpsdesc.txt0000644000175000017500000001002110161303540016036 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report ̃|[ǵANxʂ̓v\܂B # Quarterly Report ̃|[ǵA4̓v\܂B # Monthly Report ̃|[ǵAʂ̓v\܂B # Weekly Report ̃|[ǵATʂ̓v\܂B # Daily Report ̃|[ǵAʂ̓v\܂B # Hourly Report ̃|[ǵAԕʂ̓v\܂B # Quarter-Hour Report ̃|[ǵA15Ԋu̓v\܂B # Five-Minute Report ̃|[ǵA5Ԋu̓v\܂B # Daily Summary ̃|[ǵASĂ̏T̗jʑa̓v\܂B # Hourly Summary ̃|[ǵASĂ̓̎ԕʑa̓v\܂B # Hour of the Week Summary ̃|[ǵASĂ̏T̎ԕʑa̓v\܂B # Quarter-Hour Summary ̃|[ǵASĂ̓15Ԋȗa̓v\܂B # Five-Minute Summary ̃|[ǵASĂ̓5Ԋȗa̓v\܂B # General Summary ̃|[ǵAŜ̓v\܂B # Request Report ̃|[ǵATCg̃t@C̓v\܂B # Redirection Report ̃|[ǵAʂ̃t@Cփ_CNVt@C̓v\܂B(ʏA_CNVAŌɃXbV̖fBNgACGI XNvgłB) # Failure Report ̃|[ǵAut@C‚ȂṽG[𐶂t@C̓v\܂B # File Type Report ̃|[ǵAt@C̊gq̓v\܂B # Directory Report ̃|[ǵAt@CNGXgꂽfBNg̓v\܂B(efBNg̐l͑SẴTufBNg܂݂܂B) # Host Report ̃|[ǵAt@CNGXgRs[^̓v\܂B # Host Redirection Report ̃|[ǵAʃt@Cփ_CNVꂽRs[^̓v\܂B # Host Failure Report ̃|[ǵANGXgɎsRs[^̓v\܂B # Domain Report ̃|[ǵAt@CNGXgRs[^̍ʓv\܂B # Referrer Report ̃|[ǵA(NA邢͂̃TCg̉摜܂ރy[WHĂ) Qƌ̓v\܂B # Referring Site Report ̃|[ǵAQƌ̃T[o̓v\܂B # Redirected Referrer Report ̃|[ǵA_CNVNQƌ̓v\܂B # Failed Referrer Report ̃|[ǵÃTCgւ̃N؂̎Qƌ̓v\܂B # Browser Report ̃|[ǵA[ŨuEU[̓v\܂B # Virtual Host Report ̃|[ǵÃTCg̊ezhC̓v\܂B # Virtual Host Redirection Report ̃|[ǵAezhCփ_CNVꂽNGXg̓v\܂B # Virtual Host Failure Report ̃|[ǵAezhCւ̕sNGXg̓v\܂B # User Report ̃|[ǵA[UF؂邩NbL[ŔF肳ꂽƂAt@CNGXg[U̓v\܂B # User Redirection Report ̃|[ǵAʃt@Cփ_CNVꂽ[U̓v\܂B # User Failure Report ̃|[ǵANGXgɎs[U̓v\܂B # Organisation Report ̃|[ǵAt@CNGXgRs[^̃hC̓v\܂B # Search Query Report ̃|[ǵA[ŨTCg𔭌̂ɁAGWŎgp̓v\܂B # Search Word Report ̃|[ǵA[ŨTCg𔭌̂ɁAGWŎgpP̓v\܂B # Internal Search Query Report ̃|[ǵA[ŨTCgŁAXNvgŎgp̓v\܂B # Internal Search Word Report ̃|[ǵA[ŨTCgŁAXNvgŎgpP̓v\܂B # Browser Summary ̃|[ǵA[U̎gpuEU[̃x_[̓v\܂B # Operating System Report ̃|[ǵA[U̎gp OS ̓v\܂B # File Size Report ̃|[ǵAt@C̑傫̓v\܂B # Status Code Report ̃|[ǵASẴNGXg HTTP ԃR[h̓v\܂B # Processing Time Report ̃|[ǵANGXg̏Ԃ̓v\܂B analog-6.0/lang/jpsdom.tab0000644000175000017500000001253610161303540015643 0ustar sret1sret100000000000000# ʂъՃhC aero 2 q^AƊE arpa 1 C^[lbgCt biz 2 rWlX com 2 ƑgD coop 2 g edu 2 č@ gov 2 č{@ info 2 ʁij int 2 ۋ@ mil 2 čR@ museum 2 /p name 3 l net 2 lbg[N org 2 cgD pro 3 # ʃR[hhC ac 1 AZV ad 2 Ah ae 3 Au񒷍AM af 1 AtKjX^ ag 2 AeBO@Eo[u[_ ai 1 AM al 1 AojA am 2 AjA an 1 I_̃AeB ao 1 AS aq 1 ar 3 A[` as 1 AJTA at 3 I[XgA au 3 I[XgA aw 1 Ao az 1 A[oCW ba 3 {XjAEwcFSri bb 2 oohX bd 1 oOfV be 2 xM[ bf 1 uLit@\ bg 2 uKA bh 1 o[[ bi 1 uW bj 1 xi (_z[) bm 1 o[~[_ bn 1 ulC bo 3 {rA br 3 uW bs 1 on} bt 1 u[^ bv 1 u[x bw 1 {ci by 1 x[V bz 1 x[Y ca 3 Ji_ cc 1 RRX (L[O) cd 1 RS勤a (UC[) cf 1 AtJa cg 1 RS ch 2 XCX ci 1 R[gW{A[ (ۉC) ck 1 NbN cl 2 ` cm 1 J[ cn 3 ؐla co 3 RrA cr 3 RX^J cs 1 ZrA邢̓elO cu 1 L[o cv 1 J[|xf cx 1 NX}X cy 3 LvX cz 2 `FR de 2 hCc dj 1 Wu` dk 2 f}[N dm 2 h~jJ do 2 h~jJa dz 1 AWFA ec 3 GNAh ee 2 GXgjA eg 3 GWvg eh 1 Tn er 1 GgA es 2 XyC et 1 G`IsA fi 2 tBh fj 3 tBW[ fk 1 tH[Nh fm 1 ~NlVA fo 1 tF[ fr 2 tX fx 1 tX (BA{) ga 1 K{ gb 1 ue gd 1 Oi_ ge 1 OWA gf 1 tX̃MjA gg 1 `lK[WB gh 3 K[i gi 1 Wu^ gl 1 O[h gm 1 KrA gn 1 MjA gp 1 OA_[v gq 1 ԓMjA gr 2 MV gs 1 TEXW[WAETEXThCb` gt 3 OAe} gu 1 OA gw 1 MjArTI gy 1 KCAi hk 3 ` hm 1 n[hE}Nhih hn 2 zWX hr 2 NA`A ht 1 nC` hu 2 nK[ id 3 ChlVA ie 2 ACh il 3 CXG im 1 } in 3 Ch io 1 p̃Chmn iq 1 CN ir 1 C is 2 ACXh it 2 C^A je 1 `lW[W[ jm 3 W}CJ jo 3 _ jp 3 { ke 3 PjA kg 1 LMX^ kh 1 J{WA ki 1 LoX km 1 R kn 1 ZgNXgt@[ElCrX kp 1 N`a kr 3 ؖ kw 3 NEF[g ky 1 PC} kz 1 JUtX^ la 1 IX lb 3 om lc 1 ZgVA li 2 qeV^C lk 1 XJ lr 1 xA ls 1 \g lt 2 gAjA lu 2 NZuN lv 2 grA ly 1 rA ma 1 bR mc 2 iR md 1 ho mg 1 }_KXJ mh 1 }[V mk 3 }PhjA ml 1 } mm 1 ~}[ mn 1 S mo 1 }JI mp 1 k}Ai mq 1 }`j[N mr 1 [^jA ms 1 gZg mt 3 }^ mu 1 [VX mv 1 fBu mw 1 }EC mx 3 LVR my 3 }[VA mz 1 Ur[N na 1 i~rA nc 1 j[JhjA ne 1 jWF[ nf 1 m[tH[N ng 1 iCWFA ni 3 jJOA nl 2 I_ no 2 mEF[ np 1 lp[ nr 1 iE nu 1 jEG nz 3 j[W[h om 1 I}[ pa 3 pi} pe 3 y[ pf 1 tX̃|lVA pg 3 pvAj[MjA ph 3 tBs pk 3 pLX^ pl 3 |[h pm 1 TsG[E~N pn 1 sgPA pr 1 vGgR ps 1 pX`i pt 2 |gK pw 1 pI py 3 pOAC qa 1 J^[ re 1 jI ro 2 [}jA ru 2 VAAM rw 1 _ sa 3 TEWArA sb 1 \ sc 1 ZCVF sd 1 X[_ se 2 XEF[f sg 3 VK|[ sh 1 Zgwi si 2 XxjA sj 1 Xo[oE}CG sk 2 XoLA sl 1 VGIl sm 1 T}m sn 1 ZlK so 1 \}A sr 1 Xi st 1 TgEvVy su 2 \rGgAM sv 3 GToh sy 1 VA sz 1 XWh tc 1 ^[RXEJCRX td 1 `h tf 1 tX̋ɓ쏔 tg 1 g[S th 3 ^C tj 1 ^WLX^ tk 1 gPE tl 1 `[ tm 1 gNjX^ tn 1 `jWA to 1 gK tp 1 eB[ tr 3 gR tt 3 gj_[hEgoS tv 1 co tw 3 p tz 1 ^UjA ua 3 ENCi ug 3 EK_ uk 3 CMX um 1 ė̑m us 4 AJO uy 3 EOAC uz 1 EYxLX^ va 1 o`Js vc 1 ZgrZgуOifB[ ve 3 xlYG vg 1 p̃o[W vi 1 ė̃o[W vn 1 xgi vu 1 okAc wf 1 XEtei ws 1 TA ye 1 CG yt 1 }bg yu 3 [SXrA za 3 AtJa zm 1 UrA zr 1 RS勤a (UC[) zw 3 WouG analog-6.0/lang/jpsform.html0000644000175000017500000002105610161303540016222 0ustar sret1sret100000000000000 Analog tH[EC^tF[X

Analog tH[EC^tF[X


1. |[g̑I

: ȉ̎wɏ]Ċ‹ݒ肵I܂ŁA ̃tH[͓삵Ȃł傤BႦ΁A{^Ȃ܂B ‹ݒIA̕߂폜ĂB
X̃|[g̏ڍׂȈӖɂ‚Ă analog ̃z[y[W QƂĂB

ǂ̃|[g\܂?


[On] [Off] Ŝ̊Tv
[On] [Off] ʃ|[g
[On] [Off] Tʃ|[g
[On] [Off] jʊTv
[On] [Off] ʃ|[g
[On] [Off] ԕʊTv
[On] [Off] ԕʃ|[g
[On] [Off] 15Ԋu|[g
[On] [Off] hC|[g
[On] [Off] gDʃ|[g
[On] [Off] fBNg|[g
[On] [Off] t@Cޕʃ|[g
[On] [Off] NGXg|[g
[On] [Off] t@CTCY|[g
[On] [Off] Qƌ|[g
[On] [Off] 僌|[g
[On] [Off] ꃌ|[g
[On] [Off] zXg|[g
[On] [Off] uEU|[g
[On] [Off] uEŮTv
[On] [Off] OS |[g
[On] [Off] Xe[^XR[h|[g

vO̎s :
́AX̃|[gɂ‚āA ȉ̃IvVw肷鎖ł܂B ́A10MoCgȏ̍ڂ\܂Bl ́AoCg 50 ʂ\܂B


2. |[g̏ڍ׃IvV

hC|[g̃IvV

hC|[g̃\[g
ȂƂ ȏ̃hCSĊ܂ށB

gDʃ|[g̃IvV

gDʃ|[g̃\[g
ȂƂ ȏ̑gDSĊ܂ށB

fBNg|[g̃IvV

fBNg|[g̃\[g
ȂƂ ȏ̃fBNgSĊ܂ށB

NGXg|[g̃IvV

NGXg|[g̃\[g
ȂƂ ȏ̃t@CSĊ܂ށB
\́A ΏۂƂB

Qƌ|[g̃IvV

Qƌ|[g̃\[g
ȂƂ ȏ̎Qƌ URL SĊ܂ށB

3. Ot@C̕

̂
̃NGXg͂鎖”\łB ͂t͈̔͂ȉ̂悤 yymmdd ̌`œ͂ĂB : 980301 1998N31 (͈̔͂𐧌ꍇ́A Е̃tB[h𖄂߂Ă)
܂

̃t@Ĉ
ȉ̃t@Ĉ݂ΏۂƂ܂ (R}ŋ؂ė񋓂ĂB ChJ[hƂ * ܂߂鎖ł܂)

ȉ̃t@C͏O܂B


4. CAEg

Ȃ̑gD (y[W̃^Cgp)

gD̃z[y[W (sv̏ꍇ͋󔒂̂܂܂ɂĂ)
URL :


analog-6.0/lang/jpu.cfg0000644000175000017500000000373610161303540015140 0ustar sret1sret100000000000000LANGUAGE JAPANESE-UTF SUBDOMAIN ad.jp 管理組織 SUBDOMAIN ac.jp 大学・専門学校など SUBDOMAIN co.jp 企業 SUBDOMAIN go.jp 政府機関 SUBDOMAIN or.jp 各種法人団体 SUBDOMAIN ne.jp ネットワークサービス SUBDOMAIN gr.jp 任意団体 SUBDOMAIN ed.jp 各種学校 SUBDOMAIN hokkaido.jp 北海道 SUBDOMAIN aomori.jp 青森県 SUBDOMAIN iwate.jp 岩手県 SUBDOMAIN miyagi.jp 宮城県 SUBDOMAIN akita.jp 秋田県 SUBDOMAIN yamagata.jp 山形県 SUBDOMAIN fukushima.jp 福島県 SUBDOMAIN ibaraki.jp 茨城県 SUBDOMAIN tochigi.jp 栃木県 SUBDOMAIN gunma.jp 群馬県 SUBDOMAIN saitama.jp 埼玉県 SUBDOMAIN chiba.jp 千葉県 SUBDOMAIN tokyo.jp 東京都 SUBDOMAIN kanagawa.jp 神奈川県 SUBDOMAIN niigata.jp 新潟県 SUBDOMAIN toyama.jp 富山県 SUBDOMAIN ishikawa.jp 石川県 SUBDOMAIN fukui.jp 福井県 SUBDOMAIN yamanashi.jp 山梨県 SUBDOMAIN nagano.jp 長野県 SUBDOMAIN gifu.jp 岐阜県 SUBDOMAIN shizuoka.jp 静岡県 SUBDOMAIN aichi.jp 愛知県 SUBDOMAIN mie.jp 三重県 SUBDOMAIN shiga.jp 滋賀県 SUBDOMAIN kyoto.jp 京都府 SUBDOMAIN osaka.jp 大阪府 SUBDOMAIN hyogo.jp 兵庫県 SUBDOMAIN nara.jp 奈良県 SUBDOMAIN wakayama.jp 和歌山県 SUBDOMAIN tottori.jp 鳥取県 SUBDOMAIN shimane.jp 島根県 SUBDOMAIN okayama.jp 岡山県 SUBDOMAIN hiroshima.jp 広島県 SUBDOMAIN yamaguchi.jp 山口県 SUBDOMAIN tokushima.jp 徳島県 SUBDOMAIN kagawa.jp 香川県 SUBDOMAIN ehime.jp 愛媛県 SUBDOMAIN kochi.jp 高知県 SUBDOMAIN fukuoka.jp 福岡県 SUBDOMAIN saga.jp 佐賀県 SUBDOMAIN nagasaki.jp 長崎県 SUBDOMAIN kumamoto.jp 熊本県 SUBDOMAIN oita.jp 大分県 SUBDOMAIN miyazaki.jp 宮崎県 SUBDOMAIN kagoshima.jp 鹿児島県 SUBDOMAIN okinawa.jp 沖縄県 SUBDOMAIN sapporo.jp 札幌市 SUBDOMAIN sendai.jp 仙台市 SUBDOMAIN yokohama.jp 横浜市 SUBDOMAIN kawasaki.jp 川崎市 SUBDOMAIN nagoya.jp 名古屋市 SUBDOMAIN kobe.jp 神戸市 SUBDOMAIN kitakyushu.jp 北九州市 analog-6.0/lang/jpu.lng0000644000175000017500000003510310161303540015152 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Japanese version by Kaori Chikenji, ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp), ## Motonobu Takahashi (monyo@home.monyo.com), ## and Kazuto Ishigaki (ishigaki-ml@factory.gr.jp) 2002 Feb. 24 ## ## Takayuki Matsuki (matsuki@tokyo-kasei.ac.jp) 2004 Feb. 18 ## ## Note: Be careful to use the same character set in all the configuration ## files, i.e., jp?.lng (this file), jp?.cfg, jp?dom.tab, jp?desc.txt. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP *UTF-8 ## Abbreviations for the day and month names. 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 ## Next some standard common words. ## Abbreviation for "week beginning" 週先頭日 年 ## Quarter of a year 4半期 月 日 日 時間 分 分 秒 秒 バイト バイト ## ?bytes represents kbytes, Mbytes etc. ?バイト リクエスト リクエスト 年月日 ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 年月日 時間帯 時 開始日 開始時刻 最終アクセス日時 最終アクセス時刻 ファイル ファイル ホスト ホスト 仮想ホスト 仮想ホスト ディレクトリ ディレクトリ ドメイン ドメイン 組織 組織 拡張子 拡張子 URL URL ブラウザ ブラウザ OS OS ## (= operating system, operating systems) サイズ 検索語 検索項目 サイト サイト ユーザ ユーザ 状態コード 状態コード ウェブサーバの統計 ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. キロ メガ ギガ (10億) テラ (1兆) ペタ (1千兆) エクサ (100京) ゼータ (10垓) ヨッタ (1禾予) ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports 全体の概要 ## The time reports, plus "busiest" strings (at the bottom of each report) 年別レポート 最も混雑した年 : 4半期別レポート 最も混雑した4半期 : 月別レポート 最も混雑した月 : 週別レポート 最も混雑した週 (右の日付から1週間): 曜日別集計 日別レポート 最も混雑した日 : 時間別レポート 時間別集計 曜日別時間集計 最も混雑した時間 : 15分間隔レポート 15分間隔集計 最も混雑した15分間 : 5分間隔レポート 5分間隔集計 最も混雑した5分間 : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! ホストレポート ホスト ホスト n ホストリダイレクションレポート ホスト ホスト n ホスト不成功レポート ホスト ホスト n ディレクトリレポート ディレクトリ ディレクトリ n ファイル種類別レポート 拡張子 拡張子 n リクエストレポート ファイル ファイル n リダイレクションレポート ファイル ファイル n リクエスト不成功レポート ファイル ファイル n 参照元レポート 参照元URL 参照元URL n 参照元サイトレポート 参照元サイト 参照元サイト n 参照元リダイレクションレポート 参照元URL 参照元URL n 参照元不成功レポート 参照元URL 参照元URL n 検索語句レポート 検索語句 検索語句 n 検索語レポート 検索語 検索語 n 内部検索語句レポート 検索語句 検索語句 n 内部検索語レポート 検索語 検索語 n 仮想ホストレポート 仮想ホスト 仮想ホスト n 仮想ホストリダイレクションレポート 仮想ホスト 仮想ホスト n 仮想ホスト不成功レポート 仮想ホスト 仮想ホスト n ユーザレポート ユーザ ユーザ n ユーザリダイレクションレポート ユーザ ユーザ n ユーザ不成功レポート ユーザ ユーザ n ブラウザ集計 ブラウザ ブラウザ n ブラウザレポート ブラウザ ブラウザ n OSレポート OS OS n ドメインレポート ドメイン ドメイン n 組織別レポート 組織 組織 n ステータスコードレポート ステータスコード ステータスコード n 所要時間レポート ファイルサイズレポート ## Used at the bottom of the report レポート出力ソフト : 処理時間 <1 ## Used in the time reports 1単位 は あるいはその値未満を表す ページリクエスト件数 ページリクエスト件数 ## Used at the bottom of each non-time report: need m, f & n genders * * その他 ## Used on the pie charts: again need m, f & n genders * * その他 ## Used at the top of the report 統計開始日時 : 解析対象期間 : ~ ## Used in the General Summary リクエスト成功件数 上記の日別平均 ページリクエスト成功件数 上記の日別平均 ステータスコード不在ログ行数 リクエスト不成功件数 リクエストリダイレクション件数 ステータスコード付きリクエスト件数 異なるリクエストファイル数 異なるサービスホスト数 異常ログ行数 不必要ログ項目数 データ転送量 上記の日別平均 括弧内の数字は 右の日時までの直近7日間の集計 : 直近7日間 Go To 先頭 ## Some special phrases for particular reports. ## Note to self: these phrases also occur in anlghea3.h and Pnextname(). [未解決IPアドレス] [ドメイン名未付与] [未知ドメイン名] [ルートディレクトリ] [無ディレクトリ] [無拡張子] [ディレクトリ] その他のWindows その他のUNIX ロボット 未知OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) リクエスト件数 週間リクエスト件数 リクエスト件数 (%) 週間リクエスト件数 (%) ページ数 週間ページ数 ページ数 (%) 週間ページ数 (%) バイト ? バイト バイト (週間) ? バイト (週間) バイト (%) バイト (週間) (%) 番号 ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * 上位 %s の表 : * * 上位 %d %s の表 : * * %s の表 : ## "by" in the phrase "listing the top 3 files BY number of requests" 基準は ## All requests WITH AT LEAST 10 requests 最小は ## Different ways of doing floors リクエスト件数 (直近7日間) リクエスト件数 (直近7日間) ページ数 (直近7日間) ページ数 (直近7日間) リダイレクションリクエスト件数 リダイレクションリクエスト件数 リダイレクションリクエスト件数 (直近7日間) リダイレクションリクエスト件数 (直近7日間) 不成功リクエスト件数 不成功リクエスト件数 不成功リクエスト件数 (直近7日間) 不成功リクエスト件数 (直近7日間) % の通信量 % の通信量 (直近7日間) % の最大通信量 % の最大通信量 (直近7日間) (転送) バイト (転送) バイト ## ?bytes represents kbytes, Mbytes etc. ? バイトのデータ転送量 (転送) バイト (直近7日間) (転送) バイト (直近7日間) ? (転送) バイト (直近7日間) 最終のリクエスト日時 : 最終のリダイレクションリクエスト日時 : 最終のリクエスト不成功日時 : 最初のリクエスト日時 : 最初のリダイレクションリクエスト日時 : 最初の不成功リクエスト日時 : ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ソート順は ## Used at the top of each report このレポートのデータ集計期間 : ## Used in pie charts 扇型の角度 : ## different ways of sorting 通信量 直近7日間のデータ転送量 % のリクエスト件数 直近7日間の % のリクエスト件数 % の最大リクエスト件数 直近7日間の % の最大リクエスト件数 リクエスト数 直近7日間のリクエスト件数 % のページリクエスト件数 直近7日間の % のページクエスト件数 % の最大ページリクエスト件数 直近7日間の % の最大ページリクエスト件数 ページリクエスト件数 直近7日間のページリクエスト件数 % のリダイレクションリクエスト件数 直近7日間の % のリダイレクションリクエスト件数 % の最大リダイレクションリクエスト件数 直近7日間の % の最大リダイレクションリクエスト件数 リダイレクションリクエスト数 直近7日間のリダイレクションリクエスト件数 % の不成功リクエスト件数 直近7日間の % の不成功リクエスト件数 % の最大不成功リクエスト件数 直近7日間の % の最大不成功リクエスト件数 不成功リクエスト件数 直近7日間の不成功リクエスト件数 最終リクエスト時刻 最終リダイレションリクエスト時刻 最終不成功リクエスト時刻 最初のリクエスト時刻 最初のリダイレクションリクエスト時刻 最初の不成功リクエスト時刻 ## 3 other ways of sorting in m, f, & n * * ソート順はアルファベット * * ソート順は状態コード * * ソート無し ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. 午前 午後 ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y年%m月%D日 %H時%n分 ## "Program started at" and "Analysed requests from" %Y年%m月%D日(%w) %H時%n分 ## In Daily Report %Y年%m月%d日 ## In Daily Summary %w ## In Hourly Report %Y年%m月%d日 %H時%n分%x%I時%o分 ## In Hourly Summary %h時 ## In Hour of the Week Summary %w曜日 %H時%n分%x%I時%o分 ## In Quarter-Hour and Five-Minute Reports %Y年%m月%d日 %H時%n分%x%I時%o分 ## In Quarter-Hour and Five-Minute Summaries %H時%n分%x%I時%o分 ## In Weekly Report %Y年%m月%d日 ## In Monthly Report %Y年%m月 ## In Quarterly Report %Y年 %m月%x%l月 ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y年 ## The date (d) column in non-time reports %Y年%m月%D日 ## The date & time (D) column in non-time reports %Y年%m月%D日 %H時%n分 ## In non-time reports: "including all files with requests since [date]" %Y年%m月%D日 %H時%n分 ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 継続 101 プロトコル変更 1xx [種々の情報] 200 OK 201 作成成功 202 将来の処理として受理 203 非公認 204 送信情報無し 205 データの初期化 206 断片情報 2xx [種々の成功] 300 複数が該当 301 恒久的移動 302 他に移動 303 他を参照 304 最近の検索以来変更無し 305 プロクシを使用せよ 306 プロクシを変更せよ 307 一時的移動 3xx [種々のリダイレクト] 400 不法リクエスト 401 要認証 402 要支払 403 アクセス禁止 404 ページ不在 405 不法メソッド 406 ページの不許可 407 プロクシによる要認証 408 時間切れ 409 リクエストはページと矛盾 410 ページ削除済 411 要長さ 412 事前条件不成立 413 リクエストデータの超過 414 リクエストファイル名の長さ超過 415 未サポートのメディア 416 リクエスト領域異常 417 要求不成功 4xx [種々のユーザエラー] 500 サーバ内部エラー 501 未サポートリクエスト 502 サーバ外部エラー 503 一時的応答不能 504 ゲートウェイ時間切れ 505 未サポートHTTPバージョン 506 リダイレクト不成功 5xx [種々のサーバエラー] xxx [その他] analog-6.0/lang/jpudesc.txt0000644000175000017500000001270310161303540016051 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report このレポートは、年度別の統計を表します。 # Quarterly Report このレポートは、4半期毎の統計を表します。 # Monthly Report このレポートは、月別の統計を表します。 # Weekly Report このレポートは、週別の統計を表します。 # Daily Report このレポートは、日別の統計を表します。 # Hourly Report このレポートは、時間別の統計を表します。 # Quarter-Hour Report このレポートは、15分間隔の統計を表します。 # Five-Minute Report このレポートは、5分間隔の統計を表します。 # Daily Summary このレポートは、全ての週の曜日別総和の統計を表します。 # Hourly Summary このレポートは、全ての日の時間別総和の統計を表します。 # Hour of the Week Summary このレポートは、全ての週の時間別総和の統計を表します。 # Quarter-Hour Summary このレポートは、全ての日の15分間隔の総和の統計を表します。 # Five-Minute Summary このレポートは、全ての日の5分間隔の総和の統計を表します。 # General Summary このレポートは、全体の統計を表します。 # Request Report このレポートは、サイトのファイルの統計を表します。 # Redirection Report このレポートは、別のファイルへリダイレクションしたファイルの統計を表します。(通常、リダイレクションを強制させる、最後にスラッシュの無いディレクトリか、CGI スクリプトである。) # Failure Report このレポートは、「ファイルが見つからない」等のエラーを生じさせるファイルの統計を表します。 # File Type Report このレポートは、ファイルの拡張子の統計を表します。 # Directory Report このレポートは、ファイルがリクエストされたディレクトリの統計を表します。(各ディレクトリの数値は全てのサブディレクトリも含みます。) # Host Report このレポートは、ファイルをリクエストしたコンピュータの統計を表します。 # Host Redirection Report このレポートは、別ファイルへリダイレクションされたコンピュータの統計を表します。 # Host Failure Report このレポートは、リクエストに失敗したコンピュータの統計を表します。 # Domain Report このレポートは、ファイルをリクエストしたコンピュータの国別統計を表します。 # Referrer Report このレポートは、(リンク、あるいはこのサイトの画像を含むページを辿ってきた) 参照元の統計を表します。 # Referring Site Report このレポートは、参照元のサーバの統計を表します。 # Redirected Referrer Report このレポートは、リダイレクションを起こした参照元の統計を表します。 # Failed Referrer Report このレポートは、このサイトへのリンク切れの参照元の統計を表します。 # Browser Report このレポートは、ユーザのブラウザーの統計を表します。 # Virtual Host Report このレポートは、このサイトの各仮想ドメインの統計を表します。 # Virtual Host Redirection Report このレポートは、各仮想ドメインへリダイレクションされたリクエストの統計を表します。 # Virtual Host Failure Report このレポートは、各仮想ドメインへの不成功リクエストの統計を表します。 # User Report このレポートは、ユーザが認証されるかクッキーで認定されたとき、ファイルをリクエストしたユーザの統計を表します。 # User Redirection Report このレポートは、別ファイルへリダイレクションされたユーザの統計を表します。 # User Failure Report このレポートは、リクエストに失敗したユーザの統計を表します。 # Organisation Report このレポートは、ファイルをリクエストをしたコンピュータのドメインの統計を表します。 # Search Query Report このレポートは、ユーザがこのサイトを発見するのに、検索エンジンで使用した検索語句の統計を表します。 # Search Word Report このレポートは、ユーザがこのサイトを発見するのに、検索エンジンで使用した単語の統計を表します。 # Internal Search Query Report このレポートは、ユーザがこのサイト内で、スクリプトで使用した検索語句の統計を表します。 # Internal Search Word Report このレポートは、ユーザがこのサイト内で、スクリプトで使用した単語の統計を表します。 # Browser Summary このレポートは、ユーザの使用したブラウザーのベンダーの統計を表します。 # Operating System Report このレポートは、ユーザの使用した OS の統計を表します。 # File Size Report このレポートは、ファイルの大きさの統計を表します。 # Status Code Report このレポートは、全てのリクエストの HTTP 状態コードの統計を表します。 # Processing Time Report このレポートは、成功リクエストの処理時間の統計を表します。 analog-6.0/lang/jpudom.tab0000644000175000017500000001550510161303540015644 0ustar sret1sret100000000000000# 一般および基盤ドメイン aero 2 航空運輸業界 arpa 1 インターネットインフラ biz 2 ビジネス com 2 商業組織 coop 2 協同組合 edu 2 米国高等教育機関 gov 2 米国政府機関 info 2 一般(情報) int 2 国際機関 mil 2 米国軍事機関 museum 2 博物館/美術館 name 3 個人名 net 2 ネットワーク org 2 非営利組織 pro 3 専門家 # 国別コードドメイン名 ac 1 アセンション島 ad 2 アンドラ王国 ae 3 アラブ首長国連邦 af 1 アフガニスタン ag 2 アンティグァ・バーブーダ ai 1 アンギラ al 1 アルバニア am 2 アルメニア an 1 オランダ領アンティル ao 1 アンゴラ aq 1 南極 ar 3 アルゼンチン as 1 アメリカンサモア at 3 オーストリア au 3 オーストラリア aw 1 アルバ az 1 アゼルバイジャン ba 3 ボスニア・ヘルツェゴビナ bb 2 バルバドス bd 1 バングラデシュ be 2 ベルギー bf 1 ブルキナファソ bg 2 ブルガリア bh 1 バーレーン bi 1 ブルンジ bj 1 ベナン (旧ダホーメ) bm 1 バーミューダ bn 1 ブルネイ bo 3 ボリビア br 3 ブラジル bs 1 バハマ bt 1 ブータン bv 1 ブーベ島 bw 1 ボツワナ by 1 ベラルーシ bz 1 ベリーズ ca 3 カナダ cc 1 ココス (キーリング) 諸島 cd 1 コンゴ民主共和国 (旧ザイール) cf 1 中央アフリカ共和国 cg 1 コンゴ ch 2 スイス ci 1 コートジボアール (旧象牙海岸) ck 1 クック諸島 cl 2 チリ cm 1 カメルーン cn 3 中華人民共和国 co 3 コロンビア cr 3 コスタリカ cs 1 セルビアあるいはモンテネグロ cu 1 キューバ cv 1 カーポベルデ cx 1 クリスマス島 cy 3 キプロス cz 2 チェコ de 2 ドイツ dj 1 ジブチ dk 2 デンマーク dm 2 ドミニカ do 2 ドミニカ共和国 dz 1 アルジェリア ec 3 エクアドル ee 2 エストニア eg 3 エジプト eh 1 西サハラ er 1 エリトリア es 2 スペイン et 1 エチオピア fi 2 フィンランド fj 3 フィジー fk 1 フォークランド諸島 fm 1 ミクロネシア fo 1 フェロー諸島 fr 2 フランス fx 1 フランス (欧州連合本部) ga 1 ガボン gb 1 ブリテン gd 1 グレナダ ge 1 グルジア gf 1 フランス領ギニア gg 1 チャネル諸島ガーンジィ島 gh 3 ガーナ gi 1 ジブラルタル gl 1 グリーンランド gm 1 ガンビア gn 1 ギニア gp 1 グアダループ gq 1 赤道ギニア gr 2 ギリシャ gs 1 サウスジョージア・サウスサンドイッチ諸島 gt 3 グアテマラ gu 1 グアム gw 1 ギニアビサオ gy 1 ガイアナ hk 3 香港 hm 1 ハード・マクドナルド諸島 hn 2 ホンジュラス hr 2 クロアチア ht 1 ハイチ hu 2 ハンガリー id 3 インドネシア ie 2 アイルランド il 3 イスラエル im 1 マン島 in 3 インド io 1 英領インド洋地域 iq 1 イラク ir 1 イラン is 2 アイスランド it 2 イタリア je 1 チャネル諸島ジャージー島 jm 3 ジャマイカ jo 3 ヨルダン jp 3 日本 ke 3 ケニア kg 1 キルギスタン kh 1 カンボジア ki 1 キリバス km 1 コモロ kn 1 セントクリストファー・ネイビス kp 1 朝鮮民主主義共和国 kr 3 大韓民国 kw 3 クウェート ky 1 ケイマン諸島 kz 1 カザフスタン la 1 ラオス lb 3 レバノン lc 1 セントルシア li 2 リヒテンシュタイン lk 1 スリランカ lr 1 リベリア ls 1 レソト lt 2 リトアニア lu 2 ルクセンブルク lv 2 ラトビア ly 1 リビア ma 1 モロッコ mc 2 モナコ md 1 モルドバ mg 1 マダガスカル mh 1 マーシャル諸島 mk 3 マケドニア ml 1 マリ mm 1 ミャンマー mn 1 モンゴル mo 1 マカオ mp 1 北マリアナ諸島 mq 1 マルチニーク島 mr 1 モーリタニア ms 1 モントセラト mt 3 マルタ mu 1 モーリシャス mv 1 モルディブ mw 1 マラウイ mx 3 メキシコ my 3 マレーシア mz 1 モザンビーク na 1 ナミビア nc 1 ニューカレドニア ne 1 ニジェール nf 1 ノーフォーク島 ng 1 ナイジェリア ni 3 ニカラグア nl 2 オランダ no 2 ノルウェー np 1 ネパール nr 1 ナウル nu 1 ニウエ nz 3 ニュージーランド om 1 オマーン pa 3 パナマ pe 3 ペルー pf 1 フランス領ポリネシア pg 3 パプアニューギニア ph 3 フィリピン pk 3 パキスタン pl 3 ポーランド pm 1 サンピエール島・ミクロン島 pn 1 ピトケアン島 pr 1 プエルトリコ ps 1 パレスチナ pt 2 ポルトガル pw 1 パラオ py 3 パラグアイ qa 1 カタール re 1 レユニオン ro 2 ルーマニア ru 2 ロシア連邦 rw 1 ルワンダ sa 3 サウジアラビア sb 1 ソロモン諸島 sc 1 セイシェル sd 1 スーダン se 2 スウェーデン sg 3 シンガポール sh 1 セントヘレナ島 si 2 スロベニア sj 1 スバールバル諸島・ヤンマイエン島 sk 2 スロバキア sl 1 シエラレオネ sm 1 サンマリノ sn 1 セネガル so 1 ソマリア sr 1 スリナム st 1 サントメ・プリンシペ su 2 旧ソビエト連邦 sv 3 エルサルバドル sy 1 シリア sz 1 スワジランド tc 1 ターコス諸島・カイコス諸島 td 1 チャド tf 1 フランス領極南諸島 tg 1 トーゴ th 3 タイ tj 1 タジキスタン tk 1 トケラウ諸島 tl 1 東チモール tm 1 トルクメニスタン tn 1 チュニジア to 1 トンガ tp 1 東ティモール tr 3 トルコ tt 3 トリニダード・トバゴ tv 1 ツバル tw 3 台湾 tz 1 タンザニア ua 3 ウクライナ ug 3 ウガンダ uk 3 イギリス um 1 米領太平洋諸島 us 4 アメリカ合衆国 uy 3 ウルグアイ uz 1 ウズベキスタン va 1 バチカン市国 vc 1 セントビンセントおよびグレナディーン諸島 ve 3 ベネズエラ vg 1 英領バージン諸島 vi 1 米領バージン諸島 vn 1 ベトナム vu 1 バヌアツ wf 1 ワリス・フテュナ諸島 ws 1 西サモア ye 1 イエメン yt 1 マヨット島 yu 3 ユーゴスラビア za 3 南アフリカ共和国 zm 1 ザンビア zr 1 コンゴ民主共和国 (旧ザイール) zw 3 ジンバブエ analog-6.0/lang/jpuform.html0000644000175000017500000002364710161303540016234 0ustar sret1sret100000000000000 Analog フォーム・インタフェース

Analog フォーム・インタフェース


1. レポートの選択

注意 : 以下の指示に従って環境を設定し終わるまで、 このフォームは動作しないでしょう。例えば、ボタンさえ現れないかもしれません。 環境設定を終了した後、この文節を削除してください。
個々のレポートの詳細な意味については analog のホームページ を参照してください。

どのレポートを表示しますか?


[On] [Off] 全体の概要
[On] [Off] 月別レポート
[On] [Off] 週別レポート
[On] [Off] 曜日別概要
[On] [Off] 日別レポート
[On] [Off] 時間別概要
[On] [Off] 時間別レポート
[On] [Off] 15分間隔レポート
[On] [Off] ドメインレポート
[On] [Off] 組織別レポート
[On] [Off] ディレクトリレポート
[On] [Off] ファイル種類別レポート
[On] [Off] リクエストレポート
[On] [Off] ファイルサイズレポート
[On] [Off] 参照元レポート
[On] [Off] 検索語句レポート
[On] [Off] 検索語レポート
[On] [Off] ホストレポート
[On] [Off] ブラウザレポート
[On] [Off] ブラウザの概要
[On] [Off] OS レポート
[On] [Off] ステータスコードレポート

プログラムの実行 :
もしくは、個々のレポートについて、 以下のオプションを指定する事ができます。 は、10Mバイト以上の項目を表示します。同様に は、バイト数が多い方から上位 50 位を表示します。


2. レポートの詳細オプション

ドメインレポートのオプション

ドメインレポートのソート順
少なくとも 以上のドメインを全て含む。

組織別レポートのオプション

組織別レポートのソート順
少なくとも 以上の組織を全て含む。

ディレクトリレポートのオプション

ディレクトリレポートのソート順
少なくとも 以上のディレクトリを全て含む。

リクエストレポートのオプション

リクエストレポートのソート順
少なくとも 以上のファイルを全て含む。
表示は、 を対象とする。

参照元レポートのオプション

参照元レポートのソート順
少なくとも 以上の参照元 URL を全て含む。

3. ログファイルの部分解析

特定日時のみ
特定日時のリクエストだけを解析する事も可能です。 解析する日付の範囲を以下のように yymmdd の形で入力してください。例 : 980301 は 1998年3月1日 (一方の範囲だけを制限したい場合は、 片方のフィールドだけを埋めてください)
から まで

特定のファイルのみ
以下のファイルのみを対象とします (コンマで区切って列挙してください。 ワイルドカードとして * を含める事ができます)

以下のファイルは除外します。


4. レイアウト

あなたの組織名 (ページのタイトル用)

組織のホームページ (不要の場合は空白のままにしてください)
URL :


analog-6.0/lang/kr.lng0000644000175000017500000003014510161303540014771 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Note: there are still some English words left in this language file. ## This is because the word order in analog is not sufficiently flexible ## to allow an accurate translation. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP *EUC-KR ## Abbreviations for the day and month names. ȭ 1 2 3 4 5 6 7 8 9 10 11 12 ## Next some standard common words. ## Abbreviation for "week beginning" ⵵ ## Quarter of a year б Ʈ Ʈ ## ?bytes represents kbytes, Mbytes etc. ?Ʈ û û ¥ ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 ¥ ð ð ó ó ð ð ȣƮ ȣƮ ȣƮ ȣƮ 丮 丮 Ҽ Ҽ Ȯ Ȯ URL URLs ü ü ## (= operating system, operating systems) ũ ˻ ˻ Ʈ Ʈ ڵ ڵ ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Ϲ ## The time reports, plus "busiest" strings (at the bottom of each report) Ⱓ ȸ⵵: б⺸ ȸб: : ְ : ϰ ϰ : ð ð ð Ӹ ð: 15 15 Ӹ 15 : 5 5 Ӹ 5 : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! ȣƮ ȣƮ ȣƮ n ȣƮ 缳 ȣƮ ȣƮ n ȣƮ ȣƮ ȣƮ n 丮 丮 丮 n ȭ Ȯ Ȯ n û ȭ ȭ n ȭ ȭ ȭ n ȭ ȭ n ּ ּ n Ʈ Ʈ Ʈ n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n ˻ ˻ ˻ n ˻ ܾ ˻ ˻ n ˻ ˻ ˻ n ˻ ܾ ˻ ܾ ˻ ܾ n ȣƮ ȣƮ ȣƮ n ȣƮ 缳 ȣƮ ȣƮ n ȣƮ ȣƮ ȣƮ n n 缳 ڵ n n () n () n ü ü ü n n ȸ, ȸ, ȸ, n ڵ ڵ ڵ n óð ȭ ũ ## Used at the bottom of the report ۼ α׷ : ð Less than 1 ## Used in the time reports ǥ : ̳ Ϻκ û û ## Used at the bottom of each non-time report: need m, f & n genders * * ǥ ## Used on the pie charts: again need m, f & n genders * * Ÿ ## Used at the top of the report α׷ ð : : : ## Used in the General Summary û Ǽ û Ǽ û Ǽ û Ǽ ڵ尡 αȭ û Ǽ ۵ û Ǽ ڵ û Ǽ û ȭ Ǽ ȣƮ м Ұ αȭ м û αȭ Ÿ Ÿ ۷ ȣ ڴ 7 days to 7ϰ ̵ ## Some special phrases for particular reports. ̸ ã ּ ϵ ˷ Ʈ 丮 丮 Ȯ directory ˷ ٸ н κ ˷ ü ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) û 7ϰ ɽƮ û(%) %7ϰ Ʈ(%) 7 (%) ϰ (%) Ʈ ?Ʈ 7-ϰ Ʈ 7-ϰ ?Ʈ(%) Ʈ(%) 7-ϰ Ʈ(%) ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * ù° : %s * * ù° : %d %s * * : %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors 7 Ʈ 7 Ʈ 7 7 缳 Ʈ 缳 Ʈ 7ϰ 缳 7ϰ 缳 Ʈ Ʈ 7ϰ Ʈ 7ϰ Ʈ % Ʈ % 7ϰ Ʈ % Ʈ ߿ ִġ % 7ϰ Ʈ ߿ ִġ Ʈ ǥǴ Ʈ Ʈ ǥǴ Ʈ ## ?bytes represents kbytes, Mbytes etc. ?Ʈ ǥǴ Ʈ 7ϰ Ʈ ǥǴ Ʈ 7ϰ Ʈ ǥǴ Ʈ 7ϰ ?Ʈ ǥǴ Ʈ requested since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report Ÿ ´. ## Used in pie charts ǥ Ͽ ׷. ## different ways of sorting Ʈ 7ϰ Ʈ % Ʈ % 7 Ʈ % Ʈ ִ밪 % 7ϰ Ʈ ִ밪 û 7 Ʈ % % 7ϰ % ִ밪 % 7ϰ ִ밪 û 7 Ʈ % 缳 Ʈ % 7 缳 Ʈ % 缳 Ʈ ִ밪 % 7ϰ 缳 Ʈ ִ밪 缳 Ʈ 7 缳 Ʈ % Ʈ % 7 Ʈ % Ʈ ִ밪 % 7 Ʈ ִ밪 Ʈ 7 Ʈ Ʈ ð 缳 Ʈ ð Ʈ ð ó Ʈ ð ó 缳 Ʈ ð ó Ʈ ð ## 3 other ways of sorting in m, f, & n * * * * * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y-%m-%D %H:%n ## "Program started at" and "Analysed requests from" %y-%m-%D-%w %H:%n ## In Daily Report %y/%m/%d ## In Daily Summary %w ## In Hourly Report %y/%m/%d %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %y/%m/%d %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %y/%m/%d ## In Monthly Report %Y %m ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %y/%m/%d ## The date & time (D) column in non-time reports %y/%m/%d %H:%n ## In non-time reports: "including all files with requests since [date]" %y/%m/%d at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/lt.lng0000644000175000017500000003345510161303540015003 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## Lietuviu kalba (Lithuanian language) ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-4 ## Abbreviations for the day and month names. Sekm Pirm Antr Tre Ketv Pen et Saus Vas Kov Bal Geg Bir Liep Rugp Rugs Spal Lap Gruod ## Next some standard common words. ## Abbreviation for "week beginning" sav. pradia ++year++ ## Quarter of a year ++quarter++ mnuo diena dienos val minut minuts sekund sekunds baitas baitai ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ uklausa uklaus data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data laikas ++time++ ++first date++ ++first time++ pask. data pask. kartas failas fail/as hostas host/as virtualus hostas virtuali host/as katalogas katalog/as domenas domen/as ++organisation++ ++organisations++ ipltimas ipltim/as URL URL narykl narykli/s ++OS++ ++OS's++ ## (= operating system, operating systems) dydis ++search term++ ++search terms++ tinklapis tinklapi/is vartotojas vartotoj/as statuso kodas statuso kod/as Web Serverio Statistikos ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Bendra Suvestin ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Ataskaita Pagal Mnesius Uimiausias Mnuo: Ataskaita Pagal Savaites Uimiausia Savait: Savaits Suvestin Ataskaita Pagal Dienas Uimiausia Diena: Ataskaita Pagal Valandas Paros Suvestin ++Hour of the Week Summary++ Uimiausia Valanda: Ataskaita Pagal Valandos Ketvirius ++Quarter-Hour Summary++ Uimiausias Valandos Ketvirtis: Penkiaminutin Ataskaita ++Five-Minute Summary++ Uimiausios Penkios Minuts: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Ataskaita hostas host m ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Katalog Ataskaita katalogas katalog m Fail Tip Ataskaita ipltimas ipltim m Uklaus Ataskaita failas fail m Peradresavim Ataskaita failas fail m Neskming Uklaus Ataskaita failas fail m Nuorod Ataskaita vedantysis URL vedanij URL m Nuorod Tinklapi Ataskaita vedantysis tinklapis vedanij tinklapi m Peradresavimo Nuorod Ataskaita vedantis URL vedanij URL m Neskming Nuorod Ataskaita vedantysis URL vedanij URL m ++Search Query Report++ ++query++ ++queries++ ++n++ ++Search Word Report++ ++query word++ ++query words++ ++n++ ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Virtuali Host Ataskaita virtualus hostas virtuali host m ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Vartotoj Ataskaita vartotojas vartotoj m ++User Redirection Report++ ++user++ ++users++ ++n++ Vartotoj Neskmi Ataskaita vartotojas vartotoj m Narykli Suvestin narykl narykli f Narykli Ataskaita narykl narykli f ++Operating System Report++ ++operating system++ ++operating systems++ ++n++ Domen Ataskaita domenas domen m ++Organisation Report++ ++organisation++ ++organisations++ ++n++ Statuso kodo Ataskaita statuso kodas statuso kod m ++Processing Time Report++ Fail dydio Ataskaita ## Used at the bottom of the report i analiz sugeneruota Analizs trukm Maiau negu 1 ## Used in the time reports Kiekvien vienet sudaro arba j dalis uklausa uklaus/os ## Used at the bottom of each non-time report: need m, f & n genders netraukti netrauktos * ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report Analiz atlikta Analizuotos uklausos nuo iki ## Used in the General Summary Skming uklaus Skming uklaus vidurkis per dien Skmingos puslapi uklausos Skming puslapi uklaus vidurkis per dien Log failo eilui be statuso kodo skaiius Neskming uklaus Peradresuot uklaus Uklaus su informaciniu statuso kodu Skirting fail uklaus Skirting host kreipini Sugadintos log failo eiluts Nereikalingos log failo eiluts Perduota duomen Perduot duomen vidurkis per dien Skliaustuose nurodyti rezultatai 7 dienos iki paskutinms 7 dienoms Eiti Vir ## Some special phrases for particular reports. ++[unresolved numerical addresses]++ ++[domain not given]++ ++[unknown domain]++ ++[root directory]++ ++[no directory]++ ++[no extension]++ ++[directories]++ ++Unknown Windows++ ++Other Unix++ ++Robots++ ++OS unknown++ ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #kiekis ++7-day reqs++ %kiekio ++%7-day reqs++ puslapiai ++7-day pages++ %puslapi ++%7-day pages++ baitai ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %bait ++%7-day bytes++ ++no.++ ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Pirm %s sraas Pirm %s sraas * Pirm %d-ies %s sraas Pirm %d-ies %s sraas * Sraas %s Sraas %s * ## "by" in the phrase "listing the top 3 files BY number of requests" , pagal ## All requests WITH AT LEAST 10 requests , sudarani maiausiai ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ peradresuota uklausa peradresuot uklaus ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ neskminga uklausa neskming uklaus ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % apkrovimo ++% of the traffic in the last 7 days++ % maksimalaus apkrovimo ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ apkrovimas baitais ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ uklausta nuo kartu su peradresuotomis uklausomis nuo kartu su neskmingomis uklausomis nuo ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) suriuot pagal suriuot pagal * ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting apkrovimo dyd ++the amount of traffic in the last 7 days++ % uklaus ++% of the requests in the last 7 days++ % maksimalaus uklaus kiekio ++% of the maximum number of requests in the last 7 days++ uklaus kiek ++the number of requests in the last 7 days++ % puslapi uklaus ++% of the requests for pages in the last 7 days++ % maksimalaus puslapi uklaus kiekio ++% of the maximum number of requests for pages in the last 7 days++ uklaus kiek puslapiams ++the number of requests for pages in the last 7 days++ % peradresuot uklaus ++% of the redirected requests in the last 7 days++ % maksimalaus peradresuot uklaus kiekio ++% of the maximum number of redirected requests in the last 7 days++ peradresuot uklaus kiek ++the number of redirected requests in the last 7 days++ % neskming uklaus ++% of the failed requests in the last 7 days++ % maksimalau neskming uklaus kiekio ++% of the maximum number of failed requests in the last 7 days++ neskming uklaus kiek ++the number of failed requests in the last 7 days++ paskutins uklausos laik paskutins peradresuotos uklausos laik paskutins neskmingos uklausos laik ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n suriuoti pagal alfabet suriuotos pagal alfabet * suriuoti pagal kiek suriuotos pagal kiek * neriuoti neriuotos * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary ++%w++ ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. ++100 Continue with request++ ++101 Switching protocols++ ++1xx [Miscellaneous informational]++ ++200 OK++ ++201 Created++ ++202 Accepted for future processing++ ++203 Non-authoritative information++ ++204 OK, but nothing to send++ ++205 Reset document++ ++206 Partial content++ ++2xx [Miscellaneous successes]++ ++300 Multiple documents available++ ++301 Document moved permanently++ ++302 Document found elsewhere++ ++303 See other document++ ++304 Not modified since last retrieval++ ++305 Use proxy++ ++306 Switch proxy++ ++307 Document moved temporarily++ ++3xx [Miscellaneous redirections]++ ++400 Bad request++ ++401 Authentication required++ ++402 Payment required++ ++403 Access forbidden++ ++404 Document not found++ ++405 Method not allowed++ ++406 Document not acceptable to client++ ++407 Proxy authentication required++ ++408 Request timeout++ ++409 Request conflicts with state of resource++ ++410 Document gone permanently++ ++411 Length required++ ++412 Precondition failed++ ++413 Request too long++ ++414 Requested filename too long++ ++415 Unsupported media type++ ++416 Requested range not valid++ ++417 Expectation failed++ ++4xx [Miscellaneous client/user errors]++ ++500 Internal server error++ ++501 Request type not supported++ ++502 Error at upstream server++ ++503 Service temporarily unavailable++ ++504 Gateway timeout++ ++505 HTTP version not supported++ ++506 Redirection failed++ ++5xx [Miscellaneous server errors]++ ++xxx [Unknown]++ analog-6.0/lang/lv.lng0000644000175000017500000003374010161303540015002 0ustar sret1sret100000000000000## Latvian language file for analog 6.0 ## May not (or may) work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Made by Anda Bimbere ## anda@firstcut.net http://www.firstcut.net Web design & hosting ## Any comments welcome ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1257 ## Abbreviations for the day and month names. Svtd. Pirmd. Otrd. Tred. Ceturtd. Piektd. Sestd. Jan Feb Mar Apr Maij Jn Jl Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" nedas sk. gads ## Quarter of a year ceturksnis mnesis diena dienas st. minte mintes sekunde sekundes baits baiti ## ?bytes represents kbytes, Mbytes etc. ?baiti pieprasjums pieprasjumi datums ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datums laiks laiks pirmais datums pirmais laiks pdjais datums pdjais laiks fails faili dators datori virtula mana virtulas manas direktorija direktorijas domns domni organizcija organizcijas paplainjums paplainjumi URL URLi Internet prlkprogramma Internet prlkprogrammas OS OSas ## (= operating system, operating systems) izmrs meklanas vrds meklanas vrdi saits saiti lietotjs lietotji status kods status kodi Web Servera Statistika ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ss Kopsavilkums ## The time reports, plus "busiest" strings (at the bottom of each report) Gada Prskats Visnoslogotkais gads: Ceturka Prskats Visnoslogotkais ceturksnis: Mnea Prskats Visnoslogotkais mnesis: Nedas Prskats Visnoslogotk neda: nedas skums Dienas kopsavilkums Dienas Prskats Visnoslogotk diena: Stundas Prskats Stundas Kopsavilkums Nedas Stundu Kopsavilkums Visnoslogotk stunda: Ceturtdastundas Prskats Ceturtdastundas Kopsavilkums Visnoslogotk stundas ceturtdaa: Piecu Minu Prskats Piecu Minu Kopsavilkums Visnoslogotks piecas mintes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Datoru Statistika dators datori m Servera Pradrescijas Prskats serveris serveri m Servera Neveiksmju Prskats serveris serveri m Direktoriju Prskats direktorija direktorijas f Failu Tipu Prskats faila paplainjums failu paplainjumi m Pieprasjumu Prskats fails faili m Pradrescijas Prskats fails faili m Kdu Prskats fails faili m Prsttju Prskats prsttja URL prsttju URLi m Prsttja Lapas Prskats prsttja lapa prsttju lapas f Pradresto Prsttju Prskats prsttja URL prsttju URLi m Neveiksmgu Prsttju Prskats prsttja URL prsttju URLi m Meklanas Pieprasjumu Prskats pieprasjums pieprasjumi m Meklanas Vrdu Prskats meklanas vrds meklanas vrdi m Iekjs Meklanas Pieprasjuma Prskats pieprasjums pieprasjumi m Iekjs Meklanas Vrda Prskats pieprasjuma vrds pieprasjumu vrdi m Virtulo Manu Prskats virtula mana virtulas manas f Virtul Servera Pradresciju Prskats virtulais serveris virtulie serveri m Virtul Servera Neveiksmju Prskats virtulais serveris virtulie serveri m Lietotju Prskats lietotjs lietotji m Lietotju Pradrescijas Prskats lietotjs lietotji m Lietotju Neveiksmju Prskats lietotjs lietotji m Internet Prlkprogrammu Kopsavilkums Internet prlkprogramma Internet prlkprogrammas f Internet Prlkprogrammu Prskats Internet prlkprogramma Internet prlkprogrammas f Opertjsistmu Prskats opertjsistma opertjsistmas f Domnu Prskats domns domni m Organizciju Prskats organizcija organizcijas f Status Kodu Prskats status kods status kodi m Prstrdanas Laika Prskats Failu Izmru Statistika ## Used at the bottom of the report analze tika izveidota ar Analizanas laiks Mazks k 1 ## Used in the time reports Katra vienba parda vai dau no tiem lapas pieprasjums lapas pieprasjumi ## Used at the bottom of each non-time report: need m, f & n genders nav pardti nav pardtas nav pardti ## Used on the pie charts: again need m, f & n genders Cits Cita Cits ## Used at the top of the report Programma bija skta: Analizti pieprasjumi no ldz ## Used in the General Summary Veiksmgu pieprasjumu skaits Veiksmgu pieprasjumu vidjais skaits dien Lapu veiksmgo pieprasjumu skaits Lapu veiksmgo pieprasjumu vidjais skaits dien Logfaila rindas bez statusa koda bija Neveiksmgu pieprasjumu skaits Pradresto pieprasjumu skaits Pieprasjumu ar informcijas statusa kodu bija Pieprastie individulie faili Apkalpotie individulie serveri Sabojto logfailu rindas Nelietots logfaila rindas Prsttie dati Dien vidji prsttie dati Numuri iekavs attiecas uz 7 dienu periods beidzoties pdjs 7 dienas Skatt Skums ## Some special phrases for particular reports. [neatrisintas numurisks adreses] [domeins nav uzrdts] [nezinms domeins] [saknes direktorija] [nav direktorijas] [nav paplainjums] [direktorijas] Nezinms Windows Cits Unix Roboti OS nezinma ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #piepr 7 dienu piepr. %piepr %7 dienu piepr. lapas 7 dienu lapas %lapas %7 dienu lapas baiti ?baiti 7 dienu baiti 7 dienu ?baiti %baiti %7 dienu baiti No. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Uzrdti topa %s Uzrdtas topa %s Uzrdti topa %s Uzrdti topa %d %s Uzrdtas topa %d %s Uzrdti topa %d %s Uzrdti %s Uzrdtas %s Uzrdti %s ## "by" in the phrase "listing the top 3 files BY number of requests" pc ## All requests WITH AT LEAST 10 requests kam ir ne mazk par ## Different ways of doing floors pieprasjums pdjo 7 dienu laik pieprasjumi pdjo 7 dienu laik lapas pieprasjums pdjo 7 dienu laik lapu pieprasjumi pdjo 7 dienu laik pradrests pieprasjums pradresti pieprasjumi pradrests pieprasjums pdjo 7 dienu laik pradresti pieprasjumi pdjo 7 dienu laik neizdevies pieprasjums neizdevuies pieprasjumi neizdevies pieprasjums pdjo 7 dienu laik neizdevuies pieprasjumi pdjo 7 dienu laik % no satiksmes % no satiksmes pdjo 7 dienu laik % no kopjs satiksmes % no vislielks satiksmes daudzuma pdjo 7 dienu laik baits no satiksmes baiti no satiksmes ## ?bytes represents kbytes, Mbytes etc. ?baiti no satiksmes baits no satiksmes pdjo 7 dienu laik baiti no satiksmes pdjo 7 dienu laik ?baiti no satiksmes pdjo 7 dienu laik pieprasti kop ar pradrestiem pieprasjumiem kop ar neveiksmgiem pieprasjumiem ar pirmo pieprasjumu kop ar pirmo pradresto pieprasjumu kop ar pirmo neveiksmgo pieprasjumu kop ## Now "sorted by": again, in m, f & n (only needed in plural though) sakrtoti pc sakrtotas pc sakrtoti pc ## Used at the top of each report aj prskat ir dati no ## Used in pie charts les ir izveidotas no ## different ways of sorting satiksmes daudzuma satiksmes daudzuma pdjo 7 dienu laik % no pieprasjumiem % no pieprasjumiem pdjo 7 dienu laik % no vislielak pieprasjumu skaita % no vislielak pieprasjumu skaita pdjo 7 dienu laik pieprasjumu skaita pieprasjumu skaits pdjo 7 dienu laik % no lapu pieprasjuma % no lapu pieprasjuma pdjo 7 dienu laik % no lapu kopj pieprasjuma % no vislielk lapu pieprasjumu skaita pdjo 7 dienu laik lapu pieprasjumu skaita lapu pieprasjumu skaits pdjo 7 dienu laik % no pradrestiem pieprasjumiem % no pradrestiem pieprasjumiem pdjo 7 dienu laik % no pradresto pieprasjumu vislielk skaita % no pradresto pieprasjumu vislielk skaita pdjo 7 dienu laik pradresto pieprasjumu skaita pradresto pieprasjumu skaits pdjo 7 dienu laik % no neveiksmgiem pieprasjumiem % no neveiksmgiem pieprasjumiem pdjo 7 dienu laik % no visiem neveiksmgiem pieprasjumiem % no neveiksmgu pieprasjumu vislielk skaita pdjo 7 dienu laik no neveiksmgu pieprasjumu skaita neveiksmgo pieprasjumu skaits pdjo 7 dienu laik pdjais pieprasjums bija pdjais pradrestais pieprasjums bija pdjais neveiksmgais pieprasjums bija pirm pieprasjuma laiks pirm pradrest pieprasjuma laiks pirm neveiksmg pieprasjuma laiks ## 3 other ways of sorting in m, f, & n sakrtoti pc alfabta krtbas sakrtotas pc alfabta krtbas sakrtoti pc alfabta krtbas sakrtoti pc secbas sakrtotas pc secbas sakrtoti pc secbas nesakrtoti nesakrtotas nesakrtoti ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y.g. %d. %m. %H:%n ## "Program started at" and "Analysed requests from" %w, %Y.g. %d. %m. %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m.%x%l. %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Turpint pieprasjumu 101 Tiek maints protokols 1xx [Dada informcija] 200 OK 201 Izveidota 202 Pieemts prstrdei nkotn 203 neautorizta informcija 204 OK, bet nav, ko stt 205 Atjaunots dokuments 206 Dajs saturs 2xx [Dadi izdevuies pieprasjumi] 300 Pieejami vairki dokumenti 301 Dokuments pastvgi prvietots 302 Dokuments atrodams citur 303 Apskatiet citu dokumentu 304 Nav maints kop pdjs reizes 305 Lietojiet proxy 306 Mainiet proxy 307 Dokuments pagaidm prvietots 3xx [Dadas pradrescijas] 400 Slikts pieprasjums 401 Nepiecieama autentikcija+ 402 Vajadzgs maksjums 403 Pieeja aizliegta 404 Dokuments nav atrasts 405 Metode nav atauta 406 Dokuments nav pieemams klientam 407 Nepiecieama proxy autentikcija 408 Pieprasjuma laiks beidzies 409 Pieprasjums ir pretrun ar resursu stvokli 410 Dokuments ir pastvgi izemts no lietoanas 411 Vajadzgs garums 412 Ieprieknosacjums nav izdevies 413 Pieprasjums par garu 414 Pieprastais faila nosaukums par garu 415 Neatbalstti mediju veidi 416 Pieprast amplitda nederga 417 Pieprasjums nav izdevies 4xx [Dadas klientu/lietotju kdas] 500 Iekj servera kda 501 Pieprasjuma veids nav atbalstts 502 Kda vien no tlkajiem serveriem 503 Pakalpojums pagaidm nav pieejams 504 Gateway laiks beidzies 505 HTTP versija nav atbalstta 506 Neveiksmga pradrescija 5xx [Dadas servera kdas] xxx [Nezinms] analog-6.0/lang/nl.lng0000644000175000017500000003340610161303540014771 0ustar sret1sret100000000000000## Taalbestand voor Analog 6.0. Kan wellicht niet werken met andere versies. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Vertaling Engels naar Nederlands a.d.h.v het oude taalbestand. ## 16 Juni 1998, Joost Baaij . ## ## Translation for version 4 by Dimitry Smagghe ## Translation for version 5 by Bert Hiddink ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Zon Maa Din Woe Don Vry Zat Jan Feb Mrt Apr Mei Jun Jul Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. jaar ## Quarter of a year kwartaal maand dag dagen u. minuut minuten seconde seconden byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes aanvraag aanvragen datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum tijd tijd eerste datum eerste tijd laatste datum laatste tijd bestand bestanden host hosts virtual host virtual hosts directory directories domein domeinen bedrijf bedrijven extensie extensies URL URLs browser browsers besturingssysteem besturingssystemen ## (= operating system, operating systems) grootte zoek string zoek strings site sites gebruiker gebruikers status code status codes Website statistieken voor ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Algemene samenvatting ## The time reports, plus "busiest" strings (at the bottom of each report) Jaar Rapport Drukste jaar Kwartaal Rapport Drukste kwartaal Maandelijks Rapport Drukste maand: Wekelijks Rapport Drukste week: week beginnende Dagelijkse Samenvatting Dagelijks Rapport Drukste dag: Uur Rapport Uur Samenvatting Uur van de Week Samenvatting Drukste uur: Kwartier Rapport Kwartier Samenvatting Drukste kwartier van een uur: Vijf-minuten Rapport Vijf-minuten Samenvatting Drukste vijf minuten: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Rapport host hosts n Host Doorverwezen Rapport host hosts n Host Mislukking Rapport host hosts n Directory Rapport directory directories n Bestands Type Rapport extensie extensies n Aanvragen Rapport Aangevraagd bestand aangevraagde bestanden n Redirectie Rapport Aangevraagd bestand aangevraagde bestanden n Mislukking Rapport Aangevraagd bestand aangevraagde bestanden n Referrer Rapport refererende URL refererende URLs n Refererende Sites Rapport refererende site refererende sites n Doorverwezen Referrer Rapport refererende URL refererende URLs n Mislukte Referrer Rapport refererende URL refererende URLs n Zoek Query Rapport query queries n Zoek Woord Rapport query woord query woorden n Intern Zoekopdracht Rapport zoekopdracht zoekopdrachten n Intern Zoekwoord Rapport zoekwoord zoekwoorden n Virtual Host Rapport virtual host virtual hosts n Virtuele Host Redirect Rapport virtuele host virtuele hosts n Virtuel Host Mislukking Rapport virtuele host virtuele hosts n Gebruiker Rapport gebruiker gebruikers n Gebruiker Doorverwezen Rapport gebruiker gebruikers n Gebruiker Mislukking Rapport gebruiker gebruikers n Browser Samenvatting browser browsers n Browser Rapport browser browsers n Besturingssysteem Rapport Besturingssysteem Besturingssysteemen n Domein Rapport domein domeinen n Bedrijfs Rapport bedrijf bedrijven n Status Code Rapport status code status codes n Verwerkingstijd Rapport Bestandsgrootte Rapport ## Used at the bottom of the report Deze analyse is geproduceerd door Looptijd Minder dan 1 ## Used in the time reports Elke eenheid representeert of een gedeelte hiervan aanvragen voor een pagina aanvragen voor pagina's ## Used at the bottom of each non-time report: need m, f & n genders * * niet getoond ## Used on the pie charts: again need m, f & n genders * * Andere ## Used at the top of the report Programma gestart op Aanvragen geanalyseerd van tot ## Used in the General Summary Totale aantal geslaagde aanvragen Gemiddelde aantal geslaagde aanvragen per dag Totale aantal geslaagde aanvragen voor pagina's Gemiddelde aantal geslaagde aanvragen voor pagina's per dag Logbestand regels zonder status code Totale aantal mislukte aanvragen Totale aantal omgeleide aanvragen Aantal aanvragen met informatieve status code Aantal verschillende bestanden aangevraagd Aantal verschillende hosts bediend Onleesbare regels in logbestand Ongebruikte regels in logbestand Totale hoeveelheid data verzonden Gemiddelde hoeveelheid data verzonden per dag Getallen tussen haakjes verwijzen naar de 7 dagen tot afgelopen 7 dagen Ga Naar Top ## Some special phrases for particular reports. [Niet gevonden numerieke adressen] [domein niet gegeven] [ongekend domein] [hoofdmap] [geen map] [geen uitbreiding] [mappen] Onbekende Windows Ander Unix Robots Onbekend besturingssysteem ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #aanv 7-dagen aanvragen %aanv 7-dagen aanvragen pags 7-dagen paginas %pags 7-dagen paginas bytes ?bytes 7-dagen bytes 7-dagen ?bytes %bytes 7-dagen ?bytes aantal ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Top %s afgedrukt * * Top %d %s afgedrukt * * Alle %s afgedrukt ## "by" in the phrase "listing the top 3 files BY number of requests" met ## All requests WITH AT LEAST 10 requests met minstens ## Different ways of doing floors aanvraag gedurende afgelopen 7 dagen aanvragen gedurende afgelopen 7 dagen aanvraag voor een pagina gedurende afgelopen 7 dagen aanvragen voor paginas gedurende de afgelopen 7 dagen doorverwezen aanvraag doorverwezen aanvragen doorverwezen aanvraag gedurende de laatste 7 dagen doorverwezen aanvragen gedurende de laatste 7 dagen mislukt aanvraag mislukte aanvragen mislukte aanvraag gedurende de laatste 7 dagen mislukte aanvragen gedurende de laatste 7 dagen % van het verkeer % van het verkeer gedurende de laatste 7 dagen % van het maximale aantal verkeer % van de maximale hoeveelheid verkeer gedurende de afgelopen 7 dagen byte van het verkeer bytes van het verkeer ## ?bytes represents kbytes, Mbytes etc. ?bytes van het verkeer byte van het verkeer gedurende de laatste 7 dagen bytes van het verkeer gedurende de laatste 7 dagen ?bytes van het verkeer gedurende de laatste 7 dagen verzocht sinds met een doorverwezen aanvraag sinds met een mislukt aanvraag sinds met eerste aanvraag sinds met eerste doorverwezen aanvraag sinds met eerste mislukte aanvraag sinds ## Now "sorted by": again, in m, f & n (only needed in plural though) * * gesorteerd op ## Used at the top of each report Dit rapport bevat gegevens van ## Used in pie charts De taartpunten geven weer de ## different ways of sorting hoeveelheid verkeer de hoeveelheid verkeer gedurende the laatste 7 dagen % van de aanvragen % van de aanvragen gedurende de laatste 7 dagen % van het maximale aantal aanvragen % van het maximale aantal aanvragen gedurende de laatste 7 dagen het aantal aanvragen het aantal aanvragen gedurende de laatste 7 dagen % van de aanvragen voor pagina's % van pagina aanvragen gedurende de laatste 7 dagen % van het aantal aanvragen voor pagina's % van het maximale aantal pagina aanvragen gedurende de laatste 7 dagen het aantal aanvragen voor pagina's het aantal pagina aanvragen gedurende de laatste 7 dagen % van de doorverwezen aanvragen % van de doorverwezen aanvragen gedurende de laatste 7 dagen % van het maximale aantal doorverwezen aanvragen % van het maximale aantal doorverwezen aanvragen gedurende de laatste 7 dagen het aantal doorverwezen aanvragen het aantal doorverwezen aanvragen gedurende de laatste 7 dagen % van de mislukte aanvragen % van de mislukte doorverwezen aanvragen gedurende de laatste 7 dagen % van het maximum aantal mislukte aanvragen % van het maximale aantal aanvragen gedurende de laatste 7 dagen het aantal mislukte aanvragen het aantal mislukte aanvragen gedurende de laatste 7 dagen de tijd van de laatste aanvraag de tijd van de laatste doorverwezen aanvraag de tijd van de laatste mislukte aanvraag tijdstip van de eerste aanvraag tijdstip van de eerste doorverwezen aanvraag tijdstip van eerste mislukte aanvraag ## 3 other ways of sorting in m, f, & n * * alfabetisch gesorteerd * * op nummer gesorteerd * * niet gesorteerd ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. vm nm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d-%m-%y ## In Daily Summary %w ## In Hourly Report %d-%m-%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d-%m-%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d-%m-%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d-%m-%y ## The date & time (D) column in non-time reports %d-%m-%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d-%m-%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Doe verder met aanvraag 101 Verwisselen van protocollen 1xx [Overige informatief] 200 OK 201 Gemaakt 202 Aanvaard voor verdere verwerking 203 Niet toegankelijke informatie 204 OK, maar ik heb niks te versturen 205 Herbegin document 206 Gedeeltelijke inhoud 2xx [Verschillende successen] 300 Meerdere documenten beschikbaar 301 Document is voorgoed verplaatst 302 Document elders gevonden 303 Zie ander document 304 Niet gewijzigd sinds laatste opvraging 305 Gebruik proxy 306 Verwissel proxy 307 Document tijdelijk verplaatst 3xx [Gemengde doorverwijzingen] 400 Slechte aanvraag 401 Identificatie vereist 402 Betaling vereist 403 Toegang geweigerd 404 Document niet gevonden 405 Methode niet toegestaan 406 Document niet aanvaard door client 407 Proxy identificatie vereist 408 Tijdlimiet aanvraag overschreden 409 Aanvraag conflicteert met staat van bron 410 Document voorgoed verdwenen 411 Lengte vereist 412 Eerste vereiste niet voldaan 413 Aanvraag te lang 414 Gevraagde bestandsnaam te lang 415 Niet ondersteund media type 416 Gevraagd bereik niet geldig 417 Vooruitzicht mislukt 4xx [Gemengde client/gebruiker fouten] 500 Interne server fout 501 Gevraagde type niet ondersteund 502 Fout by upstream server 503 Dienst tijdelijk onbeschikbaar 504 Tijdlimiet gateway overschreden 505 HTTP versie niet ondersteund 506 Doorverwijzing mislukt 5xx [Gemengde server fouten] xxx [Niet bekend] analog-6.0/lang/nla.lng0000644000175000017500000003340410161303540015130 0ustar sret1sret100000000000000## Taalbestand voor Analog 6.0. Kan wellicht niet werken met andere versies. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Vertaling Engels naar Nederlands a.d.h.v het oude taalbestand. ## 16 Juni 1998, Joost Baaij . ## ## Translation for version 4 by Dimitry Smagghe ## Translation for version 5 by Bert Hiddink ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Zon Maa Din Woe Don Vry Zat Jan Feb Mrt Apr Mei Jun Jul Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. jaar ## Quarter of a year kwartaal maand dag dagen u. minuut minuten seconde seconden byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes aanvraag aanvragen datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum tijd tijd eerste datum eerste tijd laatste datum laatste tijd bestand bestanden host hosts virtual host virtual hosts directory directories domein domeinen bedrijf bedrijven extensie extensies URL URLs browser browsers besturingssysteem besturingssystemen ## (= operating system, operating systems) grootte zoek string zoek strings site sites gebruiker gebruikers status code status codes Website statistieken voor ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Algemene samenvatting ## The time reports, plus "busiest" strings (at the bottom of each report) Jaar Rapport Drukste jaar Kwartaal Rapport Drukste kwartaal Maandelijks Rapport Drukste maand: Wekelijks Rapport Drukste week: week beginnende Dagelijkse Samenvatting Dagelijks Rapport Drukste dag: Uur Rapport Uur Samenvatting Uur van de Week Samenvatting Drukste uur: Kwartier Rapport Kwartier Samenvatting Drukste kwartier van een uur: Vijf-minuten Rapport Vijf-minuten Samenvatting Drukste vijf minuten: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Rapport host hosts n Host Doorverwezen Rapport host hosts n Host Mislukking Rapport host hosts n Directory Rapport directory directories n Bestands Type Rapport extensie extensies n Aanvragen Rapport Aangevraagd bestand aangevraagde bestanden n Redirectie Rapport Aangevraagd bestand aangevraagde bestanden n Mislukking Rapport Aangevraagd bestand aangevraagde bestanden n Referrer Rapport refererende URL refererende URLs n Refererende Sites Rapport refererende site refererende sites n Doorverwezen Referrer Rapport refererende URL refererende URLs n Mislukte Referrer Rapport refererende URL refererende URLs n Zoek Query Rapport query queries n Zoek Woord Rapport query woord query woorden n Intern Zoekopdracht Rapport zoekopdracht zoekopdrachten n Intern Zoekwoord Rapport zoekwoord zoekwoorden n Virtual Host Rapport virtual host virtual hosts n Virtuele Host Redirect Rapport virtuele host virtuele hosts n Virtuel Host Mislukking Rapport virtuele host virtuele hosts n Gebruiker Rapport gebruiker gebruikers n Gebruiker Doorverwezen Rapport gebruiker gebruikers n Gebruiker Mislukking Rapport gebruiker gebruikers n Browser Samenvatting browser browsers n Browser Rapport browser browsers n Besturingssysteem Rapport Besturingssysteem Besturingssysteemen n Domein Rapport domein domeinen n Bedrijfs Rapport bedrijf bedrijven n Status Code Rapport status code status codes n Verwerkingstijd Rapport Bestandsgrootte Rapport ## Used at the bottom of the report Deze analyse is geproduceerd door Looptijd Minder dan 1 ## Used in the time reports Elke eenheid representeert of een gedeelte hiervan aanvragen voor een pagina aanvragen voor pagina's ## Used at the bottom of each non-time report: need m, f & n genders * * niet getoond ## Used on the pie charts: again need m, f & n genders * * Andere ## Used at the top of the report Programma gestart op Aanvragen geanalyseerd van tot ## Used in the General Summary Totale aantal geslaagde aanvragen Gemiddelde aantal geslaagde aanvragen per dag Totale aantal geslaagde aanvragen voor pagina's Gemiddelde aantal geslaagde aanvragen voor pagina's per dag Logbestand regels zonder status code Totale aantal mislukte aanvragen Totale aantal omgeleide aanvragen Aantal aanvragen met informatieve status code Aantal verschillende bestanden aangevraagd Aantal verschillende hosts bediend Onleesbare regels in logbestand Ongebruikte regels in logbestand Totale hoeveelheid data verzonden Gemiddelde hoeveelheid data verzonden per dag Getallen tussen haakjes verwijzen naar de 7 dagen tot afgelopen 7 dagen Ga Naar Top ## Some special phrases for particular reports. [Niet gevonden numerieke adressen] [domein niet gegeven] [ongekend domein] [hoofdmap] [geen map] [geen uitbreiding] [mappen] Onbekende Windows Ander Unix Robots Onbekend besturingssysteem ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #aanv 7-dagen aanvragen %aanv 7-dagen aanvragen pags 7-dagen paginas %pags 7-dagen paginas bytes ?bytes 7-dagen bytes 7-dagen ?bytes %bytes 7-dagen ?bytes aantal ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Top %s afgedrukt * * Top %d %s afgedrukt * * Alle %s afgedrukt ## "by" in the phrase "listing the top 3 files BY number of requests" met ## All requests WITH AT LEAST 10 requests met minstens ## Different ways of doing floors aanvraag gedurende afgelopen 7 dagen aanvragen gedurende afgelopen 7 dagen aanvraag voor een pagina gedurende afgelopen 7 dagen aanvragen voor paginas gedurende de afgelopen 7 dagen doorverwezen aanvraag doorverwezen aanvragen doorverwezen aanvraag gedurende de laatste 7 dagen doorverwezen aanvragen gedurende de laatste 7 dagen mislukt aanvraag mislukte aanvragen mislukte aanvraag gedurende de laatste 7 dagen mislukte aanvragen gedurende de laatste 7 dagen % van het verkeer % van het verkeer gedurende de laatste 7 dagen % van het maximale aantal verkeer % van de maximale hoeveelheid verkeer gedurende de afgelopen 7 dagen byte van het verkeer bytes van het verkeer ## ?bytes represents kbytes, Mbytes etc. ?bytes van het verkeer byte van het verkeer gedurende de laatste 7 dagen bytes van het verkeer gedurende de laatste 7 dagen ?bytes van het verkeer gedurende de laatste 7 dagen verzocht sinds met een doorverwezen aanvraag sinds met een mislukt aanvraag sinds met eerste aanvraag sinds met eerste doorverwezen aanvraag sinds met eerste mislukte aanvraag sinds ## Now "sorted by": again, in m, f & n (only needed in plural though) * * gesorteerd op ## Used at the top of each report Dit rapport bevat gegevens van ## Used in pie charts De taartpunten geven weer de ## different ways of sorting hoeveelheid verkeer de hoeveelheid verkeer gedurende the laatste 7 dagen % van de aanvragen % van de aanvragen gedurende de laatste 7 dagen % van het maximale aantal aanvragen % van het maximale aantal aanvragen gedurende de laatste 7 dagen het aantal aanvragen het aantal aanvragen gedurende de laatste 7 dagen % van de aanvragen voor pagina's % van pagina aanvragen gedurende de laatste 7 dagen % van het aantal aanvragen voor pagina's % van het maximale aantal pagina aanvragen gedurende de laatste 7 dagen het aantal aanvragen voor pagina's het aantal pagina aanvragen gedurende de laatste 7 dagen % van de doorverwezen aanvragen % van de doorverwezen aanvragen gedurende de laatste 7 dagen % van het maximale aantal doorverwezen aanvragen % van het maximale aantal doorverwezen aanvragen gedurende de laatste 7 dagen het aantal doorverwezen aanvragen het aantal doorverwezen aanvragen gedurende de laatste 7 dagen % van de mislukte aanvragen % van de mislukte doorverwezen aanvragen gedurende de laatste 7 dagen % van het maximum aantal mislukte aanvragen % van het maximale aantal aanvragen gedurende de laatste 7 dagen het aantal mislukte aanvragen het aantal mislukte aanvragen gedurende de laatste 7 dagen de tijd van de laatste aanvraag de tijd van de laatste doorverwezen aanvraag de tijd van de laatste mislukte aanvraag tijdstip van de eerste aanvraag tijdstip van de eerste doorverwezen aanvraag tijdstip van eerste mislukte aanvraag ## 3 other ways of sorting in m, f, & n * * alfabetisch gesorteerd * * op nummer gesorteerd * * niet gesorteerd ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. vm nm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d-%m-%y ## In Daily Summary %w ## In Hourly Report %d-%m-%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d-%m-%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d-%m-%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d-%m-%y ## The date & time (D) column in non-time reports %d-%m-%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d-%m-%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Doe verder met aanvraag 101 Verwisselen van protocollen 1xx [Overige informatief] 200 OK 201 Gemaakt 202 Aanvaard voor verdere verwerking 203 Niet toegankelijke informatie 204 OK, maar ik heb niks te versturen 205 Herbegin document 206 Gedeeltelijke inhoud 2xx [Verschillende successen] 300 Meerdere documenten beschikbaar 301 Document is voorgoed verplaatst 302 Document elders gevonden 303 Zie ander document 304 Niet gewijzigd sinds laatste opvraging 305 Gebruik proxy 306 Verwissel proxy 307 Document tijdelijk verplaatst 3xx [Gemengde doorverwijzingen] 400 Slechte aanvraag 401 Identificatie vereist 402 Betaling vereist 403 Toegang geweigerd 404 Document niet gevonden 405 Methode niet toegestaan 406 Document niet aanvaard door client 407 Proxy identificatie vereist 408 Tijdlimiet aanvraag overschreden 409 Aanvraag conflicteert met staat van bron 410 Document voorgoed verdwenen 411 Lengte vereist 412 Eerste vereiste niet voldaan 413 Aanvraag te lang 414 Gevraagde bestandsnaam te lang 415 Niet ondersteund media type 416 Gevraagd bereik niet geldig 417 Vooruitzicht mislukt 4xx [Gemengde client/gebruiker fouten] 500 Interne server fout 501 Gevraagde type niet ondersteund 502 Fout by upstream server 503 Dienst tijdelijk onbeschikbaar 504 Tijdlimiet gateway overschreden 505 HTTP versie niet ondersteund 506 Doorverwijzing mislukt 5xx [Gemengde server fouten] xxx [Niet bekend] analog-6.0/lang/nladesc.txt0000644000175000017500000001116110161303540016022 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Dit rapport laat de activiteiten zien in ieder jaar. # Quarterly Report Dit rapport laat de activiteiten zien in ieder kwartaal. # Monthly Report Dit rapport laat de activiteiten zien in iedere maand. # Weekly Report Dit rapport laat de activiteiten zien in iedere week. # Daily Report Dit rapport laat de activiteiten zien in iedere dag. # Hourly Report Dit rapport laat de activiteiten zien in ieder uur. # Quarter-Hour Report Dit rapport laat de activiteiten zien in ieder kwartier. # Five-Minute Report Dit rapport laat de activiteiten zien per vijf minuten. # Daily Summary Dit rapport laat de totale activiteit zien voor iedere dag van de week, gesommeerd over alle weken in het rapport. # Hourly Summary Dit rapport laat de totale activiteit zien voor ieder uur van de dag, gesommeerd over alle dagen in het rapport. # Hour of the Week Summary Dit rapport laat de totale activiteit zien for ieder uur van de week, gesommeerd over alle weken in het rapport. # Quarter-Hour Summary Dit rapport laat de totale activiteit voor ieder kwartier van de dag, gesommeerd over alle dagen in het rapport. # Five-Minute Summary Dit rapport laat de totale activiteit zien voor iedere vijf minuten van de dag, gesommeerd over alle dagen in het rapport. # General Summary Dit rapport bevat de algemene statistieken. # Request Report Dit rapport laat de bestanden op de site zien. # Redirection Report Dit rapport laat de bestanden zien die ervoor zorgen dat verzoeken worden doorverwezen naar een ander bestand. (Meestal directories zonder de laatste slash, of CGI scripts die doorsturen.) # Failure Report Dit rapport laat de bestanden zien die fouten veroorzaken, bijvoorbeeld bestand niet gevonden. # File Type Report Dit rapport laat de extensies zien van de aangevraagde bestanden. # Directory Report Dit rapport laat de directories zien van waar de bestanden waren aangevraagd. (De figuren voor iedere directory bevatten alle subdirectories.) # Host Report Dit rapport laat de computers zien die bestanden aanvragen. # Host Redirection Report Dit rapport laat de computers zien die zijn doorverwezen naar andere bestanden. # Host Failure Report Dit rapport laat de computers zien die foute verzoeken veroorzaakten. # Domain Report Dit rapport laat de landen van de computers zien die bestanden aanvragen. # Referrer Report Dit rapport laat de referrers zien (van waar mensen links hebben gevolgd, of pagina's die plaatsjes/bestanden van deze site bevatten). # Referring Site Report Dit rapport laat zien vanaf welke servers mensen links volgde. # Redirected Referrer Report Dit rapport laat zien welke referrers een doorverwijzing veroorzaakt. # Failed Referrer Report Dit rapport laat de referrers zien die een broken link naar de site hebben. # Browser Report Dit rapport laat zien welke browser door de bezoekers gebruikt worden. # Virtual Host Report Dit rapport laat de activiteiten zien op elke virtual domain van de site. # Virtual Host Redirection Report Dit rapport laat de doorverwezen verzoeken zien naar elke virtual domain van de site. # Virtual Host Failure Report Dit rapport laat de mislukte verzoeken zien van elke virtual domain. # User Report Dit rapport laat de gebruikers zien die bestanden aanvroegen, als gebruikers zich hebben aangemeld of geidentificeerd kunnen worden door cookies. # User Redirection Report Dit rapport laat de gebruikers zien die zijn doorverwezen naar een ander bestand. # User Failure Report Dit rapport laat de gebruikers zien die fouten veroorzaakten. # Organisation Report Dit rapport laat de organisaties zien van waar computers bestanden aanvroegen. # Search Query Report Dit rapport laat zien welke vraag bezoekers hebben gesteld in een zoekmachine om deze site te vinden. # Search Word Report Dit rapport laat zien welke woorden bezoekers hebben gebruikt in een zoekmachine om deze site te vinden. # Internal Search Query Report Dit rapport laat zien welke vraag bezoekers hebben gesteld in scripts binnen de site. # Internal Search Word Report Dit rapport laat zien welke woorden bezoekers hebben gebruikt in scripts binnen de site. # Browser Summary Dit rapport laat de makers van de bezoekers' browsers zien. # Operating System Report Dit rapport laat de operating systems zien gebruikt door de bezoekers. # File Size Report Dit rapport laat de grootte van de bestanden zien. # Status Code Report Dit rapport laat de HTTP status codes of alle requests zien. # Processing Time Report Dit rapport laat de benodigde tijden zien om aanvragen goed af te handelen. analog-6.0/lang/nladom.tab0000644000175000017500000001222010161303540015607 0ustar sret1sret100000000000000aero 2 Luchtvaartindustrie arpa 1 Arpanet biz 2 Bedrijven com 2 Commercieel coop 2 Cooperaties edu 2 USA Onderwijs gov 2 USA Overheid info 2 Informatief int 2 Internationale Verdrag Organisaties mil 2 VS Militiar museum 2 Musea name 3 Personen net 2 Netwerk org 2 Niet-Commerciele Organisaties pro 3 Professionals ac 1 Ascension Eiland ad 2 Andorra ae 3 Verenigde Arabisch Emiraten af 1 Afghanistan ag 2 Antigua en Barbuda ai 1 Anguilla al 1 Albanie am 2 Armenie an 1 Nederlandse Antillen ao 1 Angola aq 1 Antarctica ar 3 Argentinie as 1 Amerikaans Samoa at 3 Oostenrijk au 3 Australie aw 1 Aruba az 1 Azerbaidzjan ba 3 Bosnie-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgie bf 1 Burkina Faso bg 2 Bulgarie bh 1 Bahrein bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazilie bs 1 Bahama's bt 1 Bhutan bv 1 Bouvet Eiland bw 1 Botswana by 1 Wit-Rusland bz 1 Belize ca 3 Canada cc 1 Cocos (of Keeling) Eilanden cd 1 Democratisch Republiek Congo cf 1 Centraal-Afrikaanse Republiek cg 1 Congo ch 2 Zwitserland ci 1 Ivoorkust ck 1 Cook Eilanden cl 2 Chili cm 1 Kameroen cn 3 China co 3 Colombia cr 3 Costa Rica cs 3 Servie en Montenegro cu 1 Cuba cv 1 Kaap Verdie cx 2 Christmas Eiland cy 3 Cyprus cz 2 Tsjechie de 2 Duitsland dj 1 Djibouti dk 2 Denemarken dm 2 Dominica do 2 Dominicaanse Republiek dz 1 Algerije ec 3 Ecuador ee 2 Estland eg 3 Egypte eh 1 West-Sahara er 1 Eritrea es 2 Spanje et 1 Ethiopie fi 2 Finland fj 3 Fiji fk 1 Falkland Eilanden fm 1 Micronesie fo 1 Faeroer Eilanden fr 2 Frankrijk fx 1 Frankrijk (Europees Territorium) ga 1 Gabon gb 1 Verenigd Koninkrijk gd 1 Grenada ge 1 Georgie gf 1 Frans Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Equatoriaal Guinea gr 2 Griekenland gs 1 Zuid-Georgie en de Zuid-Sandwicheilanden gt 3 Guatemala gu 1 Guam gw 1 Guinee-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heard- en McDonald Eilanden hn 2 Honduras hr 2 Kroatie ht 1 Haiti hu 2 Hongarije id 3 Indonesie ie 2 Ierland il 3 Israel im 1 Isle of Man in 3 India io 1 Brits gebied in de Indisch Oceaan iq 1 Irak ir 1 Iran is 2 IJsland it 2 Italie je 1 Jersey jm 3 Jamaica jo 3 Jordanie jp 3 Japan ke 3 Kenia kg 1 Kirgiezie kh 1 Cambodja ki 1 Kiribati km 1 Comoren kn 1 Saint Kitts en Nevis kp 1 Noord-Korea kr 3 Zuid-Korea kw 3 Koeweit ky 1 Cayman Eilanden kz 1 Kazachstan la 1 Laos lb 3 Libanon lc 1 Sint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litouwen lu 2 Luxemburg lv 2 Letland ly 1 Libie ma 1 Marokko mc 2 Monaco md 1 Moldavie mg 1 Madagaskar mh 1 Marshall Eilanden mk 3 Macedonie ml 1 Mali mm 1 Myanmar mn 1 Mongolie mo 1 Macau mp 1 Noord-Marianen mq 1 Martinique mr 1 Mauritanie ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maladiven mw 1 Malawi mx 3 Mexico my 3 Maleisie mz 1 Mozambique na 1 Namibie nc 1 Nieuw-Caledonie ne 1 Niger nf 1 Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Nederland no 2 Noorwegen np 1 Nepal nr 1 Nauru nu 2 Niue Eiland nz 3 Nieuw-Zeeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Frans-Polynesie pg 3 Papua-Nieuw-Guinea ph 3 Filipijnen pk 3 Pakistan pl 3 Polen pm 1 Sint Pierre en Miquelon pn 1 Pitcairn Eilanden pr 1 Puerto Rico ps 1 Gebied onder Palestijnse autoriteit pt 2 Portugal pw 1 Palau Eilanden py 3 Paraguay qa 1 Qatar re 1 Reunion Eiland ro 2 Romanie ru 2 Rusland rw 1 Rwanda sa 3 Saudi-Arabie sb 1 Salomons Eilanden sc 1 Seychelles sd 1 Soedan se 2 Zweden sg 3 Singapore sh 1 Sint Helena si 2 Slovenie sj 1 Svalbard en Jan Mayen Eilanden sk 2 Slowakije sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalie sr 1 Suriname st 1 Sao Tome en Principe su 2 Voormalig Sovjet Unie sv 3 El Salvador sy 1 Syrie sz 1 Swaziland tc 1 Turks en Caicos Eilanden td 1 Tsjaad tf 1 Franse zuidelijke gebieden tg 1 Togo th 3 Thailand tj 1 Tadjikistan tk 1 Tokelau Eilanden tl 1 Oost-Timor tm 1 Turkmenistan tn 1 Tunisie to 1 Tonga tp 1 Oost-Timor tr 3 Turkije tt 3 Trinidad en Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Oekraine ug 3 Uganda uk 3 Vereningd Koninkrijk um 1 Verafgelegen eilandjes van de Verenigde Staten us 4 Vereningde Staten uy 3 Uruguay uz 1 Oezbekistan va 1 Vaticaanstad vc 1 Saint Vincent en Grenadines ve 3 Venezuela vg 1 Maagdeneilanden (Brits) vi 1 Maagdeneilanden (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis en Futuna Eilanden ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Joegoslavie za 3 Zuid-Afrika zm 1 Zambia zr 1 Voormalig Zaire zw 3 Zimbabwe analog-6.0/lang/nldesc.txt0000644000175000017500000001116110161303540015661 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Dit rapport laat de activiteiten zien in ieder jaar. # Quarterly Report Dit rapport laat de activiteiten zien in ieder kwartaal. # Monthly Report Dit rapport laat de activiteiten zien in iedere maand. # Weekly Report Dit rapport laat de activiteiten zien in iedere week. # Daily Report Dit rapport laat de activiteiten zien in iedere dag. # Hourly Report Dit rapport laat de activiteiten zien in ieder uur. # Quarter-Hour Report Dit rapport laat de activiteiten zien in ieder kwartier. # Five-Minute Report Dit rapport laat de activiteiten zien per vijf minuten. # Daily Summary Dit rapport laat de totale activiteit zien voor iedere dag van de week, gesommeerd over alle weken in het rapport. # Hourly Summary Dit rapport laat de totale activiteit zien voor ieder uur van de dag, gesommeerd over alle dagen in het rapport. # Hour of the Week Summary Dit rapport laat de totale activiteit zien for ieder uur van de week, gesommeerd over alle weken in het rapport. # Quarter-Hour Summary Dit rapport laat de totale activiteit voor ieder kwartier van de dag, gesommeerd over alle dagen in het rapport. # Five-Minute Summary Dit rapport laat de totale activiteit zien voor iedere vijf minuten van de dag, gesommeerd over alle dagen in het rapport. # General Summary Dit rapport bevat de algemene statistieken. # Request Report Dit rapport laat de bestanden op de site zien. # Redirection Report Dit rapport laat de bestanden zien die ervoor zorgen dat verzoeken worden doorverwezen naar een ander bestand. (Meestal directories zonder de laatste slash, of CGI scripts die doorsturen.) # Failure Report Dit rapport laat de bestanden zien die fouten veroorzaken, bijvoorbeeld bestand niet gevonden. # File Type Report Dit rapport laat de extensies zien van de aangevraagde bestanden. # Directory Report Dit rapport laat de directories zien van waar de bestanden waren aangevraagd. (De figuren voor iedere directory bevatten alle subdirectories.) # Host Report Dit rapport laat de computers zien die bestanden aanvragen. # Host Redirection Report Dit rapport laat de computers zien die zijn doorverwezen naar andere bestanden. # Host Failure Report Dit rapport laat de computers zien die foute verzoeken veroorzaakten. # Domain Report Dit rapport laat de landen van de computers zien die bestanden aanvragen. # Referrer Report Dit rapport laat de referrers zien (van waar mensen links hebben gevolgd, of pagina's die plaatsjes/bestanden van deze site bevatten). # Referring Site Report Dit rapport laat zien vanaf welke servers mensen links volgde. # Redirected Referrer Report Dit rapport laat zien welke referrers een doorverwijzing veroorzaakt. # Failed Referrer Report Dit rapport laat de referrers zien die een broken link naar de site hebben. # Browser Report Dit rapport laat zien welke browser door de bezoekers gebruikt worden. # Virtual Host Report Dit rapport laat de activiteiten zien op elke virtual domain van de site. # Virtual Host Redirection Report Dit rapport laat de doorverwezen verzoeken zien naar elke virtual domain van de site. # Virtual Host Failure Report Dit rapport laat de mislukte verzoeken zien van elke virtual domain. # User Report Dit rapport laat de gebruikers zien die bestanden aanvroegen, als gebruikers zich hebben aangemeld of gedentificeerd kunnen worden door cookies. # User Redirection Report Dit rapport laat de gebruikers zien die zijn doorverwezen naar een ander bestand. # User Failure Report Dit rapport laat de gebruikers zien die fouten veroorzaakten. # Organisation Report Dit rapport laat de organisaties zien van waar computers bestanden aanvroegen. # Search Query Report Dit rapport laat zien welke vraag bezoekers hebben gesteld in een zoekmachine om deze site te vinden. # Search Word Report Dit rapport laat zien welke woorden bezoekers hebben gebruikt in een zoekmachine om deze site te vinden. # Internal Search Query Report Dit rapport laat zien welke vraag bezoekers hebben gesteld in scripts binnen de site. # Internal Search Word Report Dit rapport laat zien welke woorden bezoekers hebben gebruikt in scripts binnen de site. # Browser Summary Dit rapport laat de makers van de bezoekers' browsers zien. # Operating System Report Dit rapport laat de operating systems zien gebruikt door de bezoekers. # File Size Report Dit rapport laat de grootte van de bestanden zien. # Status Code Report Dit rapport laat de HTTP status codes of alle requests zien. # Processing Time Report Dit rapport laat de benodigde tijden zien om aanvragen goed af te handelen. analog-6.0/lang/nldom.tab0000644000175000017500000001222010161303540015446 0ustar sret1sret100000000000000aero 2 Luchtvaartindustrie arpa 1 Arpanet biz 2 Bedrijven com 2 Commercieel coop 2 Coperaties edu 2 USA Onderwijs gov 2 USA Overheid info 2 Informatief int 2 Internationale Verdrag Organisaties mil 2 VS Militiar museum 2 Musea name 3 Personen net 2 Netwerk org 2 Niet-Commercile Organisaties pro 3 Professionals ac 1 Ascension Eiland ad 2 Andorra ae 3 Verenigde Arabisch Emiraten af 1 Afghanistan ag 2 Antigua en Barbuda ai 1 Anguilla al 1 Albani am 2 Armeni an 1 Nederlandse Antillen ao 1 Angola aq 1 Antarctica ar 3 Argentini as 1 Amerikaans Samoa at 3 Oostenrijk au 3 Australi aw 1 Aruba az 1 Azerbaidzjan ba 3 Bosni-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgi bf 1 Burkina Faso bg 2 Bulgari bh 1 Bahrein bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazili bs 1 Bahama's bt 1 Bhutan bv 1 Bouvet Eiland bw 1 Botswana by 1 Wit-Rusland bz 1 Belize ca 3 Canada cc 1 Cocos (of Keeling) Eilanden cd 1 Democratisch Republiek Congo cf 1 Centraal-Afrikaanse Republiek cg 1 Congo ch 2 Zwitserland ci 1 Ivoorkust ck 1 Cook Eilanden cl 2 Chili cm 1 Kameroen cn 3 China co 3 Colombia cr 3 Costa Rica cs 3 Servi en Montenegro cu 1 Cuba cv 1 Kaap Verdi cx 2 Christmas Eiland cy 3 Cyprus cz 2 Tsjechi de 2 Duitsland dj 1 Djibouti dk 2 Denemarken dm 2 Dominica do 2 Dominicaanse Republiek dz 1 Algerije ec 3 Ecuador ee 2 Estland eg 3 Egypte eh 1 West-Sahara er 1 Eritrea es 2 Spanje et 1 Ethiopi fi 2 Finland fj 3 Fiji fk 1 Falkland Eilanden fm 1 Micronesi fo 1 Faerer Eilanden fr 2 Frankrijk fx 1 Frankrijk (Europees Territorium) ga 1 Gabon gb 1 Verenigd Koninkrijk gd 1 Grenada ge 1 Georgi gf 1 Frans Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Equatoriaal Guinea gr 2 Griekenland gs 1 Zuid-Georgi en de Zuid-Sandwicheilanden gt 3 Guatemala gu 1 Guam gw 1 Guinee-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heard- en McDonald Eilanden hn 2 Honduras hr 2 Kroati ht 1 Hati hu 2 Hongarije id 3 Indonesi ie 2 Ierland il 3 Isral im 1 Isle of Man in 3 India io 1 Brits gebied in de Indisch Oceaan iq 1 Irak ir 1 Iran is 2 IJsland it 2 Itali je 1 Jersey jm 3 Jamaica jo 3 Jordani jp 3 Japan ke 3 Kenia kg 1 Kirgiezi kh 1 Cambodja ki 1 Kiribati km 1 Comoren kn 1 Saint Kitts en Nevis kp 1 Noord-Korea kr 3 Zuid-Korea kw 3 Koeweit ky 1 Cayman Eilanden kz 1 Kazachstan la 1 Laos lb 3 Libanon lc 1 Sint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litouwen lu 2 Luxemburg lv 2 Letland ly 1 Libi ma 1 Marokko mc 2 Monaco md 1 Moldavi mg 1 Madagaskar mh 1 Marshall Eilanden mk 3 Macedoni ml 1 Mali mm 1 Myanmar mn 1 Mongoli mo 1 Macau mp 1 Noord-Marianen mq 1 Martinique mr 1 Mauritani ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maladiven mw 1 Malawi mx 3 Mexico my 3 Maleisi mz 1 Mozambique na 1 Namibi nc 1 Nieuw-Caledoni ne 1 Niger nf 1 Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Nederland no 2 Noorwegen np 1 Nepal nr 1 Nauru nu 2 Niue Eiland nz 3 Nieuw-Zeeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Frans-Polynesi pg 3 Papua-Nieuw-Guinea ph 3 Filipijnen pk 3 Pakistan pl 3 Polen pm 1 Sint Pierre en Miquelon pn 1 Pitcairn Eilanden pr 1 Puerto Rico ps 1 Gebied onder Palestijnse autoriteit pt 2 Portugal pw 1 Palau Eilanden py 3 Paraguay qa 1 Qatar re 1 Reunion Eiland ro 2 Romani ru 2 Rusland rw 1 Rwanda sa 3 Saudi-Arabi sb 1 Salomons Eilanden sc 1 Seychelles sd 1 Soedan se 2 Zweden sg 3 Singapore sh 1 Sint Helena si 2 Sloveni sj 1 Svalbard en Jan Mayen Eilanden sk 2 Slowakije sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somali sr 1 Suriname st 1 Sao Tom en Principe su 2 Voormalig Sovjet Unie sv 3 El Salvador sy 1 Syri sz 1 Swaziland tc 1 Turks en Caicos Eilanden td 1 Tsjaad tf 1 Franse zuidelijke gebieden tg 1 Togo th 3 Thailand tj 1 Tadjikistan tk 1 Tokelau Eilanden tl 1 Oost-Timor tm 1 Turkmenistan tn 1 Tunisi to 1 Tonga tp 1 Oost-Timor tr 3 Turkije tt 3 Trinidad en Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Oekrane ug 3 Uganda uk 3 Vereningd Koninkrijk um 1 Verafgelegen eilandjes van de Verenigde Staten us 4 Vereningde Staten uy 3 Uruguay uz 1 Oezbekistan va 1 Vaticaanstad vc 1 Saint Vincent en Grenadines ve 3 Venezuela vg 1 Maagdeneilanden (Brits) vi 1 Maagdeneilanden (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis en Futuna Eilanden ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Joegoslavi za 3 Zuid-Afrika zm 1 Zambia zr 1 Voormalig Zaire zw 3 Zimbabwe analog-6.0/lang/no.lng0000644000175000017500000003172710161303540015000 0ustar sret1sret100000000000000## Norwegian "bokml" language file for Analog 6.0 ## Norsk bokml sprkfil for Analog 6.0 ## ## Oversatt 2001-03-26 av Pl Lberg ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. sn man tir ons tor fre lr jan feb mar apr mai jun jul aug sep okt nov des ## Next some standard common words. ## Abbreviation for "week beginning" ukestart r ## Quarter of a year kvartal mned dag dager time minutt minutter sekund sekunder byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes foresprsel foresprsler dato ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dato klokkeslett periode frste gang frste gang siste gang siste gang fil filer maskin maskiner virtuell tjener virtuelle tjenere katalog kataloger domene domener organisasjon organisasjoner filendelse filendelser URL URLer klient klienter OS OS ## (= operating system, operating systems) strrelse skeuttrykk skeuttrykk referanse referanser bruker brukere statuskode statuskoder Webtjenerstatistikk for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Oppsummering ## The time reports, plus "busiest" strings (at the bottom of each report) Rapport - r Travleste r: Rapport - kvartal Travleste kvartal: Rapport - mned Travleste mned: Rapport - uke Travleste uke: Starter Oppsummering - dag Rapport - dag Travleste dag: Rapport - time Oppsummering - time Oppsummering - tid i uken Travleste time: Rapport - kvarter Oppsummering - kvarter Travleste kvarter: Rapport - fem minutt Oppsummering - fem minutt Travleste fem minutter: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Rapport - maskiner maskin maskiner m Rapport - videresendt fra tjener tjener tjenere m Rapport - tjenerfeil tjener tjenere m Rapport - kataloger katalog katalogene m Rapport - filtyper filtype filtypene m Rapport - foresprsler forespurt fil forespurte filer m Rapport - videresending fil filene m Rapport - feil fil filene m Rapport - referanser refererende URL refererende URLer m Rapport - refererende tjenere refererende tjener refererende tjenerene m Rapport - referanser som videresendes refererende URL refererende URLer m Rapport - feilreferanser refererende URL refererende URLer m Rapport - Sk sk sk n Rapport - Skeord skeord skeord n Rapport - Interne sk sk sk n Rapport - Interne skeord skeord skeord n Rapport - virtuelle tjenere virtuell tjener virtuelle tjenere m Rapport - videresending for virtuelle tjenere virtuell tjener virtuelle tjenere m Rapport - feil for virtuelle tjenere virtuell tjener virtuelle tjenere m Rapport - brukere bruker brukerene m Rapport - videresendte brukere bruker brukere m Rapport - feil per bruker bruker brukerene m Oppsummering - klienter klient klientene m Rapport - klienter klient klientene m Rapport - OS operativsystem operativsystem n Rapport - domener domene domenene n Rapport - organisasjon organisasjon organisasjoner m Rapport - statuskoder statuskode statuskodene m Rapport - responstid Rapport - filstrrelser ## Used at the bottom of the report Analysen er laget med Kjretid Mindre enn 1 ## Used in the time reports Hver enhet representerer eller en del av dette foresprsel etter en side foresprsler etter sider ## Used at the bottom of each non-time report: need m, f & n genders ikke vist ikke vist ikke vist ## Used on the pie charts: again need m, f & n genders Andre Andre Andre ## Used at the top of the report Programmet startet Analyse av foresprsler fra t.o.m. ## Used in the General Summary Totalt antall vellykkede foresprsler Gjennomsnittlig antall vellykkede foresprsler per dag Totalt antall vellykkede foresprsler etter sider Gjennomsnittlig antall vellykkede foresprsler etter sider per dag Logglinjer uten statuskode Totalt antall mislykkede foresprsler Totalt antall omdirigerte foresprsler Requests with informational status code *#*#* Antall forskjellige filer forespurt Antall forskjellige maskiner betjent Ugyldige logglinjer Unskede logglinjer Total mengde data overfrt Gjennomsnittlig mengde data overfrt per dag Tall i paranteser refererer til de 7 dager til siste 7 dager G til Toppen ## Some special phrases for particular reports. [ukjente adresser] [domain ikke oppgitt] [ukjent domene] [rotkatalog] [ingen katalog] [ingen filending] [kataloger] Ukjent Windows Annen Unix Roboter Ukjent OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #frsp 7-dager frsp %frsp %7-day frsp sider 7-dager sider %sider %7-day sider bytes ?bytes 7-dager bytes 7-dager ?bytes %bytes %7-dager bytes ant. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Lister opp de frste %s Lister opp de frste %s Lister opp de frste %s Lister opp de %d frste %s Lister opp de %d frste %s Lister opp de %d frste %s Lister opp alle %s Lister opp alle %s Lister opp alle %s ## "by" in the phrase "listing the top 3 files BY number of requests" med flest ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors foresprsel siste 7 dager foresprsler siste 7 dager foresprsel etter en side siste 7 dager foresprsler etter en side siste 7 dager videresending videresendinger videresendt foresprsel siste 7 dager videresendte foresprsler siste 7 dager mislykket foresprsel mislykkede foresprsler mislykket foresprsel siste 7 dager mislykkede foresprsler siste 7 dager % av trafikken % av trafikken siste 7 dager % av den maksimale trafikken % av den maksimale trafikken siste 7 dager byte trafikk bytes trafikk ## ?bytes represents kbytes, Mbytes etc. ?bytes trafikk byte trafikk siste 7 dager bytes trafikk siste 7 dager ?bytes trafikk siste 7 dager forespurt etter med en videresendt foresprsel etter med en mislykket foresprsel etter med frste foresprsel etter med frste videresendte foresprsel etter med frste mislykkede foresprsel etter ## Now "sorted by": again, in m, f & n (only needed in plural though) sortert etter sortert etter sortert etter ## Used at the top of each report Rapporten inneholder data fra ## Used in pie charts Kakestykkene viser ## different ways of sorting mengden trafikk mengden trafikk siste 7 dager % av foresprslene % av foresprslene siste 7 dager % av det maksimale antallet foresprsler % av det maksimale antallet foresprsler siste 7 dager antall foresprsler antall foresprsler siste 7 dager % av foresprslene etter sider % av foresprslene etter sider siste 7 dager % av det maksimale antallet foresprsler etter sider % av det maksimale antallet foresprsler etter sider siste 7 dager antall foresprsler etter sider antall foresprsler etter sider siste 7 dager % av videresendte foresprsler % av videresendte foresprsler siste 7 dager % av det maksimale antallet videresendte foresprsler % av det maksimale antallet videresendte foresprsler siste 7 dager antall videresendte foresprsler antall videresendte foresprsler siste 7 dager % av de mislykkede foresprslene % av de mislykkede foresprslene siste 7 dager % av det maksimale antallet mislykkede foresprsler % av det maksimale antallet mislykkede foresprsler siste 7 dager antall mislykkede foresprsler antall mislykkede foresprsler siste 7 dager tidspunktet for siste foresprsel tidspunktet for siste videresendte foresprsel tidspunktet for siste mislykkede foresprsel tidspunktet for frste foresprsel tidspunktet for frste videresendte foresprsel tidspunktet for frste mislykkede foresprsel ## 3 other ways of sorting in m, f, & n sortert alfabetisk sortert alfabetisk sortert alfabetisk sortert etter verdi sortert etter verdi sortert etter verdi usortert usortert usortert ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m. %Y %H:%n ## "Program started at" and "Analysed requests from" %D. %m. %Y %H:%n ## In Daily Report %d.%m.%y ## In Daily Summary %w ## In Hourly Report %d.%m.%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m. %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Diverse informative] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Diverse suksess] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Diverse videresendt] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Diverske klient/brukerfeil] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Diverse serverfeil] xxx [Ukjent] analog-6.0/lang/no2.lng0000644000175000017500000003141410161303540015053 0ustar sret1sret100000000000000## Norwegian "nynorsk" language file for Analog 6.0 ## Norsk nynorsk sprkfil for Analog 6.0 ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Omsett 1998-06-27 av Magni Onsien ## Revidert 1999-10-12 av Magni Onsien ## Omsett 2001-03-29 for analog versjon 5 av Trond ksendal ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. sn mn tys ons tor fre lau jan feb mar apr mai jun jul aug sep okt nov des ## Next some standard common words. ## Abbreviation for "week beginning" vekestart r ## Quarter of a year kvartal mnad dag dagar time minutt minutt sekund sekund byte byte ## ?bytes represents kbytes, Mbytes etc. ?byte sprjing sprjingar dato ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dato klokkeslett periode fyrste gong fyrste gong siste gong siste gong fil filer maskin maskiner virtuell tenar virtuelle tenarar katalog katalogar domene domene organisasjon organisasjonar filending filendingar URL URLar klient klientar OS OS ## (= operating system, operating systems) storleik skjeuttrykk skjeuttrykk referanse referansar brukar brukarar statuskode statuskodar Webtenarstatistikk for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Oppsummering ## The time reports, plus "busiest" strings (at the bottom of each report) Rapport - r Travlaste r: Rapport - kvartal Travlaste kvartal: Rapport - mnad Travlaste mnad: Rapport - veke Travlaste veke: Startar Oppsummering - dag Rapport - dag Travlaste dag: Rapport - time Oppsummering - time Oppsummering - time i veka Travlaste time: Rapport - kvarter Oppsummering - kvarter Travlaste kvarter: Rapport - fem minutt Oppsummering - fem minutt Travlaste fem minutt: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Rapport - maskiner maskin maskinene n Rapport - vidaresendt fr tenar tenar tenarane n Rapport - tenarfeil tenar tenarane n Rapport - katalogar katalog katalogane n Rapport - filtypar filtype filtypane n Rapport - sprjingar etterspurt fil etterspurde filer n Rapport - vidaresending fil filene n Rapport - feil fil filene n Rapport - referansar refererande URL refererande URLar n Rapport - refererande tenarar refererande tenar refererande tenarane n Rapport - referansar som vert vidaresende refererande URL refererande URLar n Rapport - feilreferansar refererande URL refererande URLar n Rapport - sk sk sk n Rapport - skjeord skjeord skjeord n Rapport - interne sk sk sk n Rapport - interne skjeord skjeord skjeord n Rapport - virtuelle tenarar virtuell tenar virtuelle tenarar n Rapport - vidaresending for virtuelle tenarar virtuell tenar virtuelle tenarane n Rapport - feil for virtuelle tenarar virtuell tenar virtuelle tenarane n Rapport - brukarar brukar brukarane n Rapport - vidaresende brukarar brukar brukarane n Rapport - feil per brukar brukar brukarane n Oppsummering - klientar klient klientane n Rapport - klientar klient klientane n Rapport - OS operativsystem operativsystem n Rapport - domene domene domena n Rapport - organisasjon organisasjon organisasjonar n Rapport - statuskodar statuskode statuskodane n Rapport - responstid Rapport - filstorleikar ## Used at the bottom of the report Analysen er laga med Kyretid Mindre enn 1 ## Used in the time reports Kvar strek representerer eller ein del av dette sprjing etter ei side sprjingar etter sider ## Used at the bottom of each non-time report: need m, f & n genders * * ikkje vist ## Used on the pie charts: again need m, f & n genders * * Andre ## Used at the top of the report Programmet starta Analyse av sprjingar fr t.o.m. ## Used in the General Summary Talet p vellukka sprjingar totalt Gjennomsnittleg tal p vellukka sprjingar per dag Talet p vellukka sprjingar etter sider totalt Gjennomsnittleg tal p vellukka sprjingar etter sider per dag Loggliner utan statuskode Talet p mislukka sprjingar totalt Talet p omdirigerte sprjingar totalt Sprjingar med informativ statuskode Talet p ulike etterspurde filer Talet p ulike klientmaskiner Ugyldige loggliner Unskte loggliner Samanlagt mengd overfrde data Gjennomsnittleg mengd overfrde data per dag Tal i parantesar refererer til 7-dagarsperioden som slutta dei siste 7 dagane G til Toppen ## Some special phrases for particular reports. [ukjende adresser] [domene ikkje oppgjeve] [ukjend domene] [rotkatalog] [ingen katalog] [inga filending] [katalogar] Ukjend Windows Annan Unix Robotar Ukjent OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) sprj 7-dagar sprj %sprj %7-dagar sprj sider 7-dagar sider %sider %7-dagar sider byte ?byte 7-dagar byte 7-dagar ?byte %byte %7-dagar byte tal ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Lister opp dei fyrste %s * * Lister opp dei %d fyrste %s * * Lister opp alle %s ## "by" in the phrase "listing the top 3 files BY number of requests" med flest ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors sprjing siste 7 dagar sprjingar siste 7 dagar sprjing etter ei side siste 7 dagar sprjingar etter sider siste 7 dagar vidaresending vidaresendingar vidaresend sprjing siste 7 dagar vidaresende sprjingar siste 7 dagar mislukka sprjing mislukka sprjingar mislukka sprjing siste 7 dagar mislukka sprjingar siste 7 dagar % av trafikken % av trafikken siste 7 dagar % av den maksimale trafikken % av den maksimale trafikken siste 7 dagar byte trafikk byte trafikk ## ?bytes represents kbytes, Mbytes etc. ?byte trafikk byte trafikk siste 7 dagar byte trafikk siste 7 dagar ?byte trafikk siste 7 dagar spurt etter med ei vidaresend sprjing etter med ei mislukka sprjing etter med frste sprjing etter med frste vidaresende sprjing etter med frste mislukka sprjing etter ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortert etter ## Used at the top of each report Rapporten inneheld data fr ## Used in pie charts Kakestykkjene viser ## different ways of sorting trafikkmengda trafikkmengda siste 7 dagar % av sprjingane % av sprjingane siste 7 dagar % av det maksimale talet p sprjingar % av det maksimale talet p sprjingar siste 7 dagar talet p sprjingar talet p sprjingar siste 7 dagar % av sprjingane etter sider % av sprjingane etter sider siste 7 dagar % av det maksimale talet p sprjingar etter sider % av det maksimale talet p sprjingar etter sider siste 7 dagar talet p sprjingar etter sider talet p sprjingar etter sider siste 7 dagar % av vidaresende sprjingar % av vidaresende sprjingar siste 7 dagar % av det maksimale talet p vidaresende sprjingar % av det maksimale talet p vidaresende sprjingar siste 7 dagar talet p vidaresende sprjingar talet p vidaresende sprjingar siste 7 dagar % av dei mislukka sprjingane % av dei mislukka sprjingane siste 7 dagar % av det maksimale talet p mislukka sprjingar % av det maksimale talet p mislukka sprjingar siste 7 dagar mislukka sprjingar mislukka sprjingar siste 7 dagar tida for siste sprjing tida for siste vidaresende sprjing tida for siste mislukka sprjing tida for frste sprjing tida for frste vidaresende sprjing tida for frste mislukka sprjing ## 3 other ways of sorting in m, f, & n * * sortert alfabetisk * * sortert etter verdi * * usortert ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m. %Y %H:%n ## "Program started at" and "Analysed requests from" %D. %m. %Y %H:%n ## In Daily Report %d.%m.%y ## In Daily Summary %w ## In Hourly Report %d.%m.%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m. %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Ymse informative] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Ymse suksess] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Ymse vidaresendt] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Ymse klient/brukarfeil] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Ymse tenarfeil] xxx [Ukjend] analog-6.0/lang/no2a.lng0000644000175000017500000003141210161303541015213 0ustar sret1sret100000000000000## Norwegian "nynorsk" language file for Analog 6.0 ## Norsk nynorsk sprakfil for Analog 6.0 ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## Omsett 1998-06-27 av Magni Onsien ## Revidert 1999-10-12 av Magni Onsien ## Omsett 2001-03-29 for analog versjon 5 av Trond ksendal ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. son man tys ons tor fre lau jan feb mar apr mai jun jul aug sep okt nov des ## Next some standard common words. ## Abbreviation for "week beginning" vekestart ar ## Quarter of a year kvartal manad dag dagar time minutt minutt sekund sekund byte byte ## ?bytes represents kbytes, Mbytes etc. ?byte sporjing sporjingar dato ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dato klokkeslett periode fyrste gong fyrste gong siste gong siste gong fil filer maskin maskiner virtuell tenar virtuelle tenarar katalog katalogar domene domene organisasjon organisasjonar filending filendingar URL URLar klient klientar OS OS ## (= operating system, operating systems) storleik sokjeuttrykk sokjeuttrykk referanse referansar brukar brukarar statuskode statuskodar Webtenarstatistikk for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Oppsummering ## The time reports, plus "busiest" strings (at the bottom of each report) Rapport - ar Travlaste ar: Rapport - kvartal Travlaste kvartal: Rapport - manad Travlaste manad: Rapport - veke Travlaste veke: Startar Oppsummering - dag Rapport - dag Travlaste dag: Rapport - time Oppsummering - time Oppsummering - time i veka Travlaste time: Rapport - kvarter Oppsummering - kvarter Travlaste kvarter: Rapport - fem minutt Oppsummering - fem minutt Travlaste fem minutt: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Rapport - maskiner maskin maskinene n Rapport - vidaresendt fra tenar tenar tenarane n Rapport - tenarfeil tenar tenarane n Rapport - katalogar katalog katalogane n Rapport - filtypar filtype filtypane n Rapport - sporjingar etterspurt fil etterspurde filer n Rapport - vidaresending fil filene n Rapport - feil fil filene n Rapport - referansar refererande URL refererande URLar n Rapport - refererande tenarar refererande tenar refererande tenarane n Rapport - referansar som vert vidaresende refererande URL refererande URLar n Rapport - feilreferansar refererande URL refererande URLar n Rapport - sok sok sok n Rapport - sokjeord sokjeord sokjeord n Rapport - interne sok sok sok n Rapport - interne sokjeord sokjeord sokjeord n Rapport - virtuelle tenarar virtuell tenar virtuelle tenarar n Rapport - vidaresending for virtuelle tenarar virtuell tenar virtuelle tenarane n Rapport - feil for virtuelle tenarar virtuell tenar virtuelle tenarane n Rapport - brukarar brukar brukarane n Rapport - vidaresende brukarar brukar brukarane n Rapport - feil per brukar brukar brukarane n Oppsummering - klientar klient klientane n Rapport - klientar klient klientane n Rapport - OS operativsystem operativsystem n Rapport - domene domene domena n Rapport - organisasjon organisasjon organisasjonar n Rapport - statuskodar statuskode statuskodane n Rapport - responstid Rapport - filstorleikar ## Used at the bottom of the report Analysen er laga med Koyretid Mindre enn 1 ## Used in the time reports Kvar strek representerer eller ein del av dette sporjing etter ei side sporjingar etter sider ## Used at the bottom of each non-time report: need m, f & n genders * * ikkje vist ## Used on the pie charts: again need m, f & n genders * * Andre ## Used at the top of the report Programmet starta Analyse av sporjingar fra t.o.m. ## Used in the General Summary Talet pa vellukka sporjingar totalt Gjennomsnittleg tal pa vellukka sporjingar per dag Talet pa vellukka sporjingar etter sider totalt Gjennomsnittleg tal pa vellukka sporjingar etter sider per dag Loggliner utan statuskode Talet pa mislukka sporjingar totalt Talet pa omdirigerte sporjingar totalt Sporjingar med informativ statuskode Talet pa ulike etterspurde filer Talet pa ulike klientmaskiner Ugyldige loggliner Uonskte loggliner Samanlagt mengd overforde data Gjennomsnittleg mengd overforde data per dag Tal i parantesar refererer til 7-dagarsperioden som slutta dei siste 7 dagane Ga til Toppen ## Some special phrases for particular reports. [ukjende adresser] [domene ikkje oppgjeve] [ukjend domene] [rotkatalog] [ingen katalog] [inga filending] [katalogar] Ukjend Windows Annan Unix Robotar Ukjent OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) sporj 7-dagar sporj %sporj %7-dagar sporj sider 7-dagar sider %sider %7-dagar sider byte ?byte 7-dagar byte 7-dagar ?byte %byte %7-dagar byte tal ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Lister opp dei fyrste %s * * Lister opp dei %d fyrste %s * * Lister opp alle %s ## "by" in the phrase "listing the top 3 files BY number of requests" med flest ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors sporjing siste 7 dagar sporjingar siste 7 dagar sporjing etter ei side siste 7 dagar sporjingar etter sider siste 7 dagar vidaresending vidaresendingar vidaresend sporjing siste 7 dagar vidaresende sporjingar siste 7 dagar mislukka sporjing mislukka sporjingar mislukka sporjing siste 7 dagar mislukka sporjingar siste 7 dagar % av trafikken % av trafikken siste 7 dagar % av den maksimale trafikken % av den maksimale trafikken siste 7 dagar byte trafikk byte trafikk ## ?bytes represents kbytes, Mbytes etc. ?byte trafikk byte trafikk siste 7 dagar byte trafikk siste 7 dagar ?byte trafikk siste 7 dagar spurt etter med ei vidaresend sporjing etter med ei mislukka sporjing etter med forste sporjing etter med forste vidaresende sporjing etter med forste mislukka sporjing etter ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortert etter ## Used at the top of each report Rapporten inneheld data fra ## Used in pie charts Kakestykkjene viser ## different ways of sorting trafikkmengda trafikkmengda siste 7 dagar % av sporjingane % av sporjingane siste 7 dagar % av det maksimale talet pa sporjingar % av det maksimale talet pa sporjingar siste 7 dagar talet pa sporjingar talet pa sporjingar siste 7 dagar % av sporjingane etter sider % av sporjingane etter sider siste 7 dagar % av det maksimale talet pa sporjingar etter sider % av det maksimale talet pa sporjingar etter sider siste 7 dagar talet pa sporjingar etter sider talet pa sporjingar etter sider siste 7 dagar % av vidaresende sporjingar % av vidaresende sporjingar siste 7 dagar % av det maksimale talet pa vidaresende sporjingar % av det maksimale talet pa vidaresende sporjingar siste 7 dagar talet pa vidaresende sporjingar talet pa vidaresende sporjingar siste 7 dagar % av dei mislukka sporjingane % av dei mislukka sporjingane siste 7 dagar % av det maksimale talet pa mislukka sporjingar % av det maksimale talet pa mislukka sporjingar siste 7 dagar mislukka sporjingar mislukka sporjingar siste 7 dagar tida for siste sporjing tida for siste vidaresende sporjing tida for siste mislukka sporjing tida for forste sporjing tida for forste vidaresende sporjing tida for forste mislukka sporjing ## 3 other ways of sorting in m, f, & n * * sortert alfabetisk * * sortert etter verdi * * usortert ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m. %Y %H:%n ## "Program started at" and "Analysed requests from" %D. %m. %Y %H:%n ## In Daily Report %d.%m.%y ## In Daily Summary %w ## In Hourly Report %d.%m.%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m. %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Ymse informative] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Ymse suksess] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Ymse vidaresendt] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Ymse klient/brukarfeil] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Ymse tenarfeil] xxx [Ukjend] analog-6.0/lang/noa.lng0000644000175000017500000003172510161303541015140 0ustar sret1sret100000000000000## Norwegian "bokml" language file for Analog 6.0 ## Norsk bokml sprkfil for Analog 6.0 ## ## Oversatt 2001-03-26 av Pl Lberg ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. son man tir ons tor fre lor jan feb mar apr mai jun jul aug sep okt nov des ## Next some standard common words. ## Abbreviation for "week beginning" ukestart ar ## Quarter of a year kvartal maned dag dager time minutt minutter sekund sekunder byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes foresporsel foresporsler dato ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dato klokkeslett periode forste gang forste gang siste gang siste gang fil filer maskin maskiner virtuell tjener virtuelle tjenere katalog kataloger domene domener organisasjon organisasjoner filendelse filendelser URL URLer klient klienter OS OS ## (= operating system, operating systems) storrelse sokeuttrykk sokeuttrykk referanse referanser bruker brukere statuskode statuskoder Webtjenerstatistikk for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Oppsummering ## The time reports, plus "busiest" strings (at the bottom of each report) Rapport - ar Travleste ar: Rapport - kvartal Travleste kvartal: Rapport - maned Travleste maned: Rapport - uke Travleste uke: Starter Oppsummering - dag Rapport - dag Travleste dag: Rapport - time Oppsummering - time Oppsummering - tid i uken Travleste time: Rapport - kvarter Oppsummering - kvarter Travleste kvarter: Rapport - fem minutt Oppsummering - fem minutt Travleste fem minutter: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Rapport - maskiner maskin maskiner m Rapport - videresendt fra tjener tjener tjenere m Rapport - tjenerfeil tjener tjenere m Rapport - kataloger katalog katalogene m Rapport - filtyper filtype filtypene m Rapport - foresporsler forespurt fil forespurte filer m Rapport - videresending fil filene m Rapport - feil fil filene m Rapport - referanser refererende URL refererende URLer m Rapport - refererende tjenere refererende tjener refererende tjenerene m Rapport - referanser som videresendes refererende URL refererende URLer m Rapport - feilreferanser refererende URL refererende URLer m Rapport - Sok sok sok n Rapport - Sokeord sokeord sokeord n Rapport - Interne sok sok sok n Rapport - Interne sokeord sokeord sokeord n Rapport - virtuelle tjenere virtuell tjener virtuelle tjenere m Rapport - videresending for virtuelle tjenere virtuell tjener virtuelle tjenere m Rapport - feil for virtuelle tjenere virtuell tjener virtuelle tjenere m Rapport - brukere bruker brukerene m Rapport - videresendte brukere bruker brukere m Rapport - feil per bruker bruker brukerene m Oppsummering - klienter klient klientene m Rapport - klienter klient klientene m Rapport - OS operativsystem operativsystem n Rapport - domener domene domenene n Rapport - organisasjon organisasjon organisasjoner m Rapport - statuskoder statuskode statuskodene m Rapport - responstid Rapport - filstorrelser ## Used at the bottom of the report Analysen er laget med Kjoretid Mindre enn 1 ## Used in the time reports Hver enhet representerer eller en del av dette foresporsel etter en side foresporsler etter sider ## Used at the bottom of each non-time report: need m, f & n genders ikke vist ikke vist ikke vist ## Used on the pie charts: again need m, f & n genders Andre Andre Andre ## Used at the top of the report Programmet startet Analyse av foresporsler fra t.o.m. ## Used in the General Summary Totalt antall vellykkede foresporsler Gjennomsnittlig antall vellykkede foresporsler per dag Totalt antall vellykkede foresporsler etter sider Gjennomsnittlig antall vellykkede foresporsler etter sider per dag Logglinjer uten statuskode Totalt antall mislykkede foresporsler Totalt antall omdirigerte foresporsler Requests with informational status code *#*#* Antall forskjellige filer forespurt Antall forskjellige maskiner betjent Ugyldige logglinjer Uonskede logglinjer Total mengde data overfort Gjennomsnittlig mengde data overfort per dag Tall i paranteser refererer til de 7 dager til siste 7 dager Ga til Toppen ## Some special phrases for particular reports. [ukjente adresser] [domain ikke oppgitt] [ukjent domene] [rotkatalog] [ingen katalog] [ingen filending] [kataloger] Ukjent Windows Annen Unix Roboter Ukjent OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #frsp 7-dager frsp %frsp %7-day frsp sider 7-dager sider %sider %7-day sider bytes ?bytes 7-dager bytes 7-dager ?bytes %bytes %7-dager bytes ant. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Lister opp de forste %s Lister opp de forste %s Lister opp de forste %s Lister opp de %d forste %s Lister opp de %d forste %s Lister opp de %d forste %s Lister opp alle %s Lister opp alle %s Lister opp alle %s ## "by" in the phrase "listing the top 3 files BY number of requests" med flest ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors foresporsel siste 7 dager foresporsler siste 7 dager foresporsel etter en side siste 7 dager foresporsler etter en side siste 7 dager videresending videresendinger videresendt foresporsel siste 7 dager videresendte foresporsler siste 7 dager mislykket foresporsel mislykkede foresporsler mislykket foresporsel siste 7 dager mislykkede foresporsler siste 7 dager % av trafikken % av trafikken siste 7 dager % av den maksimale trafikken % av den maksimale trafikken siste 7 dager byte trafikk bytes trafikk ## ?bytes represents kbytes, Mbytes etc. ?bytes trafikk byte trafikk siste 7 dager bytes trafikk siste 7 dager ?bytes trafikk siste 7 dager forespurt etter med en videresendt foresporsel etter med en mislykket foresporsel etter med forste foresporsel etter med forste videresendte foresporsel etter med forste mislykkede foresporsel etter ## Now "sorted by": again, in m, f & n (only needed in plural though) sortert etter sortert etter sortert etter ## Used at the top of each report Rapporten inneholder data fra ## Used in pie charts Kakestykkene viser ## different ways of sorting mengden trafikk mengden trafikk siste 7 dager % av foresporslene % av foresporslene siste 7 dager % av det maksimale antallet foresporsler % av det maksimale antallet foresporsler siste 7 dager antall foresporsler antall foresporsler siste 7 dager % av foresporslene etter sider % av foresporslene etter sider siste 7 dager % av det maksimale antallet foresporsler etter sider % av det maksimale antallet foresporsler etter sider siste 7 dager antall foresporsler etter sider antall foresporsler etter sider siste 7 dager % av videresendte foresporsler % av videresendte foresporsler siste 7 dager % av det maksimale antallet videresendte foresporsler % av det maksimale antallet videresendte foresporsler siste 7 dager antall videresendte foresporsler antall videresendte foresporsler siste 7 dager % av de mislykkede foresporslene % av de mislykkede foresporslene siste 7 dager % av det maksimale antallet mislykkede foresporsler % av det maksimale antallet mislykkede foresporsler siste 7 dager antall mislykkede foresporsler antall mislykkede foresporsler siste 7 dager tidspunktet for siste foresporsel tidspunktet for siste videresendte foresporsel tidspunktet for siste mislykkede foresporsel tidspunktet for forste foresporsel tidspunktet for forste videresendte foresporsel tidspunktet for forste mislykkede foresporsel ## 3 other ways of sorting in m, f, & n sortert alfabetisk sortert alfabetisk sortert alfabetisk sortert etter verdi sortert etter verdi sortert etter verdi usortert usortert usortert ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m. %Y %H:%n ## "Program started at" and "Analysed requests from" %D. %m. %Y %H:%n ## In Daily Report %d.%m.%y ## In Daily Summary %w ## In Hourly Report %d.%m.%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m. %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Diverse informative] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Diverse suksess] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Diverse videresendt] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Diverske klient/brukerfeil] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Diverse serverfeil] xxx [Ukjent] analog-6.0/lang/pl.lng0000644000175000017500000003214210161303541014770 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Polish translation (ISO-8859-2 version) by: ## Marcin Sochacki (wanted@panda.bg.univ.gda.pl) ## Tomek Woniak (huckster@panda.bg.univ.gda.pl) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. Nie Pon Wto ro Czw Pi Sob Sty Lut Mar Kwi Maj Cze Lip Sie Wrz Pa Lis Gru ## Next some standard common words. ## Abbreviation for "week beginning" pocz. tyg. rok ## Quarter of a year kwarta miesic dzie dni godz minuta minuty sekunda sekundy bajt bajty ## ?bytes represents kbytes, Mbytes etc. ?bajtw zapytanie zapytania data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data czas czas pierwsza data pierwszy czas ostatnia data ostatni czas plik pliki host hosty wirtualny host wirtualny hosty katalog katalogi domena domeny subdomena subdomeny rozszerzenie rozszerzenia URL URL-e przegldarka przegldarki OS OS-y ## (= operating system, operating systems) rozmiar wyraenie wyszukiwawcze wyraenia wyszukiwawcze host hosty uytkownik uytkownikw kod serwera HTTP kody serwera HTTP Statystyki WWW dla ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Podsumowanie oglne ## The time reports, plus "busiest" strings (at the bottom of each report) Raport roczny Rekordowy rok: Raport kwartalny Rekordowy kwarta: Raport miesiczny Rekordowy miesic: Raport tygodniowy Rekordowy tydzie: pocztek tygodnia Podsumowanie dzienne Raport dzienny Rekordowy dzie: Raport godzinny Podsumowanie godzinne Podsumowanie godzin w tygodniu Rekordowa godzina: Raport kwadransw Podsumowanie kwadransw Rekordowy kwadrans: Raport piciominutowy Podsumowanie piciominutowe Rekordowe pi minut: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Raport hostw host hosty n Raport przekierowa hostw host hosty n Raport bdnych hostw host hosty n Raport katalogw katalog katalogi n Raport typw plikw rozszerzenie rozszerzenia n Raport zapyta plik pliki n Raport przekierowa plik pliki n Raport bdw plik pliki n Raport odsyaczy - URLe odsyajcy URL odsyajce URL-e n Raport odsyaczy - hosty odsyajcy host odsyajce hosty n Raport odsyaczy - przekierowania odsyajcy URL odsyajce URL-e n Raport odsyaczy - bdy odsyajcy URL odsyajce URL-e n Raport wyrae wyszukiwawczych wyraenie wyraenia n Raport sw wyszukiwawczych sowo sowa n Raport lokalnych wyrae wyszukiwawczych wyraenie wyraenia n Raport lokalnych sw wyszukiwawczych sowo sowa n Raport wirtualnych hostw wirtualny host wirtualne hosty n Raport wirtualnych hostw - przekierowania wirtualny host wirtualne hosty n Raport wirtualnych hostw - bdy wirtualny host wirtualne hosty n Raport uytkownikw uytkownik uytkownikw n Raport uytkownikw - przekierowania uytkownik uytkownikw n Raport uytkownikw - bdy uytkownik uytkownikw n Podsumowanie przegldarek przegldarka przegldarki n Raport przegldarek przegldarka przegldarki n Raport systemw operacyjnych system operacyjny systemy operacyjne n Raport domen domena domeny n Raport subdomen subdomena subdomeny n Raport kodw serwera HTTP kod serwera kody serwera n Raport czasu przetwarzania Raport wielkoci plikw ## Used at the bottom of the report Raport wygenerowany przez Czas pracy mniej ni 1 ## Used in the time reports Kada jednostka przedstawia (zaokrglenie w gr) zapyta o stron zapyta o strony ## Used at the bottom of each non-time report: need m, f & n genders * * poza list ## Used on the pie charts: again need m, f & n genders * * Inne ## Used at the top of the report Program uruchomiony: Przeanalizowano zapytania od do ## Used in the General Summary Liczba zapyta ogem rednia liczba zapyta dziennie Zapytania o strony ogem rednia liczba zapyta o strony dziennie Linie loga bez kodu serwera HTTP Bdne zapytania Przekierowane zapytania Zapytania z informacyjnym kodem serwera HTTP Liczba plikw Liczba hostw Uszkodzone linie loga Niepotrzebne wpisy w logu Dane przesane ogem rednia ilo danych przesyana dziennie Liczby w nawiasach oznaczaj 7 dni do ostatnie 7 dni Przejd do Gra ## Some special phrases for particular reports. [nieznane adresy numeryczne] [brak domeny] [nieznana domena] [gwny katalog] [brak katalogu] [brak rozszerzenia] [katalogi] Nieznane Windows Inny Unix Automaty indeksujce Nieznany system operacyjny ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) zapyta zapyta (7 dni) %zapyta %zapyta (7 dni) stron stron (7 dni) %stron %stron (7 dni) bajtw ?bajtw bajtw (7 dni) ?bajtw (7 dni) %bajtw %bajtw (7 dni) nr ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Wywietlono pierwsze %s * * Wywietlono pierwsze %d %s * * Wywietlono %s ## "by" in the phrase "listing the top 3 files BY number of requests" wedug ## All requests WITH AT LEAST 10 requests , ktre miay co najmniej ## Different ways of doing floors zapytanie w ostatnich 7 dniach zapyta w ostatnich 7 dniach zapytanie o stron w ostatnich 7 dniach zapyta o strony w ostatnich 7 dniach przekierowane zapytanie przekierowanych zapyta przekierowane zapytanie w ostatnich 7 dniach przekierowanych zapyta w ostatnich 7 dniach bdne zapytanie bdnych zapyta bdne zapytanie w ostatnich 7 dniach bdnych zapyta w ostatnich 7 dniach % ruchu w sieci % ruchu w sieci w ostatnich 7 dniach % maksymalnego ruchu w sieci % maksymalnego ruchu w sieci w ostatnich 7 dniach przesany bajt przesanych bajtw ## ?bytes represents kbytes, Mbytes etc. przesanych ?bajtw przesany bajt w ostatnich 7 dniach przesanych bajtw w ostatnich 7 dniach przesanych ?bajtw w ostatnich 7 dniach zapytanych od z przekierowanym zapytaniem od z bdnym zapytaniem od z pierwszym zapytaniem od z pierwszym przekierowanym zapytaniem od z pierwszym bdnym zapytaniem od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * posortowane wedug ## Used at the top of each report Ten raport zawiera dane z ## Used in pie charts Wykres posortowany wedug ## different ways of sorting ruchu w sieci ruchu w sieci w ostatnich 7 dniach % zapyta % zapyta w ostatnich 7 dniach % maksymalnej liczby zapyta % maksymalnej liczby zapyta w ostatnich 7 dniach liczby zapyta liczby zapyta w ostatnich 7 dniach % zapyta o strony % zapyta o strony w ostatnich 7 dniach % maksymalnej liczby zapyta o strony % maksymalnej liczby zapyta o strony w ostatnich 7 dniach liczby zapyta o strony liczby zapyta o strony w ostatnich 7 dniach % przekierowanych zapyta % przekierowanych zapyta w ostatnich 7 dniach % maksymalnej liczby przekierowanych zapyta % maksymalnej liczby przekierowanych zapyta w ostatnich 7 dniach liczby przekierowanych zapyta liczby przekierowanych zapyta w ostatnich 7 dniach % bdnych zapyta % bdnych zapyta w ostatnich 7 dniach % maksymalnej liczby bdnych zapyta % maksymalnej liczby bdnych zapyta w ostatnich 7 dniach liczby bdnych zapyta liczby bdnych zapyta w ostatnich 7 dniach daty ostaniego zapytania daty ostaniego przekierowanego zapytania daty ostaniego bdnego zapytania daty pierwszego zapytania daty pierwszego przekierowanego zapytania daty pierwszego bdnego zapytania ## 3 other ways of sorting in m, f, & n * * posortowane alfabetycznie * * posortowane numerycznie * * bez sortowania ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. rano po poudniu ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %H:%n ## "Program started at" and "Analysed requests from" %d %m %Y %H:%n ## In Daily Report %d %m %Y ## In Daily Summary %w ## In Hourly Report %d %m %Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %Y ## The date & time (D) column in non-time reports %d %m %Y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %Y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Rne komunikaty informacyjne] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Rne komunikaty o powodzeniu] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Rne komunikaty o przekierowaniu] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Rne bdy po stronie klienta/uytkownika] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Rne bdy po stronie serwera] xxx [Nieznane] analog-6.0/lang/pla.lng0000644000175000017500000003213610161303541015134 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Polish translation (US-ASCII version) by: ## Marcin Sochacki (wanted@panda.bg.univ.gda.pl) ## Tomek Wozniak (huckster@panda.bg.univ.gda.pl) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Nie Pon Wto Sro Czw Pia Sob Sty Lut Mar Kwi Maj Cze Lip Sie Wrz Paz Lis Gru ## Next some standard common words. ## Abbreviation for "week beginning" pocz. tyg. rok ## Quarter of a year kwartal miesiac dzien dni godz minuta minuty sekunda sekundy bajt bajty ## ?bytes represents kbytes, Mbytes etc. ?bajtow zapytanie zapytania data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data czas czas pierwsza data pierwszy czas ostatnia data ostatni czas plik pliki host hosty wirtualny host wirtualny hosty katalog katalogi domena domeny subdomena subdomeny rozszerzenie rozszerzenia URL URL-e przegladarka przegladarki OS OS-y ## (= operating system, operating systems) rozmiar wyrazenie wyszukiwawcze wyrazenia wyszukiwawcze host hosty uzytkownik uzytkownikow kod serwera HTTP kody serwera HTTP Statystyki WWW dla ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Podsumowanie ogolne ## The time reports, plus "busiest" strings (at the bottom of each report) Raport roczny Rekordowy rok: Raport kwartalny Rekordowy kwartal: Raport miesieczny Rekordowy miesiac: Raport tygodniowy Rekordowy tydzien: poczatek tygodnia Podsumowanie dzienne Raport dzienny Rekordowy dzien: Raport godzinny Podsumowanie godzinne Podsumowanie godzin w tygodniu Rekordowa godzina: Raport kwadransow Podsumowanie kwadransow Rekordowy kwadrans: Raport pieciominutowy Podsumowanie pieciominutowe Rekordowe piec minut: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Raport hostow host hosty n Raport przekierowan hostow host hosty n Raport blednych hostow host hosty n Raport katalogow katalog katalogi n Raport typow plikow rozszerzenie rozszerzenia n Raport zapytan plik pliki n Raport przekierowan plik pliki n Raport bledow plik pliki n Raport odsylaczy - URLe odsylajacy URL odsylajace URL-e n Raport odsylaczy - hosty odsylajacy host odsylajace hosty n Raport odsylaczy - przekierowania odsylajacy URL odsylajace URL-e n Raport odsylaczy - bledy odsylajacy URL odsylajace URL-e n Raport wyrazen wyszukiwawczych wyrazenie wyrazenia n Raport slow wyszukiwawczych slowo slowa n Raport lokalnych wyrazen wyszukiwawczych wyrazenie wyrazenia n Raport lokalnych slow wyszukiwawczych slowo slowa n Raport wirtualnych hostow wirtualny host wirtualne hosty n Raport wirtualnych hostow - przekierowania wirtualny host wirtualne hosty n Raport wirtualnych hostow - bledy wirtualny host wirtualne hosty n Raport uzytkownikow uzytkownik uzytkownikow n Raport uzytkownikow - przekierowania uzytkownik uzytkownikow n Raport uzytkownikow - bledy uzytkownik uzytkownikow n Podsumowanie przegladarek przegladarka przegladarki n Raport przegladarek przegladarka przegladarki n Raport systemow operacyjnych system operacyjny systemy operacyjne n Raport domen domena domeny n Raport subdomen subdomena subdomeny n Raport kodow serwera HTTP kod serwera kody serwera n Raport czasu przetwarzania Raport wielkosci plikow ## Used at the bottom of the report Raport wygenerowany przez Czas pracy mniej niz 1 ## Used in the time reports Kazda jednostka przedstawia (zaokraglenie w gore) zapytan o strone zapytan o strony ## Used at the bottom of each non-time report: need m, f & n genders * * poza lista ## Used on the pie charts: again need m, f & n genders * * Inne ## Used at the top of the report Program uruchomiony: Przeanalizowano zapytania od do ## Used in the General Summary Liczba zapytan ogolem Srednia liczba zapytan dziennie Zapytania o strony ogolem Srednia liczba zapytan o strony dziennie Linie loga bez kodu serwera HTTP Bledne zapytania Przekierowane zapytania Zapytania z informacyjnym kodem serwera HTTP Liczba plikow Liczba hostow Uszkodzone linie loga Niepotrzebne wpisy w logu Dane przeslane ogolem Srednia ilosc danych przesylana dziennie Liczby w nawiasach oznaczaja 7 dni do ostatnie 7 dni Przejdz do Gora ## Some special phrases for particular reports. [nieznane adresy numeryczne] [brak domeny] [nieznana domena] [glowny katalog] [brak katalogu] [brak rozszerzenia] [katalogi] Nieznane Windows Inny Unix Automaty indeksujace Nieznany system operacyjny ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) zapytan zapytan (7 dni) %zapytan %zapytan (7 dni) stron stron (7 dni) %stron %stron (7 dni) bajtow ?bajtow bajtow (7 dni) ?bajtow (7 dni) %bajtow %bajtow (7 dni) nr ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Wyswietlono pierwsze %s * * Wyswietlono pierwsze %d %s * * Wyswietlono %s ## "by" in the phrase "listing the top 3 files BY number of requests" wedlug ## All requests WITH AT LEAST 10 requests , ktore mialy co najmniej ## Different ways of doing floors zapytanie w ostatnich 7 dniach zapytan w ostatnich 7 dniach zapytanie o strone w ostatnich 7 dniach zapytan o strony w ostatnich 7 dniach przekierowane zapytanie przekierowanych zapytan przekierowane zapytanie w ostatnich 7 dniach przekierowanych zapytan w ostatnich 7 dniach bledne zapytanie blednych zapytan bledne zapytanie w ostatnich 7 dniach blednych zapytan w ostatnich 7 dniach % ruchu w sieci % ruchu w sieci w ostatnich 7 dniach % maksymalnego ruchu w sieci % maksymalnego ruchu w sieci w ostatnich 7 dniach przeslany bajt przeslanych bajtow ## ?bytes represents kbytes, Mbytes etc. przeslanych ?bajtow przeslany bajt w ostatnich 7 dniach przeslanych bajtow w ostatnich 7 dniach przeslanych ?bajtow w ostatnich 7 dniach zapytanych od z przekierowanym zapytaniem od z blednym zapytaniem od z pierwszym zapytaniem od z pierwszym przekierowanym zapytaniem od z pierwszym blednym zapytaniem od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * posortowane wedlug ## Used at the top of each report Ten raport zawiera dane z ## Used in pie charts Wykres posortowany wedlug ## different ways of sorting ruchu w sieci ruchu w sieci w ostatnich 7 dniach % zapytan % zapytan w ostatnich 7 dniach % maksymalnej liczby zapytan % maksymalnej liczby zapytan w ostatnich 7 dniach liczby zapytan liczby zapytan w ostatnich 7 dniach % zapytan o strony % zapytan o strony w ostatnich 7 dniach % maksymalnej liczby zapytan o strony % maksymalnej liczby zapytan o strony w ostatnich 7 dniach liczby zapytan o strony liczby zapytan o strony w ostatnich 7 dniach % przekierowanych zapytan % przekierowanych zapytan w ostatnich 7 dniach % maksymalnej liczby przekierowanych zapytan % maksymalnej liczby przekierowanych zapytan w ostatnich 7 dniach liczby przekierowanych zapytan liczby przekierowanych zapytan w ostatnich 7 dniach % blednych zapytan % blednych zapytan w ostatnich 7 dniach % maksymalnej liczby blednych zapytan % maksymalnej liczby blednych zapytan w ostatnich 7 dniach liczby blednych zapytan liczby blednych zapytan w ostatnich 7 dniach daty ostaniego zapytania daty ostaniego przekierowanego zapytania daty ostaniego blednego zapytania daty pierwszego zapytania daty pierwszego przekierowanego zapytania daty pierwszego blednego zapytania ## 3 other ways of sorting in m, f, & n * * posortowane alfabetycznie * * posortowane numerycznie * * bez sortowania ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. rano po poludniu ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %H:%n ## "Program started at" and "Analysed requests from" %d %m %Y %H:%n ## In Daily Report %d %m %Y ## In Daily Summary %w ## In Hourly Report %d %m %Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %Y ## The date & time (D) column in non-time reports %d %m %Y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %Y %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Rozne komunikaty informacyjne] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Rozne komunikaty o powodzeniu] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Rozne komunikaty o przekierowaniu] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Rozne bledy po stronie klienta/uzytkownika] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Rozne bledy po stronie serwera] xxx [Nieznane] analog-6.0/lang/pladom.tab0000644000175000017500000001162010161303541015615 0ustar sret1sret100000000000000## Domains File for Analog ## Polish translation (US-ASCII version) by: ## Marcin Sochacki (wanted@panda.bg.univ.gda.pl) ## Tomek Wozniak (huckster@panda.bg.univ.gda.pl) aero 2 Przemysl lotniczy arpa 1 Arpanet biz 2 Biznes com 2 Komercyjne coop 2 Kooperacje edu 2 Edukacyjne gov 2 Rzadowe info 2 Informacyjne int 2 Organizacje Miedzynarodowe mil 2 Wojskowe museum 2 Muzea name 3 Prywatne net 2 Sieciowe org 2 Organizacje pro 3 Profesjonalne ac 1 Wyspa Wniebowstapienia ad 2 Andora ae 3 Zjednoczone Emiraty Arabskie af 1 Afganistan ag 2 Antigua i Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antyle Holenderskie ao 1 Angola aq 1 Antarktyka ar 3 Argentyna as 1 Samoa Amerykanskie at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbejdzan ba 3 Bosnia i Hercegowina bb 2 Barbados bd 1 Bangladesz be 3 Belgia bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermudy bn 1 Brunei bo 3 Boliwia br 3 Brazylia bs 1 Bahamy bt 1 Bhutan bv 1 Wyspa Bouvet bw 1 Botswana by 1 Bialorus bz 1 Belize ca 3 Kanada cc 1 Wyspy Kokosowe cd 1 Demokratyczna Republika Konga cf 1 Republika Srodkowoafrykanska cg 1 Kongo ch 2 Szwajcaria ci 1 Wybrzeze Kosci Sloniowej ck 1 Wyspy Cooka cl 2 Chile cm 1 Kamerun cn 3 Chiny co 3 Kolumbia cr 3 Kostaryka cu 2 Kuba cv 1 Republika Zielonego Przyladka cx 2 Wyspa Bozego Narodzenia cy 3 Cypr cz 2 Czechy de 2 Niemcy dj 1 Dzibuti dk 2 Dania dm 2 Dominika do 3 Dominikana dz 1 Algieria ec 3 Ekwador ee 2 Estonia eg 3 Egipt eh 1 Sahara Zachodnia er 1 Erytrea es 2 Hiszpania et 1 Etiopia fi 2 Finlandia fj 3 Fidzi fk 1 Falklandy fm 1 Mikronezja fo 1 Wyspy Faroe fr 2 Francja fx 1 Francja (Terytorium Europejskie) ga 1 Gabon gb 1 Wielka Brytania gd 1 Grenada ge 1 Gruzja gf 1 Gujana Francuska gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Grenlandia gm 1 Gambia gn 1 Gwinea gp 1 Gwadelupa gq 1 Gwinea Rownikowa gr 2 Grecja gs 1 Georgia Poludniowa i Sandwich Poludniowy gt 3 Gwatemala gu 1 Guam (USA) gw 1 Gwinea Bissau gy 1 Gujana hk 3 Hongkong hm 1 Wyspy Heard i McDonald hn 2 Honduras hr 2 Chorwacja ht 1 Haiti hu 2 Wegry id 3 Indonezja ie 2 Irlandia il 3 Izrael im 1 Wyspa Man in 3 Indie io 1 Brytyjskie Terytorium Oceanu Indyjskiego iq 1 Irak ir 1 Iran is 2 Islandia it 2 Wlochy je 1 Jersey jm 3 Jamajka jo 3 Jordania jp 3 Japonia ke 3 Kenia kg 1 Kirgistan kh 1 Kambodza ki 1 Kiribati km 1 Komory kn 1 Saint Kitts i Nevis kp 1 Korea Polnocna kr 3 Korea Poludniowa kw 3 Kuwejt ky 1 Kajmany kz 1 Kazachstan la 1 Laos lb 3 Liban lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litwa lu 2 Luksemburg lv 2 Lotwa ly 1 Libia ma 1 Maroko mc 2 Monako md 1 Moldawia mg 1 Madagaskar mh 1 Wyspy Marshalla mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Makao mp 1 Mariany Polnocne mq 1 Martynika mr 1 Mauretania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Malediwy mw 1 Malawi mx 3 Meksyk my 3 Malezja mz 1 Mozambik na 1 Namibia nc 1 Nowa Kaledonia ne 1 Niger nf 1 Wyspa Norfolk ng 1 Nigeria ni 3 Nikaragua nl 2 Holandia no 2 Norwegia np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nowa Zelandia om 1 Oman pa 3 Panama pe 3 Peru pf 1 Polinezja Francuska pg 3 Papua Nowa Gwinea ph 3 Filipiny pk 3 Pakistan pl 3 Polska pm 1 Saint-Pierre i Miquelon pn 1 Pitcairn pr 1 Puerto Rico ps 1 Palestyna pt 2 Portugalia pw 1 Palau py 3 Paragwaj qa 1 Katar re 1 Reunion ro 2 Rumunia ru 2 Rosja rw 1 Rwanda sa 3 Arabia Saudyjska sb 1 Wyspy Salomona sc 1 Seszele sd 1 Sudan se 2 Szwecja sg 3 Singapur sh 1 Swieta Helena si 2 Slowenia sj 1 Wyspy Svalbard i Jan Mayen sk 2 Slowacja sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Wyspy Swietego Tomasza i Ksiazeca su 2 ZSRR sv 3 Salwador sy 1 Syria sz 1 Suazi tc 1 Wyspy Turks i Caicos td 1 Czad tf 1 Francuskie Terytoria Poludniowe tg 1 Togo th 3 Tajlandia tj 1 Tadzykistan tk 1 Tokelau tl 1 Timor Wschodni tm 1 Turkmenistan tn 1 Tunezja to 1 Tonga tp 1 Timor Wschodni tr 3 Turcja tt 3 Trynidad i Tobago tv 1 Tuvalu tw 3 Tajwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Wielka Brytania um 1 Wyspy Zewnetrzne Stanow Zjednoczonych us 4 Stany Zjednoczone uy 3 Urugwaj uz 1 Uzbekistan va 1 Watykan vc 1 Saint Vincent i Grenadyny ve 3 Wenezuela vg 1 Dziewicze Wyspy Brytyjskie vi 1 Dziewicze Wyspy Stanow Zjednoczonych vn 1 Wietnam vu 1 Vanuatu wf 1 Wyspy Wallis i Futuna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslawia za 3 Republika Poludniowej Afryki zm 1 Zambia zr 1 Demokratyczna Republika Konga zw 3 Zimbabwe analog-6.0/lang/pldom.tab0000644000175000017500000001162210161303541015456 0ustar sret1sret100000000000000## Domains File for Analog ## Polish translation (ISO-8859-2 version) by: ## Marcin Sochacki (wanted@panda.bg.univ.gda.pl) ## Tomek Woniak (huckster@panda.bg.univ.gda.pl) aero 2 Przemys lotniczy arpa 1 Arpanet biz 2 Biznes com 2 Komercyjne coop 2 Kooperacje edu 2 Edukacyjne gov 2 Rzdowe info 2 Informacyjne int 2 Organizacje Midzynarodowe mil 2 Wojskowe museum 2 Muzea name 3 Prywatne net 2 Sieciowe org 2 Organizacje pro 3 Profesjonalne ac 1 Wyspa Wniebowstpienia ad 2 Andora ae 3 Zjednoczone Emiraty Arabskie af 1 Afganistan ag 2 Antigua i Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antyle Holenderskie ao 1 Angola aq 1 Antarktyka ar 3 Argentyna as 1 Samoa Amerykaskie at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbejdan ba 3 Bonia i Hercegowina bb 2 Barbados bd 1 Bangladesz be 3 Belgia bf 1 Burkina Faso bg 2 Bugaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermudy bn 1 Brunei bo 3 Boliwia br 3 Brazylia bs 1 Bahamy bt 1 Bhutan bv 1 Wyspa Bouvet bw 1 Botswana by 1 Biaoru bz 1 Belize ca 3 Kanada cc 1 Wyspy Kokosowe cd 1 Demokratyczna Republika Konga cf 1 Republika rodkowoafrykaska cg 1 Kongo ch 2 Szwajcaria ci 1 Wybrzee Koci Soniowej ck 1 Wyspy Cooka cl 2 Chile cm 1 Kamerun cn 3 Chiny co 3 Kolumbia cr 3 Kostaryka cu 2 Kuba cv 1 Republika Zielonego Przyldka cx 2 Wyspa Boego Narodzenia cy 3 Cypr cz 2 Czechy de 2 Niemcy dj 1 Dibuti dk 2 Dania dm 2 Dominika do 3 Dominikana dz 1 Algieria ec 3 Ekwador ee 2 Estonia eg 3 Egipt eh 1 Sahara Zachodnia er 1 Erytrea es 2 Hiszpania et 1 Etiopia fi 2 Finlandia fj 3 Fidi fk 1 Falklandy fm 1 Mikronezja fo 1 Wyspy Faroe fr 2 Francja fx 1 Francja (Terytorium Europejskie) ga 1 Gabon gb 1 Wielka Brytania gd 1 Grenada ge 1 Gruzja gf 1 Gujana Francuska gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Grenlandia gm 1 Gambia gn 1 Gwinea gp 1 Gwadelupa gq 1 Gwinea Rwnikowa gr 2 Grecja gs 1 Georgia Poudniowa i Sandwich Poudniowy gt 3 Gwatemala gu 1 Guam (USA) gw 1 Gwinea Bissau gy 1 Gujana hk 3 Hongkong hm 1 Wyspy Heard i McDonald hn 2 Honduras hr 2 Chorwacja ht 1 Haiti hu 2 Wgry id 3 Indonezja ie 2 Irlandia il 3 Izrael im 1 Wyspa Man in 3 Indie io 1 Brytyjskie Terytorium Oceanu Indyjskiego iq 1 Irak ir 1 Iran is 2 Islandia it 2 Wochy je 1 Jersey jm 3 Jamajka jo 3 Jordania jp 3 Japonia ke 3 Kenia kg 1 Kirgistan kh 1 Kamboda ki 1 Kiribati km 1 Komory kn 1 Saint Kitts i Nevis kp 1 Korea Pnocna kr 3 Korea Poudniowa kw 3 Kuwejt ky 1 Kajmany kz 1 Kazachstan la 1 Laos lb 3 Liban lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litwa lu 2 Luksemburg lv 2 otwa ly 1 Libia ma 1 Maroko mc 2 Monako md 1 Modawia mg 1 Madagaskar mh 1 Wyspy Marshalla mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Makao mp 1 Mariany Pnocne mq 1 Martynika mr 1 Mauretania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Malediwy mw 1 Malawi mx 3 Meksyk my 3 Malezja mz 1 Mozambik na 1 Namibia nc 1 Nowa Kaledonia ne 1 Niger nf 1 Wyspa Norfolk ng 1 Nigeria ni 3 Nikaragua nl 2 Holandia no 2 Norwegia np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nowa Zelandia om 1 Oman pa 3 Panama pe 3 Peru pf 1 Polinezja Francuska pg 3 Papua Nowa Gwinea ph 3 Filipiny pk 3 Pakistan pl 3 Polska pm 1 Saint-Pierre i Miquelon pn 1 Pitcairn pr 1 Puerto Rico ps 1 Palestyna pt 2 Portugalia pw 1 Palau py 3 Paragwaj qa 1 Katar re 1 Reunion ro 2 Rumunia ru 2 Rosja rw 1 Rwanda sa 3 Arabia Saudyjska sb 1 Wyspy Salomona sc 1 Seszele sd 1 Sudan se 2 Szwecja sg 3 Singapur sh 1 wita Helena si 2 Sowenia sj 1 Wyspy Svalbard i Jan Mayen sk 2 Sowacja sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Wyspy witego Tomasza i Ksica su 2 ZSRR sv 3 Salwador sy 1 Syria sz 1 Suazi tc 1 Wyspy Turks i Caicos td 1 Czad tf 1 Francuskie Terytoria Poudniowe tg 1 Togo th 3 Tajlandia tj 1 Tadykistan tk 1 Tokelau tl 1 Timor Wschodni tm 1 Turkmenistan tn 1 Tunezja to 1 Tonga tp 1 Timor Wschodni tr 3 Turcja tt 3 Trynidad i Tobago tv 1 Tuvalu tw 3 Tajwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Wielka Brytania um 1 Wyspy Zewntrzne Stanw Zjednoczonych us 4 Stany Zjednoczone uy 3 Urugwaj uz 1 Uzbekistan va 1 Watykan vc 1 Saint Vincent i Grenadyny ve 3 Wenezuela vg 1 Dziewicze Wyspy Brytyjskie vi 1 Dziewicze Wyspy Stanw Zjednoczonych vn 1 Wietnam vu 1 Vanuatu wf 1 Wyspy Wallis i Futuna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugosawia za 3 Republika Poudniowej Afryki zm 1 Zambia zr 1 Demokratyczna Republika Konga zw 3 Zimbabwe analog-6.0/lang/pt.lng0000644000175000017500000003325010161303541015001 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Portuguese version by Jaime Carvalho e Silva, 26 January 2001 ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Dom Seg Ter Qua Qui Sex Sab Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez ## Next some standard common words. ## Abbreviation for "week beginning" sem. com. ano ## Quarter of a year trimestre ms dia dias h minuto minutos segundo segundos byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes pedido pedidos data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data hora horas prim. data prim. hora data ant. hora ant. ficheiro ficheiros servidor servidores servidor virtual servidores virtuais directoria directorias domnio domnios organizao organizaes extenso extenses URL URLs Leitor Leitores Sistema Operativo Sistemas Operativos ## (= operating system, operating systems) tamanho termo pesquisado termos pesquisados stio stios utilizador utilizadores cod. estado cod. estado Estatsticas do Servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sumrio Geral ## The time reports, plus "busiest" strings (at the bottom of each report) Relatrio Anual Ano mais movimentado: Relatrio trimestral Trimestre mais movimentado: Relatrio Mensal Ms mais movimentado: Relatrio Semanal Semana mais movimentada: semana comeando Resumo Dirio Relatrio Dirio Dia mais movimentado: Relatrio Horrio Resumo Horrio Resumo de hora da Semana Hora mais movimentada: Relatrio ao quarto de hora Resumo dos quartos de hora Quarto de hora mais movimentado: Relatrio cada cinco minutos Resumo dos cinco minutos Cinco minutos mais movimentados: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Relatrio de Servidores Servidor Servidores m Relatrio de reencaminhamento do Servidor servidor servidores m Relatrio de falhas do Servidor servidor servidores m Relatrio de Directorias directoria directorias f Relatrio de Tipos de Ficheiro extenso extenses f Relatrio de Pedidos ficheiro ficheiros m Relatrio de redireccionamento ficheiro ficheiros m Relatrio de falhas ficheiro ficheiros m Relatrio de referncia URL de referncia URLs de referncia m Relatrio do stio de referncia stio de referncia stios de referncia m Relatrio de referncia redireccionada URL de referncia URLs de referncia m Relatrio de referncia falhada URL de referncia URLs de referncia m Relatrio de perguntas de pesquisa pergunta perguntas f Relatrio de pesquisa de palavras palavra pesquisada palavras pesquisadas f Relatrio de Pesquisas Internas pesquisas pesquisa f Relatrio de Palavras Pesquisadas Internamente palavra pesquisada palavras pesquisadas f Relatrio de Servidor Virtual servidor virtual servidores virtuais m Relatrio de Reencaminhamento de Servidor Virtual servidor virtual servidores virtuais m Relatrio de Falhas de Servidor Virtual servidor virtual servidores virtuais m Relatrio de Utilizadores utilizador utilizadores m Relatrio de Reencaminhamento de Utilizadores utilizador utilizadores m Relatrio de Erros de Utilizadores utilizador utilizadores m Resumo de Leitores leitor leitores m Relatrio de Leitores leitor leitores m Relatrio de Sistemas Operativos Sistema Operativo Sistemas Operativos m Relatrio de Domnios domnio domnios m Relatrio de organizaes organizao organizaes f Relatrio de Cdigos de Estado cdigo de estado cdigos de estado m Relatrio de tempo de processamento Relatrio de Tamanho de Ficheiro ## Used at the bottom of the report Estatsticas geradas por Tempo de execuo Menos de 1 ## Used in the time reports Cada unidade representa ou fraco pedido de uma pgina pedidos de pginas ## Used at the bottom of each non-time report: need m, f & n genders no listados no listadas * ## Used on the pie charts: again need m, f & n genders Outro Outra * ## Used at the top of the report Comeo do programa em Anlise de pedidos desde at ## Used in the General Summary Pedidos atendidos Nmero mdio de pedidos atendidos por dia Pedidos de pginas atendidos Nmero mdio de pedidos de pginas atendidos por dia Linhas sem cdigo de estado no ficheiro de log Pedidos no atendidos Pedidos redirigidos Pedidos com cdigo de estado informativo Ficheiros diferentes solicitados Servidores diferentes atendidos Linhas invlidas no ficheiro de log Entradas no desejadas no ficheiro de log Trfego total Trfego mdio transferido por dia Os valores entre parntesis referem-se aos 7 dias at ltimos 7 dias Ir a Incio ## Some special phrases for particular reports. [endereo numrico no traduzido] [domnio no indicado] [domnio desconhecido] [directoria da raiz] [directoria ausente] [extenso ausente] [directorias] Windows desconhecido Outro Unix Robs Sistema Operativo desconhecido ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) N.ped ped.7 dias % ped %ped. 7 dias Pgs. pgs. 7 dias % Pgs. %pgs. 7 dias bytes ?bytes bytes 7 dias ?bytes 7 dias %bytes %bytes 7 dias no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Mostrando o primeiro %s Mostrando a primeira %s * Mostrando os %d primeiros %s Mostrando as %d primeiras %s * Mostrando os %s Mostrando as %s * ## "by" in the phrase "listing the top 3 files BY number of requests" por ## All requests WITH AT LEAST 10 requests com pelo menos ## Different ways of doing floors pedido nos ltimos 7 dias pedidos nos ltimos 7 dias pedido de uma pgina nos ltimos 7 dias pedido de pginas nos ltimos 7 dias pedido redireccionado pedidos redireccionados pedido reencaminhado nos ltimos 7 dias pedidos reencaminhados nos ltimos 7 dias pedido falhado pedidos falhados pedido falhado nos ltimos 7 dias pedidos falhados nos ltimos 7 dias % do trfego % do trfego nos ltimos 7 dias % da quantidade mxima de trfego % da quantidade mxima de trfego dos ltimos 7 dias byte de trfego bytes de trfego ## ?bytes represents kbytes, Mbytes etc. ?bytes de trfego byte de trfego nos ltimos 7 dias bytes de trfego nos ltimos 7 dias ?bytes de trfego nos ltimos 7 dias pedido desde com um pedido redireccionado desde com um pedido falhado desde com o primeiro pedido desde com o primeiro pedido redireccionado desde com o primeiro pedido falhado desde ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenados por ordenadas por * ## Used at the top of each report Este relatrio contm dados de ## Used in pie charts Este grfico foi traado por ## different ways of sorting quantidade de trfego quantidade de trfego nos ltimos 7 dias % dos pedidos % dos pedidos nos ltimos 7 dias % da quantidade mxima de pedidos % da quantidade mxima de pedidos nos ltimos 7 dias nmero de pedidos nmero de pedidos nos ltimos 7 dias % dos pedidos de pginas % dos pedidos de pginas nos ltimos 7 dias % do nmero mximo de pedidos de pginas % do nmero mximo de pedidos de pginas nos ltimos 7 dias nmero de pedidos de pginas nmero de pedidos de pginas nos ltimos 7 dias % dos pedidos redireccionados % dos pedidos redireccionados nos ltimos 7 dias % do nmero mximo de pedidos redireccionados % do nmero mximo de pedidos redireccionados nos ltimos 7 dias nmero de pedidos redireccionados nmero de pedidos redireccionados nos ltimos 7 dias % dos pedidos falhados % dos pedidos falhados nos ltimos 7 dias % do nmero mximo de pedidos falhados % do nmero mximo de pedidos falhados nos ltimos 7 dias nmero de pedidos falhados nmero de pedidos falhados nos ltimos 7 dias hora do ltimo pedido hora do ltimo pedido redireccionado hora do ltimo pedido falhado hora do primeiro pedido hora do primeiro pedido redireccionado hora do primeiro pedido falhado ## 3 other ways of sorting in m, f, & n por ordem alfabtica por ordem alfabtica por ordem alfabtica por ordem numrica por ordem numrica por ordem numrica desordenados desordenadas * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary %H ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y s %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/pta.lng0000644000175000017500000003325010161303541015142 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Portuguese version by Jaime Carvalho e Silva, 26 January 2001 ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Dom Seg Ter Qua Qui Sex Sab Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez ## Next some standard common words. ## Abbreviation for "week beginning" sem. com. ano ## Quarter of a year trimestre mes dia dias h minuto minutos segundo segundos byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes pedido pedidos data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data hora horas prim. data prim. hora data ant. hora ant. ficheiro ficheiros servidor servidores servidor virtual servidores virtuais directoria directorias dominio dominios organizacao organizacoes extensao extensoes URL URLs Leitor Leitores Sistema Operativo Sistemas Operativos ## (= operating system, operating systems) tamanho termo pesquisado termos pesquisados sitio sitios utilizador utilizadores cod. estado cod. estado Estatisticas do Servidor Web de ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sumario Geral ## The time reports, plus "busiest" strings (at the bottom of each report) Relatorio Anual Ano mais movimentado: Relatorio trimestral Trimestre mais movimentado: Relatorio Mensal Mes mais movimentado: Relatorio Semanal Semana mais movimentada: semana comecando Resumo Diario Relatorio Diario Dia mais movimentado: Relatorio Horario Resumo Horario Resumo de hora da Semana Hora mais movimentada: Relatorio ao quarto de hora Resumo dos quartos de hora Quarto de hora mais movimentado: Relatorio cada cinco minutos Resumo dos cinco minutos Cinco minutos mais movimentados: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Relatorio de Servidores Servidor Servidores m Relatorio de reencaminhamento do Servidor servidor servidores m Relatorio de falhas do Servidor servidor servidores m Relatorio de Directorias directoria directorias f Relatorio de Tipos de Ficheiro extensao extensoes f Relatorio de Pedidos ficheiro ficheiros m Relatorio de redireccionamento ficheiro ficheiros m Relatorio de falhas ficheiro ficheiros m Relatorio de referencia URL de referencia URLs de referencia m Relatorio do sitio de referencia sitio de referencia sitios de referencia m Relatorio de referencia redireccionada URL de referencia URLs de referencia m Relatorio de referencia falhada URL de referencia URLs de referencia m Relatorio de perguntas de pesquisa pergunta perguntas f Relatorio de pesquisa de palavras palavra pesquisada palavras pesquisadas f Relatorio de Pesquisas Internas pesquisas pesquisa f Relatorio de Palavras Pesquisadas Internamente palavra pesquisada palavras pesquisadas f Relatorio de Servidor Virtual servidor virtual servidores virtuais m Relatorio de Reencaminhamento de Servidor Virtual servidor virtual servidores virtuais m Relatorio de Falhas de Servidor Virtual servidor virtual servidores virtuais m Relatorio de Utilizadores utilizador utilizadores m Relatorio de Reencaminhamento de Utilizadores utilizador utilizadores m Relatorio de Erros de Utilizadores utilizador utilizadores m Resumo de Leitores leitor leitores m Relatorio de Leitores leitor leitores m Relatorio de Sistemas Operativos Sistema Operativo Sistemas Operativos m Relatorio de Dominios dominio dominios m Relatorio de organizacoes organizacao organizacoes f Relatorio de Codigos de Estado codigo de estado codigos de estado m Relatorio de tempo de processamento Relatorio de Tamanho de Ficheiro ## Used at the bottom of the report Estatisticas geradas por Tempo de execucao Menos de 1 ## Used in the time reports Cada unidade representa ou fraccao pedido de uma pagina pedidos de paginas ## Used at the bottom of each non-time report: need m, f & n genders nao listados nao listadas * ## Used on the pie charts: again need m, f & n genders Outro Outra * ## Used at the top of the report Comeco do programa em Analise de pedidos desde Ate' ## Used in the General Summary Pedidos atendidos Numero medio de pedidos atendidos por dia Pedidos de paginas atendidos Numero medio de pedidos de paginas atendidos por dia Linhas sem codigo de estado no ficheiro de log Pedidos nao atendidos Pedidos redirigidos Pedidos com codigo de estado informativo Ficheiros diferentes solicitados Servidores diferentes atendidos Linhas invalidas no ficheiro de log Entradas nao desejadas no ficheiro de log Trafego total Trafego medio transferido por dia Os valores entre parentesis referem-se aos 7 dias ate' ultimos 7 dias Ir a Inicio ## Some special phrases for particular reports. [endereco numerico nao traduzido] [dominio nao indicado] [dominio desconhecido] [directoria da raiz] [directoria ausente] [extensao ausente] [directorias] Windows desconhecido Outro Unix Robos Sistema Operativo desconhecido ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) N.ped ped.7 dias % ped %ped. 7 dias Pgs. pgs. 7 dias % Pgs. %pgs. 7 dias bytes ?bytes bytes 7 dias ?bytes 7 dias %bytes %bytes 7 dias no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Mostrando o primeiro %s Mostrando a primeira %s * Mostrando os %d primeiros %s Mostrando as %d primeiras %s * Mostrando os %s Mostrando as %s * ## "by" in the phrase "listing the top 3 files BY number of requests" por ## All requests WITH AT LEAST 10 requests com pelo menos ## Different ways of doing floors pedido nos ultimos 7 dias pedidos nos ultimos 7 dias pedido de uma pagina nos ultimos 7 dias pedido de paginas nos ultimos 7 dias pedido redireccionado pedidos redireccionados pedido reencaminhado nos ultimos 7 dias pedidos reencaminhados nos ultimos 7 dias pedido falhado pedidos falhados pedido falhado nos ultimos 7 dias pedidos falhados nos ultimos 7 dias % do trafego % do trafego nos ultimos 7 dias % da quantidade maxima de trafego % da quantidade maxima de trafego dos ultimos 7 dias byte de trafego bytes de trafego ## ?bytes represents kbytes, Mbytes etc. ?bytes de trafego byte de trafego nos ultimos 7 dias bytes de trafego nos ultimos 7 dias ?bytes de trafego nos ultimos 7 dias pedido desde com um pedido redireccionado desde com um pedido falhado desde com o primeiro pedido desde com o primeiro pedido redireccionado desde com o primeiro pedido falhado desde ## Now "sorted by": again, in m, f & n (only needed in plural though) ordenados por ordenadas por * ## Used at the top of each report Este relatorio contem dados de ## Used in pie charts Este grafico foi tracado por ## different ways of sorting quantidade de trafego quantidade de trafego nos ultimos 7 dias % dos pedidos % dos pedidos nos ultimos 7 dias % da quantidade maxima de pedidos % da quantidade maxima de pedidos nos ultimos 7 dias numero de pedidos numero de pedidos nos ultimos 7 dias % dos pedidos de paginas % dos pedidos de paginas nos ultimos 7 dias % do numero maximo de pedidos de paginas % do numero maximo de pedidos de paginas nos ultimos 7 dias numero de pedidos de paginas numero de pedidos de paginas nos ultimos 7 dias % dos pedidos redireccionados % dos pedidos redireccionados nos ultimos 7 dias % do numero maximo de pedidos redireccionados % do numero maximo de pedidos redireccionados nos ultimos 7 dias numero de pedidos redireccionados numero de pedidos redireccionados nos ultimos 7 dias % dos pedidos falhados % dos pedidos falhados nos ultimos 7 dias % do numero maximo de pedidos falhados % do numero maximo de pedidos falhados nos ultimos 7 dias numero de pedidos falhados numero de pedidos falhados nos ultimos 7 dias hora do ultimo pedido hora do ultimo pedido redireccionado hora do ultimo pedido falhado hora do primeiro pedido hora do primeiro pedido redireccionado hora do primeiro pedido falhado ## 3 other ways of sorting in m, f, & n por ordem alfabetica por ordem alfabetica por ordem alfabetica por ordem numerica por ordem numerica por ordem numerica desordenados desordenadas * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary %H ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y as %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/ptadesc.txt0000644000175000017500000001115510161303541016040 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Este relatorio lista a actividade em cada ano. # Quarterly Report Este relatorio lista a actividade em cada trimestre. # Monthly Report Este relatorio lista a actividade em cada mes. # Weekly Report Este relatorio lista a actividade em cada semana. # Daily Report Este relatorio lista a actividade em cada dia. # Hourly Report Este relatorio lista a actividade em cada hora. # Quarter-Hour Report Este relatorio lista a actividade em cada quarto de hora. # Five-Minute Report Este relatorio lista a actividade em cada periodo de cinco minutos. # Daily Summary Este relatorio lista a actividade total para cada dia da semana, somada ao longo de todas semanas do relatorio. # Hourly Summary Este relatorio lista a actividade total para cada hora do dia, somada ao longo de todos os dias do relatorio. # Hour of the Week Summary Este relatorio lista a actividade total para cada hora da semana, somada ao longo de todas as semanas do relatorio. # Quarter-Hour Summary Este relatorio lista a actividade total em cada quarto de hora, somada ao longo de todos os dias do relatorio. # Five-Minute Summary Este relatorio lista a actividade total para cada periodo de cinco minutos, somada ao longo de todos os dias do relatorio. # General Summary Este relatorio contem as estatisticas globais. # Request Report Este relatorio lista os ficheiros no servidor. # Redirection Report Este relatorio lista os ficheiros que fizeram com que os pedidos fossem reencaminhados para outro ficheiro. (Geralmente as directorias sem a barra final, ou 'scripts' CGI forcaram os reencaminhamentos.) # Failure Report Este relatorio lista os ficheiros que provocaram falhas, por exemplo ficheiros nao encontrados. # File Type Report Este relatorio lista as extensoes dos ficheiros solicitados. # Directory Report Este relatorio lista as directorias cujos ficheiros foram solicitados. (Os numeros para cada directoria incluem todas as suas subdirectorias.) # Host Report Este relatorio lista os computadores que solicitaram ficheiros. # Host Redirection Report Este relatorio lista os computadores que foram redireccionados para outro ficheiro. # Host Failure Report Este relatorio lista os computadores que encontraram pedidos falhados. # Domain Report Este relatorio lista os paises dos computadores que pediram ficheiros. # Referrer Report Este relatorio lista os referenciadores (donde as pessoas seguiram ligacoes, ou paginas que incluiam as imagens deste sitio). # Referring Site Report Este relatorio lista os servidores donde as pessoas seguiram ligacoes. # Redirected Referrer Report Este relatorio lista os referenciadores que provocaram reencaminhamento de pedidos. # Failed Referrer Report Este relatorio lista os referenciadores contendo ligacoes quebradas para o sitio. # Browser Report Este relatorio lista os navegadores usados pelos vistantes. # Virtual Host Report Este relatorio lista a actividade em cada um dos dominios virtuais no sitio. # Virtual Host Redirection Report Este relatorio lista os pedidos reencaminhados para cada um dos dominios virtuais. # Virtual Host Failure Report Este relatorio lista os pedidos falhados para cada um dos dominios virtuais. # User Report Este relatorio lista os utilizadores que pediram ficheiros, se os utilizadores foram autenticados ou podem ser identificados por 'cookies'. # User Redirection Report Este relatorio lista os utilizadores que foram reencaminhados para outro ficheiro. # User Failure Report Este relatorio lista os utilizadores que encontraram pedidos falhados. # Organisation Report Este relatorio lista as organizacoes dos computadores que pediram ficheiros. # Search Query Report Este relatorio lista que pesquisas as pessoas usaram nos motores de pesquisa para encontrar o sitio. # Search Word Report Este relatorio lista que palavras as pessoas usaram nos motores de pesquisa para encontrar o sitio. # Internal Search Query Report Este relatorio lista que pesquisas as pessoas usaram nos 'scripts' do sitio. # Internal Search Word Report Este relatorio lista que palavras as pessoas usaram nos 'scripts' do sitio. # Browser Summary Este relatorio lista os fabricantes dos navegadores dos visitantes. # Operating System Report Este relatorio lista os sistemas operativos usados pelos visitantes. # File Size Report Este relatorio lista os tamanhos dos ficheiros. # Status Code Report Este relatorio lista os codigos de estado HTTP de todos os pedidos. # Processing Time Report Este relatorio lista os tempos gastos a processar os pedidos bem sucedidos. analog-6.0/lang/ptadom.tab0000644000175000017500000001173310161303541015632 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emiratos Arabes Unidos af 1 Afeganistao ag 2 Antigua e Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antilhas Holandesas ao 1 Angola aq 1 Antarctida ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijao ba 3 Bosnia Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgica bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benim bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasil bs 1 Bahamas bt 1 Butao bv 1 Ilha Bouvet bw 1 Botswana by 1 Lituania bz 1 Belize ca 3 Canada cc 1 Ilhas Cocos (Keeling) cd 1 Congo cf 1 Republica Centro-Africana cg 1 Congo ch 2 Suica ci 1 Costa do Marfim ck 1 Ilhas Cook cl 2 Chile cm 1 Camaroes cn 3 China co 3 Colombia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Ilha Christmas cy 3 Chipre cz 2 Republica Theca de 2 Alemanha dj 1 Djibuti dk 2 Dinamarca dm 2 Dominica do 3 Republica Dominicana dz 1 Argelia ec 3 Equador edu 2 Educacional ee 2 Estonia eg 3 Egito eh 1 Saara Oriental er 1 Eritreia es 2 Espanha et 1 Etiopia fi 2 Finlandia fj 3 Fiji fk 1 Ilhas Malvinas (Falkland) fm 1 Estados Federados da Micronesia fo 1 Ilhas Faroe fr 2 Franca fx 1 Franca (Territorio Europeu) ga 1 Gabao gb 1 Gra-Bretanha gd 1 Granada ge 1 Georgia gf 1 Guiana Francesa gg 1 Ilha de Guernesey gh 3 Gana gi 1 Gibraltar gl 1 Gronelandia gm 1 Gambia gn 1 Guine gov 2 Governo norte-americano gp 1 Ilha de Guadalupe gq 1 Guine Equatorial gr 2 Grecia gs 1 Ilhas de Georgia do Sul e Sandwich do Sul gt 3 Guatemala gu 1 Ilha de Guam gw 1 Guine-Bissau gy 1 Guiana (ex. Guiana Inglesa) hk 3 Hong Kong hm 1 Ilhas Heard e McDonald hn 2 Honduras hr 2 Croacia ht 1 Haiti hu 2 Hungria id 3 Indonesia ie 2 Irlanda il 3 Israel im 1 Ilha de Man in 3 India int 1 Internacional io 1 Territorio Indico-britanico iq 1 Iraque ir 1 Irao is 2 Islandia it 2 Italia je 1 Ilha de Jersey jm 3 Jamaica jo 3 Jordania jp 3 Japao ke 3 Quenia kg 1 Kyrgyzstan kh 1 Camboja ki 1 Kiribati km 1 Ilhas Comores kn 1 Ilhas Saint Kitts e Nevis kp 1 Coreia do Norte kr 3 Coreia do Sul kw 3 Kuwait ky 1 Ilhas Cayman kz 1 Cazaquistao la 1 Laos lb 3 Libano lc 1 Ilha de Santa Lucia li 2 Liechtenstein lk 1 Sri-Lanka lr 1 Liberia ls 1 Lesoto lt 2 Lituania lu 2 Luxemburgo lv 2 Letonia ly 1 Libia ma 1 Marrocos mc 2 Principado de Monaco md 1 Moldavia mg 1 Madagascar mh 1 Ilhas Marshall mil 2 Militar norte-americano mk 3 Macedonia (Antiga Jugoslavia) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macau mp 1 Ilhas Marianas do Norte mq 1 Martinica mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Ilhas Mauricias mv 1 Ilhas Maldivas mw 1 Malaui mx 3 Mexico my 3 Malasia mz 1 Mocambique na 1 Namibia nc 1 Nova Caledonia ne 1 Niger net 2 Redes nf 1 Ilha Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Holanda no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Niue (Polinesia) nz 3 Nova Zelandia om 1 Oma org 2 Organizacoes nao-governamentais pa 3 Panama pe 3 Peru pf 1 Polinesia Francesa pg 3 Papua Nova Guine ph 3 Filipinas pk 3 Paquistao pl 3 Polnia pm 1 Ilhas Saint Pierre e Miquelon pn 1 Ilha Pitcairn pr 1 Porto Rico ps 3 Palestina pt 2 Portugal pw 1 Palau py 3 Paraguai qa 1 Qatar re 1 Ilhas Reuniao ro 2 Romenia ru 2 Russia rw 1 Ruanda sa 3 Arabia Saudita sb 1 Ilhas Salomao sc 1 Ilhas Seychelles sd 1 Sudao se 2 Suecia sg 3 Singapura sh 1 Ilha de Santa Helena si 2 Eslovenia sj 1 Ilhas Svalbard e Jan Mayen sk 2 Eslovaquia sl 1 Serra Leoa sm 1 Principado de San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Sao Tome e Principe su 2 Antiga Uniao Sovietica sv 3 El Salvador sy 1 Siria sz 1 Suazilandia tc 1 Ilhas Turks e Caicos td 1 Chade tf 1 Territorios Franceses do Ultramar tg 1 Togo th 3 Tailandia tj 1 Tadjiquistao tk 1 Ilha Tokelau tl 1 Timor Leste tm 1 Turquemenistao tn 1 Tunisia to 1 Tonga tp 1 Timor Leste tr 3 Turquia tt 3 Trinidade e Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ucrania ug 3 Uganda uk 3 Reino Unido um 1 Territorios americanos do ultramar us 4 Estados Unidos da America uy 3 Uruguai uz 1 Uzbequistao va 1 Cidade do Vaticano vc 1 Ilhas de Saint Vincent e Grenadines ve 3 Venezuela vg 1 Ilhas Virgens Britanicas vi 1 Ilhas Virgens vn 1 Vietname vu 1 Vanuatu wf 1 Ilhas Wallis e Fortuna ws 1 Samoa ye 1 Iemen yt 1 Ilha Mayotte yu 3 Jugoslavia za 3 Africa do Sul zm 1 Zambia zr 1 Republica Democratica do Congo zw 3 Zimbabue analog-6.0/lang/ptdesc.txt0000644000175000017500000001115510161303541015677 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Este relatrio lista a actividade em cada ano. # Quarterly Report Este relatrio lista a actividade em cada trimestre. # Monthly Report Este relatrio lista a actividade em cada ms. # Weekly Report Este relatrio lista a actividade em cada semana. # Daily Report Este relatrio lista a actividade em cada dia. # Hourly Report Este relatrio lista a actividade em cada hora. # Quarter-Hour Report Este relatrio lista a actividade em cada quarto de hora. # Five-Minute Report Este relatrio lista a actividade em cada perodo de cinco minutos. # Daily Summary Este relatrio lista a actividade total para cada dia da semana, somada ao longo de todas semanas do relatrio. # Hourly Summary Este relatrio lista a actividade total para cada hora do dia, somada ao longo de todos os dias do relatrio. # Hour of the Week Summary Este relatrio lista a actividade total para cada hora da semana, somada ao longo de todas as semanas do relatrio. # Quarter-Hour Summary Este relatrio lista a actividade total em cada quarto de hora, somada ao longo de todos os dias do relatrio. # Five-Minute Summary Este relatrio lista a actividade total para cada perodo de cinco minutos, somada ao longo de todos os dias do relatrio. # General Summary Este relatrio contm as estatsticas globais. # Request Report Este relatrio lista os ficheiros no servidor. # Redirection Report Este relatrio lista os ficheiros que fizeram com que os pedidos fossem reencaminhados para outro ficheiro. (Geralmente as directorias sem a barra final, ou 'scripts' CGI foraram os reencaminhamentos.) # Failure Report Este relatrio lista os ficheiros que provocaram falhas, por exemplo ficheiros no encontrados. # File Type Report Este relatrio lista as extenses dos ficheiros solicitados. # Directory Report Este relatrio lista as directorias cujos ficheiros foram solicitados. (Os nmeros para cada directoria incluem todas as suas subdirectorias.) # Host Report Este relatrio lista os computadores que solicitaram ficheiros. # Host Redirection Report Este relatrio lista os computadores que foram redireccionados para outro ficheiro. # Host Failure Report Este relatrio lista os computadores que encontraram pedidos falhados. # Domain Report Este relatrio lista os pases dos computadores que pediram ficheiros. # Referrer Report Este relatrio lista os referenciadores (donde as pessoas seguiram ligaes, ou pginas que incluiam as imagens deste stio). # Referring Site Report Este relatrio lista os servidores donde as pessoas seguiram ligaes. # Redirected Referrer Report Este relatrio lista os referenciadores que provocaram reencaminhamento de pedidos. # Failed Referrer Report Este relatrio lista os referenciadores contendo ligaes quebradas para o stio. # Browser Report Este relatrio lista os navegadores usados pelos vistantes. # Virtual Host Report Este relatrio lista a actividade em cada um dos domnios virtuais no stio. # Virtual Host Redirection Report Este relatrio lista os pedidos reencaminhados para cada um dos domnios virtuais. # Virtual Host Failure Report Este relatrio lista os pedidos falhados para cada um dos domnios virtuais. # User Report Este relatrio lista os utilizadores que pediram ficheiros, se os utilizadores foram autenticados ou podem ser identificados por 'cookies'. # User Redirection Report Este relatrio lista os utilizadores que foram reencaminhados para outro ficheiro. # User Failure Report Este relatrio lista os utilizadores que encontraram pedidos falhados. # Organisation Report Este relatrio lista as organizaes dos computadores que pediram ficheiros. # Search Query Report Este relatrio lista que pesquisas as pessoas usaram nos motores de pesquisa para encontrar o stio. # Search Word Report Este relatrio lista que palavras as pessoas usaram nos motores de pesquisa para encontrar o stio. # Internal Search Query Report Este relatrio lista que pesquisas as pessoas usaram nos 'scripts' do stio. # Internal Search Word Report Este relatrio lista que palavras as pessoas usaram nos 'scripts' do stio. # Browser Summary Este relatrio lista os fabricantes dos navegadores dos visitantes. # Operating System Report Este relatrio lista os sistemas operativos usados pelos visitantes. # File Size Report Este relatrio lista os tamanhos dos ficheiros. # Status Code Report Este relatrio lista os cdigos de estado HTTP de todos os pedidos. # Processing Time Report Este relatrio lista os tempos gastos a processar os pedidos bem sucedidos. analog-6.0/lang/ptdom.tab0000644000175000017500000001173310161303541015471 0ustar sret1sret100000000000000ad 2 Andorra ae 3 Emirados rabes Unidos af 1 Afeganisto ag 2 Antgua e Barbuda ai 1 Anguilla al 1 Albnia am 2 Armnia an 1 Antilhas Holandesas ao 1 Angola aq 1 Antarctida ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 ustria au 3 Austrlia aw 1 Aruba az 1 Azerbaijo ba 3 Bsnia Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Blgica bf 1 Burkina Faso bg 2 Bulgria bh 1 Bahrain bi 1 Burundi bj 1 Benim bm 1 Bermuda bn 1 Brunei bo 3 Bolvia br 3 Brasil bs 1 Bahamas bt 1 Buto bv 1 Ilha Bouvet bw 1 Botswana by 1 Litunia bz 1 Belize ca 3 Canad cc 1 Ilhas Cocos (Keeling) cd 1 Congo cf 1 Repblica Centro-Africana cg 1 Congo ch 2 Sua ci 1 Costa do Marfim ck 1 Ilhas Cook cl 2 Chile cm 1 Camares cn 3 China co 3 Colmbia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Cabo Verde cx 2 Ilha Christmas cy 3 Chipre cz 2 Repblica Theca de 2 Alemanha dj 1 Djibuti dk 2 Dinamarca dm 2 Dominica do 3 Repblica Dominicana dz 1 Arglia ec 3 Equador edu 2 Educacional ee 2 Estnia eg 3 Egito eh 1 Saara Oriental er 1 Eritreia es 2 Espanha et 1 Etipia fi 2 Finlndia fj 3 Fiji fk 1 Ilhas Malvinas (Falkland) fm 1 Estados Federados da Micronsia fo 1 Ilhas Faroe fr 2 Frana fx 1 Frana (Territrio Europeu) ga 1 Gabo gb 1 Gr-Bretanha gd 1 Granada ge 1 Gergia gf 1 Guiana Francesa gg 1 Ilha de Guernesey gh 3 Gana gi 1 Gibraltar gl 1 Gronelndia gm 1 Gmbia gn 1 Guin gov 2 Governo norte-americano gp 1 Ilha de Guadalupe gq 1 Guin Equatorial gr 2 Grcia gs 1 Ilhas de Gergia do Sul e Sandwich do Sul gt 3 Guatemala gu 1 Ilha de Guam gw 1 Guin-Bissau gy 1 Guiana (ex. Guiana Inglesa) hk 3 Hong Kong hm 1 Ilhas Heard e McDonald hn 2 Honduras hr 2 Crocia ht 1 Haiti hu 2 Hungria id 3 Indonsia ie 2 Irlanda il 3 Israel im 1 Ilha de Man in 3 ndia int 1 Internacional io 1 Territrio ndico-britnico iq 1 Iraque ir 1 Iro is 2 Islndia it 2 Itlia je 1 Ilha de Jersey jm 3 Jamaica jo 3 Jordnia jp 3 Japo ke 3 Qunia kg 1 Kyrgyzstan kh 1 Camboja ki 1 Kiribati km 1 Ilhas Comores kn 1 Ilhas Saint Kitts e Nevis kp 1 Coreia do Norte kr 3 Coreia do Sul kw 3 Kuwait ky 1 Ilhas Cayman kz 1 Cazaquisto la 1 Laos lb 3 Lbano lc 1 Ilha de Santa Lucia li 2 Liechtenstein lk 1 Sri-Lanka lr 1 Libria ls 1 Lesoto lt 2 Litunia lu 2 Luxemburgo lv 2 Letnia ly 1 Lbia ma 1 Marrocos mc 2 Principado de Mnaco md 1 Moldvia mg 1 Madagascar mh 1 Ilhas Marshall mil 2 Militar norte-americano mk 3 Macednia (Antiga Jugoslvia) ml 1 Mali mm 1 Myanmar mn 1 Monglia mo 1 Macau mp 1 Ilhas Marianas do Norte mq 1 Martinica mr 1 Mauritnia ms 1 Montserrat mt 3 Malta mu 1 Ilhas Maurcias mv 1 Ilhas Maldivas mw 1 Malaui mx 3 Mxico my 3 Malsia mz 1 Moambique na 1 Nambia nc 1 Nova Calednia ne 1 Nger net 2 Redes nf 1 Ilha Norfolk ng 1 Nigria ni 3 Nicargua nl 2 Holanda no 2 Noruega np 1 Nepal nr 1 Nauru nu 2 Niue (Polinsia) nz 3 Nova Zelndia om 1 Om org 2 Organizaes no-governamentais pa 3 Panam pe 3 Peru pf 1 Polinsia Francesa pg 3 Papua Nova Guin ph 3 Filipinas pk 3 Paquisto pl 3 Polnia pm 1 Ilhas Saint Pierre e Miquelon pn 1 Ilha Pitcairn pr 1 Porto Rico ps 3 Palestina pt 2 Portugal pw 1 Palau py 3 Paraguai qa 1 Qatar re 1 Ilhas Reunio ro 2 Romnia ru 2 Rssia rw 1 Ruanda sa 3 Arbia Saudita sb 1 Ilhas Salomo sc 1 Ilhas Seychelles sd 1 Sudo se 2 Sucia sg 3 Singapura sh 1 Ilha de Santa Helena si 2 Eslovnia sj 1 Ilhas Svalbard e Jan Mayen sk 2 Eslovquia sl 1 Serra Leoa sm 1 Principado de San Marino sn 1 Senegal so 1 Somlia sr 1 Suriname st 1 So Tom e Prncipe su 2 Antiga Unio Sovitica sv 3 El Salvador sy 1 Sria sz 1 Suazilndia tc 1 Ilhas Turks e Caicos td 1 Chade tf 1 Territrios Franceses do Ultramar tg 1 Togo th 3 Tailndia tj 1 Tadjiquisto tk 1 Ilha Tokelau tl 1 Timor Leste tm 1 Turquemenisto tn 1 Tunsia to 1 Tonga tp 1 Timor Leste tr 3 Turquia tt 3 Trinidade e Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanznia ua 3 Ucrnia ug 3 Uganda uk 3 Reino Unido um 1 Territrios americanos do ultramar us 4 Estados Unidos da Amrica uy 3 Uruguai uz 1 Uzbequisto va 1 Cidade do Vaticano vc 1 Ilhas de Saint Vincent e Grenadines ve 3 Venezuela vg 1 Ilhas Virgens Britnicas vi 1 Ilhas Virgens vn 1 Vietname vu 1 Vanuatu wf 1 Ilhas Wallis e Fortuna ws 1 Samoa ye 1 Imen yt 1 Ilha Mayotte yu 3 Jugoslvia za 3 frica do Sul zm 1 Zmbia zr 1 Repblica Democrtica do Congo zw 3 Zimbabu analog-6.0/lang/ro.lng0000644000175000017500000003172010161303541014776 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. Dum Lun Mar Mie Joi Vin Sam Ian Feb Mar Apr Mai Iun Iul Aug Sep Oct Noi Dec ## Next some standard common words. ## Abbreviation for "week beginning" sapt incepind cu ++year++ ## Quarter of a year ++quarter++ luna zi zile ora minut minute secunda seconde bit biti ## ?bytes represents kbytes, Mbytes etc. ++?bytes++ cerere cereri data ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 data ora ++time++ data initiala ora initiala ultima data ultima ora fisier fisiere host host-uri host virtual host-uri virtuale director directoare domeniu domenii organizatie organizatii extensie extensii URL URL-uri browser browsere SO SO-uri ## (= operating system, operating systems) marime termen cautare termeni cautare site site-uri utilizator utilizatori cod status coduri status Statistica pentru ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sumar General ## The time reports, plus "busiest" strings (at the bottom of each report) ++Yearly Report++ ++Busiest year:++ ++Quarterly Report++ ++Busiest quarter:++ Raport Lunar Luna de virf: Raport Saptaminal Saptaina de virf: incepind cu Sumar Zilnic Raport Zilnic Ziua ce mai aglomerata: Raport Orar Sumar Orar ++Hour of the Week Summary++ Ora de virf: Raport la un sfert de ora ++Quarter-Hour Summary++ Perioada de virf: Raport la 5 minute ++Five-Minute Summary++ Perioada de virf: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Raport Host-uri host host-uri n ++Host Redirection Report++ ++host++ ++hosts++ ++n++ ++Host Failure Report++ ++host++ ++hosts++ ++n++ Raport Directoare director directoare n Raport pe Tipuri de Fisiere extensie extensii n Raport Cereri fisier fisiere n Raport Redirectionari fisier filsiere n Raport Erori fisier fisiere n Raport Refererinte referinta la URL referinta la URL-uri n Raport Referinte la Sit-uri referinta la sit referinte la sit-uri n Raport Referinte Redirectionate URL referinta URL-uri referinta n Raport Erori Referinte URL referinta URL-uri referinta n Raport Cautari cautare cautari n Raport Cautari Cuvinte cautare cuvinte cautari cuvinte n ++Internal Search Query Report++ ++query++ ++queries++ ++n++ ++Internal Search Word Report++ ++query word++ ++query words++ ++n++ Raport Host Virtual host virtual host-uri virtuale n ++Virtual Host Redirection Report++ ++virtual host++ ++virtual hosts++ ++n++ ++Virtual Host Failure Report++ ++virtual host++ ++virtual hosts++ ++n++ Raport Utilizatori utilizator utilizatori n ++User Redirection Report++ ++user++ ++users++ ++n++ Raport Erori Utilizator utilizator utilizatori n Sumar Browser browser browsere n Raport Browser browser browsere n Raport Sisteme de Operare sistem de operare sisteme de operare n Raport Domeniu domeniu domenii n Raport Organizatii organizatie organizatii n Raport Cod Status cod status coduri status n Raport Timp de Procesare Raport Marimi Fisiere ## Used at the bottom of the report Aceasta analiza a fost efectuata cu Timp de rulare Sub 1 ## Used in the time reports Fiecare unitate reprezinta parti de cerere pentru o pagina cereri de pagini ## Used at the bottom of each non-time report: need m, f & n genders ne-listat ne-listat ne-listat ## Used on the pie charts: again need m, f & n genders ++*++ ++*++ ++Other++ ## Used at the top of the report Program pornit la Analiza ceruta de la la ## Used in the General Summary Cereri satisfacute Media cererilor satisfacute zilnic Creri de pagina satisfacute Media cererilor de pagini satisfacute zilnic Linii din log fara coduri status Cereri esuatee Cereri redirectionate Cereri cu cod status informational Fisiere distincte cerute Servere distincte servite Linii de log corupte Intrari nedorite in log Date transferate Media transferurilor zilnice Cifrele din paranteze se refera la 7 zile pin la ultimele 7 zile Vezi: Inceput ## Some special phrases for particular reports. [adrese numerice nerezolvate] [domeniu negasit] [domeniu necunoscut] [director de baza] [fara director] [fara extensie] [directoare] Windows necunoscut Unix necunoscut ++Robots++ SO necunoscut ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #cer. ++7-day reqs++ %cer. ++%7-day reqs++ #pagini ++7-day pages++ %pagini ++%7-day pages++ bytes ++?bytes++ ++7-day bytes++ ++7-day ?bytes++ %bytes ++%7-day bytes++ nr. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Lista primelor %s * * Lista primelor %d %s * * Lista %s ## "by" in the phrase "listing the top 3 files BY number of requests" dupa ## All requests WITH AT LEAST 10 requests cu cel putin ## Different ways of doing floors ++request in the last 7 days++ ++requests in the last 7 days++ ++request for a page in the last 7 days++ ++requests for pages in the last 7 days++ cerere redirectionata cereri redirectionate ++redirected request in the last 7 days++ ++redirected requests in the last 7 days++ cerere esuata cereri esuate ++failed request in the last 7 days++ ++failed requests in the last 7 days++ % trafic ++% of the traffic in the last 7 days++ % trafic maxim ++% of the maximum amount of traffic in the last 7 days++ ++byte of traffic++ biti trafic ## ?bytes represents kbytes, Mbytes etc. ++?bytes of traffic++ ++byte of traffic in the last 7 days++ ++bytes of traffic in the last 7 days++ ++?bytes of traffic in the last 7 days++ cerute din cu cereri redirectate din cu cereri esuate din ++with first request since++ ++with first redirected request since++ ++with first failed request since++ ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortate dupa ## Used at the top of each report ++This report contains data from++ ## Used in pie charts ++The wedges are plotted by++ ## different ways of sorting trafic ++the amount of traffic in the last 7 days++ % de cereri ++% of the requests in the last 7 days++ % nr. maxim de cereri ++% of the maximum number of requests in the last 7 days++ numarul de cereri ++the number of requests in the last 7 days++ % de cereri pagini ++% of the requests for pages in the last 7 days++ % maxim de cereri de pagini ++% of the maximum number of requests for pages in the last 7 days++ numar de cereri de pagini ++the number of requests for pages in the last 7 days++ % de cereri redirectionate ++% of the redirected requests in the last 7 days++ % maxim de cereri redirectionate ++% of the maximum number of redirected requests in the last 7 days++ numar de cereri redirectionate ++the number of redirected requests in the last 7 days++ % de cereri nesatisfacute ++% of the failed requests in the last 7 days++ % maxim de cereri nesatisfacute ++% of the maximum number of failed requests in the last 7 days++ numar de cereri nesatisfacute ++the number of failed requests in the last 7 days++ ora ultimei cereri ora ultimei cereri redirectionate ora ultimei cereri esuate ++the time of the first request++ ++the time of the first redirected request++ ++the time of the first failed request++ ## 3 other ways of sorting in m, f, & n * * sortate alfabetic * * sortate numeric * * nesortate ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. ++,++ ++.++ ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. ++am++ ++pm++ ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d-%m-%Y %h:%n ## "Program started at" and "Analysed requests from" %d-%m-%Y %h:%n ## In Daily Report %d-%m-%y ## In Daily Summary ++%w++ ## In Hourly Report %d-%m-%y %h:%n%x%i:%o ## In Hourly Summary ++%h++ ## In Hour of the Week Summary ++%w %H:%n%x%I:%o++ ## In Quarter-Hour and Five-Minute Reports %d-%m-%y %h:%n%x%i:%o ## In Quarter-Hour and Five-Minute Summaries ++%H:%n%x%I:%o++ ## In Weekly Report %d-%m-%y ## In Monthly Report %m-%Y ## In Quarterly Report ++%m%x%l %Y++ ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report ++%Y++ ## The date (d) column in non-time reports %d-%m-%y ## The date & time (D) column in non-time reports %d-%m-%y %h:%n ## In non-time reports: "including all files with requests since [date]" %d-%m-%y la %h:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continua cu cererea 101 Schimb protocoalele 1xx [Informatii diverse] 200 OK 201 Creat 202 Acceptat pt. procesare ulterioara 203 Informatie Non-authoritativa 204 OK, dar nimic de trimis 205 Reset document 206 Continut partial 2xx [Diverse succese] 300 Documente multiple disponibile 301 Document mutat permanent 302 Document gasit in alta parte 303 Vezi alt document 304 Nemodificat de la ultima cerere 305 Filoseste proxy 306 Schimba proxy 307 Document motat temporar 3xx [Diverse redirectari] 400 Cerere gresita 401 Authentificare necesara 402 Plata necesara 403 Access interzis 404 Documentul nu a fost gasit 405 Metoda neacceptata 406 Document inacceptabil pt. client 407 Autentificare Proxy necesara 408 Timeout cerere 409 Cererea este in conflict cu statusul resurselor 410 Documentul sters definitiv 411 Lungime necesara 412 Preconditie esuata 413 Cerere prea lunga 414 Nume fisier solicitat prea lung 415 Tip media nesuportat 416 Domeniu cerut nu e valid 417 Asteptare esuata 4xx [Diverse erori client/utilizator] 500 Eroare Interna a Serverului 501 Tip de cerere nesuportata 502 Eroare la serverul amonte 503 Serviciu indisponibil temporar 504 Gateway timeout 505 Versiune HTTP version ne-suportata 506 Redirectare esuata 5xx [Diverse erori ale Serverului] xxx [Necunoscut] analog-6.0/lang/rodom.tab0000644000175000017500000001140210161303541015457 0ustar sret1sret100000000000000ad 2 Andora ae 3 Emiratele Arabe Unite af 1 Afganistan ag 2 Antigua si Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Antilele Olandeze ao 1 Angola aq 1 Antarctica ar 3 Argentina arpa 1 Arpanet as 1 Samoa Americana at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaidjan ba 3 Bosnia-Hetegovina bb 2 Barbados bd 1 Bangladej be 3 Belgia bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazila bs 1 Bahama bt 1 Bhutan bv 1 Insula Bouvet bw 1 Botswana by 1 Bielorusia bz 1 Belize ca 3 Canada cc 1 Insulele Cocos (Keeling) cd 1 Republica Democrata Congo cf 1 Republica Centr-Africana cg 1 Congo ch 2 Elvetia ci 1 Coasta de Fildes (Cote d'Ivoire) ck 1 Insulele Cook cl 2 Chile cm 1 Camerun cn 3 China co 3 Columbia com 2 Comercial cr 3 Costa Rica cu 2 Cuba cv 1 Capul Verde cx 2 Insula Christmas cy 3 Cipru cz 2 Republica Ceha de 2 Germania dj 1 Djibouti dk 2 Danemarca dm 2 Dominica do 3 Republica Dominicana dz 1 Algeria ec 3 Ecuador edu 2 Educational ee 2 Estonia eg 3 Egipt eh 1 Sahara Vestica er 1 Eritrea es 2 Spania et 1 Etiopia fi 2 Finlanda fj 3 Fiji fk 1 Insulele Falkland fm 1 Micronesia fo 1 Insulele Faroe fr 2 Franta fx 1 Franta (Europa) ga 1 Gabon gb 1 Marea Britanie gd 1 Grenada ge 1 Georgia gf 1 Guiana Franceza gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenlanda gm 1 Gambia gn 1 Guinea gov 2 Guvern gp 1 Guadelupa (France) gq 1 Guinea Ecuatoriala gr 2 Grecia gs 1 Insulele S. Georgia si S. Sandwich gt 3 Guatemala gu 1 Guam (USA) gw 1 Guinea Bissau gy 1 Guiana hk 3 Hong Kong hm 1 Insulele Heard and McDonald hn 2 Honduras hr 2 Croatia ht 1 Haiti hu 2 Ungaria id 3 Indonezia ie 2 Irlanda il 3 Israel im 1 Isle of Man in 3 India int 1 International io 1 British Indian Ocean iq 1 Iraq ir 1 Iran is 2 Islanda it 2 Italia je 1 Jersey jm 3 Jamaica jo 3 Iordania jp 3 Japonia ke 3 Kenya kg 1 Kirgizstan kh 1 Cambogia ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts & Nevis kp 1 Corea de Nord kr 3 Corea de Sud kw 3 Kuweit ky 1 Insulele Cayman kz 1 Kazakstan la 1 Laos lb 3 Liban lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lituania lu 2 Luxemburg lv 2 Lituania ly 1 Libia ma 1 Maroc mc 2 Monaco md 1 Moldova mg 1 Madagascar mh 1 Insulele Marshall mil 2 Militar mk 3 Macedonia ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Insulele Northern Mariana mq 1 Martinica (Franceza) mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldive mw 1 Malawi mx 3 Mexic my 3 Malaezia mz 1 Mozambic na 1 Namibia nc 1 Noua Caledonie (Franceza) ne 1 Niger net 2 Network nf 1 Insula Norfolk ng 1 Nigeria ni 3 Nicaragua nl 2 Olanda no 2 Norvegia np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Noua Zeelanda om 1 Oman org 2 Organizatii Non-Profit pa 3 Panama pe 3 Peru pf 1 Polinezia (Franceza) pg 3 Papua Noua Guinee ph 3 Filipine pk 3 Pakistan pl 3 Polonia pm 1 Saint Pierre and Miquelon pn 1 Insula Pitcairn pr 1 Porto Rico pt 2 Portugalia pw 1 Palau py 3 Paraguai qa 1 Qatar re 1 Reunion (Franceza) ro 2 Romania ru 2 Rusia rw 1 Rwanda sa 3 Arabia Saudita sb 1 Insulele Solomon sc 1 Seichele sd 1 Sudan se 2 Suedia sg 3 Singapore sh 1 Saint Helena si 2 Slovenia sj 1 Insulele Svalbard and Jan Mayen sk 2 Republica Slovaca sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Saint Tome and Principe su 2 Fosta URSS sv 3 El Salvador sy 1 Siria sz 1 Swaziland tc 1 Insulele Turks and Caicos td 1 Ciad tf 1 Teritoriile Franceze de Sud tg 1 Togo th 3 Tailanda tj 1 Tadjikistan tk 1 Tokelau tl 1 Timor de Est tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 Timor de Est tr 3 Turcia tt 3 Trinidad and Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Marea Britanie um 1 Insule minore SUA us 4 Statele Unite uy 3 Uruguai uz 1 Uzbekistan va 1 Vatican vc 1 Saint Vincent & Grenadines ve 3 Venezuela vg 1 Insulele Virgin (Britanice) vi 1 Insulele Virgin (SUA) vn 1 Vietnam vu 1 Vanuatu wf 1 Insulele Wallis si Futuna ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Iugoslavia za 3 Africa de Sud zm 1 Zambia zr 1 Republica Democrata Congo zw 3 Zimbabue analog-6.0/lang/ru.lng0000644000175000017500000003302310161303541015002 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Russification made by Boris Litvinenko ## weber@vips.icn.gov.ru http://www-vips.icn.gov.ru ## ## Updates to version 5 and corrects by Denis Zhukov at 26/03/2002 ## mailto: sav@iclub.nsu.ru ## ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP KOI8-R ## Abbreviations for the day and month names. . . . . . . . ## Next some standard common words. ## Abbreviation for "week beginning" ## Quarter of a year ## ?bytes represents kbytes, Mbytes etc. ? ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 URL URL OS's ## (= operating system, operating systems) ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. ## Shorter versions of the same prefixes for column headings ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ## The time reports, plus "busiest" strings (at the bottom of each report) : : : : : 15- 15- 15 . : 5- 5- 5 . : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! n n n n n n n n URL URL n n URL URL n URL URLs n n n n ( ) n n ( ) n ( ) n n n n () n () n n n n n ## Used at the bottom of the report 1 ## Used in the time reports ## Used at the bottom of each non-time report: need m, f & n genders ## Used on the pie charts: again need m, f & n genders * * ## Used at the top of the report ## Used in the General Summary . . , logfile . - 7 7 ## Some special phrases for particular reports. [ IP-] [ ] [ ] [ ] [ ] [ ] [] Windows- Unix- ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) (7) % % (7 ) (7 ) % % (7 ) ? 7 ? 7 % % 7 N ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s * * %d %s * * %s ## "by" in the phrase "listing the top 3 files BY number of requests" - ## All requests WITH AT LEAST 10 requests , ## Different ways of doing floors 7 7 7 7 7 7 7 7 % % 7 % . % . 7 ## ?bytes represents kbytes, Mbytes etc. ? 7 7 ? 7 ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ## Used at the top of each report ## Used in pie charts ## different ways of sorting 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 ## 3 other ways of sorting in m, f, & n * * * * * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %H:%n ## "Program started at" and "Analysed requests from" %w %d %m %Y %H:%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [ ] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/ru1.lng0000644000175000017500000003312710161303541015070 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Russification made by Boris Litvinenko ## weber@vips.icn.gov.ru http://www-vips.icn.gov.ru ## ## Updates to version 5 and corrects by Denis Zhukov at 26/03/2002 ## mailto: sav@iclub.nsu.ru ## This language file is in cp1251 (M$ Windows cyrillic) charset. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1251 ## Abbreviations for the day and month names. . . . . . . . ## Next some standard common words. ## Abbreviation for "week beginning" ## Quarter of a year ## ?bytes represents kbytes, Mbytes etc. ? ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 URL URL OS's ## (= operating system, operating systems) ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. ## Shorter versions of the same prefixes for column headings ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports ## The time reports, plus "busiest" strings (at the bottom of each report) : : : : : 15- 15- 15 . : 5- 5- 5 . : ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! n n n n n n n n URL URL n n URL URL n URL URLs n n n n ( ) n n ( ) n ( ) n n n n () n () n n n n n ## Used at the bottom of the report 1 ## Used in the time reports ## Used at the bottom of each non-time report: need m, f & n genders ## Used on the pie charts: again need m, f & n genders * * ## Used at the top of the report ## Used in the General Summary . . , logfile . - 7 7 ## Some special phrases for particular reports. [ IP-] [ ] [ ] [ ] [ ] [ ] [] Windows- Unix- ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) (7) % % (7 ) (7 ) % % (7 ) ? 7 ? 7 % % 7 N ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s * * %d %s * * %s ## "by" in the phrase "listing the top 3 files BY number of requests" - ## All requests WITH AT LEAST 10 requests , ## Different ways of doing floors 7 7 7 7 7 7 7 7 % % 7 % . % . 7 ## ?bytes represents kbytes, Mbytes etc. ? 7 7 ? 7 ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ## Used at the top of each report ## Used in pie charts ## different ways of sorting 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 ## 3 other ways of sorting in m, f, & n * * * * * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %H:%n ## "Program started at" and "Analysed requests from" %w %d %m %Y %H:%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [ ] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/ru1desc.txt0000644000175000017500000001053710161303541015766 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # Russian translation made by Denis Zhukov at 26/03/2002 # mailto: sav@iclub.nsu.ru # This language file is in cp1251 (M$ Windows cyrillic) charset. # # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # # # # # Yearly Report . # Quarterly Report . # Monthly Report . # Weekly Report . # Daily Report . # Hourly Report . # Quarter-Hour Report 15 . # Five-Minute Report 5 . # Daily Summary , , . # Hourly Summary , , . # Hour of the Week Summary , , . # Quarter-Hour Summary 15 , , . # Five-Minute Summary 5 , , . # General Summary . # Request Report . # Redirection Report , . # Failure Report , , , , . # File Type Report . # Directory Report , . # Host Report , . # Host Redirection Report , . # Host Failure Report , . # Domain Report (), . # Referrer Report , . # Referring Site Report , . # Redirected Referrer Report , . # Failed Referrer Report , . # Browser Report , . # Virtual Host Report . # Virtual Host Redirection Report . # Virtual Host Failure Report . # User Report , , . # User Redirection Report , . # User Failure Report , . # Organisation Report , . # Search Query Report , , . # Search Word Report , , . # Internal Search Query Report , . # Internal Search Word Report , . # Browser Summary , . # Operating System Report , . # File Size Report . # Status Code Report HTTP . # Processing Time Report , .analog-6.0/lang/ru1dom.tab0000644000175000017500000001304010161303541015546 0ustar sret1sret100000000000000## This version of Domains for Analog on Russian has ## translated Nikitich (nikitich@yahoo.com). ## The given text is submitted in the codepage ## KOI8-R. Good luck. ## ## Updates and corrects by Denis Zhukov at 26/03/2002 ## mailto: sav@iclub.nsu.ru ## This language file is in cp1251 (M$ Windows cyrillic) charset. ## ## aero 2 arpa 1 biz 2 com 2 coop 2 edu 2 gov 2 info 2 int 2 International Treaty Organizations mil 2 museum 2 name 2 net 2 , org 2 pro 3 ac 1 Ascension Island ad 2 ae 3 () af 1 ag 2 ai 1 al 1 am 2 an 1 () ao 1 aq 1 ar 3 arpa 1 Arpanet ( ) as 1 at 3 au 3 aw 1 az 1 ba 3 - bb 2 bd 1 be 3 bf 1 - bg 2 bh 1 bi 1 bj 1 bm 1 bn 1 bo 3 br 3 bs 1 bt 1 bv 1 bw 1 by 1 bz 1 ca 3 cc 1 cd 1 cf 1 cg 1 ch 2 ci 1 -- ck 1 cl 2 cm 1 cn 3 co 3 com 2 cr 3 - cu 2 cv 1 - cx 2 cy 3 cz 2 de 2 dj 1 dk 2 dm 2 do 3 dz 1 ec 3 edu 2 ee 2 eg 3 eh 1 er 1 es 2 et 1 fi 2 fj 3 fk 1 fm 1 fo 1 fr 2 fx 1 ( ) ga 1 gb 1 gd 1 ge 1 gf 1 gg 1 gh 3 gi 1 gl 1 gm 1 gn 1 gov 2 gp 1 () gq 1 gr 2 gs 1 gt 3 gu 1 () gw 1 - gy 1 hk 3 hm 1 hn 2 hr 2 ht 1 hu 2 id 3 ie 2 il 3 im 1 in 3 int 1 io 1 iq 1 ir 1 is 2 it 2 je 1 jm 3 jo 3 jp 3 ke 3 kg 1 kh 1 ki 1 km 1 kn 1 - kp 1 kr 3 kw 3 ky 1 kz 1 la 1 lb 3 lc 1 - li 2 lk 1 - lr 1 ls 1 lt 2 lu 2 lv 2 ly 1 ma 1 mc 2 md 1 mg 1 mh 1 mil 2 mk 3 ml 1 mm 1 mn 1 mo 1 mp 1 mq 1 () mr 1 ms 1 mt 3 mu 1 mv 1 mw 1 mx 3 my 3 mz 1 na 1 nc 1 () ne 1 net 2 nf 1 ng 1 ni 3 nl 2 no 2 np 1 nr 1 nu 2 nz 3 om 1 org 2 pa 3 pe 3 pf 1 pg 3 - ph 3 pk 3 pl 3 pm 1 - pn 1 pr 1 - pt 2 pw 1 py 3 qa 1 re 1 ro 2 ru 2 rw 1 sa 3 sb 1 sc 1 sd 1 se 2 sg 3 sh 1 si 2 sj 1 sk 2 sl 1 - sm 1 - sn 1 so 1 sr 1 st 1 - su 2 sv 3 sy 1 sz 1 tc 1 td 1 tf 1 tg 1 th 3 tj 1 tk 1 tl 1 tm 1 tn 1 to 1 tp 1 tr 3 tt 3 tv 1 tw 3 tz 1 ua 3 ug 3 uk 3 um 1 USA Minor Outlying us 4 uy 3 uz 1 va 1 vc 1 - ve 3 vg 1 () vi 1 () vn 1 vu 1 wf 1 ws 1 ye 1 yt 1 yu 3 za 3 - zm 1 zr 1 zw 3 analog-6.0/lang/rudesc.txt0000644000175000017500000001043310161303541015700 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # Russian translation made by Denis Zhukov at 26/03/2002 # mailto: sav@iclub.nsu.ru # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # # # # # Yearly Report . # Quarterly Report . # Monthly Report . # Weekly Report . # Daily Report . # Hourly Report . # Quarter-Hour Report 15 . # Five-Minute Report 5 . # Daily Summary , , . # Hourly Summary , , . # Hour of the Week Summary , , . # Quarter-Hour Summary 15 , , . # Five-Minute Summary 5 , , . # General Summary . # Request Report . # Redirection Report , . # Failure Report , , , , . # File Type Report . # Directory Report , . # Host Report , . # Host Redirection Report , . # Host Failure Report , . # Domain Report (), . # Referrer Report , . # Referring Site Report , . # Redirected Referrer Report , . # Failed Referrer Report , . # Browser Report , . # Virtual Host Report . # Virtual Host Redirection Report . # Virtual Host Failure Report . # User Report , , . # User Redirection Report , . # User Failure Report , . # Organisation Report , . # Search Query Report , , . # Search Word Report , , . # Internal Search Query Report , . # Internal Search Word Report , . # Browser Summary , . # Operating System Report , . # File Size Report . # Status Code Report HTTP . # Processing Time Report , .analog-6.0/lang/rudom.tab0000644000175000017500000001273510161303541015477 0ustar sret1sret100000000000000## This version of Domains for Analog on Russian has ## translated Nikitich (nikitich@yahoo.com). ## The given text is submitted in the codepage ## KOI8-R. Good luck. ## ## Updates and corrects by Denis Zhukov at 26/03/2002 ## mailto: sav@iclub.nsu.ru ## ## aero 2 arpa 1 biz 2 com 2 coop 2 edu 2 gov 2 info 2 int 2 International Treaty Organizations mil 2 museum 2 name 2 net 2 , org 2 pro 3 ac 1 Ascension Island ad 2 ae 3 () af 1 ag 2 ai 1 al 1 am 2 an 1 () ao 1 aq 1 ar 3 arpa 1 Arpanet ( ) as 1 at 3 au 3 aw 1 az 1 ba 3 - bb 2 bd 1 be 3 bf 1 - bg 2 bh 1 bi 1 bj 1 bm 1 bn 1 bo 3 br 3 bs 1 bt 1 bv 1 bw 1 by 1 bz 1 ca 3 cc 1 cd 1 cf 1 cg 1 ch 2 ci 1 -- ck 1 cl 2 cm 1 cn 3 co 3 com 2 cr 3 - cu 2 cv 1 - cx 2 cy 3 cz 2 de 2 dj 1 dk 2 dm 2 do 3 dz 1 ec 3 edu 2 ee 2 eg 3 eh 1 er 1 es 2 et 1 fi 2 fj 3 fk 1 fm 1 fo 1 fr 2 fx 1 ( ) ga 1 gb 1 gd 1 ge 1 gf 1 gg 1 gh 3 gi 1 gl 1 gm 1 gn 1 gov 2 gp 1 () gq 1 gr 2 gs 1 gt 3 gu 1 () gw 1 - gy 1 hk 3 hm 1 hn 2 hr 2 ht 1 hu 2 id 3 ie 2 il 3 im 1 in 3 int 1 io 1 iq 1 ir 1 is 2 it 2 je 1 jm 3 jo 3 jp 3 ke 3 kg 1 kh 1 ki 1 km 1 kn 1 - kp 1 kr 3 kw 3 ky 1 kz 1 la 1 lb 3 lc 1 - li 2 lk 1 - lr 1 ls 1 lt 2 lu 2 lv 2 ly 1 ma 1 mc 2 md 1 mg 1 mh 1 mil 2 mk 3 ml 1 mm 1 mn 1 mo 1 mp 1 mq 1 () mr 1 ms 1 mt 3 mu 1 mv 1 mw 1 mx 3 my 3 mz 1 na 1 nc 1 () ne 1 net 2 nf 1 ng 1 ni 3 nl 2 no 2 np 1 nr 1 nu 2 nz 3 om 1 org 2 pa 3 pe 3 pf 1 pg 3 - ph 3 pk 3 pl 3 pm 1 - pn 1 pr 1 - pt 2 pw 1 py 3 qa 1 re 1 ro 2 ru 2 rw 1 sa 3 sb 1 sc 1 sd 1 se 2 sg 3 sh 1 si 2 sj 1 sk 2 sl 1 - sm 1 - sn 1 so 1 sr 1 st 1 - su 2 sv 3 sy 1 sz 1 tc 1 td 1 tf 1 tg 1 th 3 tj 1 tk 1 tl 1 tm 1 tn 1 to 1 tp 1 tr 3 tt 3 tv 1 tw 3 tz 1 ua 3 ug 3 uk 3 um 1 USA Minor Outlying us 4 uy 3 uz 1 va 1 vc 1 - ve 3 vg 1 () vi 1 () vn 1 vu 1 wf 1 ws 1 ye 1 yt 1 yu 3 za 3 - zm 1 zr 1 zw 3 analog-6.0/lang/ruform.html0000644000175000017500000002076010161303541016056 0ustar sret1sret100000000000000 Analog

Analog


1. ޣ

! , , , . ruform.html .
. analog .

?


[.] [.]
[.] [.] ޣ
[.] [.] ޣ
[.] [.]
[.] [.]
[.] [.]
[.] [.] ޣ
[.] [.] ޣ
[.] [.] ޣ
[.] [.] ޣ
[.] [.] ޣ
[.] [.]
[.] [.] ޣ
[.] [.]
[.] [.]
[.] [.]
[.] [.]
[.] [.] ޣ

:
, ޣ , .
. , ( . ) 10 MB; ( ) .


2. ޣ

ޣ

ޣ
, :

ޣ


, :

ޣ

ޣ
:

ޣ

ޣ
, :

ޣ

ޣ
, :

3.

, yymmdd; , 011020 20 2001 . , ( ) .
From to


-, ̣ . - * .

, .


4. ޣ

(),


URL:


analog-6.0/lang/se.lng0000644000175000017500000003122010161303541014760 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Svensk version av www.imc-ab.com ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. S M Ti On To Fr L Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" veckostart r ## Quarter of a year kvartal mnad dag dagar tim minut minuter sekund sekunder byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes anrop anrop datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum tid tid startdatum starttid senaste datum senaste gngen fil filer domn domner virtuell domn virtuella domner katalog kataloger domn domner organisation organisationer filtyp filtyper URL URLer webbklient webbklienter OS OS ## (= operating system, operating systems) storlek skord skord sajt sajter anvndare anvndare statuskod statuskoder Webserverstatistik fr ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Allmnt ## The time reports, plus "busiest" strings (at the bottom of each report) rsrapport Intensivaste r: Kvartalsrapport Intensivaste kvartal: Mnadsrapport Intensivaste mnad: Veckorapport Intensivaste vecka: vecka brjar Daglig summering Daglig rapport Bsta dag: Timrapport Timsummering Summering, veckotimme Intensivaste timma: Kvartsrapport Summering, kvartar Intensivaste kvart: Femminutsrapport Femminutssummering Intensivaste fem minuter: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Domnrapport domn domner n Omdirigeringsrapport, vrdar vrd vrdar n Felrapport, vrdar vrd vrdar n Katalograpport katalog kataloger n Filtypsrapport filtyp filtyper n Anropsrapport fil filer n Omdirigeringsrapport fil filer n Felrapport fil filer n Referensrapport refererande URL refererande URLer n Refererande Sajt-rapport refererande sajt refererande sajter n Omdirigerad Referens-rapport referring URL referring URLs n Felaktig Referens-rapport referring URL referring URLs n Skrapport skbegrepp skbegrepp n Skordsrapport skord skord n Intern skrapport frfrgan frfrgningar n Intern skordsrapport skord skord n Virtuell domnrapport virtuell domn virtuella domner n Omdirigeringsrapport, virtuella vrdar virtuell vrd virtuella vrdar n Felrapport, virtuella vrdar virtuell vrd virtuella vrdar n Anvndarrapport anvndare anvndare n Omdirigeringsrapport, anvndare anvndare anvndare n Felande anvndare-rapport anvndare anvndare n Webbklientsummering webbklient webbklienter n Webbklientrapport webbklient webbklienter n Operativsystemsrapport operativsystem operativsystem n Toppdomnsrapport toppdomn toppdomner n Organisationsrapport organisation organisationer n Statuskodrapport statuskod statuskoder n Exekveringstidsrapport Filstorleksrapport ## Used at the bottom of the report Analysen gjord av Exekveringstid Mindre n 1 ## Used in the time reports Varje enhet representerar eller del av access till en sida accesser till sidor ## Used at the bottom of each non-time report: need m, f & n genders inte listade inte listade inte listade ## Used on the pie charts: again need m, f & n genders Andra Andra Andra ## Used at the top of the report Programmet startade Analyserade accesser frn till ## Used in the General Summary Serveranrop Medeltal serveranrop per dag Serveranrop till sidor Medeltal serveranrop till sidor per dag Logfilsrader utan statuskod Felaktiga serveranrop Omdirigerade serveranrop serveranrop med infostatuskod Distinkta filer accessade Distinkta domner servade Fel i rader ur loggfilen Felande loggfilsrader Data skickade Medeltal data skickade per dag Data inom parentes visar 7 dagar till senaste 7 dagarna G till Topp ## Some special phrases for particular reports. [oupplsta numeriska adresser] [domn ej angiven] [oknd domn] [rootmapp] [saknar mapp] [saknar tillgg] [kataloger] Oknd Windows Annan Unix Robotar OS oknt ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #acc 7 dagar Anrop %acc %7 dagar Anrop sidor 7 dagar Sidor %sidor %7 dagar Sidor bytes ?bytes 7 dagar bytes 7 dagar ?bytes %bytes %7 dagar bytes antal ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listar de frsta %s * * Listar de frsta %d %s * * Listar %s ## "by" in the phrase "listing the top 3 files BY number of requests" efter ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors serveranrop de senaste 7 dagarna serveranrop de senaste 7 dagarna anrop till sida de senaste 7 dagarna anrop till sidor de senaste 7 dagarna Omdirigerat serveranrop Omdirigerade serveranrop omdirigerat serveranrop de senaste 7 dagarna omdirigerade serveranrop de senaste 7 dagarna felaktigt serveranrop felaktiga serveranrop felaktigt serveranrop de senaste 7 dagarna felaktiga serveranrop de senaste 7 dagarna % av trafiken % av trafiken de senaste 7 dagarna % av den maximala trafiken % av den maximala trafiken de senaste 7 dagarna byte, trafik bytes, trafik ## ?bytes represents kbytes, Mbytes etc. ?bytes, trafik byte, trafik de senaste 7 dagarna bytes, trafik de senaste 7 dagarna ?bytes, trafik de senaste 7 dagarna serveranrop sedan med ett omdirigerat serveranrop sedan med ett felaktigt serveranrop sedan med frsta serveranrop sedan med frsta omdirigerade serveranrop sedan med frsta felaktiga serveranrop sedan ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorterad efter ## Used at the top of each report Denna rapport innehller data frn ## Used in pie charts Plottat som ## different ways of sorting procent av antal bytes trafikmngden de senaste 7 dagarna % av serveranrop % av serveranrop de senaste 7 dagarna % av det maximala antalet anrop % av det maximala antalet anrop de senaste 7 dagarna antal serveranrop antal serveranrop de senaste 7 dagarna % av anrop till sidor % av anrop till sidor de senaste 7 dagarna % av det maximala antalet anrop till sidor % av det maximala antalet anrop till sidor de senaste 7 dagarna antal anrop till sidor antal anrop till sidor de senaste 7 dagarna % av omdirigerade anrop % av omdirigerade anrop de senaste 7 dagarna % av det maximala antalet omdirigerade anrop % av det maximala antalet omdirigerade anrop de senaste 7 dagarna antal omdirigerade anrop antal omdirigerade anrop de senaste 7 dagarna % av felaktiga anrop % av felaktiga anrop de senaste 7 dagarna % av det maximala antalet felaktiga anrop % av det maximala antalet felaktiga anrop de senaste 7 dagarna antal felaktiga anrop antal felaktiga anrop de senaste 7 dagarna senaste serveranrop senaste omdirigerade serveranrop senaste felaktiga serveranrop tidpunkt fr frsta anrop tidpunkt fr frsta omdirigerade serveranrop tidpunkt fr frsta felaktiga serveranrop ## 3 other ways of sorting in m, f, & n * * i alfabetisk ordning * * sorterat numeriskt * * ej sorterat ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y-%m-%D %H:%n ## "Program started at" and "Analysed requests from" %w %D %m %Y %H:%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:% ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %y klockan %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/se2.lng0000644000175000017500000003232710161303541015053 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Alternative Swedish translation by Christian Rose . ## (This translation aims to use fewer Anglicisms than the other Swedish ## translation.) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. sn mn tis ons tor fre lr jan feb mar apr maj jun jul aug sep okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" veckostart r ## Quarter of a year kvartal mnad dygn dygn timme minut minuter sekund sekunder byte byte ## ?bytes represents kbytes, Mbytes etc. ?byte begran begranden datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum tid tid startdatum starttid slutdatum sluttid fil filer vrd vrdar virtuell vrd virtuella vrdar katalog kataloger domn domner organisation organisationer filndelse filndelser URL URL:er webblsare webblsare operativsystem operativsystem ## (= operating system, operating systems) storlek skuttryck skuttryck webbplats webbplatser anvndare anvndare statuskod statuskoder Webbserverstatistik fr ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sammanfattning ## The time reports, plus "busiest" strings (at the bottom of each report) rsrapport Intensivaste ret: Kvartalsrapport Intensivaste kvartalet: Mnadsrapport Intensivaste mnaden: Veckorapport Intensivaste veckan: veckan som brjade Dygnssammanfattning Dygnsrapport Intensivaste dygnet: Timrapport Timsammanfattning Sammanfattning fr intensivaste timmen i veckan Intensivaste timmen: Kvartrapport Kvartsammanfattning Intensivaste kvarten: Femminutersrapport Femminuterssammanfattning Intensivaste fem minuterna: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Vrdrapport vrd vrdarna n Vrdomdirigeringsrapport vrd vrdarna n Vrdfelrapport vrd vrdarna n Katalograpport katalog katalogerna n Filtypsrapport filndelse filndelserna n Begransrapport fil filerna n Omdirigeringsrapport fil filerna n Felrapport fil filerna n Hnvisarrapport hnvisande URL hnvisande URL:erna n Rapport ver hnvisande webbplatser hnvisande webbplats hnvisande webbplatserna n Rapport ver omdirigerade hnvisningar hnvisande URL hnvisande URL:erna n Rapport ver misslyckade hnvisningar hnvisande URL hnvisande URL:erna n Skuttrycksrapport skuttryck skuttrycken n Skordsrapport skord skorden n Rapport ver interna skuttryck skuttryck skuttrycken n Rapport ver interna skord skord skorden n Rapport ver virtuella domner virtuell domn virtuella domnerna n Rapport ver omdirigering i virtuella domner virtuell domn virtuella domnerna n Rapport ver fel i virtuella domner virtuell vrd virtuella vrdarna n Anvndarrapport anvndare anvndarna n Anvndaromdirigeringsrapport anvndare anvndarna n Anvndarfelrapport anvndare anvndarna n Webblsarsammanfattning webblsare webblsarna n Webblsarrapport webblsare webblsarna n Operativsystemsrapport operativsystem operativsystemen n Domnrapport domn domnerna n Organisationsrapport organisation organisationerna n Statuskodsrapport statuskod statuskoderna n Exekveringstidsrapport Filstorleksrapport ## Used at the bottom of the report Denna analys gjordes av Exekveringstid Mindre n 1 ## Used in the time reports Varje enhet motsvarar eller del av begran av en sida begranden av sidor ## Used at the bottom of each non-time report: need m, f & n genders * * inte listade ## Used on the pie charts: again need m, f & n genders * * Annat ## Used at the top of the report Programmet startade Analyserade begranden frn till ## Used in the General Summary Lyckade begranden Medelantal lyckade begranden per dygn Lyckade begranden av sidor Medelantal lyckade begranden av sidor per dygn Loggfilsrader utan statuskod Misslyckade begranden Omdirigerade begranden Begranden med informativ statuskod Distinkta begrda filer Distinkta betjnade vrdar Felaktiga loggfilsrader Onskade loggfilsrader Skickad data Medeltal skickad data per dygn Data inom parantes r de 7 dygnen innan senaste 7 dygnen G till Brjan ## Some special phrases for particular reports. [ouppslagna numeriska adresser] [domn inte angiven] [oknd domn] [rotkatalog] [ingen katalog] [ingen filndelse] [kataloger] Oknt Windows Annat Unix Robotar Oknt operativsystem ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) beg 7-dygns beg %beg %7-dygns beg sidor 7-dygns sidor %sidor %7-dygns sidor byte ?byte 7-dygns byte 7-dygns ?byte %byte %7-dygns byte nr ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listar de versta %s * * Listar de versta %d %s * * Listar %s ## "by" in the phrase "listing the top 3 files BY number of requests" efter ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors begran de senaste 7 dygnen begranden de senaste 7 dygnen begran av en sida de senaste 7 dygnen begranden av sidor de senaste 7 dygnen omdirigerad begran omdirigerade begranden omdirigerad begran de senaste 7 dygnen omdirigerade begranden de senaste 7 dygnen misslyckad begran misslyckade begranden misslyckad begran de senaste 7 dygnen misslyckade begranden de senaste 7 dygnen % av trafiken % av trafiken de senaste 7 dygnen % av den strsta mngden trafik % av den strsta mngden trafik de senaste 7 dygnen byte trafik byte trafik ## ?bytes represents kbytes, Mbytes etc. ?byte trafik byte trafik de senaste 7 dygnen byte trafik de senaste 7 dygnen ?byte trafik de senaste 7 dygnen med en begran sedan med en omdirigerad begran sedan med en misslyckad begran sedan med frsta begran sedan med frsta omdirigerade begran sedan med frsta misslyckade begran sedan ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorterade efter ## Used at the top of each report Denna rapport innehller data frn ## Used in pie charts Trtbitarna ritas efter ## different ways of sorting mngden trafik mngden trafik de senaste 7 dygnen % av antalet begranden % av antalet begranden de senaste 7 dygnen % av det strsta antalet begranden % av det strsta antalet begranden de senaste 7 dygnen antalet begranden antalet begranden de senaste 7 dygnen % av antalet begranden av sidor % av antalet begranden av sidor de senaste 7 dygnen % av det strsta antalet begranden av sidor % av det strsta antalet begranden av sidor de senaste 7 dygnen antalet begranden av sidor antalet begranden av sidor de senaste 7 dygnen % av antalet omdirigerade begranden % av antalet omdirigerade begranden de senaste 7 dygnen % av det strsta antalet omdirigerade begranden % av det strsta antalet omdirigerade begranden de senaste 7 dygnen antalet omdirigerade begranden antalet omdirigerade begranden de senaste 7 dygnen % av misslyckade begranden % av misslyckade begranden de senaste 7 dygnen % av strsta antalet misslyckade begranden % av strsta antalet misslyckade begranden de senaste 7 dygnen antalet misslyckade begranden antalet misslyckade begranden de senaste 7 dygnen tiden fr senaste begran tiden fr senaste omdirigerade begran tiden fr senaste misslyckade begran tiden fr frsta begran tiden fr frsta omdirigerade begran tiden fr frsta misslyckade begran ## 3 other ways of sorting in m, f, & n * * sorterat alfabetiskt * * sorterat numeriskt * * inte sorterat ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. fm em ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %H.%n ## "Program started at" and "Analysed requests from" %w %d %m %Y %H.%n ## In Daily Report %d %m %Y ## In Daily Summary %w ## In Hourly Report %d %m %Y %H.%n%x%I.%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H.%n%x%I.%o ## In Quarter-Hour and Five-Minute Reports %d %m %Y %H.%n%x%I.%o ## In Quarter-Hour and Five-Minute Summaries %H.%n%x%I.%o ## In Weekly Report %d %m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %Y ## The date & time (D) column in non-time reports %d %m %Y %H.%n ## In non-time reports: "listing files with requests since [date]" %d %m %Y kl. %H.%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Fortstt med begran 101 Byter protokoll 1xx [Diverse informativa] 200 OK 201 Skapad 202 Accepterad fr fortsatt behandling 203 Ickeauktorativ information 204 OK, men ingenting att skicka 205 Nollstll dokument 206 Endast del av dokument 2xx [Diverse lyckade] 300 Flera dokument finns tillgngliga 301 Dokumentet har flyttat permanent 302 Dokumentet hittat p annan plats 303 Se annat dokument 304 Inte ndrat sedan senaste hmtningen 305 Anvnd proxy 306 Byt proxy 307 Dokumentet har flyttats temporrt 3xx [Diverse omdirigeringar] 400 Felaktig begran 401 Autentisering krvs 402 Betalning krvs 403 Tilltrde frbjudet 404 Dokumentet kunde inte hittas 405 Metoden inte tillten 406 Dokumentet inte godtagbart av klienten 407 Proxyautentisering krvs 408 Time-out av begran 409 Begran r i konflikt med resursens tillstnd 410 Dokumentet r borta permanent 411 Lngd krvs 412 Frutsttning krvs 413 Begran r fr lng 414 Begrt filnamn r fr lngt 415 Mediatypen stds inte 416 Begrt intervall r ogiltigt 417 Frvntan misslyckades 4xx [Diverse klient- och anvndarfel] 500 Internt serverfel 501 Typen av begran stds inte 502 Fel vid servern uppstrms 503 Tjnsten r tillflligt otillgnglig 504 Gateway-timeout 505 HTTP-versionen stds inte 506 Omdirigering misslyckades 5xx [Diverse serverfel] xxx [Oknda] analog-6.0/lang/se2a.lng0000644000175000017500000003271710161303541015217 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Alternative Swedish translation by Christian Rose . ## (This translation aims to use fewer Anglicisms than the other Swedish ## translation.) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. soe maa tis ons tor fre loe jan feb mar apr maj jun jul aug sep okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" veckostart aar ## Quarter of a year kvartal maanad dygn dygn timme minut minuter sekund sekunder byte byte ## ?bytes represents kbytes, Mbytes etc. ?byte begaeran begaeranden datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum tid tid startdatum starttid slutdatum sluttid fil filer vaerd vaerdar virtuell vaerd virtuella vaerdar katalog kataloger domaen domaener organisation organisationer filaendelse filaendelser URL URL:er webblaesare webblaesare operativsystem operativsystem ## (= operating system, operating systems) storlek soekuttryck soekuttryck webbplats webbplatser anvaendare anvaendare statuskod statuskoder Webbserverstatistik foer ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sammanfattning ## The time reports, plus "busiest" strings (at the bottom of each report) AArsrapport Intensivaste aaret: Kvartalsrapport Intensivaste kvartalet: Maanadsrapport Intensivaste maanaden: Veckorapport Intensivaste veckan: veckan som boerjade Dygnssammanfattning Dygnsrapport Intensivaste dygnet: Timrapport Timsammanfattning Sammanfattning foer intensivaste timmen i veckan Intensivaste timmen: Kvartrapport Kvartsammanfattning Intensivaste kvarten: Femminutersrapport Femminuterssammanfattning Intensivaste fem minuterna: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Vaerdrapport vaerd vaerdarna n Vaerdomdirigeringsrapport vaerd vaerdarna n Vaerdfelrapport vaerd vaerdarna n Katalograpport katalog katalogerna n Filtypsrapport filaendelse filaendelserna n Begaeransrapport fil filerna n Omdirigeringsrapport fil filerna n Felrapport fil filerna n Haenvisarrapport haenvisande URL haenvisande URL:erna n Rapport oever haenvisande webbplatser haenvisande webbplats haenvisande webbplatserna n Rapport oever omdirigerade haenvisningar haenvisande URL haenvisande URL:erna n Rapport oever misslyckade haenvisningar haenvisande URL haenvisande URL:erna n Soekuttrycksrapport soekuttryck soekuttrycken n Soekordsrapport soekord soekorden n Rapport oever interna soekuttryck soekuttryck soekuttrycken n Rapport oever interna soekord soekord soekorden n Rapport oever virtuella domaener virtuell domaen virtuella domaenerna n Rapport oever omdirigering i virtuella domaener virtuell domaen virtuella domaenerna n Rapport oever fel i virtuella domaener virtuell vaerd virtuella vaerdarna n Anvaendarrapport anvaendare anvaendarna n Anvaendaromdirigeringsrapport anvaendare anvaendarna n Anvaendarfelrapport anvaendare anvaendarna n Webblaesarsammanfattning webblaesare webblaesarna n Webblaesarrapport webblaesare webblaesarna n Operativsystemsrapport operativsystem operativsystemen n Domaenrapport domaen domaenerna n Organisationsrapport organisation organisationerna n Statuskodsrapport statuskod statuskoderna n Exekveringstidsrapport Filstorleksrapport ## Used at the bottom of the report Denna analys gjordes av Exekveringstid Mindre aen 1 ## Used in the time reports Varje enhet motsvarar eller del av begaeran av en sida begaeranden av sidor ## Used at the bottom of each non-time report: need m, f & n genders * * inte listade ## Used on the pie charts: again need m, f & n genders * * Annat ## Used at the top of the report Programmet startade Analyserade begaeranden fraan till ## Used in the General Summary Lyckade begaeranden Medelantal lyckade begaeranden per dygn Lyckade begaeranden av sidor Medelantal lyckade begaeranden av sidor per dygn Loggfilsrader utan statuskod Misslyckade begaeranden Omdirigerade begaeranden Begaeranden med informativ statuskod Distinkta begaerda filer Distinkta betjaenade vaerdar Felaktiga loggfilsrader Ooenskade loggfilsrader Skickad data Medeltal skickad data per dygn Data inom parantes aer de 7 dygnen innan senaste 7 dygnen Gaa till Boerjan ## Some special phrases for particular reports. [ouppslagna numeriska adresser] [domaen inte angiven] [okaend domaen] [rotkatalog] [ingen katalog] [ingen filaendelse] [kataloger] Okaent Windows Annat Unix Robotar Okaent operativsystem ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) beg 7-dygns beg %beg %7-dygns beg sidor 7-dygns sidor %sidor %7-dygns sidor byte ?byte 7-dygns byte 7-dygns ?byte %byte %7-dygns byte nr ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listar de oeversta %s * * Listar de oeversta %d %s * * Listar %s ## "by" in the phrase "listing the top 3 files BY number of requests" efter ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors begaeran de senaste 7 dygnen begaeranden de senaste 7 dygnen begaeran av en sida de senaste 7 dygnen begaeranden av sidor de senaste 7 dygnen omdirigerad begaeran omdirigerade begaeranden omdirigerad begaeran de senaste 7 dygnen omdirigerade begaeranden de senaste 7 dygnen misslyckad begaeran misslyckade begaeranden misslyckad begaeran de senaste 7 dygnen misslyckade begaeranden de senaste 7 dygnen % av trafiken % av trafiken de senaste 7 dygnen % av den stoersta maengden trafik % av den stoersta maengden trafik de senaste 7 dygnen byte trafik byte trafik ## ?bytes represents kbytes, Mbytes etc. ?byte trafik byte trafik de senaste 7 dygnen byte trafik de senaste 7 dygnen ?byte trafik de senaste 7 dygnen med en begaeran sedan med en omdirigerad begaeran sedan med en misslyckad begaeran sedan med foersta begaeran sedan med foersta omdirigerade begaeran sedan med foersta misslyckade begaeran sedan ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorterade efter ## Used at the top of each report Denna rapport innehaaller data fraan ## Used in pie charts Taartbitarna ritas efter ## different ways of sorting maengden trafik maengden trafik de senaste 7 dygnen % av antalet begaeranden % av antalet begaeranden de senaste 7 dygnen % av det stoersta antalet begaeranden % av det stoersta antalet begaeranden de senaste 7 dygnen antalet begaeranden antalet begaeranden de senaste 7 dygnen % av antalet begaeranden av sidor % av antalet begaeranden av sidor de senaste 7 dygnen % av det stoersta antalet begaeranden av sidor % av det stoersta antalet begaeranden av sidor de senaste 7 dygnen antalet begaeranden av sidor antalet begaeranden av sidor de senaste 7 dygnen % av antalet omdirigerade begaeranden % av antalet omdirigerade begaeranden de senaste 7 dygnen % av det stoersta antalet omdirigerade begaeranden % av det stoersta antalet omdirigerade begaeranden de senaste 7 dygnen antalet omdirigerade begaeranden antalet omdirigerade begaeranden de senaste 7 dygnen % av misslyckade begaeranden % av misslyckade begaeranden de senaste 7 dygnen % av stoersta antalet misslyckade begaeranden % av stoersta antalet misslyckade begaeranden de senaste 7 dygnen antalet misslyckade begaeranden antalet misslyckade begaeranden de senaste 7 dygnen tiden foer senaste begaeran tiden foer senaste omdirigerade begaeran tiden foer senaste misslyckade begaeran tiden foer foersta begaeran tiden foer foersta omdirigerade begaeran tiden foer foersta misslyckade begaeran ## 3 other ways of sorting in m, f, & n * * sorterat alfabetiskt * * sorterat numeriskt * * inte sorterat ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. fm em ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d %m %Y %H.%n ## "Program started at" and "Analysed requests from" %w %d %m %Y %H.%n ## In Daily Report %d %m %Y ## In Daily Summary %w ## In Hourly Report %d %m %Y %H.%n%x%I.%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H.%n%x%I.%o ## In Quarter-Hour and Five-Minute Reports %d %m %Y %H.%n%x%I.%o ## In Quarter-Hour and Five-Minute Summaries %H.%n%x%I.%o ## In Weekly Report %d %m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %Y ## The date & time (D) column in non-time reports %d %m %Y %H.%n ## In non-time reports: "listing files with requests since [date]" %d %m %Y kl. %H.%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Fortsaett med begaeran 101 Byter protokoll 1xx [Diverse informativa] 200 OK 201 Skapad 202 Accepterad foer fortsatt behandling 203 Ickeauktorativ information 204 OK, men ingenting att skicka 205 Nollstaell dokument 206 Endast del av dokument 2xx [Diverse lyckade] 300 Flera dokument finns tillgaengliga 301 Dokumentet har flyttat permanent 302 Dokumentet hittat paa annan plats 303 Se annat dokument 304 Inte aendrat sedan senaste haemtningen 305 Anvaend proxy 306 Byt proxy 307 Dokumentet har flyttats temporaert 3xx [Diverse omdirigeringar] 400 Felaktig begaeran 401 Autentisering kraevs 402 Betalning kraevs 403 Tilltraede foerbjudet 404 Dokumentet kunde inte hittas 405 Metoden inte tillaaten 406 Dokumentet inte godtagbart av klienten 407 Proxyautentisering kraevs 408 Time-out av begaeran 409 Begaeran aer i konflikt med resursens tillstaand 410 Dokumentet aer borta permanent 411 Laengd kraevs 412 Foerutsaettning kraevs 413 Begaeran aer foer laang 414 Begaert filnamn aer foer laangt 415 Mediatypen stoeds inte 416 Begaert intervall aer ogiltigt 417 Foervaentan misslyckades 4xx [Diverse klient- och anvaendarfel] 500 Internt serverfel 501 Typen av begaeran stoeds inte 502 Fel vid servern uppstroems 503 Tjaensten aer tillfaelligt otillgaenglig 504 Gateway-timeout 505 HTTP-versionen stoeds inte 506 Omdirigering misslyckades 5xx [Diverse serverfel] xxx [Okaenda] analog-6.0/lang/se2adesc.txt0000644000175000017500000001071710161303541016111 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Denna rapport visar aktiviteten under varje aar. # Quarterly Report Denna rapport visar aktiviteten under varje kvartal. # Monthly Report Denna rapport visar aktiviteten under varje maanad. # Weekly Report Denna rapport visar aktiviteten under varje vecka. # Daily Report Denna rapport visar aktiviteten under varje dygn. # Hourly Report Denna rapport visar aktiviteten under varje timme. # Quarter-Hour Report Denna rapport visar aktiviteten under varje kvart. # Five-Minute Report Denna rapport visar aktiviteten under varje femminutersperiod. # Daily Summary Denna rapport visar totala aktiviteten foer varje dygn i veckan, summerat oever alla veckor i rapporten. # Hourly Summary Denna rapport visar totala aktiviteten foer varje timme paa dygnet, summerat oever alla dygn i rapporten. # Hour of the Week Summary Denna rapport visar totala aktiviteten foer varje dag i veckan, summerat oever alla veckor i rapporten. # Quarter-Hour Summary Denna rapport visar totala aktiviteten foer varje kvart under dygnet, summerat oever alla dygn i rapporten. # Five-Minute Summary Denna rapport visar totala aktiviten foer varje femminutersperiod under dygnet, summerat oever alla dygn i rapporten. # General Summary Denna rapport innehaaller oevergripande statistik. # Request Report Denna rapport visar filerna paa webbplatsen. # Redirection Report Denna rapport visar filerna som orsakade att begaeranden omdirigerades till en annan fil (normalt kataloger som saknade ett snedstreck paa slutet, eller CGI-skript som tvingade omdirigeringar). # Failure Report Denna rapport visar de filer som orsakade misslyckanden, till exempel filer som inte kunde hittas. # File Type Report Denna rapport visar filaendelserna paa begaerda filer. # Directory Report Denna rapport visar de kataloger som filer begaerdes ifraan (siffrorna foer varje katalog inkluderar alla dess underkataloger). # Host Report Denna rapport visar de datorer som begaerde filer. # Host Redirection Report Denna rapport visar de datorer som omdirigerades till en annan fil. # Host Failure Report Denna rapport visar de datorer som raakade ut foer misslyckade begaeran. # Domain Report Denna rapport visar laenderna foer de datorer som begaerde filer. # Referrer Report Denna rapport visar haenvisarna (de platser som besoekare foeljde laenkar ifraan, eller sidor som inkluderade den haer webbplatsens bilder). # Referring Site Report Denna rapport visar de servrar som besoekare foeljt laenkar ifraan. # Redirected Referrer Report Denna rapport visar de haenvisare som orsakade omdirigerade begaeran. # Failed Referrer Report Denna rapport visar de haenvisare som innehaaller trasiga laenkar till webbplatsen. # Browser Report Denna rapport visar webblaesarna som besoekare anvaender. # Virtual Host Report Denna rapport visar aktiviteten foer varje virtuell domaen pae servern. # Virtual Host Redirection Report Denna rapport visar omdirigerade begaeran till varje virtuell domaen. # Virtual Host Failure Report Denna rapport visar misslyckade begaeran foer varje virtuell domaen. # User Report Denna rapport visar de anvaendare som begaerde filer, om anvaendare kan autentiseras eller identifieras av kakor. # User Redirection Report Denna rapport visar de anvaendare som omdirigerades till en annan fil. # User Failure Report Denna rapport visar de anvaendare som raakade ut foer misslyckade begaeran. # Organisation Report Denna rapport visar de organisationer som de datorer som begaerde filer tillhoer. # Search Query Report Denna rapport visar de soekuttryck som besoekare anvaent i soekmotorer foer att hitta webbplatsen. # Search Word Report Denna rapport visar de soekord som besoekare anvaent i soekmotorer foer att hitta webbplatsen. # Internal Search Query Report Denna rapport visar de soekuttryck som besoekare anvaent i skript paa webbplatsen. # Internal Search Word Report Denna rapport visar de soekord som besoekare anvaent i skript paa webbplatsen. # Browser Summary Denna rapport visar vilka webblaesare besoekarna har anvaent. # Operating System Report Denna rapport visar de operativsystem som besoekarna har anvaent. # File Size Report Denna rapport visar storlekarna paa filer. # Status Code Report Denna rapport visar HTTP-statuskoderna foer alla begaeranden. # Processing Time Report Denna rapport visar tiden det har tagit foer att bearbeta lyckade begaeranden. analog-6.0/lang/se2adom.tab0000644000175000017500000001202210161303541015670 0ustar sret1sret100000000000000aero 2 Flygindustri arpa 1 Arpanet biz 2 Foeretag com 2 Kommersiellt coop 2 Kooperativ edu 2 Utbildningsvaesendet i USA gov 2 Myndigheter i USA info 2 Informativt int 2 Internationella foerdragsorganisationer mil 2 Militaer i USA museum 2 Museum name 3 Individer net 2 Naetverk org 2 Ideella organisationer pro 3 Yrkesmaen ac 1 Ascensionoen ad 2 Andorra ae 3 Foerenade Arabemiraten af 1 Afghanistan ag 2 Antigua och Barbuda ai 1 Anguilla al 1 Albanien am 2 Armenien an 1 Nederlaendska Antillerna ao 1 Angola aq 1 Antarktis ar 3 Argentina as 1 Amerikanska Samoa at 3 Oesterrike au 3 Australien aw 1 Aruba az 1 Azerbajdzjan ba 3 Bosnien-Hercegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgien bf 1 Burkina Faso bg 2 Bulgarien bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasilien bs 1 Bahamas bt 1 Bhutan bv 1 Bouvetoen bw 1 Botswana by 1 Vitryssland bz 1 Belize ca 3 Kanada cc 1 Kokosoearna cd 1 Demokratiska republiken Kongo cf 1 Centralafrikanska republiken cg 1 Kongo ch 2 Schweiz ci 1 Elfenbenskusten ck 1 Cookoearna cl 2 Chile cm 1 Kamerun cn 3 Kina co 3 Colombia cr 3 Costa Rica cu 2 Kuba cv 1 Kap Verdeoearna cx 2 Juloen cy 3 Cypern cz 2 Tjeckien de 2 Tyskland dj 1 Djibouti dk 2 Danmark dm 2 Dominica do 3 Dominikanska republiken dz 1 Algeriet ec 3 Ecuador ee 2 Estland eg 3 Egypten eh 1 Vaestsahara er 1 Eritrea es 2 Spanien et 1 Etiopien fi 2 Finland fj 3 Fidji fk 1 Falklandsoearna fm 1 Mikronesien fo 1 Faeroearna fr 2 Frankrike fx 1 Frankrike (Europeiskt territorium) ga 1 Gabon gb 1 Storbritannien gd 1 Grenada ge 1 Georgien gf 1 Franska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Ekvatorialguinea gr 2 Grekland gs 1 Sydgeorgien och Sydsandwichoearna gt 3 Guatemala gu 1 Guam gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heardoen och McDonaldoearna hn 2 Honduras hr 2 Kroatien ht 1 Haiti hu 2 Ungern id 3 Indonesien ie 2 Irland il 3 Israel im 1 Isle of Man in 3 Indien io 1 Brittiskt territorium i Indiska Oceanen iq 1 Irak ir 1 Iran is 2 Island it 2 Italien je 1 Jersey jm 3 Jamaica jo 3 Jordanien jp 3 Japan ke 3 Kenya kg 1 Kirgizistan kh 1 Kambodja ki 1 Kiribati km 1 Komorerna kn 1 Sankt Kitts och Nevis kp 1 Nordkorea kr 3 Sydkorea kw 3 Kuwait ky 1 Caymanoearna kz 1 Kazakstan la 1 Laos lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litauen lu 2 Luxemburg lv 2 Lettland ly 1 Libyen ma 1 Marocko mc 2 Monaco md 1 Moldavien mg 1 Madagaskar mh 1 Marshalloearna mk 3 Makedonien (foere detta del av Jugoslavien) ml 1 Mali mm 1 Burma (Myanmar) mn 1 Mongoliet mo 1 Macau mp 1 Nordmarianerna mq 1 Martinique mr 1 Mauretanien ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldiverna mw 1 Malawi mx 3 Mexiko my 3 Malaysia mz 1 Mocambique na 1 Namibia nc 1 Nya Kaledonien ne 1 Niger nf 1 Norfolkoen ng 1 Nigeria ni 3 Nicaragua nl 2 Nederlaenderna no 2 Norge np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nya Zeeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Franska Polynesien pg 3 Papua Nya Guinea ph 3 Filippinerna pk 3 Pakistan pl 3 Polen pm 1 Sankt Pierre och Miquelon pn 1 Pitcairnoen pr 1 Puerto Rico ps 3 Palestinska territoriet pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Rumaenien ru 2 Ryssland rw 1 Rwanda sa 3 Saudiarabien sb 1 Solomonoearna sc 1 Seychellerna sd 1 Sudan se 2 Sverige sg 3 Singapore sh 1 Sankt Helena si 2 Slovenien sj 1 Svalbard och Jan Mayen sk 2 Slovakien sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Sankt Tome och Principe su 2 F.d. Sovjetunionen sv 3 El Salvador sy 1 Syrien sz 1 Swaziland tc 1 Turks- och Caicosoearna td 1 Tchad tf 1 Franska soedra territorierna tg 1 Togo th 3 Thailand tj 1 Tadjikistan tk 1 Tokelau tl 1 Oesttimor tm 1 Turkmenistan tn 1 Tunisien to 1 Tonga tp 1 Oesttimor tr 3 Turkiet tt 3 Trinidad och Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Storbritannien um 1 USAs yttre oear us 4 USA uy 3 Uruguay uz 1 Uzbekistan va 1 Vatikanstaten vc 1 Sankt Vincent och Grenadinerna ve 3 Venezuela vg 1 Brittiska Jungfruoearna vi 1 Jungfruoearna vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis- och Futunaoearna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavien za 3 Sydafrika zm 1 Zambia zr 1 Demokratiska republiken Kongo zw 3 Zimbabwe analog-6.0/lang/se2desc.txt0000644000175000017500000001056010161303541015744 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report Denna rapport visar aktiviteten under varje r. # Quarterly Report Denna rapport visar aktiviteten under varje kvartal. # Monthly Report Denna rapport visar aktiviteten under varje mnad. # Weekly Report Denna rapport visar aktiviteten under varje vecka. # Daily Report Denna rapport visar aktiviteten under varje dygn. # Hourly Report Denna rapport visar aktiviteten under varje timme. # Quarter-Hour Report Denna rapport visar aktiviteten under varje kvart. # Five-Minute Report Denna rapport visar aktiviteten under varje femminutersperiod. # Daily Summary Denna rapport visar totala aktiviteten fr varje dygn i veckan, summerat ver alla veckor i rapporten. # Hourly Summary Denna rapport visar totala aktiviteten fr varje timme p dygnet, summerat ver alla dygn i rapporten. # Hour of the Week Summary Denna rapport visar totala aktiviteten fr varje dag i veckan, summerat ver alla veckor i rapporten. # Quarter-Hour Summary Denna rapport visar totala aktiviteten fr varje kvart under dygnet, summerat ver alla dygn i rapporten. # Five-Minute Summary Denna rapport visar totala aktiviten fr varje femminutersperiod under dygnet, summerat ver alla dygn i rapporten. # General Summary Denna rapport innehller vergripande statistik. # Request Report Denna rapport visar filerna p webbplatsen. # Redirection Report Denna rapport visar filerna som orsakade att begranden omdirigerades till en annan fil (normalt kataloger som saknade ett snedstreck p slutet, eller CGI-skript som tvingade omdirigeringar). # Failure Report Denna rapport visar de filer som orsakade misslyckanden, till exempel filer som inte kunde hittas. # File Type Report Denna rapport visar filndelserna p begrda filer. # Directory Report Denna rapport visar de kataloger som filer begrdes ifrn (siffrorna fr varje katalog inkluderar alla dess underkataloger). # Host Report Denna rapport visar de datorer som begrde filer. # Host Redirection Report Denna rapport visar de datorer som omdirigerades till en annan fil. # Host Failure Report Denna rapport visar de datorer som rkade ut fr misslyckade begran. # Domain Report Denna rapport visar lnderna fr de datorer som begrde filer. # Referrer Report Denna rapport visar hnvisarna (de platser som beskare fljde lnkar ifrn, eller sidor som inkluderade den hr webbplatsens bilder). # Referring Site Report Denna rapport visar de servrar som beskare fljt lnkar ifrn. # Redirected Referrer Report Denna rapport visar de hnvisare som orsakade omdirigerade begran. # Failed Referrer Report Denna rapport visar de hnvisare som innehller trasiga lnkar till webbplatsen. # Browser Report Denna rapport visar webblsarna som beskare anvnder. # Virtual Host Report Denna rapport visar aktiviteten fr varje virtuell domn p servern. # Virtual Host Redirection Report Denna rapport visar omdirigerade begran till varje virtuell domn. # Virtual Host Failure Report Denna rapport visar misslyckade begran fr varje virtuell domn. # User Report Denna rapport visar de anvndare som begrde filer, om anvndare kan autentiseras eller identifieras av kakor. # User Redirection Report Denna rapport visar de anvndare som omdirigerades till en annan fil. # User Failure Report Denna rapport visar de anvndare som rkade ut fr misslyckade begran. # Organisation Report Denna rapport visar de organisationer som de datorer som begrde filer tillhr. # Search Query Report Denna rapport visar de skuttryck som beskare anvnt i skmotorer fr att hitta webbplatsen. # Search Word Report Denna rapport visar de skord som beskare anvnt i skmotorer fr att hitta webbplatsen. # Internal Search Query Report Denna rapport visar de skuttryck som beskare anvnt i skript p webbplatsen. # Internal Search Word Report Denna rapport visar de skord som beskare anvnt i skript p webbplatsen. # Browser Summary Denna rapport visar vilka webblsare beskarna har anvnt. # Operating System Report Denna rapport visar de operativsystem som beskarna har anvnt. # File Size Report Denna rapport visar storlekarna p filer. # Status Code Report Denna rapport visar HTTP-statuskoderna fr alla begranden. # Processing Time Report Denna rapport visar tiden det har tagit fr att bearbeta lyckade begranden. analog-6.0/lang/se2dom.tab0000644000175000017500000001175310161303541015541 0ustar sret1sret100000000000000aero 2 Flygindustri arpa 1 Arpanet biz 2 Fretag com 2 Kommersiellt coop 2 Kooperativ edu 2 Utbildningsvsendet i USA gov 2 Myndigheter i USA info 2 Informativt int 2 Internationella frdragsorganisationer mil 2 Militr i USA museum 2 Museum name 3 Individer net 2 Ntverk org 2 Ideella organisationer pro 3 Yrkesmn ac 1 Ascensionn ad 2 Andorra ae 3 Frenade Arabemiraten af 1 Afghanistan ag 2 Antigua och Barbuda ai 1 Anguilla al 1 Albanien am 2 Armenien an 1 Nederlndska Antillerna ao 1 Angola aq 1 Antarktis ar 3 Argentina as 1 Amerikanska Samoa at 3 sterrike au 3 Australien aw 1 Aruba az 1 Azerbajdzjan ba 3 Bosnien-Hercegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgien bf 1 Burkina Faso bg 2 Bulgarien bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasilien bs 1 Bahamas bt 1 Bhutan bv 1 Bouvetn bw 1 Botswana by 1 Vitryssland bz 1 Belize ca 3 Kanada cc 1 Kokosarna cd 1 Demokratiska republiken Kongo cf 1 Centralafrikanska republiken cg 1 Kongo ch 2 Schweiz ci 1 Elfenbenskusten ck 1 Cookarna cl 2 Chile cm 1 Kamerun cn 3 Kina co 3 Colombia cr 3 Costa Rica cu 2 Kuba cv 1 Kap Verdearna cx 2 Juln cy 3 Cypern cz 2 Tjeckien de 2 Tyskland dj 1 Djibouti dk 2 Danmark dm 2 Dominica do 3 Dominikanska republiken dz 1 Algeriet ec 3 Ecuador ee 2 Estland eg 3 Egypten eh 1 Vstsahara er 1 Eritrea es 2 Spanien et 1 Etiopien fi 2 Finland fj 3 Fidji fk 1 Falklandsarna fm 1 Mikronesien fo 1 Frarna fr 2 Frankrike fx 1 Frankrike (Europeiskt territorium) ga 1 Gabon gb 1 Storbritannien gd 1 Grenada ge 1 Georgien gf 1 Franska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Grnland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Ekvatorialguinea gr 2 Grekland gs 1 Sydgeorgien och Sydsandwicharna gt 3 Guatemala gu 1 Guam gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heardn och McDonaldarna hn 2 Honduras hr 2 Kroatien ht 1 Haiti hu 2 Ungern id 3 Indonesien ie 2 Irland il 3 Israel im 1 Isle of Man in 3 Indien io 1 Brittiskt territorium i Indiska Oceanen iq 1 Irak ir 1 Iran is 2 Island it 2 Italien je 1 Jersey jm 3 Jamaica jo 3 Jordanien jp 3 Japan ke 3 Kenya kg 1 Kirgizistan kh 1 Kambodja ki 1 Kiribati km 1 Komorerna kn 1 Sankt Kitts och Nevis kp 1 Nordkorea kr 3 Sydkorea kw 3 Kuwait ky 1 Caymanarna kz 1 Kazakstan la 1 Laos lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litauen lu 2 Luxemburg lv 2 Lettland ly 1 Libyen ma 1 Marocko mc 2 Monaco md 1 Moldavien mg 1 Madagaskar mh 1 Marshallarna mk 3 Makedonien (fre detta del av Jugoslavien) ml 1 Mali mm 1 Burma (Myanmar) mn 1 Mongoliet mo 1 Macau mp 1 Nordmarianerna mq 1 Martinique mr 1 Mauretanien ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldiverna mw 1 Malawi mx 3 Mexiko my 3 Malaysia mz 1 Mocambique na 1 Namibia nc 1 Nya Kaledonien ne 1 Niger nf 1 Norfolkn ng 1 Nigeria ni 3 Nicaragua nl 2 Nederlnderna no 2 Norge np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nya Zeeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Franska Polynesien pg 3 Papua Nya Guinea ph 3 Filippinerna pk 3 Pakistan pl 3 Polen pm 1 Sankt Pierre och Miquelon pn 1 Pitcairnn pr 1 Puerto Rico ps 3 Palestinska territoriet pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Rumnien ru 2 Ryssland rw 1 Rwanda sa 3 Saudiarabien sb 1 Solomonarna sc 1 Seychellerna sd 1 Sudan se 2 Sverige sg 3 Singapore sh 1 Sankt Helena si 2 Slovenien sj 1 Svalbard och Jan Mayen sk 2 Slovakien sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Sankt Tome och Principe su 2 F.d. Sovjetunionen sv 3 El Salvador sy 1 Syrien sz 1 Swaziland tc 1 Turks- och Caicosarna td 1 Tchad tf 1 Franska sdra territorierna tg 1 Togo th 3 Thailand tj 1 Tadjikistan tk 1 Tokelau tl 1 sttimor tm 1 Turkmenistan tn 1 Tunisien to 1 Tonga tp 1 sttimor tr 3 Turkiet tt 3 Trinidad och Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Storbritannien um 1 USAs yttre ar us 4 USA uy 3 Uruguay uz 1 Uzbekistan va 1 Vatikanstaten vc 1 Sankt Vincent och Grenadinerna ve 3 Venezuela vg 1 Brittiska Jungfruarna vi 1 Jungfruarna vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis- och Futunaarna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavien za 3 Sydafrika zm 1 Zambia zr 1 Demokratiska republiken Kongo zw 3 Zimbabwe analog-6.0/lang/sea.lng0000644000175000017500000003132310161303541015125 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Svensk version av www.imc-ab.com ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. So Ma Ti On To Fr Lo Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" veckostart Aar ## Quarter of a year kvartal maanad dag dagar tim minut minuter sekund sekunder byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes anrop anrop datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum tid tid startdatum starttid senaste datum senaste gaangen fil filer domaen domaener virtuell domaen virtuella domaener katalog kataloger domaen domaener organisation organisationer filtyp filtyper URL URLer webbklient webbklienter OS OS ## (= operating system, operating systems) storlek soekord soekord sajt sajter anvaendare anvaendare statuskod statuskoder Webserverstatistik foer ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Allmaent ## The time reports, plus "busiest" strings (at the bottom of each report) Aarsrapport Intensivaste aar: Kvartalsrapport Intensivaste kvartal: Maanadsrapport Intensivaste maanad: Veckorapport Intensivaste vecka: vecka boerjar Daglig summering Daglig rapport Baesta dag: Timrapport Timsummering Summering, veckotimme Intensivaste timma: Kvartsrapport Summering, kvartar Intensivaste kvart: Femminutsrapport Femminutssummering Intensivaste fem minuter: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Domaenrapport domaen domaener n Omdirigeringsrapport, vaerdar vaerd vaerdar n Felrapport, vaerdar vaerd vaerdar n Katalograpport katalog kataloger n Filtypsrapport filtyp filtyper n Anropsrapport fil filer n Omdirigeringsrapport fil filer n Felrapport fil filer n Referensrapport refererande URL refererande URLer n Refererande Sajt-rapport refererande sajt refererande sajter n Omdirigerad Referens-rapport referring URL referring URLs n Felaktig Referens-rapport referring URL referring URLs n Soekrapport soekbegrepp soekbegrepp n Soekordsrapport soekord soekord n Intern soekrapport foerfraagan foerfraagningar n Intern soekordsrapport soekord soekord n Virtuell domaenrapport virtuell domaen virtuella domaener n Omdirigeringsrapport, virtuella vaerdar virtuell vaerd virtuella vaerdar n Felrapport, virtuella vaerdar virtuell vaerd virtuella vaerdar n Anvaendarrapport anvaendare anvaendare n Omdirigeringsrapport, anvaendare anvaendare anvaendare n Felande anvaendare-rapport anvaendare anvaendare n Webbklientsummering webbklient webbklienter n Webbklientrapport webbklient webbklienter n Operativsystemsrapport operativsystem operativsystem n Toppdomaensrapport toppdomaen toppdomaener n Organisationsrapport organisation organisationer n Statuskodrapport statuskod statuskoder n Exekveringstidsrapport Filstorleksrapport ## Used at the bottom of the report Analysen gjord av Exekveringstid Mindre aen 1 ## Used in the time reports Varje enhet representerar eller del av access till en sida accesser till sidor ## Used at the bottom of each non-time report: need m, f & n genders inte listade inte listade inte listade ## Used on the pie charts: again need m, f & n genders Andra Andra Andra ## Used at the top of the report Programmet startade Analyserade accesser fraan till ## Used in the General Summary Serveranrop Medeltal serveranrop per dag Serveranrop till sidor Medeltal av serveranrop till sidor per dag Logfilsrader utan statuskod Felaktiga serveranrop Omdirigerade serveranrop serveranrop med infostatuskod Distinkta filer accessade Distinkta domaener servade Fel i rader ur loggfilen Felande loggfilsrader Data skickade Medeltal data skickade per dag Data inom parentes visar 7 dagar till senaste 7 dagarna Gaa till Topp ## Some special phrases for particular reports. [oupploesta numeriska adresser] [domaen ej angiven] [okaend domaen] [rootmapp] [saknar mapp] [saknar tillaegg] [kataloger] Okaend Windows Annan Unix Robotar OS okaent ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #acc 7 dagar Anrop %acc %7 dagar Anrop sidor 7 dagar Sidor %sidor %7 dagar Sidor bytes ?bytes 7 dagar bytes 7 dagar ?bytes %bytes %7 dagar bytes antal ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listar de foersta %s * * Listar de foersta %d %s * * Listar %s ## "by" in the phrase "listing the top 3 files BY number of requests" efter ## All requests WITH AT LEAST 10 requests med minst ## Different ways of doing floors serveranrop de senaste 7 dagarna serveranrop de senaste 7 dagarna anrop till sida de senaste 7 dagarna anrop till sidor de senaste 7 dagarna Omdirigerat anrop Omdirigerade anrop omdirigerat serveranrop de senaste 7 dagarna omdirigerade serveranrop de senaste 7 dagarna felaktigt serveranrop felaktiga serveranrop felaktigt serveranrop de senaste 7 dagarna felaktiga serveranrop de senaste 7 dagarna % av trafiken % av trafiken de senaste 7 dagarna % av den maximala trafiken % av den maximala trafiken de senaste 7 dagarna byte, trafik bytes, trafik ## ?bytes represents kbytes, Mbytes etc. ?bytes, trafik byte, trafik de senaste 7 dagarna bytes, trafik de senaste 7 dagarna ?bytes, trafik de senaste 7 dagarna serveranrop sedan med ett omdirigerat anrop sedan med ett felaktigt anrop sedan med foersta serveranrop sedan med foersta omdirigerade serveranrop sedan med foersta felaktiga serveranrop sedan ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorterad efter ## Used at the top of each report Denna rapport innehaaller data fraan ## Used in pie charts Plottat som ## different ways of sorting procent av antal bytes trafikmngden de senaste 7 dagarna % av serveranrop % av serveranrop de senaste 7 dagarna % av det maximala antalet anrop % av det maximala antalet anrop de senaste 7 dagarna antal serveranrop antal serveranrop de senaste 7 dagarna % av anrop till sidor % av anrop till sidor de senaste 7 dagarna % av det maximala antalet anrop till sidor % av det maximala antalet anrop till sidor de senaste 7 dagarna antal anrop till sidor antal anrop till sidor de senaste 7 dagarna % av omdirigerade anrop % av omdirigerade anrop de senaste 7 dagarna % av det maximala antalet omdirigerade anrop % av det maximala antalet omdirigerade anrop de senaste 7 dagarna antal omdirigerade anrop antal omdirigerade anrop de senaste 7 dagarna % av felaktiga anrop % av felaktiga anrop de senaste 7 dagarna % av det maximala antalet felaktiga anrop % av det maximala antalet felaktiga anrop de senaste 7 dagarna antal felaktiga anrop antal felaktiga anrop de senaste 7 dagarna senaste serveranrop senaste omdirigerade serveranrop senaste felaktiga serveranrop tidpunkt foer foersta anrop tidpunkt foer foersta omdirigerade serveranrop tidpunkt foer foersta felaktiga serveranrop ## 3 other ways of sorting in m, f, & n * * i alfabetsik ordning * * sorterat numeriskt * * ej sorterat ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %Y-%m-%D %H:%n ## "Program started at" and "Analysed requests from" %w %D %m %Y %H:%n ## In Daily Report %d %m %y ## In Daily Summary %w ## In Hourly Report %d %m %y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d %m %y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d %m %y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d %m %y ## The date & time (D) column in non-time reports %d %m %y %H:%n ## In non-time reports: "including all files with requests since [date]" %d %m %y klockan %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/seadom.tab0000644000175000017500000001202210161303541015606 0ustar sret1sret100000000000000aero 2 Flygindustri arpa 1 Arpanet biz 2 Foeretag com 2 Kommersiellt coop 2 Kooperativ edu 2 Utbildningsvaesendet i USA gov 2 Myndigheter i USA info 2 Informativt int 2 Internationella foerdragsorganisationer mil 2 Militaer i USA museum 2 Museum name 3 Individer net 2 Naetverk org 2 Ideella organisationer pro 3 Yrkesmaen ac 1 Ascensionoen ad 2 Andorra ae 3 Foerenade Arabemiraten af 1 Afghanistan ag 2 Antigua och Barbuda ai 1 Anguilla al 1 Albanien am 2 Armenien an 1 Nederlaendska Antillerna ao 1 Angola aq 1 Antarktis ar 3 Argentina as 1 Amerikanska Samoa at 3 Oesterrike au 3 Australien aw 1 Aruba az 1 Azerbajdzjan ba 3 Bosnien-Hercegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgien bf 1 Burkina Faso bg 2 Bulgarien bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasilien bs 1 Bahamas bt 1 Bhutan bv 1 Bouvetoen bw 1 Botswana by 1 Vitryssland bz 1 Belize ca 3 Kanada cc 1 Kokosoearna cd 1 Demokratiska republiken Kongo cf 1 Centralafrikanska republiken cg 1 Kongo ch 2 Schweiz ci 1 Elfenbenskusten ck 1 Cookoearna cl 2 Chile cm 1 Kamerun cn 3 Kina co 3 Colombia cr 3 Costa Rica cu 2 Kuba cv 1 Kap Verdeoearna cx 2 Juloen cy 3 Cypern cz 2 Tjeckien de 2 Tyskland dj 1 Djibouti dk 2 Danmark dm 2 Dominica do 3 Dominikanska republiken dz 1 Algeriet ec 3 Ecuador ee 2 Estland eg 3 Egypten eh 1 Vaestsahara er 1 Eritrea es 2 Spanien et 1 Etiopien fi 2 Finland fj 3 Fidji fk 1 Falklandsoearna fm 1 Mikronesien fo 1 Faeroearna fr 2 Frankrike fx 1 Frankrike (Europeiskt territorium) ga 1 Gabon gb 1 Storbritannien gd 1 Grenada ge 1 Georgien gf 1 Franska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Groenland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Ekvatorialguinea gr 2 Grekland gs 1 Sydgeorgien och Sydsandwichoearna gt 3 Guatemala gu 1 Guam gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heardoen och McDonaldoearna hn 2 Honduras hr 2 Kroatien ht 1 Haiti hu 2 Ungern id 3 Indonesien ie 2 Irland il 3 Israel im 1 Isle of Man in 3 Indien io 1 Brittiskt territorium i Indiska Oceanen iq 1 Irak ir 1 Iran is 2 Island it 2 Italien je 1 Jersey jm 3 Jamaica jo 3 Jordanien jp 3 Japan ke 3 Kenya kg 1 Kirgizistan kh 1 Kambodja ki 1 Kiribati km 1 Komorerna kn 1 Sankt Kitts och Nevis kp 1 Nordkorea kr 3 Sydkorea kw 3 Kuwait ky 1 Caymanoearna kz 1 Kazakstan la 1 Laos lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litauen lu 2 Luxemburg lv 2 Lettland ly 1 Libyen ma 1 Marocko mc 2 Monaco md 1 Moldavien mg 1 Madagaskar mh 1 Marshalloearna mk 3 Makedonien (foere detta del av Jugoslavien) ml 1 Mali mm 1 Burma (Myanmar) mn 1 Mongoliet mo 1 Macau mp 1 Nordmarianerna mq 1 Martinique mr 1 Mauretanien ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldiverna mw 1 Malawi mx 3 Mexiko my 3 Malaysia mz 1 Mocambique na 1 Namibia nc 1 Nya Kaledonien ne 1 Niger nf 1 Norfolkoen ng 1 Nigeria ni 3 Nicaragua nl 2 Nederlaenderna no 2 Norge np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nya Zeeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Franska Polynesien pg 3 Papua Nya Guinea ph 3 Filippinerna pk 3 Pakistan pl 3 Polen pm 1 Sankt Pierre och Miquelon pn 1 Pitcairnoen pr 1 Puerto Rico ps 3 Palestinska territoriet pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Rumaenien ru 2 Ryssland rw 1 Rwanda sa 3 Saudiarabien sb 1 Solomonoearna sc 1 Seychellerna sd 1 Sudan se 2 Sverige sg 3 Singapore sh 1 Sankt Helena si 2 Slovenien sj 1 Svalbard och Jan Mayen sk 2 Slovakien sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Sankt Tome och Principe su 2 F.d. Sovjetunionen sv 3 El Salvador sy 1 Syrien sz 1 Swaziland tc 1 Turks- och Caicosoearna td 1 Tchad tf 1 Franska soedra territorierna tg 1 Togo th 3 Thailand tj 1 Tadjikistan tk 1 Tokelau tl 1 Oesttimor tm 1 Turkmenistan tn 1 Tunisien to 1 Tonga tp 1 Oesttimor tr 3 Turkiet tt 3 Trinidad och Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Storbritannien um 1 USAs yttre oear us 4 USA uy 3 Uruguay uz 1 Uzbekistan va 1 Vatikanstaten vc 1 Sankt Vincent och Grenadinerna ve 3 Venezuela vg 1 Brittiska Jungfruoearna vi 1 Jungfruoearna vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis- och Futunaoearna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavien za 3 Sydafrika zm 1 Zambia zr 1 Demokratiska republiken Kongo zw 3 Zimbabwe analog-6.0/lang/sedom.tab0000644000175000017500000001175310161303541015457 0ustar sret1sret100000000000000aero 2 Flygindustri arpa 1 Arpanet biz 2 Fretag com 2 Kommersiellt coop 2 Kooperativ edu 2 Utbildningsvsendet i USA gov 2 Myndigheter i USA info 2 Informativt int 2 Internationella frdragsorganisationer mil 2 Militr i USA museum 2 Museum name 3 Individer net 2 Ntverk org 2 Ideella organisationer pro 3 Yrkesmn ac 1 Ascensionn ad 2 Andorra ae 3 Frenade Arabemiraten af 1 Afghanistan ag 2 Antigua och Barbuda ai 1 Anguilla al 1 Albanien am 2 Armenien an 1 Nederlndska Antillerna ao 1 Angola aq 1 Antarktis ar 3 Argentina as 1 Amerikanska Samoa at 3 sterrike au 3 Australien aw 1 Aruba az 1 Azerbajdzjan ba 3 Bosnien-Hercegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgien bf 1 Burkina Faso bg 2 Bulgarien bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivia br 3 Brasilien bs 1 Bahamas bt 1 Bhutan bv 1 Bouvetn bw 1 Botswana by 1 Vitryssland bz 1 Belize ca 3 Kanada cc 1 Kokosarna cd 1 Demokratiska republiken Kongo cf 1 Centralafrikanska republiken cg 1 Kongo ch 2 Schweiz ci 1 Elfenbenskusten ck 1 Cookarna cl 2 Chile cm 1 Kamerun cn 3 Kina co 3 Colombia cr 3 Costa Rica cu 2 Kuba cv 1 Kap Verdearna cx 2 Juln cy 3 Cypern cz 2 Tjeckien de 2 Tyskland dj 1 Djibouti dk 2 Danmark dm 2 Dominica do 3 Dominikanska republiken dz 1 Algeriet ec 3 Ecuador ee 2 Estland eg 3 Egypten eh 1 Vstsahara er 1 Eritrea es 2 Spanien et 1 Etiopien fi 2 Finland fj 3 Fidji fk 1 Falklandsarna fm 1 Mikronesien fo 1 Frarna fr 2 Frankrike fx 1 Frankrike (Europeiskt territorium) ga 1 Gabon gb 1 Storbritannien gd 1 Grenada ge 1 Georgien gf 1 Franska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Grnland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Ekvatorialguinea gr 2 Grekland gs 1 Sydgeorgien och Sydsandwicharna gt 3 Guatemala gu 1 Guam gw 1 Guinea Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heardn och McDonaldarna hn 2 Honduras hr 2 Kroatien ht 1 Haiti hu 2 Ungern id 3 Indonesien ie 2 Irland il 3 Israel im 1 Isle of Man in 3 Indien io 1 Brittiskt territorium i Indiska Oceanen iq 1 Irak ir 1 Iran is 2 Island it 2 Italien je 1 Jersey jm 3 Jamaica jo 3 Jordanien jp 3 Japan ke 3 Kenya kg 1 Kirgizistan kh 1 Kambodja ki 1 Kiribati km 1 Komorerna kn 1 Sankt Kitts och Nevis kp 1 Nordkorea kr 3 Sydkorea kw 3 Kuwait ky 1 Caymanarna kz 1 Kazakstan la 1 Laos lb 3 Libanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litauen lu 2 Luxemburg lv 2 Lettland ly 1 Libyen ma 1 Marocko mc 2 Monaco md 1 Moldavien mg 1 Madagaskar mh 1 Marshallarna mk 3 Makedonien (fre detta del av Jugoslavien) ml 1 Mali mm 1 Burma (Myanmar) mn 1 Mongoliet mo 1 Macau mp 1 Nordmarianerna mq 1 Martinique mr 1 Mauretanien ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldiverna mw 1 Malawi mx 3 Mexiko my 3 Malaysia mz 1 Mocambique na 1 Namibia nc 1 Nya Kaledonien ne 1 Niger nf 1 Norfolkn ng 1 Nigeria ni 3 Nicaragua nl 2 Nederlnderna no 2 Norge np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Nya Zeeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Franska Polynesien pg 3 Papua Nya Guinea ph 3 Filippinerna pk 3 Pakistan pl 3 Polen pm 1 Sankt Pierre och Miquelon pn 1 Pitcairnn pr 1 Puerto Rico ps 3 Palestinska territoriet pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Rumnien ru 2 Ryssland rw 1 Rwanda sa 3 Saudiarabien sb 1 Solomonarna sc 1 Seychellerna sd 1 Sudan se 2 Sverige sg 3 Singapore sh 1 Sankt Helena si 2 Slovenien sj 1 Svalbard och Jan Mayen sk 2 Slovakien sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Surinam st 1 Sankt Tome och Principe su 2 F.d. Sovjetunionen sv 3 El Salvador sy 1 Syrien sz 1 Swaziland tc 1 Turks- och Caicosarna td 1 Tchad tf 1 Franska sdra territorierna tg 1 Togo th 3 Thailand tj 1 Tadjikistan tk 1 Tokelau tl 1 sttimor tm 1 Turkmenistan tn 1 Tunisien to 1 Tonga tp 1 sttimor tr 3 Turkiet tt 3 Trinidad och Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraina ug 3 Uganda uk 3 Storbritannien um 1 USAs yttre ar us 4 USA uy 3 Uruguay uz 1 Uzbekistan va 1 Vatikanstaten vc 1 Sankt Vincent och Grenadinerna ve 3 Venezuela vg 1 Brittiska Jungfruarna vi 1 Jungfruarna vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis- och Futunaarna ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavien za 3 Sydafrika zm 1 Zambia zr 1 Demokratiska republiken Kongo zw 3 Zimbabwe analog-6.0/lang/si.lng0000644000175000017500000003263610161303541015000 0ustar sret1sret100000000000000## Slovenian language file for analog 6.0. ## May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. ned pon tor sre et pet sob jan feb mar apr maj jun jul avg sep okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" teden od: leto ## Quarter of a year etrtletje mesec dan dni ura minuta minut sekunda sekund(e) byte bytov ## ?bytes represents kbytes, Mbytes etc. ?bytov zahtevek zahtevki(ov) datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum ura as prvi datum prva ura zadnji obisk zadnji datum datoteka datotek(e) gostitelj gostitelji(ev) virtualni gostitelj virtualni gostitelji(ev) imenik imenikov domena domen(e) organizacija organizacije podaljek podaljki URL URL-ji brskalnik brskalniki OS OS ## (= operating system, operating systems) velikost iskalni niz iskalni nizi spletno podroje spletna podroja uporabnik uporabniki(ov) statusna koda statusne kode Statistika spletnega strenika ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sploni povzetek ## The time reports, plus "busiest" strings (at the bottom of each report) Poroilo po letih Leto z najve obiski: Poroilo po etrtletjih etrtletje z najve obiski: Poroilo po mesecih Mesec z najve obiski: Poroilo po tednih Teden z najve obiski: teden od Povzetek po dnevih Poroilo po dnevih Dan z najve obiski: Poroilo po urah Povzetek po urah Povzetek po uri tedna Ura z najve obiski: Poroilo po etrt ure Povzetek po etrt ure etrt ure z najve obiskov: Poroilo po skupinah po pet minut Povzetek po petih minutah Pet minut z najve obiski: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Poroilo po gostiteljih gostitelja gostitelji(ev) m Poroilo o preusmeritvah gostiteljev gostitelj gostiteljev m Poroilo o neuspehih gostiteljev gostitelj gostiteljev m Poroilo po imenikih imenik imeniki m Poroilo po vrstah datotek podaljek podaljki m Poroilo po zahtevkih datoteka datoteke f Poroilo o preusmeritveh (redirekciji) datoteka datoteke f Poroilo o napakah datoteka datoteke f Poroilo po straneh, od koder so prili URL naslov URL naslovi m Poroilo po spletnih podrojih, od koder so prili spletno podroje spletna podroja n Poroilo o preusmerjenih zahtevkih URL naslov URL naslovi m Poroilo o neuspelih preusmerjenih zahtevkih URL naslov URL naslovi m Poroilo o povpraevanju povpraevanje povpraevanja n Poroilo o povpraevanju z besedami povpreevalna beseda povpraevalne besede n Poroilo o internem povpraevanju povpraevanje povpraevanja n Poroilo o internem povpraevanju z besedami povpraevalna beseda povpraevalne besede f Poroilo po virtualnih gostiteljih virtualni gostitelj virtualni gostitelji m Poroilo o preusmeritvah virtualnih gostiteljev virtualni gostitelj virtualni gostitelji m Poroilo o neuspehih virtualnih gostiteljev virtualni gostitelj virtualni gostitelji m Poroilo po uporabnikih uporabnik uporabniki(ov) m Poroilo o preusmerjenih uporabnikih uporabnik uporabniki(ov) m Poroilo o neuspelih uporabnikih uporabnik uporabniki(ov) m Povzetek po brskalnikih brskalnik brskalniki(ov) m Poroilo po brskalnikih brskalnik brskalniki(ov) m Poroilo operacijskega sistema operacijski sistem operacijski sistemi m Poroilo po domenah domena domene f Poroilo o organizaciji organizacija organizacije f Poroilo o statusu posredovanih strani oznaka statusa oznake statusa m Poroilo o procesnem asu Poroilo po velikosti datotek ## Used at the bottom of the report Analizo opravil as dela Manj kot 1 ## Used in the time reports Vsaka enota predstavlja ali manji dele zahtevek za stran zahtevkov za stran ## Used at the bottom of each non-time report: need m, f & n genders nenavedeno nenavedeno nenavedeno ## Used on the pie charts: again need m, f & n genders * * Drugo ## Used at the top of the report Datum obdelave: Analizirani so zahtevki od do ## Used in the General Summary Uspenih zahtevkov (skupaj) Povpreno uspenih zahtevkov dnevno Uspenih zahtevkov za strani (skupaj) Povpreno uspenih zahtevkov za strani dnevno Vrstice v log datoteki brez oznake statusa Neuspeni zahtevki Preusmerjeni zahtevki Zahtevki z oznako "informational status" tevilo posredovanih strani na drugih strenikih tevilo posredovanih drugih strenikov Okvarjene vrstice v log datoteki Neeljeni vnosi v log datoteki Celoten obseg prenesenih podatkov Povpreno tevilo prenesenih podatkov dnevno tevilke v oklepajih se nanaajo na 7 dni do zadnjih 7 dni Pojdi na Zaetek ## Some special phrases for particular reports. [nereene tevilne adrese] [nepodana domena] [neznana domena] [glavni imenik] [ni imenika] [ni podaljka] [imeniki] Neznani Windows Drugi Unix Roboti OS neznan ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) t.zaht. ted.t.zaht. % zaht. % ted.zaht. strani ted.strani % strani % ted.strani bytov ?bytov ted.bytov ted.?bytov % bytov % ted.bytov t. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Izpisani prvi Izpisane prve Izpisani prvi %s Izpisani prvi %d %s Izpisane prve %d %s Izpisani prvi %d %s Izpisani %s Izpisane %s Izpisani %s ## "by" in the phrase "listing the top 3 files BY number of requests" po ## All requests WITH AT LEAST 10 requests z vsaj ## Different ways of doing floors zahtevek v zadnjih 7. dnevih zahtevkov v zadnjih 7. dnevih zahtevek za stran v zadnjih 7. dnevih zahtevkov za strani v zadnjih 7. dnevih preusmerjeni zahtevek preusmerjeni zahtevki preusmerjeni zahtevek v zadnjih 7. dnevih preusmerjeni zahtevki v zadnjih 7. dnevih neuspeni zahtevek neuspeni zahtevki neuspeni zahtevek v zadnjih 7. dnevih neuspeni zahtevki v zadnjih 7. dnevih % prometa % prometa v zadnjih 7. dnevih % od najvejega obsega prometa % od najvejega obsega prometa v zadnjih 7. dnevih byte prometa bytov prometa ## ?bytes represents kbytes, Mbytes etc. ?bytov prometa byte prometa v zadnjih 7. dnevih bytov prometa v zadnjih 7. dnevih ?bytov prometa v zadnjih 7. dnevih zahtevanih od s preusmerjenimi zahtevki od z neuspenimi zahtevki od s prvim zahtevkom od s prvim preusmerjenim zahtevkom od s prvim neuspenim zahtevkom od ## Now "sorted by": again, in m, f & n (only needed in plural though) razporejeni po razporejene po razporejeni po ## Used at the top of each report To poroilo vsebuje podatke iz ## Used in pie charts Rezine so narisane z ## different ways of sorting obsegu prometa obsegu prometa v zadnjih 7. dnevih % zahtevkov % zahtevkov v zadnjih 7. dnevih % od najvejega tevila zahtevkov % od najvejega tevila zahtevkov v zadnjih 7. dnevih tevilu zahtevkov tevilu zahtevkov v zadnjih 7. dnevih % zahtevkov za strani % zahtevkov za strani v zadnjih 7. dnevih % od najvejega tevila zahtevkov za strani % od najvejega tevila zahtevkov za strani v zadnjih 7. dnevih tevilu zahtevkov za strani tevilu zahtevkov za strani v zadnjih 7. dnevih % od preusmerjenih zahtevkov % od preusmerjenih zahtevkov v zadnjih 7. dnevih % od najvejega tevila preusmerjenih zahtevkov % od najvejega tevila preusmerjenih zahtevkov v zadnjih 7. dnevih tevilu preusmerjenih zahtevkov tevilu preusmerjenih zahtevkov v zadnjih 7. dnevih % od neuspenih zahtevkov % od neuspenih zahtevkov v zadnjih 7. dnevih % od najvejega tevila neuspenih zahtevkov % od najvejega tevila neuspenih zahtevkov v zadnjih 7. dnevih tevilu neuspenih zahtevkov tevilu neuspenih zahtevkov v zadnjih 7. dnevih asu zadnjega zahtevka asu zadnjega preusmerjenega zahtevka asu zadnjega neuspenega zahtevka asu prvega zahtevka asu prvega preusmerjenega zahtevka asu prvega neuspenega zahtevka ## 3 other ways of sorting in m, f, & n razporejeni po abecedi razporejene po abecedi razporejeno po abecedi razporejeni numerino razporejene numerino razporejeno numerino nerazporejeni nerazporejene nerazporejeno ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dopoldan popoldan ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d. %m. %Y %H.%n ## "Program started at" and "Analysed requests from" %d. %m. %Y ob %H.%n ## In Daily Report %d. %m. %y ## In Daily Summary %w ## In Hourly Report %d. %m. %y %H.%n%x%I.%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d. %m. %y %H.%n%x%I.%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m. %y ## In Monthly Report %m. %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m. %y ## The date & time (D) column in non-time reports %d. %m. %y ob %H.%n ## In non-time reports: "including all files with requests since [date]" %d. %m. %y %H.%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Nadaljuj z zahtevo 101 Pretikanje protokolov 1xx [Informacije] 200 V redu 201 Narejeno 202 Sprejeto 203 Informacija ni izvirna 204 Ni vsebine 205 Poisti dokument 206 Delna vsebina 2xx [Uspehi] 300 Ve izbir 301 Stalno premaknjen dokument 302 Dokument najden drugje 303 Poglej ostalo dokumentacijo 304 Nespremenjeno od zadnjega zahtevka 305 Uporabi proxy 306 Pretikanje proxy-ja 307 Zaasno premaknjen dokument 3xx [Preusmeritev] 400 Neveljavna zahteva 401 Neavtorizirano 402 Zahtevano plailo 403 Dostop zavrnjen 404 Dokument ni najden 405 Nedovoljena metoda 406 Dokument ni veljaven za klienta 407 Zahtevana izvirnost Proxy-ja 408 Zahteva je potekla 409 Zahteva v sporu s sredstvi 410 Dokument za stalno odstranjen 411 Zahtevana dolina 412 Predpogoj je spodletel 413 Zahteva je predolga 414 Zahtevano ime datoteke je predolgo 415 Ne podpira tipa datoteke 416 Zahtevan interval neveljaven 417 Priakovanja spodletela 4xx [Razline klient/uporabnik napake] 500 Notranja napaka pri procesorju 501 Nepodpiranje zahtevanega tipa 502 Napaka na serverju 503 Usluga trenutno nedosegljiva 504 Gateway je potekel 505 Verzija HTTP ni podprta 506 Preusmeritev spodletela 5xx [Napake na serverju] xxx [Neznan] analog-6.0/lang/si1.lng0000644000175000017500000003264010161303541015054 0ustar sret1sret100000000000000## Slovenian language file for analog 6.0. ## May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1250 ## Abbreviations for the day and month names. ned pon tor sre et pet sob jan feb mar apr maj jun jul avg sep okt nov dec ## Next some standard common words. ## Abbreviation for "week beginning" teden od: leto ## Quarter of a year etrtletje mesec dan dni ura minuta minut sekunda sekund(e) byte bytov ## ?bytes represents kbytes, Mbytes etc. ?bytov zahtevek zahtevki(ov) datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum ura as prvi datum prva ura zadnji obisk zadnji datum datoteka datotek(e) gostitelj gostitelji(ev) virtualni gostitelj virtualni gostitelji(ev) imenik imenikov domena domen(e) organizacija organizacije podaljek podaljki URL URL-ji brskalnik brskalniki OS OS ## (= operating system, operating systems) velikost iskalni niz iskalni nizi spletno podroje spletna podroja uporabnik uporabniki(ov) statusna koda statusne kode Statistika spletnega strenika ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Sploni povzetek ## The time reports, plus "busiest" strings (at the bottom of each report) Poroilo po letih Leto z najve obiski: Poroilo po etrtletjih etrtletje z najve obiski: Poroilo po mesecih Mesec z najve obiski: Poroilo po tednih Teden z najve obiski: teden od Povzetek po dnevih Poroilo po dnevih Dan z najve obiski: Poroilo po urah Povzetek po urah Povzetek po uri tedna Ura z najve obiski: Poroilo po etrt ure Povzetek po etrt ure etrt ure z najve obiskov: Poroilo po skupinah po pet minut Povzetek po petih minutah Pet minut z najve obiski: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Poroilo po gostiteljih gostitelja gostitelji(ev) m Poroilo o preusmeritvah gostiteljev gostitelj gostiteljev m Poroilo o neuspehih gostiteljev gostitelj gostiteljev m Poroilo po imenikih imenik imeniki m Poroilo po vrstah datotek podaljek podaljki m Poroilo po zahtevkih datoteka datoteke f Poroilo o preusmeritveh (redirekciji) datoteka datoteke f Poroilo o napakah datoteka datoteke f Poroilo po straneh, od koder so prili URL naslov URL naslovi m Poroilo po spletnih podrojih, od koder so prili spletno podroje spletna podroja n Poroilo o preusmerjenih zahtevkih URL naslov URL naslovi m Poroilo o neuspelih preusmerjenih zahtevkih URL naslov URL naslovi m Poroilo o povpraevanju povpraevanje povpraevanja n Poroilo o povpraevanju z besedami povpreevalna beseda povpraevalne besede n Poroilo o internem povpraevanju povpraevanje povpraevanja n Poroilo o internem povpraevanju z besedami povpraevalna beseda povpraevalne besede f Poroilo po virtualnih gostiteljih virtualni gostitelj virtualni gostitelji m Poroilo o preusmeritvah virtualnih gostiteljev virtualni gostitelj virtualni gostitelji m Poroilo o neuspehih virtualnih gostiteljev virtualni gostitelj virtualni gostitelji m Poroilo po uporabnikih uporabnik uporabniki(ov) m Poroilo o preusmerjenih uporabnikih uporabnik uporabniki(ov) m Poroilo o neuspelih uporabnikih uporabnik uporabniki(ov) m Povzetek po brskalnikih brskalnik brskalniki(ov) m Poroilo po brskalnikih brskalnik brskalniki(ov) m Poroilo operacijskega sistema operacijski sistem operacijski sistemi m Poroilo po domenah domena domene f Poroilo o organizaciji organizacija organizacije f Poroilo o statusu posredovanih strani oznaka statusa oznake statusa m Poroilo o procesnem asu Poroilo po velikosti datotek ## Used at the bottom of the report Analizo opravil as dela Manj kot 1 ## Used in the time reports Vsaka enota predstavlja ali manji dele zahtevek za stran zahtevkov za stran ## Used at the bottom of each non-time report: need m, f & n genders nenavedeno nenavedeno nenavedeno ## Used on the pie charts: again need m, f & n genders * * Drugo ## Used at the top of the report Datum obdelave: Analizirani so zahtevki od do ## Used in the General Summary Uspenih zahtevkov (skupaj) Povpreno uspenih zahtevkov dnevno Uspenih zahtevkov za strani (skupaj) Povpreno uspenih zahtevkov za strani dnevno Vrstice v log datoteki brez oznake statusa Neuspeni zahtevki Preusmerjeni zahtevki Zahtevki z oznako "informational status" tevilo posredovanih strani na drugih strenikih tevilo posredovanih drugih strenikov Okvarjene vrstice v log datoteki Neeljeni vnosi v log datoteki Celoten obseg prenesenih podatkov Povpreno tevilo prenesenih podatkov dnevno tevilke v oklepajih se nanaajo na 7 dni do zadnjih 7 dni Pojdi na Zaetek ## Some special phrases for particular reports. [nereene tevilne adrese] [nepodana domena] [neznana domena] [glavni imenik] [ni imenika] [ni podaljka] [imeniki] Neznani Windows Drugi Unix Roboti OS neznan ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) t.zaht. ted.t.zaht. % zaht. % ted.zaht. strani ted.strani % strani % ted.strani bytov ?bytov ted.bytov ted.?bytov % bytov % ted.bytov t. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n Izpisani prvi Izpisane prve Izpisani prvi %s Izpisani prvi %d %s Izpisane prve %d %s Izpisani prvi %d %s Izpisani %s Izpisane %s Izpisani %s ## "by" in the phrase "listing the top 3 files BY number of requests" po ## All requests WITH AT LEAST 10 requests z vsaj ## Different ways of doing floors zahtevek v zadnjih 7. dnevih zahtevkov v zadnjih 7. dnevih zahtevek za stran v zadnjih 7. dnevih zahtevkov za strani v zadnjih 7. dnevih preusmerjeni zahtevek preusmerjeni zahtevki preusmerjeni zahtevek v zadnjih 7. dnevih preusmerjeni zahtevki v zadnjih 7. dnevih neuspeni zahtevek neuspeni zahtevki neuspeni zahtevek v zadnjih 7. dnevih neuspeni zahtevki v zadnjih 7. dnevih % prometa % prometa v zadnjih 7. dnevih % od najvejega obsega prometa % od najvejega obsega prometa v zadnjih 7. dnevih byte prometa bytov prometa ## ?bytes represents kbytes, Mbytes etc. ?bytov prometa byte prometa v zadnjih 7. dnevih bytov prometa v zadnjih 7. dnevih ?bytov prometa v zadnjih 7. dnevih zahtevanih od s preusmerjenimi zahtevki od z neuspenimi zahtevki od s prvim zahtevkom od s prvim preusmerjenim zahtevkom od s prvim neuspenim zahtevkom od ## Now "sorted by": again, in m, f & n (only needed in plural though) razporejeni po razporejene po razporejeni po ## Used at the top of each report To poroilo vsebuje podatke iz ## Used in pie charts Rezine so narisane z ## different ways of sorting obsegu prometa obsegu prometa v zadnjih 7. dnevih % zahtevkov % zahtevkov v zadnjih 7. dnevih % od najvejega tevila zahtevkov % od najvejega tevila zahtevkov v zadnjih 7. dnevih tevilu zahtevkov tevilu zahtevkov v zadnjih 7. dnevih % zahtevkov za strani % zahtevkov za strani v zadnjih 7. dnevih % od najvejega tevila zahtevkov za strani % od najvejega tevila zahtevkov za strani v zadnjih 7. dnevih tevilu zahtevkov za strani tevilu zahtevkov za strani v zadnjih 7. dnevih % od preusmerjenih zahtevkov % od preusmerjenih zahtevkov v zadnjih 7. dnevih % od najvejega tevila preusmerjenih zahtevkov % od najvejega tevila preusmerjenih zahtevkov v zadnjih 7. dnevih tevilu preusmerjenih zahtevkov tevilu preusmerjenih zahtevkov v zadnjih 7. dnevih % od neuspenih zahtevkov % od neuspenih zahtevkov v zadnjih 7. dnevih % od najvejega tevila neuspenih zahtevkov % od najvejega tevila neuspenih zahtevkov v zadnjih 7. dnevih tevilu neuspenih zahtevkov tevilu neuspenih zahtevkov v zadnjih 7. dnevih asu zadnjega zahtevka asu zadnjega preusmerjenega zahtevka asu zadnjega neuspenega zahtevka asu prvega zahtevka asu prvega preusmerjenega zahtevka asu prvega neuspenega zahtevka ## 3 other ways of sorting in m, f, & n razporejeni po abecedi razporejene po abecedi razporejeno po abecedi razporejeni numerino razporejene numerino razporejeno numerino nerazporejeni nerazporejene nerazporejeno ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dopoldan popoldan ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %d. %m. %Y %H.%n ## "Program started at" and "Analysed requests from" %d. %m. %Y ob %H.%n ## In Daily Report %d. %m. %y ## In Daily Summary %w ## In Hourly Report %d. %m. %y %H.%n%x%I.%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d. %m. %y %H.%n%x%I.%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m. %y ## In Monthly Report %m. %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m. %y ## The date & time (D) column in non-time reports %d. %m. %y ob %H.%n ## In non-time reports: "including all files with requests since [date]" %d. %m. %y %H.%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Nadaljuj z zahtevo 101 Pretikanje protokolov 1xx [Informacije] 200 V redu 201 Narejeno 202 Sprejeto 203 Informacija ni izvirna 204 Ni vsebine 205 Poisti dokument 206 Delna vsebina 2xx [Uspehi] 300 Ve izbir 301 Stalno premaknjen dokument 302 Dokument najden drugje 303 Poglej ostalo dokumentacijo 304 Nespremenjeno od zadnjega zahtevka 305 Uporabi proxy 306 Pretikanje proxy-ja 307 Zaasno premaknjen dokument 3xx [Preusmeritev] 400 Neveljavna zahteva 401 Neavtorizirano 402 Zahtevano plailo 403 Dostop zavrnjen 404 Dokument ni najden 405 Nedovoljena metoda 406 Dokument ni veljaven za klienta 407 Zahtevana izvirnost Proxy-ja 408 Zahteva je potekla 409 Zahteva v sporu s sredstvi 410 Dokument za stalno odstranjen 411 Zahtevana dolina 412 Predpogoj je spodletel 413 Zahteva je predolga 414 Zahtevano ime datoteke je predolgo 415 Ne podpira tipa datoteke 416 Zahtevan interval neveljaven 417 Priakovanja spodletela 4xx [Razline klient/uporabnik napake] 500 Notranja napaka pri procesorju 501 Nepodpiranje zahtevanega tipa 502 Napaka na serverju 503 Usluga trenutno nedosegljiva 504 Gateway je potekel 505 Verzija HTTP ni podprta 506 Preusmeritev spodletela 5xx [Napake na serverju] xxx [Neznan] analog-6.0/lang/sk.lng0000644000175000017500000003222010161303541014767 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-2 ## Abbreviations for the day and month names. Ne Po Ut St t Pi So Jan Feb Mar Apr Mj Jn Jl Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" tde od rok ## Quarter of a year tvrrok mesiac de dn hod. minta min. sekunda s bajt bajtov ## ?bytes represents kbytes, Mbytes etc. ?bajtov poiadavku poiadaviek dtum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dtum as as prv dtum prv krt naposledy naposledy sbor sborov hostite hostiteov virtulny server virtulnych serverov adresr adresrov domna domn organizcia organizci prpona prpon URL URLs prehliada prehliadaov operan systm operanch systmov ## (= operating system, operating systems) vekos hadan frza hadanch frz web server web serverov uvate uvateov nvratov kd nvratovch kdov tatistika web servera ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Veobecn prehad ## The time reports, plus "busiest" strings (at the bottom of each report) Ron prehad Najrunej rok: tvrron prehad Najrunej tvrrok: Mesan prehad Najrunej mesiac: Tdenn prehad Najrunej tde: zanajci Denn shrn Denn prehad Najrunej de: Hodinov prehad Hodinov shrn Tdov shrn poda hodn Najrunejia hodina: tvrhodinov prehad tvrhodinov shrn Najrunejia tvrhodina: Pmintov prehad Pmintov shrn Najrunejch p mint: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Prehad hostiteov hostite hostiteov n Prehad presmerovan hostiteov hostite hostiteov n Prehad chbajcich hostiteov hostite hostiteov n Prehad adresrov adresr adresrov n Prehad typov sborov prpona prpon n Prehad poiadaviek sbor sborov n Prehad presmerovan sbor sborov n Prehad chb sbor sborov n Prehad referenci odkazujce URL odkazujcich URL n Prehad odkazujcich serverov odkazujci server odkazujcich serverov n Prehad presmerovanch referenci odkazovan URL odkazovanch URL n Prehad chybnch referenci odkazovan URL odkazovanch URL n Prehad vyhadvanch vrazov vraz vrazov n Prehad vyhadvanch slov hadan slovo hadanch slov n Prehad interne hadanch vrazov vraz vrazov n Prehad interne hadanch slov hadan slovo hadanch slov n Prehad virtulnych web serverov virtulny server virtulnych serverov n Prehad presmerovan virtulnych serverov virtulny server virtulnych serverov n Prehad chb virtulnych serverov virtulny server virtulnych serverov n Prehad uvateov uvate uvateov n Prehad presmerovan uvateov uvate uvateov n Prehad chb uvateov uvate uvateov n Shrn prehliadaov prehliada prehliadaov n Prehad prehliadaov prehliada prehliadaov n Prehad operanch systmov operan systm operanch systmov n Prehad domn domna domn n Prehad organizci organizcia organizci n Prehad nvratovch kdov nvratov kd nvratovch kdov n Prehad doby spracovania Prehad vekost sborov ## Used at the bottom of the report Tto analzu vytvoril Doba spracovania menej ako 1 ## Used in the time reports Kad dielik predstavuje alebo as poiadavka na strnku poiadaviek na strnku ## Used at the bottom of each non-time report: need m, f & n genders * * nezahrnut ## Used on the pie charts: again need m, f & n genders * * ostatn ## Used at the top of the report Program bol spusten v Analza sa vzahuje na obdobie od do ## Used in the General Summary spen poiadavky spen poiadavky v priemere za de spen poiadavky na strnky spen poiadavky na strnky v priemere za de Riadky logovacieho sboru bez stavovho kdu Nespen poiadavky Presmerovan poiadavky Poiadavky s informatvnym stavovm kdom Rozdielne poadovan sbory Rozdielne obslen servery Poruen riadky logovacieho sboru Neiaduce poloky logovacieho sboru Prenesen dta Prenesen dta v priemere za de daje v ztvorkch sa vzahuj na 7 dn koniacich poslednch 7 dn Prechod na Zaiatok ## Some special phrases for particular reports. [nerozoznan seln adresy] [domna neuveden] [neznma domna] [koreov adresr] [bez adresra] [bez prpony] [adresre] neznme Windows in UNIX roboty neznmy OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) po. po. za 7 dn % po. % po. za 7 dn str. str. za 7 dn % str. % str. za 7 dn bajtov ?bajtov bajtov za 7 dn ?bajtov za 7 dn % bajtov % bajtov za 7 dn . ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Zoznam prvch %s * * Zoznam prvch %d %s * * Zoznam %s ## "by" in the phrase "listing the top 3 files BY number of requests" poda ## All requests WITH AT LEAST 10 requests majcich aspo ## Different ways of doing floors poiadavka za poslednch 7 dn poiadaviek za poslednch 7 dn poiadavka na strnku za poslednch 7 dn poiadaviek na strnky za poslednch 7 dn presmerovan poiadavka presmerovanch poiadaviek presmerovan poiadavka za poslednch 7 dn presmerovanch poiadaviek za poslednch 7 dn nespen poiadavka nespench poiadaviek nespen poiadavka za poslednch 7 dn nespench poiadaviek za poslednch 7 dn % prenosu % prenosu za poslednch 7 dn % maximlneho mnostva prenesench dt % maximlneho mnostva prenesench dt za poslednch 7 dn bajtu prenosu bajtov prenosu ## ?bytes represents kbytes, Mbytes etc. ?bajtov prenosu bajtu prenosu za poslednch 7 dn bajtov prenosu za poslednch 7 dn ?bajtov prenosu za poslednch 7 dn poadovanch od s presmerovanou poiadavkou od s nespenou poiadavkou od s prvou poiadavkou s prvou presmerovanou poiadavkou od s prvou nespenou poiadavkou od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * zatrieden poda ## Used at the top of each report Tento prehad obsahuje daje od ## Used in pie charts Vseky s vykreslen poda ## different ways of sorting mnostva prenesench dt mnostva prenesench dt za poslednch 7 dn % poiadaviek % poiadaviek za poslednch 7 dn % maximlneho potu poiadaviek % maximlneho potu poiadaviek za poslednch 7 dn potu poiadaviek potu poiadaviek za poslednch 7 dn % poiadaviek na strnky % poiadaviek na strnky za poslednch 7 dn % maximlneho potu poiadaviek na strnky % maximlneho potu poiadaviek na strnky za poslednch 7 dn potu poiadaviek na strnky potu poiadaviek na strnky za poslednch 7 dn % presmerovanch poiadaviek % presmerovanch poiadaviek za poslednch 7 dn % maximlneho potu presmerovanch poiadaviek % maximlneho potu presmerovanch poiadaviek za poslednch 7 dn potu presmerovanch poiadaviek potu presmerovanch poiadaviek za poslednch 7 dn % nespench poiadaviek % nespench poiadaviek za poslednch 7 dn % maximlneho potu nespench poiadaviek % maximlneho potu nespench poiadaviek za poslednch 7 dn potu nespench poiadaviek potu nespench poiadaviek za poslednch 7 dn asu poslednej poiadavky asu poslednej presmerovanej poiadavky asu poslednej nespenej poiadavky asu prvej poiadavky asu prvej presmerovanej poiadavky asu prvej nespenej poiadavky ## 3 other ways of sorting in m, f, & n * * zatrieden abecedne * * zatrieden selne * * nezatrieden ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y, %H:%n ## "Program started at" and "Analysed requests from" %w, %D. %m %Y, %H:%n ## In Daily Report %d. %m '%y ## In Daily Summary %w ## In Hourly Report %d. %m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d. %m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m '%y ## The date & time (D) column in non-time reports %d. %m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [rzne informan] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [rzne uspen] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [rzne presmerovania] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [rzne chyby klienta] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [rzne chyby servera] xxx [neznme] analog-6.0/lang/sk1.lng0000644000175000017500000003222210161303541015052 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1250 ## Abbreviations for the day and month names. Ne Po Ut St t Pi So Jan Feb Mar Apr Mj Jn Jl Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" tde od rok ## Quarter of a year tvrrok mesiac de dn hod. minta min. sekunda s bajt bajtov ## ?bytes represents kbytes, Mbytes etc. ?bajtov poiadavku poiadaviek dtum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 dtum as as prv dtum prv krt naposledy naposledy sbor sborov hostite hostiteov virtulny server virtulnych serverov adresr adresrov domna domn organizcia organizci prpona prpon URL URLs prehliada prehliadaov operan systm operanch systmov ## (= operating system, operating systems) vekos hadan frza hadanch frz web server web serverov uvate uvateov nvratov kd nvratovch kdov tatistika web servera ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Veobecn prehad ## The time reports, plus "busiest" strings (at the bottom of each report) Ron prehad Najrunej rok: tvrron prehad Najrunej tvrrok: Mesan prehad Najrunej mesiac: Tdenn prehad Najrunej tde: zanajci Denn shrn Denn prehad Najrunej de: Hodinov prehad Hodinov shrn Tdov shrn poda hodn Najrunejia hodina: tvrhodinov prehad tvrhodinov shrn Najrunejia tvrhodina: Pmintov prehad Pmintov shrn Najrunejch p mint: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Prehad hostiteov hostite hostiteov n Prehad presmerovan hostiteov hostite hostiteov n Prehad chbajcich hostiteov hostite hostiteov n Prehad adresrov adresr adresrov n Prehad typov sborov prpona prpon n Prehad poiadaviek sbor sborov n Prehad presmerovan sbor sborov n Prehad chb sbor sborov n Prehad referenci odkazujce URL odkazujcich URL n Prehad odkazujcich serverov odkazujci server odkazujcich serverov n Prehad presmerovanch referenci odkazovan URL odkazovanch URL n Prehad chybnch referenci odkazovan URL odkazovanch URL n Prehad vyhadvanch vrazov vraz vrazov n Prehad vyhadvanch slov hadan slovo hadanch slov n Prehad interne hadanch vrazov vraz vrazov n Prehad interne hadanch slov hadan slovo hadanch slov n Prehad virtulnych web serverov virtulny server virtulnych serverov n Prehad presmerovan virtulnych serverov virtulny server virtulnych serverov n Prehad chb virtulnych serverov virtulny server virtulnych serverov n Prehad uvateov uvate uvateov n Prehad presmerovan uvateov uvate uvateov n Prehad chb uvateov uvate uvateov n Shrn prehliadaov prehliada prehliadaov n Prehad prehliadaov prehliada prehliadaov n Prehad operanch systmov operan systm operanch systmov n Prehad domn domna domn n Prehad organizci organizcia organizci n Prehad nvratovch kdov nvratov kd nvratovch kdov n Prehad doby spracovania Prehad vekost sborov ## Used at the bottom of the report Tto analzu vytvoril Doba spracovania menej ako 1 ## Used in the time reports Kad dielik predstavuje alebo as poiadavka na strnku poiadaviek na strnku ## Used at the bottom of each non-time report: need m, f & n genders * * nezahrnut ## Used on the pie charts: again need m, f & n genders * * ostatn ## Used at the top of the report Program bol spusten v Analza sa vzahuje na obdobie od do ## Used in the General Summary spen poiadavky spen poiadavky v priemere za de spen poiadavky na strnky spen poiadavky na strnky v priemere za de Riadky logovacieho sboru bez stavovho kdu Nespen poiadavky Presmerovan poiadavky Poiadavky s informatvnym stavovm kdom Rozdielne poadovan sbory Rozdielne obslen servery Poruen riadky logovacieho sboru Neiaduce poloky logovacieho sboru Prenesen dta Prenesen dta v priemere za de daje v ztvorkch sa vzahuj na 7 dn koniacich poslednch 7 dn Prechod na Zaiatok ## Some special phrases for particular reports. [nerozoznan seln adresy] [domna neuveden] [neznma domna] [koreov adresr] [bez adresra] [bez prpony] [adresre] neznme Windows in UNIX roboty neznmy OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) po. po. za 7 dn % po. % po. za 7 dn str. str. za 7 dn % str. % str. za 7 dn bajtov ?bajtov bajtov za 7 dn ?bajtov za 7 dn % bajtov % bajtov za 7 dn . ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Zoznam prvch %s * * Zoznam prvch %d %s * * Zoznam %s ## "by" in the phrase "listing the top 3 files BY number of requests" poda ## All requests WITH AT LEAST 10 requests majcich aspo ## Different ways of doing floors poiadavka za poslednch 7 dn poiadaviek za poslednch 7 dn poiadavka na strnku za poslednch 7 dn poiadaviek na strnky za poslednch 7 dn presmerovan poiadavka presmerovanch poiadaviek presmerovan poiadavka za poslednch 7 dn presmerovanch poiadaviek za poslednch 7 dn nespen poiadavka nespench poiadaviek nespen poiadavka za poslednch 7 dn nespench poiadaviek za poslednch 7 dn % prenosu % prenosu za poslednch 7 dn % maximlneho mnostva prenesench dt % maximlneho mnostva prenesench dt za poslednch 7 dn bajtu prenosu bajtov prenosu ## ?bytes represents kbytes, Mbytes etc. ?bajtov prenosu bajtu prenosu za poslednch 7 dn bajtov prenosu za poslednch 7 dn ?bajtov prenosu za poslednch 7 dn poadovanch od s presmerovanou poiadavkou od s nespenou poiadavkou od s prvou poiadavkou s prvou presmerovanou poiadavkou od s prvou nespenou poiadavkou od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * zatrieden poda ## Used at the top of each report Tento prehad obsahuje daje od ## Used in pie charts Vseky s vykreslen poda ## different ways of sorting mnostva prenesench dt mnostva prenesench dt za poslednch 7 dn % poiadaviek % poiadaviek za poslednch 7 dn % maximlneho potu poiadaviek % maximlneho potu poiadaviek za poslednch 7 dn potu poiadaviek potu poiadaviek za poslednch 7 dn % poiadaviek na strnky % poiadaviek na strnky za poslednch 7 dn % maximlneho potu poiadaviek na strnky % maximlneho potu poiadaviek na strnky za poslednch 7 dn potu poiadaviek na strnky potu poiadaviek na strnky za poslednch 7 dn % presmerovanch poiadaviek % presmerovanch poiadaviek za poslednch 7 dn % maximlneho potu presmerovanch poiadaviek % maximlneho potu presmerovanch poiadaviek za poslednch 7 dn potu presmerovanch poiadaviek potu presmerovanch poiadaviek za poslednch 7 dn % nespench poiadaviek % nespench poiadaviek za poslednch 7 dn % maximlneho potu nespench poiadaviek % maximlneho potu nespench poiadaviek za poslednch 7 dn potu nespench poiadaviek potu nespench poiadaviek za poslednch 7 dn asu poslednej poiadavky asu poslednej presmerovanej poiadavky asu poslednej nespenej poiadavky asu prvej poiadavky asu prvej presmerovanej poiadavky asu prvej nespenej poiadavky ## 3 other ways of sorting in m, f, & n * * zatrieden abecedne * * zatrieden selne * * nezatrieden ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y, %H:%n ## "Program started at" and "Analysed requests from" %w, %D. %m %Y, %H:%n ## In Daily Report %d. %m '%y ## In Daily Summary %w ## In Hourly Report %d. %m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d. %m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m '%y ## The date & time (D) column in non-time reports %d. %m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [rzne informan] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [rzne uspen] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [rzne presmerovania] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [rzne chyby klienta] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [rzne chyby servera] xxx [neznme] analog-6.0/lang/sk1a.lng0000644000175000017500000003222510161303541015216 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Ned Pon Uto Str Stv Pia Sob Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" tyzden od rok ## Quarter of a year stvrtrok mesiac den dni hod. minuta min. sekunda s bajt bajtov ## ?bytes represents kbytes, Mbytes etc. ?bajtov poziadavku poziadaviek datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum cas cas prvy datum prvy krat naposledy naposledy subor suborov hostitel hostitelov virtualny server virtualnych serverov adresar adresarov domena domen organizacia organizacii pripona pripon URL URLs prehliadac prehliadacov operacny system operacnych systemov ## (= operating system, operating systems) velkost hladana fraza hladanych fraz web server web serverov uzivatel uzivatelov navratovy kod navratovych kodov Statistika web servera ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Vseobecny prehlad ## The time reports, plus "busiest" strings (at the bottom of each report) Rocny prehlad Najrusnejsi rok: Stvrtrocny prehlad Najrusnejsi stvrtrok: Mesacny prehlad Najrusnejsi mesiac: Tyzdenny prehlad Najrusnejsi tyzden: zacinajuci Denny suhrn Denny prehlad Najrusnejsi den: Hodinovy prehlad Hodinovy suhrn Tyzdnovy suhrn podla hodin Najrusnejsia hodina: Stvrthodinovy prehlad Stvrthodinovy suhrn Najrusnejsia stvrthodina: Patminutovy prehlad Patminutovy suhrn Najrusnejsich pat minut: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Prehlad hostitelov hostitel hostitelov n Prehlad presmerovani hostitelov hostitel hostitelov n Prehlad chybajucich hostitelov hostitel hostitelov n Prehlad adresarov adresar adresarov n Prehlad typov suborov pripona pripon n Prehlad poziadaviek subor suborov n Prehlad presmerovani subor suborov n Prehlad chyb subor suborov n Prehlad referencii odkazujuce URL odkazujucich URL n Prehlad odkazujucich serverov odkazujuci server odkazujucich serverov n Prehlad presmerovanych referencii odkazovane URL odkazovanych URL n Prehlad chybnych referencii odkazovane URL odkazovanych URL n Prehlad vyhladavanych vyrazov vyraz vyrazov n Prehlad vyhladavanych slov hladane slovo hladanych slov n Prehlad interne hladanych vyrazov vyraz vyrazov n Prehlad interne hladanych slov hladane slovo hladanych slov n Prehlad virtualnych web serverov virtualny server virtualnych serverov n Prehlad presmerovani virtualnych serverov virtualny server virtualnych serverov n Prehlad chyb virtualnych serverov virtualny server virtualnych serverov n Prehlad uzivatelov uzivatel uzivatelov n Prehlad presmerovani uzivatelov uzivatel uzivatelov n Prehlad chyb uzivatelov uzivatel uzivatelov n Suhrn prehliadacov prehliadac prehliadacov n Prehlad prehliadacov prehliadac prehliadacov n Prehlad operacnych systemov operacny system operacnych systemov n Prehlad domen domena domen n Prehlad organizacii organizacia organizacii n Prehlad navratovych kodov navratovy kod navratovych kodov n Prehlad doby spracovania Prehlad velkosti suborov ## Used at the bottom of the report Tato analyzu vytvoril Doba spracovania menej ako 1 ## Used in the time reports Kazdy dielik predstavuje alebo cast poziadavka na stranku poziadaviek na stranku ## Used at the bottom of each non-time report: need m, f & n genders * * nezahrnute ## Used on the pie charts: again need m, f & n genders * * ostatne ## Used at the top of the report Program bol spusteny v Analyza sa vztahuje na obdobie od do ## Used in the General Summary Uspesne poziadavky Uspesne poziadavky v priemere za den Uspesne poziadavky na stranky Uspesne poziadavky na stranky v priemere za den Riadky logovacieho suboru bez stavoveho kodu Neuspesne poziadavky Presmerovane poziadavky Poziadavky s informativnym stavovym kodom Rozdielne pozadovane subory Rozdielne obsluzene servery Porusene riadky logovacieho suboru Neziaduce polozky logovacieho suboru Prenesene data Prenesene data v priemere za den udaje v zatvorkach sa vztahuju na 7 dni konciacich poslednych 7 dni Prechod na Zaciatok ## Some special phrases for particular reports. [nerozoznane ciselne adresy] [domena neuvedena] [neznama domena] [korenovy adresar] [bez adresara] [bez pripony] [adresare] nezname Windows iny UNIX roboty neznamy OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) poz. poz. za 7 dni % poz. % poz. za 7 dni str. str. za 7 dni % str. % str. za 7 dni bajtov ?bajtov bajtov za 7 dni ?bajtov za 7 dni % bajtov % bajtov za 7 dni c. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Zoznam prvych %s * * Zoznam prvych %d %s * * Zoznam %s ## "by" in the phrase "listing the top 3 files BY number of requests" podla ## All requests WITH AT LEAST 10 requests majucich aspon ## Different ways of doing floors poziadavka za poslednych 7 dni poziadaviek za poslednych 7 dni poziadavka na stranku za poslednych 7 dni poziadaviek na stranky za poslednych 7 dni presmerovana poziadavka presmerovanych poziadaviek presmerovana poziadavka za poslednych 7 dni presmerovanych poziadaviek za poslednych 7 dni neuspesna poziadavka neuspesnych poziadaviek neuspesna poziadavka za poslednych 7 dni neuspesnych poziadaviek za poslednych 7 dni % prenosu % prenosu za poslednych 7 dni % maximalneho mnozstva prenesenych dat % maximalneho mnozstva prenesenych dat za poslednych 7 dni bajtu prenosu bajtov prenosu ## ?bytes represents kbytes, Mbytes etc. ?bajtov prenosu bajtu prenosu za poslednych 7 dni bajtov prenosu za poslednych 7 dni ?bajtov prenosu za poslednych 7 dni pozadovanych od s presmerovanou poziadavkou od s neuspesnou poziadavkou od s prvou poziadavkou s prvou presmerovanou poziadavkou od s prvou neuspesnou poziadavkou od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * zatriedeny podla ## Used at the top of each report Tento prehlad obsahuje udaje od ## Used in pie charts Vyseky su vykreslene podla ## different ways of sorting mnozstva prenesenych dat mnozstva prenesenych dat za poslednych 7 dni % poziadaviek % poziadaviek za poslednych 7 dni % maximalneho poctu poziadaviek % maximalneho poctu poziadaviek za poslednych 7 dni poctu poziadaviek poctu poziadaviek za poslednych 7 dni % poziadaviek na stranky % poziadaviek na stranky za poslednych 7 dni % maximalneho poctu poziadaviek na stranky % maximalneho poctu poziadaviek na stranky za poslednych 7 dni poctu poziadaviek na stranky poctu poziadaviek na stranky za poslednych 7 dni % presmerovanych poziadaviek % presmerovanych poziadaviek za poslednych 7 dni % maximalneho poctu presmerovanych poziadaviek % maximalneho poctu presmerovanych poziadaviek za poslednych 7 dni poctu presmerovanych poziadaviek poctu presmerovanych poziadaviek za poslednych 7 dni % neuspesnych poziadaviek % neuspesnych poziadaviek za poslednych 7 dni % maximalneho poctu neuspesnych poziadaviek % maximalneho poctu neuspesnych poziadaviek za poslednych 7 dni poctu neuspesnych poziadaviek poctu neuspesnych poziadaviek za poslednych 7 dni casu poslednej poziadavky casu poslednej presmerovanej poziadavky casu poslednej neuspesnej poziadavky casu prvej poziadavky casu prvej presmerovanej poziadavky casu prvej neuspesnej poziadavky ## 3 other ways of sorting in m, f, & n * * zatriedeny abecedne * * zatriedeny ciselne * * nezatriedeny ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y, %H:%n ## "Program started at" and "Analysed requests from" %w, %D. %m %Y, %H:%n ## In Daily Report %d. %m '%y ## In Daily Summary %w ## In Hourly Report %d. %m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d. %m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m '%y ## The date & time (D) column in non-time reports %d. %m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [rozne informacne] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [rozne uspesne] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [rozne presmerovania] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [rozne chyby klienta] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [rozne chyby servera] xxx [nezname] analog-6.0/lang/sk1adesc.txt0000644000175000017500000001112110161303541016104 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # # Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: US-ASCII # # Yearly Report Tento prehlad zobrazuje aktivitu v kazdom roku. # Quarterly Report Tento prehlad zobrazuje aktivitu v kazdom stvrtroku. # Monthly Report Tento prehlad zobrazuje aktivitu v kazdom mesiaci. # Weekly Report Tento prehlad zobrazuje aktivitu v kazdom tyzdni. # Daily Report Tento prehlad zobrazuje aktivitu v kazdom dni. # Hourly Report Tento prehlad zobrazuje aktivitu v kazdej hodine. # Quarter-Hour Report Tento prehlad zobrazuje aktivitu v kazdom stvrthodinovom intervale. # Five-Minute Report Tento prehlad zobrazuje aktivitu v kazdom 5-minutovom intervale. # Daily Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdy den tyzdna, suhrnne pre vsetky tyzdne v prehlade. # Hourly Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdu hodinu dna, suhrnne pre vsetky dni v prehlade. # Hour of the Week Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdu hodinu tyzdna, suhrnne pre vsetky tyzdne v prehlade. # Quarter-Hour Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdy stvrthodinovy interval dna, suhrnne pre vsetky dni v prehlade. # Five-Minute Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdy 5-minutovy interval dna, suhrnne pre vsetky dni v prehlade. # General Summary Tento prehlad obsahuje celkove statistiky. # Request Report Tento prehlad zobrazuje pozadovane subory na strankach. # Redirection Report Tento prehlad zobrazuje subory, ktore sposobili presmerovanie poziadaviek na iny subor. (Zvycajne adresare s chybajucim lomitkom na konci alebo skripty, ktore vnutili presmerovanie.) # Failure Report Tento prehlad zobrazuje subory, ktore sposobili zlyhanie, napriklad nenajdene subory. # File Type Report Tento prehlad zobrazuje pripony vyziadanych suborov. # Directory Report Tento prehlad zobrazuje adresare, z ktorych boli vyziadane subory. (Diagramy pre kazdy adresar obsahuju vsetky jeho podadresare.) # Host Report Tento prehlad zobrazuje pocitace, ktore si vyziadali subory. # Host Redirection Report Tento prehlad zobrazuje pocitace, ktore boli presmerovane na iny subor. # Host Failure Report Tento prehlad zobrazuje pocitace, ktore narazili na zlyhania poziadaviek. # Domain Report Tento prehlad zobrazuje krajiny pocitacov, ktore si vyziadali subory. # Referrer Report Tento prehlad zobrazuje referencie (odkial ludia nasledovali odkazy, alebo stranky, ktore obsahuju obrazky z tychto stranok). # Referring Site Report Tento prehlad zobrazuje servery, z ktorych ludia nasledovali odkazy. # Redirected Referrer Report Tento prehlad zobrazuje referencie, ktore sposobili presmerovane poziadavky. # Failed Referrer Report Tento prehlad zobrazuje referencie, obsahujuce chybne odkazy na stranku. # Browser Report Tento prehlad zobrazuje, ktore prehliadace pouzivaju navstevnici, spolu s podrobnostami. # Virtual Host Report Tento prehlad zobrazuje aktivitu kazdej virtualnej domeny na strankach. # Virtual Host Redirection Report Tento prehlad zobrazuje presmerovane poziadavky na kazdu virtualnu domenu. # Virtual Host Failure Report Tento prehlad zobrazuje neuspesne poziadavky na kazdu virtualnu domenu. # User Report Tento prehlad zobrazuje uzivatelov, ktori si vyziadali subory, ak boli autentifikovani alebo mozu byt identifikovani cez cookies. # User Redirection Report Tento prehlad zobrazuje uzivatelov, ktori boli presmerovani na iny subor. # User Failure Report Tento prehlad zobrazuje uzivatelov, ktori narazili na neuspesne poziadavky. # Organisation Report Tento prehlad zobrazuje organizacie pocitacov, ktore si vyziadali subory. # Search Query Report Tento prehlad zobrazuje, ktore vyrazy ludia zadali do vyhladavacov, aby nasli tieto stranky. # Search Word Report Tento prehlad zobrazuje, ktore slova ludia zadali do vyhladavacov, aby nasli tieto stranky. # Internal Search Query Report Tento prehlad zobrazuje, ktore vyrazy ludia zadali do skriptov na tychto strankach. # Internal Search Word Report Tento prehlad zobrazuje, ktore slova ludia zadali do skriptov na tychto strankach. # Browser Summary Tento prehlad zobrazuje, ktore prehliadace pouzivaju navstevnici. # Operating System Report Tento prehlad zobrazuje, ktore operacne systemy pouzivaju navstevnici. # File Size Report Tento prehlad zobrazuje velkosti suborov. # Status Code Report Tento prehlad zobrazuje stavovy kod HTTP pre vsetky poziadavky. # Processing Time Report Tento prehlad zobrazuje cas potrebny na vykonanie uspesnych poziadaviek. analog-6.0/lang/sk1adom.tab0000644000175000017500000001203110161303541015675 0ustar sret1sret100000000000000# Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: US-ASCII # Generic and Infrastructure domains aero 2 letecka doprava arpa 1 Arpanet biz 2 firmy com 2 komercne organizacie coop 2 kooperacie edu 2 vzdelavacie institucie USA gov 2 vlada USA info 2 informacne int 2 medzinarodne organizacie mil 2 armada USA museum 2 muzea name 3 jednotlivci net 2 sietove organizacie org 2 neziskove organizacie pro 3 profesionalne # Country code domains ac 1 ostrov Ascension ad 2 Andorra ae 3 Spojene Arabske emiraty af 1 Afganistan ag 2 Antigua a Barbuda ai 1 Anguilla al 1 Albansko am 2 Armensko an 1 Holandske Antily ao 1 Angola aq 1 Antarktida ar 3 Argentina as 1 Americka Samoa at 3 Rakusko au 3 Australia aw 1 Aruba az 1 Azerbajdzan ba 3 Bosna a Hercegovina bb 2 Barbados bd 1 Banglades be 3 Belgicko bf 1 Burkina Faso bg 2 Bulharsko bh 1 Bahrajn bi 1 Burundi bj 1 Benin bm 1 Bermudy bn 1 Brunej bo 3 Bolivia br 3 Brazilia bs 1 Bahamy bt 1 Bhutan bv 1 ostrov Bouvet bw 1 Botswana by 1 Bielorusko bz 1 Belize ca 3 Kanada cc 1 Kokosove ostrovy cd 1 Konzska demokraticka republika cf 1 Stredoafricka republika cg 1 Kongo ch 2 Svajciarsko ci 1 Pobrezie Slonoviny ck 1 Cookove ostrovy cl 2 Chile cm 1 Kamerun cn 3 Cina co 3 Kolumbia cr 3 Kostarika cu 2 Kuba cv 1 Kapverdy cx 2 Vianocny ostrov cy 3 Cyprus cz 2 Cesko de 2 Nemecko dj 1 Dzibutsko dk 2 Dansko dm 2 Dominika do 3 Dominikanska republika dz 1 Alzirsko ec 3 Ekvador ee 2 Estonsko eg 3 Egypt eh 1 Zapadna Sahara er 1 Eritrea es 2 Spanielsko et 1 Eiopia fi 2 Finsko fj 3 Fidzi fk 1 Falklandy fm 1 Mikronezia fo 1 Faerske ostrovy fr 2 Francuzsko fx 1 Francuzsko (Europske uzemie) ga 1 Gabon gb 1 Velka Britania gd 1 Grenada ge 1 Gruzinsko gf 1 Francuzska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Gronsko gm 1 Gambia gn 1 Guinea gp 1 Guadelupe gq 1 Rovnikova Guinea gr 2 Grecko gs 1 Juzna Georgia gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 ostrovy Heard a McDonald hn 2 Honduras hr 2 Chorvatsko ht 1 Haiti hu 2 Madarsko id 3 Indonezia ie 2 Irsko il 3 Izrael im 1 ostrov Man in 3 India io 1 Britske indickooceanske teritorium iq 1 Irak ir 1 Iran is 2 Island it 2 Taliansko je 1 ostrov Jersey jm 3 Jamajka jo 3 Jordansko jp 3 Japonsko ke 3 Kena kg 1 Kirgizsko kh 1 Kambodza ki 1 Kiribati km 1 Komory kn 1 Svaty Kristof kp 1 Severna Korea kr 3 Juzna Korea kw 3 Kuvajt ky 1 Kajmanie ostrovy kz 1 Kazachstan la 1 Laos lb 3 Libanon lc 1 Svata Lucia li 2 Lichtenstajnsko lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litva lu 2 Luxembursko lv 2 Lotyssko ly 1 Libya ma 1 Maroko mc 2 Monako md 1 Moldavsko mg 1 Madagaskar mh 1 Marshallove ostrovy mk 3 Macedonsko ml 1 Mali mm 1 Barma mn 1 Mongolsko mo 1 Macao mp 1 Severne Mariany mq 1 Martinik mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauricius mv 1 Maledivy mw 1 Malawi mx 3 Mexiko my 3 Malajzia mz 1 Mozambik na 1 Namibia nc 1 Nova Kaledonia ne 1 Niger nf 1 Norfolk ng 1 Nigeria ni 3 Nikaragua nl 2 Holandsko no 2 Norsko np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Novy Zeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Francuzska Polynezia pg 3 Papua - Nova Guinea ph 3 Filipiny pk 3 Pakistan pl 3 Polsko pm 1 Saint Pierre a Miguelon pn 1 Pitcairnove ostrovy pr 1 Portoriko ps 3 Palestina pt 2 Portugalsko pw 1 Palauske ostrovy py 3 Paraguaj qa 1 Katar re 1 Reunion ro 2 Rumunsko ru 2 Rusko rw 1 Rwanda sa 3 Saudska Arabia sb 1 Salamunove ostrovy sc 1 Seychely sd 1 Sudan se 2 Svedsko sg 3 Singapur sh 1 Svata Helena si 2 Slovinsko sj 1 Spicbergy sk 2 Slovensko sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalsko sr 1 Surinam st 1 Svaty Tomas su 2 Sovietsky zvaz sv 3 Salvador sy 1 Syria sz 1 Svazijsko tc 1 Turks a Caicos td 1 Cad tf 1 Francuzske juzne uzemia tg 1 Togo th 3 Thajsko tj 1 Tadzikistan tk 1 Tokelau tl 1 Vychodny Timor tm 1 Turkmensko tn 1 Tunisko to 1 Tonga tp 1 Vychodny Timor tr 3 Turecko tt 3 Trinidad a Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukrajina ug 3 Uganda uk 3 Velka Britania um 1 male ostrovy USA us 4 Spojene staty americke uy 3 Uruguaj uz 1 Uzbekistan va 1 Vatikan vc 1 Svaty Vincent ve 3 Venezuela vg 1 Britske Panenske ostrovy vi 1 Americke Panenske ostrovy vn 1 Vietnam vu 1 Vanuatu wf 1 Wallisove ostrovy ws 1 Samoa ye 1 Jemen yt 1 ostrov Mayotte yu 3 Juhoslavia za 3 Juzna Afrika zm 1 Zambia zr 1 Zair zw 3 Zimbabwe analog-6.0/lang/sk1desc.txt0000644000175000017500000001112510161303541015747 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # # Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: Windows-1250 # # Yearly Report Tento prehad zobrazuje aktivitu v kadom roku. # Quarterly Report Tento prehad zobrazuje aktivitu v kadom tvrroku. # Monthly Report Tento prehad zobrazuje aktivitu v kadom mesiaci. # Weekly Report Tento prehad zobrazuje aktivitu v kadom tdni. # Daily Report Tento prehad zobrazuje aktivitu v kadom dni. # Hourly Report Tento prehad zobrazuje aktivitu v kadej hodine. # Quarter-Hour Report Tento prehad zobrazuje aktivitu v kadom tvrhodinovom intervale. # Five-Minute Report Tento prehad zobrazuje aktivitu v kadom 5-mintovom intervale. # Daily Summary Tento prehad zobrazuje celkov aktivitu pre kad de tda, shrnne pre vetky tdne v prehade. # Hourly Summary Tento prehad zobrazuje celkov aktivitu pre kad hodinu da, shrnne pre vetky dni v prehade. # Hour of the Week Summary Tento prehad zobrazuje celkov aktivitu pre kad hodinu tda, shrnne pre vetky tdne v prehade. # Quarter-Hour Summary Tento prehad zobrazuje celkov aktivitu pre kad tvrhodinov interval da, shrnne pre vetky dni v prehade. # Five-Minute Summary Tento prehad zobrazuje celkov aktivitu pre kad 5-mintov interval da, shrnne pre vetky dni v prehade. # General Summary Tento prehad obsahuje celkov tatistiky. # Request Report Tento prehad zobrazuje poadovan sbory na strnkach. # Redirection Report Tento prehad zobrazuje sbory, ktor spsobili presmerovanie poiadaviek na in sbor. (Zvyajne adresre s chbajcim lomtkom na konci alebo skripty, ktor vntili presmerovanie.) # Failure Report Tento prehad zobrazuje sbory, ktor spsobili zlyhanie, naprklad nenjden sbory. # File Type Report Tento prehad zobrazuje prpony vyiadanch sborov. # Directory Report Tento prehad zobrazuje adresre, z ktorch boli vyiadan sbory. (Diagramy pre kad adresr obsahuj vetky jeho podadresre.) # Host Report Tento prehad zobrazuje potae, ktor si vyiadali sbory. # Host Redirection Report Tento prehad zobrazuje potae, ktor boli presmerovan na in sbor. # Host Failure Report Tento prehad zobrazuje potae, ktor narazili na zlyhania poiadaviek. # Domain Report Tento prehad zobrazuje krajiny potaov, ktor si vyiadali sbory. # Referrer Report Tento prehad zobrazuje referencie (odkia udia nasledovali odkazy, alebo strnky, ktor obsahuj obrzky z tchto strnok). # Referring Site Report Tento prehad zobrazuje servery, z ktorch udia nasledovali odkazy. # Redirected Referrer Report Tento prehad zobrazuje referencie, ktor spsobili presmerovan poiadavky. # Failed Referrer Report Tento prehad zobrazuje referencie, obsahujce chybn odkazy na strnku. # Browser Report Tento prehad zobrazuje, ktor prehliadae pouvaj nvtevnci, spolu s podrobnosami. # Virtual Host Report Tento prehad zobrazuje aktivitu kadej virtulnej domny na strnkach. # Virtual Host Redirection Report Tento prehad zobrazuje presmerovan poiadavky na kad virtulnu domnu. # Virtual Host Failure Report Tento prehad zobrazuje nespen poiadavky na kad virtulnu domnu. # User Report Tento prehad zobrazuje uvateov, ktor si vyiadali sbory, ak boli autentifikovan alebo mu by identifikovan cez cookies. # User Redirection Report Tento prehad zobrazuje uvateov, ktor boli presmerovan na in sbor. # User Failure Report Tento prehad zobrazuje uvateov, ktor narazili na nespen poiadavky. # Organisation Report Tento prehad zobrazuje organizcie potaov, ktor si vyiadali sbory. # Search Query Report Tento prehad zobrazuje, ktor vrazy udia zadali do vyhadvaov, aby nali tieto strnky. # Search Word Report Tento prehad zobrazuje, ktor slov udia zadali do vyhadvaov, aby nali tieto strnky. # Internal Search Query Report Tento prehad zobrazuje, ktor vrazy udia zadali do skriptov na tchto strnkach. # Internal Search Word Report Tento prehad zobrazuje, ktor slov udia zadali do skriptov na tchto strnkach. # Browser Summary Tento prehad zobrazuje, ktor prehliadae pouvaj nvtevnci. # Operating System Report Tento prehad zobrazuje, ktor operan systmy pouvaj nvtevnci. # File Size Report Tento prehad zobrazuje vekosti sborov. # Status Code Report Tento prehad zobrazuje stavov kd HTTP pre vetky poiadavky. # Processing Time Report Tento prehad zobrazuje as potrebn na vykonanie spench poiadaviek. analog-6.0/lang/sk1dom.tab0000644000175000017500000001203510161303541015540 0ustar sret1sret100000000000000# Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: Windows-1250 # Generic and Infrastructure domains aero 2 leteck doprava arpa 1 Arpanet biz 2 firmy com 2 komern organizcie coop 2 koopercie edu 2 vzdelvacie intitcie USA gov 2 vlda USA info 2 informan int 2 medzinrodn organizcie mil 2 armda USA museum 2 mze name 3 jednotlivci net 2 sieov organizcie org 2 neziskov organizcie pro 3 profesionlne # Country code domains ac 1 ostrov Ascension ad 2 Andorra ae 3 Spojen Arabsk emirty af 1 Afganistan ag 2 Antigua a Barbuda ai 1 Anguilla al 1 Albnsko am 2 Armnsko an 1 Holandsk Antily ao 1 Angola aq 1 Antarktda ar 3 Argentna as 1 Americk Samoa at 3 Raksko au 3 Austrlia aw 1 Aruba az 1 Azerbajdan ba 3 Bosna a Hercegovina bb 2 Barbados bd 1 Banglad be 3 Belgicko bf 1 Burkina Faso bg 2 Bulharsko bh 1 Bahrajn bi 1 Burundi bj 1 Benin bm 1 Bermudy bn 1 Brunej bo 3 Bolvia br 3 Brazlia bs 1 Bahamy bt 1 Bhutn bv 1 ostrov Bouvet bw 1 Botswana by 1 Bielorusko bz 1 Belize ca 3 Kanada cc 1 Kokosov ostrovy cd 1 Konsk demokratick republika cf 1 Stredoafrick republika cg 1 Kongo ch 2 vajiarsko ci 1 Pobreie Slonoviny ck 1 Cookove ostrovy cl 2 Chile cm 1 Kamerun cn 3 na co 3 Kolumbia cr 3 Kostarika cu 2 Kuba cv 1 Kapverdy cx 2 Vianon ostrov cy 3 Cyprus cz 2 esko de 2 Nemecko dj 1 Dibutsko dk 2 Dnsko dm 2 Dominika do 3 Dominiknska republika dz 1 Alrsko ec 3 Ekvdor ee 2 Estnsko eg 3 Egypt eh 1 Zpadn Sahara er 1 Eritrea es 2 panielsko et 1 Eipia fi 2 Fnsko fj 3 Fidi fk 1 Falklandy fm 1 Mikronzia fo 1 Faersk ostrovy fr 2 Franczsko fx 1 Franczsko (Eurpske zemie) ga 1 Gabon gb 1 Vek Britnia gd 1 Grenada ge 1 Gruznsko gf 1 Franczska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltr gl 1 Grnsko gm 1 Gambia gn 1 Guinea gp 1 Guadelupe gq 1 Rovnkov Guinea gr 2 Grcko gs 1 Jun Georgia gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 ostrovy Heard a McDonald hn 2 Honduras hr 2 Chorvtsko ht 1 Haiti hu 2 Maarsko id 3 Indonzia ie 2 rsko il 3 Izrael im 1 ostrov Man in 3 India io 1 Britsk indickoocenske teritrium iq 1 Irak ir 1 Irn is 2 Island it 2 Taliansko je 1 ostrov Jersey jm 3 Jamajka jo 3 Jordnsko jp 3 Japonsko ke 3 Kea kg 1 Kirgizsko kh 1 Kamboda ki 1 Kiribati km 1 Komory kn 1 Svt Kritof kp 1 Severn Krea kr 3 Jun Krea kw 3 Kuvajt ky 1 Kajmanie ostrovy kz 1 Kazachstan la 1 Laos lb 3 Libanon lc 1 Svt Lucia li 2 Lichtentajnsko lk 1 Sr Lanka lr 1 Libria ls 1 Lesotho lt 2 Litva lu 2 Luxembursko lv 2 Lotysko ly 1 Lbya ma 1 Maroko mc 2 Monako md 1 Moldavsko mg 1 Madagaskar mh 1 Marshallove ostrovy mk 3 Macednsko ml 1 Mali mm 1 Barma mn 1 Mongolsko mo 1 Macao mp 1 Severn Mariany mq 1 Martinik mr 1 Mauritnia ms 1 Montserrat mt 3 Malta mu 1 Maurcius mv 1 Maledivy mw 1 Malawi mx 3 Mexiko my 3 Malajzia mz 1 Mozambik na 1 Nambia nc 1 Nov Kalednia ne 1 Niger nf 1 Norfolk ng 1 Nigria ni 3 Nikaragua nl 2 Holandsko no 2 Nrsko np 1 Nepl nr 1 Nauru nu 2 Niue nz 3 Nov Zland om 1 Omn pa 3 Panama pe 3 Peru pf 1 Franczska Polynzia pg 3 Papua - Nov Guinea ph 3 Filipny pk 3 Pakistan pl 3 Posko pm 1 Saint Pierre a Miguelon pn 1 Pitcairnove ostrovy pr 1 Portoriko ps 3 Palestna pt 2 Portugalsko pw 1 Palausk ostrovy py 3 Paraguaj qa 1 Katar re 1 Runion ro 2 Rumunsko ru 2 Rusko rw 1 Rwanda sa 3 Saudsk Arbia sb 1 alamnove ostrovy sc 1 Seychely sd 1 Sudn se 2 vdsko sg 3 Singapur sh 1 Svt Helena si 2 Slovinsko sj 1 picbergy sk 2 Slovensko sl 1 Sierra Leone sm 1 San Marno sn 1 Senegal so 1 Somlsko sr 1 Surinam st 1 Svt Tom su 2 Sovietsky zvz sv 3 Salvdor sy 1 Sria sz 1 Svazijsko tc 1 Turks a Caicos td 1 ad tf 1 Franczske jun zemia tg 1 Togo th 3 Thajsko tj 1 Tadikistan tk 1 Tokelau tl 1 Vchodn Timor tm 1 Turkmnsko tn 1 Tunisko to 1 Tonga tp 1 Vchodn Timor tr 3 Turecko tt 3 Trinidad a Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanznia ua 3 Ukrajina ug 3 Uganda uk 3 Vek Britnia um 1 mal ostrovy USA us 4 Spojen tty americk uy 3 Uruguaj uz 1 Uzbekistan va 1 Vatikn vc 1 Svt Vincent ve 3 Venezuela vg 1 Britsk Panensk ostrovy vi 1 Americk Panensk ostrovy vn 1 Vietnam vu 1 Vanuatu wf 1 Wallisove ostrovy ws 1 Samoa ye 1 Jemen yt 1 ostrov Mayotte yu 3 Juhoslvia za 3 Jun Afrika zm 1 Zambia zr 1 Zair zw 3 Zimbabwe analog-6.0/lang/ska.lng0000644000175000017500000003222510161303541015135 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Ned Pon Uto Str Stv Pia Sob Jan Feb Mar Apr Maj Jun Jul Aug Sep Okt Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" tyzden od rok ## Quarter of a year stvrtrok mesiac den dni hod. minuta min. sekunda s bajt bajtov ## ?bytes represents kbytes, Mbytes etc. ?bajtov poziadavku poziadaviek datum ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum cas cas prvy datum prvy krat naposledy naposledy subor suborov hostitel hostitelov virtualny server virtualnych serverov adresar adresarov domena domen organizacia organizacii pripona pripon URL URLs prehliadac prehliadacov operacny system operacnych systemov ## (= operating system, operating systems) velkost hladana fraza hladanych fraz web server web serverov uzivatel uzivatelov navratovy kod navratovych kodov Statistika web servera ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Vseobecny prehlad ## The time reports, plus "busiest" strings (at the bottom of each report) Rocny prehlad Najrusnejsi rok: Stvrtrocny prehlad Najrusnejsi stvrtrok: Mesacny prehlad Najrusnejsi mesiac: Tyzdenny prehlad Najrusnejsi tyzden: zacinajuci Denny suhrn Denny prehlad Najrusnejsi den: Hodinovy prehlad Hodinovy suhrn Tyzdnovy suhrn podla hodin Najrusnejsia hodina: Stvrthodinovy prehlad Stvrthodinovy suhrn Najrusnejsia stvrthodina: Patminutovy prehlad Patminutovy suhrn Najrusnejsich pat minut: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Prehlad hostitelov hostitel hostitelov n Prehlad presmerovani hostitelov hostitel hostitelov n Prehlad chybajucich hostitelov hostitel hostitelov n Prehlad adresarov adresar adresarov n Prehlad typov suborov pripona pripon n Prehlad poziadaviek subor suborov n Prehlad presmerovani subor suborov n Prehlad chyb subor suborov n Prehlad referencii odkazujuce URL odkazujucich URL n Prehlad odkazujucich serverov odkazujuci server odkazujucich serverov n Prehlad presmerovanych referencii odkazovane URL odkazovanych URL n Prehlad chybnych referencii odkazovane URL odkazovanych URL n Prehlad vyhladavanych vyrazov vyraz vyrazov n Prehlad vyhladavanych slov hladane slovo hladanych slov n Prehlad interne hladanych vyrazov vyraz vyrazov n Prehlad interne hladanych slov hladane slovo hladanych slov n Prehlad virtualnych web serverov virtualny server virtualnych serverov n Prehlad presmerovani virtualnych serverov virtualny server virtualnych serverov n Prehlad chyb virtualnych serverov virtualny server virtualnych serverov n Prehlad uzivatelov uzivatel uzivatelov n Prehlad presmerovani uzivatelov uzivatel uzivatelov n Prehlad chyb uzivatelov uzivatel uzivatelov n Suhrn prehliadacov prehliadac prehliadacov n Prehlad prehliadacov prehliadac prehliadacov n Prehlad operacnych systemov operacny system operacnych systemov n Prehlad domen domena domen n Prehlad organizacii organizacia organizacii n Prehlad navratovych kodov navratovy kod navratovych kodov n Prehlad doby spracovania Prehlad velkosti suborov ## Used at the bottom of the report Tato analyzu vytvoril Doba spracovania menej ako 1 ## Used in the time reports Kazdy dielik predstavuje alebo cast poziadavka na stranku poziadaviek na stranku ## Used at the bottom of each non-time report: need m, f & n genders * * nezahrnute ## Used on the pie charts: again need m, f & n genders * * ostatne ## Used at the top of the report Program bol spusteny v Analyza sa vztahuje na obdobie od do ## Used in the General Summary Uspesne poziadavky Uspesne poziadavky v priemere za den Uspesne poziadavky na stranky Uspesne poziadavky na stranky v priemere za den Riadky logovacieho suboru bez stavoveho kodu Neuspesne poziadavky Presmerovane poziadavky Poziadavky s informativnym stavovym kodom Rozdielne pozadovane subory Rozdielne obsluzene servery Porusene riadky logovacieho suboru Neziaduce polozky logovacieho suboru Prenesene data Prenesene data v priemere za den udaje v zatvorkach sa vztahuju na 7 dni konciacich poslednych 7 dni Prechod na Zaciatok ## Some special phrases for particular reports. [nerozoznane ciselne adresy] [domena neuvedena] [neznama domena] [korenovy adresar] [bez adresara] [bez pripony] [adresare] nezname Windows iny UNIX roboty neznamy OS ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) poz. poz. za 7 dni % poz. % poz. za 7 dni str. str. za 7 dni % str. % str. za 7 dni bajtov ?bajtov bajtov za 7 dni ?bajtov za 7 dni % bajtov % bajtov za 7 dni c. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Zoznam prvych %s * * Zoznam prvych %d %s * * Zoznam %s ## "by" in the phrase "listing the top 3 files BY number of requests" podla ## All requests WITH AT LEAST 10 requests majucich aspon ## Different ways of doing floors poziadavka za poslednych 7 dni poziadaviek za poslednych 7 dni poziadavka na stranku za poslednych 7 dni poziadaviek na stranky za poslednych 7 dni presmerovana poziadavka presmerovanych poziadaviek presmerovana poziadavka za poslednych 7 dni presmerovanych poziadaviek za poslednych 7 dni neuspesna poziadavka neuspesnych poziadaviek neuspesna poziadavka za poslednych 7 dni neuspesnych poziadaviek za poslednych 7 dni % prenosu % prenosu za poslednych 7 dni % maximalneho mnozstva prenesenych dat % maximalneho mnozstva prenesenych dat za poslednych 7 dni bajtu prenosu bajtov prenosu ## ?bytes represents kbytes, Mbytes etc. ?bajtov prenosu bajtu prenosu za poslednych 7 dni bajtov prenosu za poslednych 7 dni ?bajtov prenosu za poslednych 7 dni pozadovanych od s presmerovanou poziadavkou od s neuspesnou poziadavkou od s prvou poziadavkou s prvou presmerovanou poziadavkou od s prvou neuspesnou poziadavkou od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * zatriedeny podla ## Used at the top of each report Tento prehlad obsahuje udaje od ## Used in pie charts Vyseky su vykreslene podla ## different ways of sorting mnozstva prenesenych dat mnozstva prenesenych dat za poslednych 7 dni % poziadaviek % poziadaviek za poslednych 7 dni % maximalneho poctu poziadaviek % maximalneho poctu poziadaviek za poslednych 7 dni poctu poziadaviek poctu poziadaviek za poslednych 7 dni % poziadaviek na stranky % poziadaviek na stranky za poslednych 7 dni % maximalneho poctu poziadaviek na stranky % maximalneho poctu poziadaviek na stranky za poslednych 7 dni poctu poziadaviek na stranky poctu poziadaviek na stranky za poslednych 7 dni % presmerovanych poziadaviek % presmerovanych poziadaviek za poslednych 7 dni % maximalneho poctu presmerovanych poziadaviek % maximalneho poctu presmerovanych poziadaviek za poslednych 7 dni poctu presmerovanych poziadaviek poctu presmerovanych poziadaviek za poslednych 7 dni % neuspesnych poziadaviek % neuspesnych poziadaviek za poslednych 7 dni % maximalneho poctu neuspesnych poziadaviek % maximalneho poctu neuspesnych poziadaviek za poslednych 7 dni poctu neuspesnych poziadaviek poctu neuspesnych poziadaviek za poslednych 7 dni casu poslednej poziadavky casu poslednej presmerovanej poziadavky casu poslednej neuspesnej poziadavky casu prvej poziadavky casu prvej presmerovanej poziadavky casu prvej neuspesnej poziadavky ## 3 other ways of sorting in m, f, & n * * zatriedeny abecedne * * zatriedeny ciselne * * nezatriedeny ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. dop. odp. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y, %H:%n ## "Program started at" and "Analysed requests from" %w, %D. %m %Y, %H:%n ## In Daily Report %d. %m '%y ## In Daily Summary %w ## In Hourly Report %d. %m '%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H%x%I ## In Quarter-Hour and Five-Minute Reports %d. %m '%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d. %m '%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d. %m '%y ## The date & time (D) column in non-time reports %d. %m '%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d. %m, '%y v %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [rozne informacne] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [rozne uspesne] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [rozne presmerovania] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [rozne chyby klienta] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [rozne chyby servera] xxx [nezname] analog-6.0/lang/skadesc.txt0000644000175000017500000001112110161303541016023 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # # Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: US-ASCII # # Yearly Report Tento prehlad zobrazuje aktivitu v kazdom roku. # Quarterly Report Tento prehlad zobrazuje aktivitu v kazdom stvrtroku. # Monthly Report Tento prehlad zobrazuje aktivitu v kazdom mesiaci. # Weekly Report Tento prehlad zobrazuje aktivitu v kazdom tyzdni. # Daily Report Tento prehlad zobrazuje aktivitu v kazdom dni. # Hourly Report Tento prehlad zobrazuje aktivitu v kazdej hodine. # Quarter-Hour Report Tento prehlad zobrazuje aktivitu v kazdom stvrthodinovom intervale. # Five-Minute Report Tento prehlad zobrazuje aktivitu v kazdom 5-minutovom intervale. # Daily Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdy den tyzdna, suhrnne pre vsetky tyzdne v prehlade. # Hourly Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdu hodinu dna, suhrnne pre vsetky dni v prehlade. # Hour of the Week Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdu hodinu tyzdna, suhrnne pre vsetky tyzdne v prehlade. # Quarter-Hour Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdy stvrthodinovy interval dna, suhrnne pre vsetky dni v prehlade. # Five-Minute Summary Tento prehlad zobrazuje celkovu aktivitu pre kazdy 5-minutovy interval dna, suhrnne pre vsetky dni v prehlade. # General Summary Tento prehlad obsahuje celkove statistiky. # Request Report Tento prehlad zobrazuje pozadovane subory na strankach. # Redirection Report Tento prehlad zobrazuje subory, ktore sposobili presmerovanie poziadaviek na iny subor. (Zvycajne adresare s chybajucim lomitkom na konci alebo skripty, ktore vnutili presmerovanie.) # Failure Report Tento prehlad zobrazuje subory, ktore sposobili zlyhanie, napriklad nenajdene subory. # File Type Report Tento prehlad zobrazuje pripony vyziadanych suborov. # Directory Report Tento prehlad zobrazuje adresare, z ktorych boli vyziadane subory. (Diagramy pre kazdy adresar obsahuju vsetky jeho podadresare.) # Host Report Tento prehlad zobrazuje pocitace, ktore si vyziadali subory. # Host Redirection Report Tento prehlad zobrazuje pocitace, ktore boli presmerovane na iny subor. # Host Failure Report Tento prehlad zobrazuje pocitace, ktore narazili na zlyhania poziadaviek. # Domain Report Tento prehlad zobrazuje krajiny pocitacov, ktore si vyziadali subory. # Referrer Report Tento prehlad zobrazuje referencie (odkial ludia nasledovali odkazy, alebo stranky, ktore obsahuju obrazky z tychto stranok). # Referring Site Report Tento prehlad zobrazuje servery, z ktorych ludia nasledovali odkazy. # Redirected Referrer Report Tento prehlad zobrazuje referencie, ktore sposobili presmerovane poziadavky. # Failed Referrer Report Tento prehlad zobrazuje referencie, obsahujuce chybne odkazy na stranku. # Browser Report Tento prehlad zobrazuje, ktore prehliadace pouzivaju navstevnici, spolu s podrobnostami. # Virtual Host Report Tento prehlad zobrazuje aktivitu kazdej virtualnej domeny na strankach. # Virtual Host Redirection Report Tento prehlad zobrazuje presmerovane poziadavky na kazdu virtualnu domenu. # Virtual Host Failure Report Tento prehlad zobrazuje neuspesne poziadavky na kazdu virtualnu domenu. # User Report Tento prehlad zobrazuje uzivatelov, ktori si vyziadali subory, ak boli autentifikovani alebo mozu byt identifikovani cez cookies. # User Redirection Report Tento prehlad zobrazuje uzivatelov, ktori boli presmerovani na iny subor. # User Failure Report Tento prehlad zobrazuje uzivatelov, ktori narazili na neuspesne poziadavky. # Organisation Report Tento prehlad zobrazuje organizacie pocitacov, ktore si vyziadali subory. # Search Query Report Tento prehlad zobrazuje, ktore vyrazy ludia zadali do vyhladavacov, aby nasli tieto stranky. # Search Word Report Tento prehlad zobrazuje, ktore slova ludia zadali do vyhladavacov, aby nasli tieto stranky. # Internal Search Query Report Tento prehlad zobrazuje, ktore vyrazy ludia zadali do skriptov na tychto strankach. # Internal Search Word Report Tento prehlad zobrazuje, ktore slova ludia zadali do skriptov na tychto strankach. # Browser Summary Tento prehlad zobrazuje, ktore prehliadace pouzivaju navstevnici. # Operating System Report Tento prehlad zobrazuje, ktore operacne systemy pouzivaju navstevnici. # File Size Report Tento prehlad zobrazuje velkosti suborov. # Status Code Report Tento prehlad zobrazuje stavovy kod HTTP pre vsetky poziadavky. # Processing Time Report Tento prehlad zobrazuje cas potrebny na vykonanie uspesnych poziadaviek. analog-6.0/lang/skadom.tab0000644000175000017500000001203110161303541015614 0ustar sret1sret100000000000000# Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: US-ASCII # Generic and Infrastructure domains aero 2 letecka doprava arpa 1 Arpanet biz 2 firmy com 2 komercne organizacie coop 2 kooperacie edu 2 vzdelavacie institucie USA gov 2 vlada USA info 2 informacne int 2 medzinarodne organizacie mil 2 armada USA museum 2 muzea name 3 jednotlivci net 2 sietove organizacie org 2 neziskove organizacie pro 3 profesionalne # Country code domains ac 1 ostrov Ascension ad 2 Andorra ae 3 Spojene Arabske emiraty af 1 Afganistan ag 2 Antigua a Barbuda ai 1 Anguilla al 1 Albansko am 2 Armensko an 1 Holandske Antily ao 1 Angola aq 1 Antarktida ar 3 Argentina as 1 Americka Samoa at 3 Rakusko au 3 Australia aw 1 Aruba az 1 Azerbajdzan ba 3 Bosna a Hercegovina bb 2 Barbados bd 1 Banglades be 3 Belgicko bf 1 Burkina Faso bg 2 Bulharsko bh 1 Bahrajn bi 1 Burundi bj 1 Benin bm 1 Bermudy bn 1 Brunej bo 3 Bolivia br 3 Brazilia bs 1 Bahamy bt 1 Bhutan bv 1 ostrov Bouvet bw 1 Botswana by 1 Bielorusko bz 1 Belize ca 3 Kanada cc 1 Kokosove ostrovy cd 1 Konzska demokraticka republika cf 1 Stredoafricka republika cg 1 Kongo ch 2 Svajciarsko ci 1 Pobrezie Slonoviny ck 1 Cookove ostrovy cl 2 Chile cm 1 Kamerun cn 3 Cina co 3 Kolumbia cr 3 Kostarika cu 2 Kuba cv 1 Kapverdy cx 2 Vianocny ostrov cy 3 Cyprus cz 2 Cesko de 2 Nemecko dj 1 Dzibutsko dk 2 Dansko dm 2 Dominika do 3 Dominikanska republika dz 1 Alzirsko ec 3 Ekvador ee 2 Estonsko eg 3 Egypt eh 1 Zapadna Sahara er 1 Eritrea es 2 Spanielsko et 1 Eiopia fi 2 Finsko fj 3 Fidzi fk 1 Falklandy fm 1 Mikronezia fo 1 Faerske ostrovy fr 2 Francuzsko fx 1 Francuzsko (Europske uzemie) ga 1 Gabon gb 1 Velka Britania gd 1 Grenada ge 1 Gruzinsko gf 1 Francuzska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Gronsko gm 1 Gambia gn 1 Guinea gp 1 Guadelupe gq 1 Rovnikova Guinea gr 2 Grecko gs 1 Juzna Georgia gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 ostrovy Heard a McDonald hn 2 Honduras hr 2 Chorvatsko ht 1 Haiti hu 2 Madarsko id 3 Indonezia ie 2 Irsko il 3 Izrael im 1 ostrov Man in 3 India io 1 Britske indickooceanske teritorium iq 1 Irak ir 1 Iran is 2 Island it 2 Taliansko je 1 ostrov Jersey jm 3 Jamajka jo 3 Jordansko jp 3 Japonsko ke 3 Kena kg 1 Kirgizsko kh 1 Kambodza ki 1 Kiribati km 1 Komory kn 1 Svaty Kristof kp 1 Severna Korea kr 3 Juzna Korea kw 3 Kuvajt ky 1 Kajmanie ostrovy kz 1 Kazachstan la 1 Laos lb 3 Libanon lc 1 Svata Lucia li 2 Lichtenstajnsko lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Litva lu 2 Luxembursko lv 2 Lotyssko ly 1 Libya ma 1 Maroko mc 2 Monako md 1 Moldavsko mg 1 Madagaskar mh 1 Marshallove ostrovy mk 3 Macedonsko ml 1 Mali mm 1 Barma mn 1 Mongolsko mo 1 Macao mp 1 Severne Mariany mq 1 Martinik mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauricius mv 1 Maledivy mw 1 Malawi mx 3 Mexiko my 3 Malajzia mz 1 Mozambik na 1 Namibia nc 1 Nova Kaledonia ne 1 Niger nf 1 Norfolk ng 1 Nigeria ni 3 Nikaragua nl 2 Holandsko no 2 Norsko np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Novy Zeland om 1 Oman pa 3 Panama pe 3 Peru pf 1 Francuzska Polynezia pg 3 Papua - Nova Guinea ph 3 Filipiny pk 3 Pakistan pl 3 Polsko pm 1 Saint Pierre a Miguelon pn 1 Pitcairnove ostrovy pr 1 Portoriko ps 3 Palestina pt 2 Portugalsko pw 1 Palauske ostrovy py 3 Paraguaj qa 1 Katar re 1 Reunion ro 2 Rumunsko ru 2 Rusko rw 1 Rwanda sa 3 Saudska Arabia sb 1 Salamunove ostrovy sc 1 Seychely sd 1 Sudan se 2 Svedsko sg 3 Singapur sh 1 Svata Helena si 2 Slovinsko sj 1 Spicbergy sk 2 Slovensko sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalsko sr 1 Surinam st 1 Svaty Tomas su 2 Sovietsky zvaz sv 3 Salvador sy 1 Syria sz 1 Svazijsko tc 1 Turks a Caicos td 1 Cad tf 1 Francuzske juzne uzemia tg 1 Togo th 3 Thajsko tj 1 Tadzikistan tk 1 Tokelau tl 1 Vychodny Timor tm 1 Turkmensko tn 1 Tunisko to 1 Tonga tp 1 Vychodny Timor tr 3 Turecko tt 3 Trinidad a Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukrajina ug 3 Uganda uk 3 Velka Britania um 1 male ostrovy USA us 4 Spojene staty americke uy 3 Uruguaj uz 1 Uzbekistan va 1 Vatikan vc 1 Svaty Vincent ve 3 Venezuela vg 1 Britske Panenske ostrovy vi 1 Americke Panenske ostrovy vn 1 Vietnam vu 1 Vanuatu wf 1 Wallisove ostrovy ws 1 Samoa ye 1 Jemen yt 1 ostrov Mayotte yu 3 Juhoslavia za 3 Juzna Afrika zm 1 Zambia zr 1 Zair zw 3 Zimbabwe analog-6.0/lang/skdesc.txt0000644000175000017500000001112310161303541015664 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # # Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: ISO-8859-2 # # Yearly Report Tento prehad zobrazuje aktivitu v kadom roku. # Quarterly Report Tento prehad zobrazuje aktivitu v kadom tvrroku. # Monthly Report Tento prehad zobrazuje aktivitu v kadom mesiaci. # Weekly Report Tento prehad zobrazuje aktivitu v kadom tdni. # Daily Report Tento prehad zobrazuje aktivitu v kadom dni. # Hourly Report Tento prehad zobrazuje aktivitu v kadej hodine. # Quarter-Hour Report Tento prehad zobrazuje aktivitu v kadom tvrhodinovom intervale. # Five-Minute Report Tento prehad zobrazuje aktivitu v kadom 5-mintovom intervale. # Daily Summary Tento prehad zobrazuje celkov aktivitu pre kad de tda, shrnne pre vetky tdne v prehade. # Hourly Summary Tento prehad zobrazuje celkov aktivitu pre kad hodinu da, shrnne pre vetky dni v prehade. # Hour of the Week Summary Tento prehad zobrazuje celkov aktivitu pre kad hodinu tda, shrnne pre vetky tdne v prehade. # Quarter-Hour Summary Tento prehad zobrazuje celkov aktivitu pre kad tvrhodinov interval da, shrnne pre vetky dni v prehade. # Five-Minute Summary Tento prehad zobrazuje celkov aktivitu pre kad 5-mintov interval da, shrnne pre vetky dni v prehade. # General Summary Tento prehad obsahuje celkov tatistiky. # Request Report Tento prehad zobrazuje poadovan sbory na strnkach. # Redirection Report Tento prehad zobrazuje sbory, ktor spsobili presmerovanie poiadaviek na in sbor. (Zvyajne adresre s chbajcim lomtkom na konci alebo skripty, ktor vntili presmerovanie.) # Failure Report Tento prehad zobrazuje sbory, ktor spsobili zlyhanie, naprklad nenjden sbory. # File Type Report Tento prehad zobrazuje prpony vyiadanch sborov. # Directory Report Tento prehad zobrazuje adresre, z ktorch boli vyiadan sbory. (Diagramy pre kad adresr obsahuj vetky jeho podadresre.) # Host Report Tento prehad zobrazuje potae, ktor si vyiadali sbory. # Host Redirection Report Tento prehad zobrazuje potae, ktor boli presmerovan na in sbor. # Host Failure Report Tento prehad zobrazuje potae, ktor narazili na zlyhania poiadaviek. # Domain Report Tento prehad zobrazuje krajiny potaov, ktor si vyiadali sbory. # Referrer Report Tento prehad zobrazuje referencie (odkia udia nasledovali odkazy, alebo strnky, ktor obsahuj obrzky z tchto strnok). # Referring Site Report Tento prehad zobrazuje servery, z ktorch udia nasledovali odkazy. # Redirected Referrer Report Tento prehad zobrazuje referencie, ktor spsobili presmerovan poiadavky. # Failed Referrer Report Tento prehad zobrazuje referencie, obsahujce chybn odkazy na strnku. # Browser Report Tento prehad zobrazuje, ktor prehliadae pouvaj nvtevnci, spolu s podrobnosami. # Virtual Host Report Tento prehad zobrazuje aktivitu kadej virtulnej domny na strnkach. # Virtual Host Redirection Report Tento prehad zobrazuje presmerovan poiadavky na kad virtulnu domnu. # Virtual Host Failure Report Tento prehad zobrazuje nespen poiadavky na kad virtulnu domnu. # User Report Tento prehad zobrazuje uvateov, ktor si vyiadali sbory, ak boli autentifikovan alebo mu by identifikovan cez cookies. # User Redirection Report Tento prehad zobrazuje uvateov, ktor boli presmerovan na in sbor. # User Failure Report Tento prehad zobrazuje uvateov, ktor narazili na nespen poiadavky. # Organisation Report Tento prehad zobrazuje organizcie potaov, ktor si vyiadali sbory. # Search Query Report Tento prehad zobrazuje, ktor vrazy udia zadali do vyhadvaov, aby nali tieto strnky. # Search Word Report Tento prehad zobrazuje, ktor slov udia zadali do vyhadvaov, aby nali tieto strnky. # Internal Search Query Report Tento prehad zobrazuje, ktor vrazy udia zadali do skriptov na tchto strnkach. # Internal Search Word Report Tento prehad zobrazuje, ktor slov udia zadali do skriptov na tchto strnkach. # Browser Summary Tento prehad zobrazuje, ktor prehliadae pouvaj nvtevnci. # Operating System Report Tento prehad zobrazuje, ktor operan systmy pouvaj nvtevnci. # File Size Report Tento prehad zobrazuje vekosti sborov. # Status Code Report Tento prehad zobrazuje stavov kd HTTP pre vetky poiadavky. # Processing Time Report Tento prehad zobrazuje as potrebn na vykonanie spench poiadaviek. analog-6.0/lang/skdom.tab0000644000175000017500000001203310161303541015455 0ustar sret1sret100000000000000# Slovak language files made by DooDeeToo (http://doodeetoo.host.sk) # # character set: ISO-8859-2 # Generic and Infrastructure domains aero 2 leteck doprava arpa 1 Arpanet biz 2 firmy com 2 komern organizcie coop 2 koopercie edu 2 vzdelvacie intitcie USA gov 2 vlda USA info 2 informan int 2 medzinrodn organizcie mil 2 armda USA museum 2 mze name 3 jednotlivci net 2 sieov organizcie org 2 neziskov organizcie pro 3 profesionlne # Country code domains ac 1 ostrov Ascension ad 2 Andorra ae 3 Spojen Arabsk emirty af 1 Afganistan ag 2 Antigua a Barbuda ai 1 Anguilla al 1 Albnsko am 2 Armnsko an 1 Holandsk Antily ao 1 Angola aq 1 Antarktda ar 3 Argentna as 1 Americk Samoa at 3 Raksko au 3 Austrlia aw 1 Aruba az 1 Azerbajdan ba 3 Bosna a Hercegovina bb 2 Barbados bd 1 Banglad be 3 Belgicko bf 1 Burkina Faso bg 2 Bulharsko bh 1 Bahrajn bi 1 Burundi bj 1 Benin bm 1 Bermudy bn 1 Brunej bo 3 Bolvia br 3 Brazlia bs 1 Bahamy bt 1 Bhutn bv 1 ostrov Bouvet bw 1 Botswana by 1 Bielorusko bz 1 Belize ca 3 Kanada cc 1 Kokosov ostrovy cd 1 Konsk demokratick republika cf 1 Stredoafrick republika cg 1 Kongo ch 2 vajiarsko ci 1 Pobreie Slonoviny ck 1 Cookove ostrovy cl 2 Chile cm 1 Kamerun cn 3 na co 3 Kolumbia cr 3 Kostarika cu 2 Kuba cv 1 Kapverdy cx 2 Vianon ostrov cy 3 Cyprus cz 2 esko de 2 Nemecko dj 1 Dibutsko dk 2 Dnsko dm 2 Dominika do 3 Dominiknska republika dz 1 Alrsko ec 3 Ekvdor ee 2 Estnsko eg 3 Egypt eh 1 Zpadn Sahara er 1 Eritrea es 2 panielsko et 1 Eipia fi 2 Fnsko fj 3 Fidi fk 1 Falklandy fm 1 Mikronzia fo 1 Faersk ostrovy fr 2 Franczsko fx 1 Franczsko (Eurpske zemie) ga 1 Gabon gb 1 Vek Britnia gd 1 Grenada ge 1 Gruznsko gf 1 Franczska Guyana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltr gl 1 Grnsko gm 1 Gambia gn 1 Guinea gp 1 Guadelupe gq 1 Rovnkov Guinea gr 2 Grcko gs 1 Jun Georgia gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hongkong hm 1 ostrovy Heard a McDonald hn 2 Honduras hr 2 Chorvtsko ht 1 Haiti hu 2 Maarsko id 3 Indonzia ie 2 rsko il 3 Izrael im 1 ostrov Man in 3 India io 1 Britsk indickoocenske teritrium iq 1 Irak ir 1 Irn is 2 Island it 2 Taliansko je 1 ostrov Jersey jm 3 Jamajka jo 3 Jordnsko jp 3 Japonsko ke 3 Kea kg 1 Kirgizsko kh 1 Kamboda ki 1 Kiribati km 1 Komory kn 1 Svt Kritof kp 1 Severn Krea kr 3 Jun Krea kw 3 Kuvajt ky 1 Kajmanie ostrovy kz 1 Kazachstan la 1 Laos lb 3 Libanon lc 1 Svt Lucia li 2 Lichtentajnsko lk 1 Sr Lanka lr 1 Libria ls 1 Lesotho lt 2 Litva lu 2 Luxembursko lv 2 Lotysko ly 1 Lbya ma 1 Maroko mc 2 Monako md 1 Moldavsko mg 1 Madagaskar mh 1 Marshallove ostrovy mk 3 Macednsko ml 1 Mali mm 1 Barma mn 1 Mongolsko mo 1 Macao mp 1 Severn Mariany mq 1 Martinik mr 1 Mauritnia ms 1 Montserrat mt 3 Malta mu 1 Maurcius mv 1 Maledivy mw 1 Malawi mx 3 Mexiko my 3 Malajzia mz 1 Mozambik na 1 Nambia nc 1 Nov Kalednia ne 1 Niger nf 1 Norfolk ng 1 Nigria ni 3 Nikaragua nl 2 Holandsko no 2 Nrsko np 1 Nepl nr 1 Nauru nu 2 Niue nz 3 Nov Zland om 1 Omn pa 3 Panama pe 3 Peru pf 1 Franczska Polynzia pg 3 Papua - Nov Guinea ph 3 Filipny pk 3 Pakistan pl 3 Posko pm 1 Saint Pierre a Miguelon pn 1 Pitcairnove ostrovy pr 1 Portoriko ps 3 Palestna pt 2 Portugalsko pw 1 Palausk ostrovy py 3 Paraguaj qa 1 Katar re 1 Runion ro 2 Rumunsko ru 2 Rusko rw 1 Rwanda sa 3 Saudsk Arbia sb 1 alamnove ostrovy sc 1 Seychely sd 1 Sudn se 2 vdsko sg 3 Singapur sh 1 Svt Helena si 2 Slovinsko sj 1 picbergy sk 2 Slovensko sl 1 Sierra Leone sm 1 San Marno sn 1 Senegal so 1 Somlsko sr 1 Surinam st 1 Svt Tom su 2 Sovietsky zvz sv 3 Salvdor sy 1 Sria sz 1 Svazijsko tc 1 Turks a Caicos td 1 ad tf 1 Franczske jun zemia tg 1 Togo th 3 Thajsko tj 1 Tadikistan tk 1 Tokelau tl 1 Vchodn Timor tm 1 Turkmnsko tn 1 Tunisko to 1 Tonga tp 1 Vchodn Timor tr 3 Turecko tt 3 Trinidad a Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanznia ua 3 Ukrajina ug 3 Uganda uk 3 Vek Britnia um 1 mal ostrovy USA us 4 Spojen tty americk uy 3 Uruguaj uz 1 Uzbekistan va 1 Vatikn vc 1 Svt Vincent ve 3 Venezuela vg 1 Britsk Panensk ostrovy vi 1 Americk Panensk ostrovy vn 1 Vietnam vu 1 Vanuatu wf 1 Wallisove ostrovy ws 1 Samoa ye 1 Jemen yt 1 ostrov Mayotte yu 3 Juhoslvia za 3 Jun Afrika zm 1 Zambia zr 1 Zair zw 3 Zimbabwe analog-6.0/lang/tr.lng0000644000175000017500000003155210161303541015006 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Turkish translation for versions 3 & 4 by Nezih Erkman. ## Turkish translation for version 5 by Dikran Diragormacioglu. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-9 ## Abbreviations for the day and month names. Paz Pts Sal r Pr Cum Cts Ock bt Mrt Nis May Haz Tem Au Eyl Ekm Ksm Ara ## Next some standard common words. ## Abbreviation for "week beginning" Hafta ba yl ## Quarter of a year aylk sre ay gn gn sa dakika dakika saniye saniye byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes eriim eriim tarih ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 tarih saat saat ilk tarih ilk saat son tarih son saat dosya dosyalar host hostlar sanal host sanal hostlar blm blmler site tipi site tipleri organizasyon organizasyonlar dosya uzants dosya uzantlar URL URLs browser browserlar sistem sistemler ## (= operating system, operating systems) boyut aranan terim aranan terimler site siteler kullanc kullanclar durum kodu durum kodlar Web Server statistikleri: ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Genel zet ## The time reports, plus "busiest" strings (at the bottom of each report) Yllk rapor En megul yl aylk rapor En megul ay Aylk Rapor En megul ay: Haftalk Rapor En megul hafta: hafta ba- Gnlk zet Gnlk Rapor En megul gn: Saatlik Rapor Saatlik zet Haftann saati zeti En megul saat: 15 dk. Raporu 15 dk. zeti En megul 15 dk.: 5 dk. Raporu 5 dk. zeti En megul 5 dk.: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Raporu host hostlar n Host ynlendirme raporu host hostlar n Baarsz host eriim raporu host hostlar n Dizin Raporu Dizin Dizinler n Dosya Tipi Raporu dosya tipi dosya tipleri n Eriim Raporu dosya dosyalar n Ynlendirme Raporu dosya dosyalar n Baarsz Eriim Raporu dosya dosyalar n Gnderen Yer Raporu gnderici URL gnderici URLler n Gnderici Site Raporu gnderici site gnderici siteler n Ynlendirmeler Raporu gnderici URL gnderici URLler n Baarsz Gnderiler Raporu gnderici URL gnderici URLler n Arama Sorgusu Raporu sorgu sorgular n Aranan Kelime Raporu aranan kelime aranan kelimeler n Dahili arama sorgusu raporu sorgu sorgular n Dahili kelime arama raporu aranan kelime aranan kelimeler n Sanal Host Raporu sanal host sanal hostlar n Sanal Host ynlendirme raporu Sanal Host Sanal Hostlar n Sanal Host baarsz eriim raporu Sanal Host Sanal Hostlar n Kullanc Raporu kullanc kullanclar n Kullanc Ynlendirme Raporu kullanc kullanclar n Eriemeyen Kullanc Raporu kullanc kullanclar n Kullanlan Browserlar zeti browser browserlar n Kullanlan Browser Raporu Browser Browserlar n letim Sistemi Raporu iletim sistemi ilerim sistemleri n Site Tipi Raporu site tipi site tipleri n Organizasyon Raporu organizasyon organizasyonlar n Durum Kodu Raporu durum kodu durum kodlar n lem Sresi Raporu Dosya Boyutu Raporu ## Used at the bottom of the report Bu analizi yaratmak iin kullanlan program: alma sresi 1 den az ## Used in the time reports Herbir nite sayfaya (sayfadaki nesnelere eriim dahil) kez eriimi gsterir kez eriimi gsterir ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * dier ## Used at the top of the report Program balagc: Analiz edilen tarih aral: / ## Used in the General Summary Baarl eriimler Baarl eriimler gnlk ortalamas Sayfalara yaplan baarl eriimler Sayfalara yaplan baarl eriimler gnlk ortalamas Durum kodu olmayan KAYIT(LOG) dosyas satrlar Baarsz eriimler Ynlendirilen eriimler Enformasyonal status kodlu eriimler Eriilen belirgin dosya says Servis verilen belirgin host says Bozuk KAYIT(LOG) dosyas satrlar stenmeyen KAYIT(LOG) dosyas satrlar Transfer edilen bilgi Transfer edilen bilgi gnlk ortalamas Parantez iindeki deerlerin temsil ettii gn says: 7 gn-biti: son 7 gn Git lk Sayfa ## Some special phrases for particular reports. [zmlenmemi saysal adres] [Host bilinmiyor] [Bilinmeyen host] [Ana dizin] [Dizin yok] [dosya uzants yok] [Dizinler] Bilinmeyen Windows Dier Unix Robotlar iletim sistemi bilinmiyor ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) eriim 7 gnlk eriim eriim% 7 gnlk eriim% sayfa 7 gnlk sayfa sayfa% 7 gnlk sayfa% bytes ?bytes 7 gnlk bytes 7 gnlk ?bytes bytes% 7 gnlk bytes% no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * lk %s listeleniyor * * lk %d %s listeleniyor * * %s listeleniyor ## "by" in the phrase "listing the top 3 files BY number of requests" . Sralama: ## All requests WITH AT LEAST 10 requests - en az ## Different ways of doing floors son 7 gn iindeki eriim son 7 gn iindeki eriimler son yedi gn iindeki tek sayfa eriimi son yedi gn iindeki sayfa eriimleri ynlendirilmi eriim ynlendirilmi eriimler son yedi gn iindeki ynlendirilmi eriim son yedi gn iindeki ynlendirilmi eriimler baarsz eriim baarsz eriimler son yedi gn iindeki baarsz eriim son yedi gn iindeki baarsz eriimler % trafii olan son yedi gnde % trafii olan % max. trafii olan son yedi gnde % max. trafii olan eriim eriim miktar ## ?bytes represents kbytes, Mbytes etc. ?bytes cinsinden eriim miktar son yedi gn iindeki eriim son yedi gn iindeki bytes cinsinden eriim miktar son yedi gn iindeki ?bytes cinsinden eriim miktar son eriim: son ynlendirilmi eriim: son baarsz eriim: ilk eriim ilk ynlendirilmi eriim ilk baarsz eriim ## Now "sorted by": again, in m, f & n (only needed in plural though) * * Sralama: ## Used at the top of each report Bu rapordaki verilerin ait olduu dnem: ## Used in pie charts Dilimlerin temsil ettii byklk: ## different ways of sorting eriim miktar son yedi gn iindeki eriim miktar % eriim yzdeli son yedi gn iindeki % eriim yzdeli % max. eriim yzdeli son yedi gn iindeki % max. eriim yzdeli eriim says son yedi gn iindeki eriim says % sayfa eriim yzdeli son yedi gn iindeki % sayfa eriim yzdeli % max. sayfa eriim yzdeli son yedi gn iindeki % max. sayfa eriim yzdeli sayfa eriim says son yedi gn iindeki sayfa eriim says % ynlendirilmi eriim yzdeli son yedi gndeki % ynlendirilmi eriim yzdeli % max. ynlendirilmi eriim yzdeli son yedi gn iindeki % max. ynlendirilmi eriim yzdeli ynlendirilmi eriim says son yedi gn iindeki ynlendirilmi eriim says % baarsz eriim yzdeli son yedi gndeki % baarsz eriim yzdeli % max. baarsz eriim yzdeli son yedi gn iindeki % max. baarsz eriim yzdeli baarsz eriim says son yedi gn iindeki baarsz eriim says Son eriim zaman: Son ynlendirilmi eriim zaman: Son baarsz eriim zaman: ilk eriim zaman ilk ynlendirilmi eriim zaman ilk baarsz eriim zaman ## 3 other ways of sorting in m, f, & n * * Alfabetik sral * * Numara sral * * Sralanmam ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. sabah leden sonra ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w,%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/tw.lng0000644000175000017500000002546010161303541015014 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ## ## This file is translated by Tzu-hsien Yu (thyu@ck.tp.edu.tw), Jun 2001. ## *Big5 ## Abbreviations for the day and month names. g g@ gG gT g| g g @ G T | C K E Q Q@ QG ## Next some standard common words. ## Abbreviation for "week beginning" Cg ~ ## Quarter of a year u p Byte Bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes ШD ШD ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 ɶ ɶ ̦ ̦ɶ ̪ ̪ɶ ɮ ɮ D D D D ؿ ؿ ´ ´ ɦW ɦW URL URLs s s @~t @~t ## (= operating system, operating systems) jp ˯r ˯rӼ ϥΪ ϥΪ ANX ANX Web Server έp: ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports `ni ## The time reports, plus "busiest" strings (at the bottom of each report) C~i p~: Cui pu Ci p: Cgi pg: }l Cin Ci p: Cpɳi Cpɳin gCpɳi pp: C(15)i C(15)in p@: i in p: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Di D D n DsɦVi D D n Dѳi D D n ؿi ؿ ؿ n i ɦW ɦW n ШDi ɮ ɮ n sɦVi ɮ ɮ n ѳi ɮ ɮ n ӷi s URL s URLs n ӷi s s n sɦVs(Redirected Referrer)i s URL s URLs n ѳsI(Referrer)i s URL s URLs n jM˯i ˯ ˯ n ˯ri ˯r ˯r n jM˯i ˯ ˯ n ˯ri ˯r ˯r n Di D D n DsɦVi D D n Dѳi D D n ϥΪ̳i ϥΪ ϥΪ n ϥΪ̭sɦVi ϥΪ ϥΪ n ϥΪ̥ѳi ϥΪ ϥΪ n sni s s n si s s n @~tγi @~t @~t n i n ӷ´i ´ ´ n ANXi ANX ANX n Bzɶi ɮפjpi ## Used at the bottom of the report έpH: ɶ p1 ## Used in the time reports C N Υ ШD ШD ## Used at the bottom of each non-time report: need m, f & n genders * * SCX ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report {}l RШD ## Used in the General Summary \ШD Cѥ\ШD ШD\ШD C饭\ШD tANX ѽШD QVШD tANXШD ۲ƪШD ۲ƪӳXD a LΪ `ǿq CѶǿq AƭȪ CѦ ̫C ## Some special phrases for particular reports. [LkϸѪ}] [L] [] [ڥؿ] [Sؿ] [LɦW] [ؿ] Windows L Unix H Robots @~t ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * CX̤W %s * * CX̤W %d %s * * CX %s ## "by" in the phrase "listing the first 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests ܤ֦ ## Different ways of doing floors ̪CѤШD ̪CѤШD ̪CѤШD ̪CѤШD sɦVШD sɦVШD ̪CѭsɦVШD ̪CѭsɦVШD ѽШD ѽШD ̪CѤѽШD ̪CѤѽШD %yq %̪CѤyq %̤jyq %̪CѤ̤jyq yq(byte) yq(bytes) ## ?bytes represents kbytes, Mbytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days ШD۱q sɦVШD۱q ѽШD۱q Ĥ@ШDb Ĥ@sɦVШDb Ĥ@ѽШDb ## Now "sorted by": again, in m, f & n (only needed in plural though) * * Ƨ: ## Used at the top of each report oi]AF ## Used in pie charts ϧøsھ: ## different ways of sorting yq ̪CѤyq %ШD %̪CѤШD %̤jШD %̪CѤ̤jШD ШD ̪CѤШD %ﭶШD %̪CѤﭶШD %̤jﭶШD %̪CѤ̤jﭶШD ШD ̪CѤﭶШD %sɦVШD %̪CѤsɦVШD %̤jsɦVШD %̪CѤ̤jsɦVШD sɦVШD ̪CѤsɦVШD %ѽШD %̪CѤѽШD %ѽШD̤j %̪CѤ̤jѽШD ѽШD ̪CѤѽШD ̪ШDɶ ̪VШDɶ ̪񥢱ѽШDɶ Ĥ@ШDɶ Ĥ@sɦVɶ Ĥ@ѽШDɶ ## 3 other ways of sorting in m, f, & n * * rDZƧ * * ƦrjpƧ * * Ƨ ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y %H:%n ## "Program started at" and "Analysed requests from" %w, %m %D %Y %H:%n ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %H:%n-%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %H:%n-%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %m/%d/%y %H:%n ## In non-time reports: "including all files with requests since [date]" %m/%d/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/twdesc.txt0000644000175000017500000000611710161303541015710 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report oiH~@έp. # Quarterly Report oiHu@έp. # Monthly Report oiH묰@έp. # Weekly Report oiHg@έp. # Daily Report oiHѬ@έp. # Hourly Report oiHpɬ@έp. # Quarter-Hour Report oiH(15)@έp. # Five-Minute Report oiH@έp. # Daily Summary oiNҦOHCgUϤ@[`έp. # Hourly Summary oiNҦOHCѦUӤpɰϤ@[`έp. # Hour of the Week Summary oiNgҦOHCѦUӤpɰϤ@[`έp. # Quarter-Hour Summary oiNҦOHCѤC15Ϥ@[`έp. # Five-Minute Summary oiNҦOHCѤC5Ϥ@[`έp. # General Summary oi`έpT. # Request Report oiCXWɮ. # Redirection Report oiCXyШDQɦVt@ɮתɮ. (q`y]: ؿ̫֤᭱F׽u/, άOjsɦV CGI {) # Failure Report oiCXyШDѪɮצW, Ҧp䤣ɮ. # File Type Report oiCXQШDɮתɦW. # Directory Report oiCXQШDɮשݪؿ. (CXؿ]AlؿO) # Host Report oiCXeXШDD}. # Host Redirection Report oiCXQsɦVD}. # Host Failure Report oiCXeXѽШDD. # Domain Report oiCXѳX̪ӷa. # Referrer Report oiCXsI. (Referrer, Ysܥɮתm, άOW]AϤ) # Referring Site Report oiCXsܥɮתDέp. # Redirected Referrer Report oiCXyQsɦVШDӷ. # Failed Referrer Report oiCXsܥwsbɮתsIέp. # Browser Report oiCXѳX̩ҨϥΪs. # Virtual Host Report oiCXӧODOέp. # Virtual Host Redirection Report oiCXӧODQsɦVШDέp. # Virtual Host Failure Report oiCXӧODѽШDέp. # User Report oiCXeXШDϥΪ(pGiHѻ{ҩ cookie o). # User Redirection Report oiCXQsɦVϥΪ. # User Failure Report oiCXeXѽШDϥΪ. # Organisation Report oiCXѳX̦}ݪ´. # Search Query Report oiCXѳX̦bjMs즹ҨϥΪ˯. # Search Word Report oiCXѳX̦bjMs즹ҨϥΪ˯r. # Internal Search Query Report oiCXѳX̦bҨϥΪ˯. # Internal Search Word Report oiCXѳX̦bҨϥΪ˯r. # Browser Summary oiCXѳX̩ҨϥΪsέp. # Operating System Report oiCXѳX̩ҨϥΪ@~tβέp. # File Size Report oiCXQШDɮפjpέp. # Status Code Report oiCX HTTP ANXέp. # Processing Time Report oiCX\ШDBzҪ᪺ɶ. analog-6.0/lang/twdom.tab0000644000175000017500000001645210161303541015503 0ustar sret1sret100000000000000aero 2 Air Transport Industry ӷ~ arpa 1 Arpanet biz 2 Businesses ӷ~ com 2 Commercial ӷ~ coop 2 Co-operatives X@(´) edu 2 Ш| gov 2 F info 2 Informational @T int 2 International Treaty Organizations ڲ´ mil 2 xƳ museum 2 Museums ժ]ic name 3 Individuals ӤHϥ net 2 Network org 2 DQʲ´ pro 3 Professionals M~Hhξc ac 1 Ascension Island ȴ˪Yq ad 2 Andorra wD@M ae 3 United Arab Emirates ԧBpXj af 1 Afghanistan I ag 2 Antigua and Barbuda wadΤڥF ai 1 Anguilla ^ݦwjԮq al 1 Albania ڥ am 2 Armenia Ȭ an 1 Netherlands Antilles ݦwasq ao 1 Angola w aq 1 Antartica nw ar 3 Argentina ڧ as 1 American Samoa ļ at 3 Austria aQ au 3 Australia DjQ aw 1 Aruba |ڮq az 1 Azerbaijan ȶM ba 3 Bosnia and Herzegovina i襧-G bb 2 Barbados ڨh bd 1 Bangladesh s[Ԧ@M be 2 Belgium Q bf 1 Burkina Faso 򨺪k bg 2 Bulgaria O[Q bh 1 Bahrain ڪL bi 1 Burundi Za bj 1 Benin n bm 1 Bermuda ʼ}Fsq bn 1 Brunei Darussalam Z bo 3 Bolivia Q br 3 Brazil ڦ bs 1 Bahamas ګ bt 1 Bhutan bv 1 Bouvet Island ®q bw 1 Botswana iϨ@M by 1 Belarus իXù bz 1 Belize ca 2 Canada [j cc 1 Cocos (Keeling) Islands sq cd 1 Democratic Republic of the Congo GD@M cf 1 Central African Republic D@M cg 1 Republic of Congo G ch 2 Switzerland h ci 1 Ivory Coast (Cote d'Ivoire) H@M ck 1 Cook Islands wJsq cl 2 Chile Q cm 1 Cameroon س cn 3 China co 3 Colombia ۤ cr 3 Costa Rica j[ cu 1 Cuba j cv 1 Cape Verde w cx 1 Christmas Island tϮq cy 3 Cyprus 봶Ǵ cz 2 Czech Republic J@M de 2 Germany w dj 1 Djibouti Na dk 2 Denmark dm 2 Dominica h̥J do 2 Dominican Republic h̥J@M dz 1 Algeria ΧQ ec 3 Ecuador ̥ʦh ee 2 Estonia RF eg 3 Egypt J eh 1 Western Sahara 輻 er 1 Eritrea ̥߯S es 2 Spain Z et 1 Ethiopia fi 2 Finland fj 3 Fiji fk 1 Falkland Islands (Malvina) ^ݺ֧Jsq fm 1 Federal State of Micronesia KJù襧 fo 1 Faroe Islands Dsq fr 2 France k ga 1 Gabon [^ gd 1 Grenada ǹF ge 1 Georgia v gf 1 French Guiana kݻ\Ȩ gg 1 Guernsey ^ݯզq gh 3 Ghana { gi 1 Gibraltar ù gl 1 Greenland 泮 gm 1 Gambia ̤ gn 1 Guinea X gp 1 Guadeloupe (French) kݥʹFq gq 1 Equatorial Guinea DX gr 2 Greece þ gs 1 South Georgia and the South Sandwich Islands nvȤΫnTvsq gt 3 Guatemala ʦa gu 1 Guam (USA) q gw 1 Guinea-Bissau XȤЦ@M gy 1 Guyana \Ȩ hk 3 Hong Kong hm 1 Heard and McDonald Islands wҸsq hn 2 Honduras Դ hr 2 Croatia (Hrvatske) JùJ ht 1 Haiti a hu 2 Hungary IQ id 3 Indonesia L ie 2 Ireland R il 3 Israel HC im 1 Isle of Man ҫq in 3 India L io 1 British Indian Ocean Territory ^ݦL׬va iq 1 Iraq ԧJ ir 1 Iran is 2 Iceland Bq it 2 Italy qjQ je 1 Jersey ^ݿAq jm 3 Jamaica R[ jo 3 Jordan jp 3 Japan 饻 ke 3 Kenya ֨ kg 1 Kyrgyzstan NN kh 1 Cambodia ZH ki 1 Kiribati Nڴ@M km 1 Comoros 켯 kn 1 Saint Kitts & Nevis tJh֤Υ kp 1 North Korea (Democratic People's Republic of Korea) _ kr 3 South Korea (Republic of Korea) n kw 3 Kuwait ¯S ky 1 Cayman Islands }Ҹsq kz 1 Kazakhstan ħJ la 1 Laos d lb 3 Lebanon ڹ lc 1 Saint Lucia tȮq li 2 Liechtenstein C䴰n lk 1 Sri Lanka d lr 1 Liberia ls 1 Lesotho lt 2 Lithuania ߳{ lu 2 Luxembourg c˳ lv 2 Latvia Բ ly 1 Libya Arab Jamahiriya Q ma 1 Morocco mc 2 Monaco ǭ md 1 Moldova F mg 1 Madagascar F[[ mh 1 Marshall Islands кsq mk 3 Macedonia y ml 1 Mali Q mm 1 Myanmar ql mn 1 Mongolia Xj mo 1 Macau D mp 1 Northern Mariana Islands _wǸsq mq 1 Martinique (French) kݰq mr 1 Mauritania TQ𥧨 ms 1 Montserrat XSԯSq mt 3 Malta L mu 1 Mauritius Ҩ贵 mv 1 Maldives a mw 1 Malawi ԫ mx 3 Mexico my 3 Malaysia Ӧ mz 1 Mozambique TJ na 1 Namibia ̤ nc 1 New Caledonia (French) sبhȸsq ne 1 Niger nf 1 Norfolk Island պ֧Jq ng 1 Nigeria `ΧQ ni 3 Nicaragua [ԥ nl 2 Netherlands no 2 Norway np 1 Nepal y nr 1 Nauru վ| nu 2 Niue ë®q nz 3 New Zealand æ om 1 Oman pa 3 Panama ڮ pe 3 Peru | pf 1 Polynesia (French) kݬ pg 3 Papua New Guinea ڥsX ph 3 Philippines ߻ pk 3 Pakistan ڰ򴵩Z pl 3 Poland i pm 1 Saint Pierre and Miquelon tǮq pn 1 Pitcairn Island ֯Sdq pr 1 Puerto Rico ݪihU ps 1 Palestinian Territories ڰǴZa pt 2 Portugal pw 1 Palau [ py 3 Paraguay کԦc qa 1 Qatar dF re 1 Reunion Island (French) d ro 2 Romania ù ru 2 Russia Xù rw 1 Rwanda cwF sa 3 Saudi Arabia FQaԧB sb 1 Solomon Islands ùsq sc 1 Seychelles usq sd 1 Sudan Ĭ se 2 Sweden sg 3 Singapore s[Y sh 1 Saint Helena tǮq si 2 Slovenia sj 1 Svalbard and Jan Mayen Islands NΥsq sk 2 Slovak Republic J@M sl 1 Sierra Leone ls sm 1 San Marino tQ sn 1 Senegal 뤺[ so 1 Somalia Q sr 1 Suriname ĬQn st 1 Sao Tome and Principe thL sv 3 El Salvador ĺ˦h sy 1 Syria Arab Republic ԧQ sz 1 Swaziland v tc 1 Turks and Caicos Islands gJζ}촵sq td 1 Chad dw tf 1 French Southern Territories kna tg 1 Togo h th 3 Thailand tj 1 Tajikistan NJ tk 1 Tokelau JҸsq tl 1 East Timor FҨZ tm 1 Turkmenistan gw tn 1 Tunisia 𥧦 to 1 Tonga F[ tp 1 East Timor FҨZ tr 3 Turkey gը tt 3 Trinidad and Tobago dF tv 1 Tuvalu R˾|sq tw 3 Taiwan xW tz 1 Tanzania Z| ua 3 Ukraine QJ ug 3 Uganda QzF uk 3 United Kingdom ^ um 1 US Minor Outlying Islands ~q us 4 United States uy 3 Uruguay QԦc uz 1 Uzbekistan QOJZ va 1 Vatican City State 븦 vc 1 Saint Vincent & Grenadines tˤή稺B ve 3 Venezuela e vg 1 Virgin Islands (British) ^ݺʸsq vi 1 Virgin Islands (USA) ݺʸsq vn 1 Vietnam Vn vu 1 Vanuatu ˨Ϧ@M wf 1 Wallis and Futuna Islands ˧QM֧Ǹsq ws 1 Western Samoa ļ ye 1 Yemen yt 1 Mayotte ȯS yu 3 Yugoslavia nԤ za 3 South Africa nD zm 1 Zambia | zr 1 Zaire ĥ zw 3 Zimbabwe ګ analog-6.0/lang/ua.lng0000644000175000017500000003141110161303541014760 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## Hi mens I try to make translation file for ukrainian and I hope you can ## use it. In any case you may contact direct to me mb@serv.biph.kiev.ua ## or take the last version of this file at http://wek.kiev.ua/analog/ ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP Windows-1251 ## Abbreviations for the day and month names. ³ ' 01 02 03 04 05 06 07 08 09 10 11 12 ## Next some standard common words. ## Abbreviation for "week beginning" ## Quarter of a year . () () ## ?bytes represents kbytes, Mbytes etc. ? ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 URL URLs ## (= operating system, operating systems) i web- ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. ## Shorter versions of the same prefixes for column headings ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1- 10 11- 100 101- 1 1- 10 10-100 100- 1 1- 10 10-100 100- 1 > 1 ## Now the names of reports ## The time reports, plus "busiest" strings (at the bottom of each report) г ̳ , ' ' ' ' ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! () () () URL URLs n , n ³ () ## Used at the bottom of the report 1 ## Used in the time reports ## Used at the bottom of each non-time report: need m, f & n genders * * ## Used on the pie charts: again need m, f & n genders * * ## Used at the top of the report ## Used in the General Summary 7 , 7 ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) 7 %() %( 7 ) 7 %() %( 7 ) ? 7 ? 7 %() %( 7 ) ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * %s * * %d %s * * %s ## "by" in the phrase "listing the top 3 files BY number of requests" ## All requests WITH AT LEAST 10 requests ## Different ways of doing floors 7 7 7 7 7 7 7 7 % % 7 % % 7 ## ?bytes represents kbytes, Mbytes etc. ? byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * ## Used at the top of each report ## Used in pie charts ## different ways of sorting 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 % % 7 % % 7 7 ## 3 other ways of sorting in m, f, & n * * * * * * ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. ## am and pm in the sense of morning and afternoon. ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D.%m.%Y %H:%n ## "Program started at" and "Analysed requests from" %H:%n %D.%m.%Y ## In Daily Report %d.%m.%Y ## In Daily Summary %w ## In Hourly Report %d.%m.%Y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m.%Y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m.%Y ## In Monthly Report %m - %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m.%y ## The date & time (D) column in non-time reports %d.%m.%y %H:%n ## In non-time reports: "including all files with requests since [date]" %H:%n %d.%m.%y ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/uadesc.txt0000644000175000017500000001053710161303541015664 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report . # Quarterly Report . # Monthly Report . # Weekly Report . # Daily Report . # Hourly Report . # Quarter-Hour Report . # Five-Minute Report ' # Daily Summary . # Hourly Summary . # Hour of the Week Summary . # Quarter-Hour Summary ' . # Five-Minute Summary ' . # General Summary . # Request Report , . # Redirection Report , ( CGI ). # Failure Report , (: ). # File Type Report ( ). # Directory Report , . ( ) # Host Report ('), . # Host Redirection Report ('), .. # Host Failure Report ('), . # Domain Report , . # Referrer Report , ( ) . # Referring Site Report , ( ) . # Redirected Referrer Report , ( ) . . # Failed Referrer Report , ( ) . . # Browser Report , , . # Virtual Host Report . # Virtual Host Redirection Report , . # Virtual Host Failure Report , . # User Report ( (cookies)). # User Redirection Report , . # User Failure Report , . # Organisation Report , . # Search Query Report , . # Search Word Report , . # Internal Search Query Report , . # Internal Search Word Report , . # Browser Summary . # Operating System Report . # File Size Report . # Status Code Report HTTP . # Processing Time Report , . analog-6.0/lang/uk.lng0000644000175000017500000003134510161303541015000 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. year ## Quarter of a year quarter month day days hour minute minutes second seconds byte bytes ## ?bytes represents kilobytes, megabytes etc. ?bytes request requests date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date time time first date first time last date last time file files host hosts virtual host virtual hosts directory directories domain domains organisation organisations extension extensions URL URLs browser browsers OS OS's ## (= operating system, operating systems) size search term search terms site sites user users status code status codes Web Server Statistics for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports General Summary ## The time reports, plus "busiest" strings (at the bottom of each report) Yearly Report Busiest year: Quarterly Report Busiest quarter: Monthly Report Busiest month: Weekly Report Busiest week: week beginning Daily Summary Daily Report Busiest day: Hourly Report Hourly Summary Hour of the Week Summary Busiest hour: Quarter-Hour Report Quarter-Hour Summary Busiest quarter of an hour: Five-Minute Report Five-Minute Summary Busiest five minutes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Report host hosts n Host Redirection Report host hosts n Host Failure Report host hosts n Directory Report directory directories n File Type Report extension extensions n Request Report file files n Redirection Report file files n Failure Report file files n Referrer Report referring URL referring URLs n Referring Site Report referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Search Query Report query queries n Search Word Report query word query words n Internal Search Query Report query queries n Internal Search Word Report query word query words n Virtual Host Report virtual host virtual hosts n Virtual Host Redirection Report virtual host virtual hosts n Virtual Host Failure Report virtual host virtual hosts n User Report user users n User Redirection Report user users n User Failure Report user users n Browser Summary browser browsers n Browser Report browser browsers n Operating System Report operating system operating systems n Domain Report domain domains n Organisation Report organisation organisations n Status Code Report status code status codes n Processing Time Report File Size Report ## Used at the bottom of the report This analysis was produced by Running time Less than 1 ## Used in the time reports Each unit represents or part thereof request for a page requests for pages ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report Program started at Analysed requests from to ## Used in the General Summary Successful requests Average successful requests per day Successful requests for pages Average successful requests for pages per day Logfile lines without status code Failed requests Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data transferred Average data transferred per day Figures in parentheses refer to the 7-day period ending last 7 days Go To Top ## Some special phrases for particular reports. ## Note to self: these phrases also occur in anlghea3.h and Pnextname(). [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) reqs 7-day reqs %reqs %7-day reqs pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors request in the last 7 days requests in the last 7 days request for a page in the last 7 days requests for pages in the last 7 days redirected request redirected requests redirected request in the last 7 days redirected requests in the last 7 days failed request failed requests failed request in the last 7 days failed requests in the last 7 days % of the traffic % of the traffic in the last 7 days % of the maximum amount of traffic % of the maximum amount of traffic in the last 7 days byte of traffic bytes of traffic ## ?bytes represents kilobytes, megabytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report This report contains data from ## Used in pie charts The wedges are plotted by ## different ways of sorting the amount of traffic the amount of traffic in the last 7 days % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days the number of requests the number of requests in the last 7 days % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days the number of requests for pages the number of requests for pages in the last 7 days % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests in the last 7 days the number of redirected requests the number of redirected requests in the last 7 days % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days the number of failed requests the number of failed requests in the last 7 days the time of the last request the time of the last redirected request the time of the last failed request the time of the first request the time of the first redirected request the time of the first failed request ## 3 other ways of sorting in m, f, & n * * sorted alphabetically * * sorted numerically * * unsorted ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "listing files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/uk12.lng0000644000175000017500000003126210161303541015141 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. year ## Quarter of a year quarter month day days hour minute minutes second seconds byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes request requests date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date time time first date first time last date last time file files host hosts virtual host virtual hosts directory directories domain domains organisation organisations extension extensions URL URLs browser browsers OS OS's ## (= operating system, operating systems) size search term search terms site sites user users status code status codes Web Server Statistics for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports General Summary ## The time reports, plus "busiest" strings (at the bottom of each report) Yearly Report Busiest year: Quarterly Report Busiest quarter: Monthly Report Busiest month: Weekly Report Busiest week: week beginning Daily Summary Daily Report Busiest day: Hourly Report Hourly Summary Hour of the Week Summary Busiest hour: Quarter-Hour Report Quarter-Hour Summary Busiest quarter of an hour: Five-Minute Report Five-Minute Summary Busiest five minutes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Report host hosts n Host Redirection Report host hosts n Host Failure Report host hosts n Directory Report directory directories n File Type Report extension extensions n Request Report file files n Redirection Report file files n Failure Report file files n Referrer Report referring URL referring URLs n Referring Site Report referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Search Query Report query queries n Search Word Report query word query words n Internal Search Query Report query queries n Internal Search Word Report query word query words n Virtual Host Report virtual host virtual hosts n Virtual Host Redirection Report virtual host virtual hosts n Virtual Host Failure Report virtual host virtual hosts n User Report user users n User Redirection Report user users n User Failure Report user users n Browser Summary browser browsers n Browser Report browser browsers n Operating System Report operating system operating systems n Domain Report domain domains n Organisation Report organisation organisations n Status Code Report status code status codes n Processing Time Report File Size Report ## Used at the bottom of the report This analysis was produced by Running time Less than 1 ## Used in the time reports Each unit represents or part thereof request for a page requests for pages ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report Program started on Analysed requests from to ## Used in the General Summary Successful requests Average successful requests per day Successful requests for pages Average successful requests for pages per day Logfile lines without status code Failed requests Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data transferred Average data transferred per day Figures in parentheses refer to the 7-day period ending last 7 days Go To Top ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) reqs 7-day reqs %reqs %7-day reqs pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors request in the last 7 days requests in the last 7 days request for a page in the last 7 days requests for pages in the last 7 days redirected request redirected requests redirected request in the last 7 days redirected requests in the last 7 days failed request failed requests failed request in the last 7 days failed requests in the last 7 days % of the traffic % of the traffic in the last 7 days % of the maximum amount of traffic % of the maximum amount of traffic in the last 7 days byte of traffic bytes of traffic ## ?bytes represents kbytes, Mbytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report This report contains data from ## Used in pie charts The wedges are plotted by ## different ways of sorting the amount of traffic the amount of traffic in the last 7 days % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days the number of requests the number of requests in the last 7 days % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days the number of requests for pages the number of requests for pages in the last 7 days % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests in the last 7 days the number of redirected requests the number of redirected requests in the last 7 days % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days the number of failed requests the number of failed requests in the last 7 days the time of the last request the time of the last redirected request the time of the last failed request the time of the first request the time of the first redirected request the time of the first failed request ## 3 other ways of sorting in m, f, & n * * sorted alphabetically * * sorted numerically * * unsorted ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y at %j:%n%a ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y at %j:%n%a ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %j:%n%a%x%k:%o%b ## In Hourly Summary %h ## In Hour of the Week Summary %w %j:%n%a%x%k:%o%b ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %j:%n%a%x%k:%o%b ## In Quarter-Hour and Five-Minute Summaries %j:%n%a%x%k:%o%b ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %j:%n%a ## In non-time reports: "listing files with requests since [date]" %d/%m/%y at %j:%n%a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/uka.lng0000644000175000017500000003134310161303541015137 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. year ## Quarter of a year quarter month day days hour minute minutes second seconds byte bytes ## ?bytes represents kilobytes, megabytes etc. ?bytes request requests date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date time time first date first time last date last time file files host hosts virtual host virtual hosts directory directories domain domains organisation organisations extension extensions URL URLs browser browsers OS OS's ## (= operating system, operating systems) size search term search terms site sites user users status code status codes Web Server Statistics for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports General Summary ## The time reports, plus "busiest" strings (at the bottom of each report) Yearly Report Busiest year: Quarterly Report Busiest quarter: Monthly Report Busiest month: Weekly Report Busiest week: week beginning Daily Summary Daily Report Busiest day: Hourly Report Hourly Summary Hour of the Week Summary Busiest hour: Quarter-Hour Report Quarter-Hour Summary Busiest quarter of an hour: Five-Minute Report Five-Minute Summary Busiest five minutes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Report host hosts n Host Redirection Report host hosts n Host Failure Report host hosts n Directory Report directory directories n File Type Report extension extensions n Request Report file files n Redirection Report file files n Failure Report file files n Referrer Report referring URL referring URLs n Referring Site Report referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Search Query Report query queries n Search Word Report query word query words n Internal Search Query Report query queries n Internal Search Word Report query word query words n Virtual Host Report virtual host virtual hosts n Virtual Host Redirection Report virtual host virtual hosts n Virtual Host Failure Report virtual host virtual hosts n User Report user users n User Redirection Report user users n User Failure Report user users n Browser Summary browser browsers n Browser Report browser browsers n Operating System Report operating system operating systems n Domain Report domain domains n Organisation Report organisation organisations n Status Code Report status code status codes n Processing Time Report File Size Report ## Used at the bottom of the report This analysis was produced by Running time Less than 1 ## Used in the time reports Each unit represents or part thereof request for a page requests for pages ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report Program started at Analysed requests from to ## Used in the General Summary Successful requests Average successful requests per day Successful requests for pages Average successful requests for pages per day Logfile lines without status code Failed requests Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data transferred Average data transferred per day Figures in parentheses refer to the 7-day period ending last 7 days Go To Top ## Some special phrases for particular reports. ## Note to self: these phrases also occur in anlghea3.h and Pnextname(). [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) reqs 7-day reqs %reqs %7-day reqs pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes no. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors request in the last 7 days requests in the last 7 days request for a page in the last 7 days requests for pages in the last 7 days redirected request redirected requests redirected request in the last 7 days redirected requests in the last 7 days failed request failed requests failed request in the last 7 days failed requests in the last 7 days % of the traffic % of the traffic in the last 7 days % of the maximum amount of traffic % of the maximum amount of traffic in the last 7 days byte of traffic bytes of traffic ## ?bytes represents kilobytes, megabytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report This report contains data from ## Used in pie charts The wedges are plotted by ## different ways of sorting the amount of traffic the amount of traffic in the last 7 days % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days the number of requests the number of requests in the last 7 days % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days the number of requests for pages the number of requests for pages in the last 7 days % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests in the last 7 days the number of redirected requests the number of redirected requests in the last 7 days % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days the number of failed requests the number of failed requests in the last 7 days the time of the last request the time of the last redirected request the time of the last failed request the time of the first request the time of the first redirected request the time of the first failed request ## 3 other ways of sorting in m, f, & n * * sorted alphabetically * * sorted numerically * * unsorted ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. am pm ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D-%m-%Y %H:%n ## "Program started at" and "Analysed requests from" %w-%D-%m-%Y %H:%n ## In Daily Report %d/%m/%y ## In Daily Summary %w ## In Hourly Report %d/%m/%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d/%m/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d/%m/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d/%m/%y ## The date & time (D) column in non-time reports %d/%m/%y %H:%n ## In non-time reports: "listing files with requests since [date]" %d/%m/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/ukdesc.txt0000644000175000017500000001032410161303542015671 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report This report lists the activity in each year. # Quarterly Report This report lists the activity in each quarter. # Monthly Report This report lists the activity in each month. # Weekly Report This report lists the activity in each week. # Daily Report This report lists the activity in each day. # Hourly Report This report lists the activity in each hour. # Quarter-Hour Report This report lists the activity in each quarter-hour period. # Five-Minute Report This report lists the activity in each five-minute period. # Daily Summary This report lists the total activity for each day of the week, summed over all the weeks in the report. # Hourly Summary This report lists the total activity for each hour of the day, summed over all the days in the report. # Hour of the Week Summary This report lists the total activity for each hour of the week, summed over all the weeks in the report. # Quarter-Hour Summary This report lists the total activity for each quarter-hour period of the day, summed over all the days in the report. # Five-Minute Summary This report lists the total activity for each five-minute period of the day, summed over all the days in the report. # General Summary This report contains overall statistics. # Request Report This report lists the files on the site. # Redirection Report This report lists the files that caused requests to be redirected to another file. (Usually directories with the final slash missing, or CGI scripts that forced redirections.) # Failure Report This report lists the files that caused failures, for example files not found. # File Type Report This report lists the extensions of files. # Directory Report This report lists the directories from which files were requested. (The figures for each directory include all of its subdirectories.) # Host Report This report lists the computers which requested files. # Host Redirection Report This report lists the computers which were redirected to another file. # Host Failure Report This report lists the computers which encountered failed requests. # Domain Report This report lists the countries of the computers which requested files. # Referrer Report This report lists the referrers (where people followed links from, or pages which included this site's images). # Referring Site Report This report lists which servers people followed links from. # Redirected Referrer Report This report lists the referrers that caused redirected requests. # Failed Referrer Report This report lists the referrers containing broken links to the site. # Browser Report This report lists the browsers used by visitors. # Virtual Host Report This report lists the activity on each of the virtual domains at the site. # Virtual Host Redirection Report This report lists the redirected requests to each of the virtual domains. # Virtual Host Failure Report This report lists the failed requests to each of the virtual domains. # User Report This report lists the users who requested files, if users have been authenticated or can be identified by cookies. # User Redirection Report This report lists the users who were redirected to another file. # User Failure Report This report lists the users who encountered failed requests. # Organisation Report This report lists the organisations of the computers which requested files. # Search Query Report This report lists which queries people used in search engines to find the site. # Search Word Report This report lists which words people used in search engines to find the site. # Internal Search Query Report This report lists which queries people used on scripts within the site. # Internal Search Word Report This report lists which words people used on scripts within the site. # Browser Summary This report lists the vendors of visitors' browsers. # Operating System Report This report lists the operating systems used by visitors. # File Size Report This report lists the sizes of files. # Status Code Report This report lists the HTTP status codes of all requests. # Processing Time Report This report lists the times taken to process successful requests. analog-6.0/lang/ukdom.tab0000644000175000017500000001222010161303542015456 0ustar sret1sret100000000000000# Generic and Infrastructure domains aero 2 Air Transport Industry arpa 1 Arpanet biz 2 Businesses com 2 Commercial coop 2 Co-operatives edu 2 USA Higher Education gov 2 USA Government info 2 Informational int 2 International Treaty Organisations mil 2 USA Military museum 2 Museums name 3 Individuals net 2 Networks org 2 Non Profit Making Organisations pro 3 Professionals # Country code domains ac 1 Ascension Island ad 2 Andorra ae 3 United Arab Emirates af 1 Afghanistan ag 2 Antigua and Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Netherlands Antilles ao 1 Angola aq 1 Antarctica ar 3 Argentina as 1 American Samoa at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijan ba 3 Bosnia-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgium bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazil bs 1 Bahamas bt 1 Bhutan bv 1 Bouvet Island bw 1 Botswana by 1 Belarus bz 1 Belize ca 3 Canada cc 1 Cocos (Keeling) Islands cd 1 Democratic Republic of the Congo cf 1 Central African Republic cg 1 Congo ch 2 Switzerland ci 1 Ivory Coast ck 1 Cook Islands cl 2 Chile cm 1 Cameroon cn 3 China co 3 Colombia cr 3 Costa Rica cs 3 Serbia and Montenegro cu 2 Cuba cv 1 Cape Verde cx 2 Christmas Island cy 3 Cyprus cz 2 Czech Republic de 2 Germany dj 1 Djibouti dk 2 Denmark dm 2 Dominica do 3 Dominican Republic dz 1 Algeria ec 3 Ecuador ee 2 Estonia eg 3 Egypt eh 1 Western Sahara er 1 Eritrea es 2 Spain et 1 Ethiopia fi 2 Finland fj 3 Fiji fk 1 Falkland Islands fm 1 Micronesia fo 1 Faroe Islands fr 2 France fx 1 France (European Territory) ga 1 Gabon gb 1 United Kingdom gd 1 Grenada ge 1 Georgia gf 1 French Guiana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Greenland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Equatorial Guinea gr 2 Greece gs 1 South Georgia and South Sandwich Islands gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heard and McDonald Islands hn 2 Honduras hr 2 Croatia ht 1 Haiti hu 2 Hungary id 3 Indonesia ie 2 Ireland il 3 Israel im 1 Isle of Man in 3 India io 1 British Indian Ocean Territory iq 1 Iraq ir 1 Iran is 2 Iceland it 2 Italy je 1 Jersey jm 3 Jamaica jo 3 Jordan jp 3 Japan ke 3 Kenya kg 1 Kyrgyzstan kh 1 Cambodia ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts and Nevis kp 1 North Korea kr 3 South Korea kw 3 Kuwait ky 1 Cayman Islands kz 1 Kazakhstan la 1 Laos lb 3 Lebanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lithuania lu 2 Luxembourg lv 2 Latvia ly 1 Libya ma 1 Morocco mc 2 Monaco md 1 Moldova mg 1 Madagascar mh 1 Marshall Islands mk 3 Macedonia (Former Yugoslav Republic) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Northern Mariana Islands mq 1 Martinique mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldives mw 1 Malawi mx 3 Mexico my 3 Malaysia mz 1 Mozambique na 1 Namibia nc 1 New Caledonia ne 1 Niger nf 1 Norfolk Island ng 1 Nigeria ni 3 Nicaragua nl 2 Netherlands no 2 Norway np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 New Zealand om 1 Oman pa 3 Panama pe 3 Peru pf 1 French Polynesia pg 3 Papua New Guinea ph 3 Philippines pk 3 Pakistan pl 3 Poland pm 1 Saint Pierre and Miquelon pn 1 Pitcairn Island pr 1 Puerto Rico ps 3 Occupied Palestinian Territory pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Romania ru 2 Russia rw 1 Rwanda sa 3 Saudi Arabia sb 1 Solomon Islands sc 1 Seychelles sd 1 Sudan se 2 Sweden sg 3 Singapore sh 1 Saint Helena si 2 Slovenia sj 1 Svalbard and Jan Mayen Islands sk 2 Slovakia sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Saint Tome and Principe su 2 Former USSR sv 3 El Salvador sy 1 Syria sz 1 Swaziland tc 1 Turks and Caicos Islands td 1 Chad tf 1 French Southern Territories tg 1 Togo th 3 Thailand tj 1 Tajikistan tk 1 Tokelau tl 1 East Timor tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 East Timor tr 3 Turkey tt 3 Trinidad and Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraine ug 3 Uganda uk 3 United Kingdom um 1 USA Minor Outlying Islands us 4 United States uy 3 Uruguay uz 1 Uzbekistan va 1 Vatican City State vc 1 Saint Vincent and Grenadines ve 3 Venezuela vg 1 Virgin Islands (British) vi 1 Virgin Islands (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis and Futuna Islands ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Former Yugoslavia za 3 South Africa zm 1 Zambia zr 1 Democratic Republic of the Congo zw 3 Zimbabwe analog-6.0/lang/us.lng0000644000175000017500000003130210161303542015002 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. year ## Quarter of a year quarter month day days hour minute minutes second seconds byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes request requests date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date time time first date first time last date last time file files host hosts virtual host virtual hosts directory directories domain domains organization organizations extension extensions URL URLs browser browsers OS OS's ## (= operating system, operating systems) size search term search terms site sites user users status code status codes Web Server Statistics for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports General Summary ## The time reports, plus "busiest" strings (at the bottom of each report) Yearly Report Busiest year: Quarterly Report Busiest quarter: Monthly Report Busiest month: Weekly Report Busiest week: week beginning Daily Summary Daily Report Busiest day: Hourly Report Hourly Summary Hour of the Week Summary Busiest hour: Quarter-Hour Report Quarter-Hour Summary Busiest quarter of an hour: Five-Minute Report Five-Minute Summary Busiest five minutes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Report host hosts n Host Redirection Report host hosts n Host Failure Report host hosts n Directory Report directory directories n File Type Report extension extensions n Request Report file files n Redirection Report file files n Failure Report file files n Referrer Report referring URL referring URLs n Referring Site Report referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Search Query Report query queries n Search Word Report query word query words n Internal Search Query Report query queries n Internal Search Word Report query word query words n Virtual Host Report virtual host virtual hosts n Virtual Host Redirection Report virtual host virtual hosts n Virtual Host Failure Report virtual host virtual hosts n User Report user users n User Redirection Report user users n User Failure Report user users n Browser Summary browser browsers n Browser Report browser browsers n Operating System Report operating system operating systems n Domain Report domain domains n Organization Report organization organizations n Status Code Report status code status codes n Processing Time Report File Size Report ## Used at the bottom of the report This analysis was produced by Running time Less than 1 ## Used in the time reports Each unit represents or part thereof request for a page requests for pages ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report Program started on Analyzed requests from to ## Used in the General Summary Successful requests Average successful requests per day Successful requests for pages Average successful requests for pages per day Logfile lines without status code Failed requests Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data transferred Average data transferred per day Figures in parentheses refer to the 7-day period ending last 7 days Go To Top ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors request in the last 7 days requests in the last 7 days request for a page in the last 7 days requests for pages in the last 7 days redirected request redirected requests redirected request in the last 7 days redirected requests in the last 7 days failed request failed requests failed request in the last 7 days failed requests in the last 7 days % of the traffic % of the traffic in the last 7 days % of the maximum amount of traffic % of the maximum amount of traffic in the last 7 days byte of traffic bytes of traffic ## ?bytes represents kbytes, Mbytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report This report contains data from ## Used in pie charts The wedges are plotted by ## different ways of sorting the amount of traffic the amount of traffic in the last 7 days % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days the number of requests the number of requests in the last 7 days % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days the number of requests for pages the number of requests for pages in the last 7 days % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests in the last 7 days the number of redirected requests the number of redirected requests in the last 7 days % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days the number of failed requests the number of failed requests in the last 7 days the time of the last request the time of the last redirected request the time of the last failed request the time of the first request the time of the first redirected request the time of the first failed request ## 3 other ways of sorting in m, f, & n * * sorted alphabetically * * sorted numerically * * unsorted ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. AM PM ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y at %j:%n %a ## "Program started at" and "Analysed requests from" %w, %m %D %Y at %j:%n %a ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %j:%n %a%x%k:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n %a%x%k:%o %b ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %m/%d/%y ## The date & time (D) column in non-time reports %m/%d/%y %j:%n %a ## In non-time reports: "listing files with requests since [date]" %m/%d/%y at %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/us24.lng0000644000175000017500000003122210161303542015151 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP ISO-8859-1 ## Abbreviations for the day and month names. Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. year ## Quarter of a year quarter month day days hour minute minutes second seconds byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes request requests date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date time time first date first time last date last time file files host hosts virtual host virtual hosts directory directories domain domains organization organizations extension extensions URL URLs browser browsers OS OS's ## (= operating system, operating systems) size search term search terms site sites user users status code status codes Web Server Statistics for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports General Summary ## The time reports, plus "busiest" strings (at the bottom of each report) Yearly Report Busiest year: Quarterly Report Busiest quarter: Monthly Report Busiest month: Weekly Report Busiest week: week beginning Daily Summary Daily Report Busiest day: Hourly Report Hourly Summary Hour of the Week Summary Busiest hour: Quarter-Hour Report Quarter-Hour Summary Busiest quarter of an hour: Five-Minute Report Five-Minute Summary Busiest five minutes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Report host hosts n Host Redirection Report host hosts n Host Failure Report host hosts n Directory Report directory directories n File Type Report extension extensions n Request Report file files n Redirection Report file files n Failure Report file files n Referrer Report referring URL referring URLs n Referring Site Report referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Search Query Report query queries n Search Word Report query word query words n Internal Search Query Report query queries n Internal Search Word Report query word query words n Virtual Host Report virtual host virtual hosts n Virtual Host Redirection Report virtual host virtual hosts n Virtual Host Failure Report virtual host virtual hosts n User Report user users n User Redirection Report user users n User Failure Report user users n Browser Summary browser browsers n Browser Report browser browsers n Operating System Report operating system operating systems n Domain Report domain domains n Organization Report organization organizations n Status Code Report status code status codes n Processing Time Report File Size Report ## Used at the bottom of the report This analysis was produced by Running time Less than 1 ## Used in the time reports Each unit represents or part thereof request for a page requests for pages ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report Program started at Analyzed requests from to ## Used in the General Summary Successful requests Average successful requests per day Successful requests for pages Average successful requests for pages per day Logfile lines without status code Failed requests Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data transferred Average data transferred per day Figures in parentheses refer to the 7-day period ending last 7 days Go To Top ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors request in the last 7 days requests in the last 7 days request for a page in the last 7 days requests for pages in the last 7 days redirected request redirected requests redirected request in the last 7 days redirected requests in the last 7 days failed request failed requests failed request in the last 7 days failed requests in the last 7 days % of the traffic % of the traffic in the last 7 days % of the maximum amount of traffic % of the maximum amount of traffic in the last 7 days byte of traffic bytes of traffic ## ?bytes represents kbytes, Mbytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report This report contains data from ## Used in pie charts The wedges are plotted by ## different ways of sorting the amount of traffic the amount of traffic in the last 7 days % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days the number of requests the number of requests in the last 7 days % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days the number of requests for pages the number of requests for pages in the last 7 days % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests in the last 7 days the number of redirected requests the number of redirected requests in the last 7 days % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days the number of failed requests the number of failed requests in the last 7 days the time of the last request the time of the last redirected request the time of the last failed request the time of the first request the time of the first redirected request the time of the first failed request ## 3 other ways of sorting in m, f, & n * * sorted alphabetically * * sorted numerically * * unsorted ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. AM PM ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y %H:%n ## "Program started at" and "Analysed requests from" %w, %m %D %Y %H:%n ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %m/%d/%y ## The date & time (D) column in non-time reports %m/%d/%y %H:%n ## In non-time reports: "listing files with requests since [date]" %m/%d/%y at %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/usa.lng0000644000175000017500000003130010161303542015141 0ustar sret1sret100000000000000## Language file for analog 6.0. May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## If your language doesn't seem to fit into this pattern, explain the problem ## to me, and I can adjust the source code if necessary. ## ## The character set of this language file. Prefix with a * to indicate a ## multibyte character set: e.g. *ISO-2022-JP US-ASCII ## Abbreviations for the day and month names. Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ## Next some standard common words. ## Abbreviation for "week beginning" week beg. year ## Quarter of a year quarter month day days hour minute minutes second seconds byte bytes ## ?bytes represents kbytes, Mbytes etc. ?bytes request requests date ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 date time time first date first time last date last time file files host hosts virtual host virtual hosts directory directories domain domains organization organizations extension extensions URL URLs browser browsers OS OS's ## (= operating system, operating systems) size search term search terms site sites user users status code status codes Web Server Statistics for ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports General Summary ## The time reports, plus "busiest" strings (at the bottom of each report) Yearly Report Busiest year: Quarterly Report Busiest quarter: Monthly Report Busiest month: Weekly Report Busiest week: week beginning Daily Summary Daily Report Busiest day: Hourly Report Hourly Summary Hour of the Week Summary Busiest hour: Quarter-Hour Report Quarter-Hour Summary Busiest quarter of an hour: Five-Minute Report Five-Minute Summary Busiest five minutes: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "listing ??? with at ## least 200 requests". (The words higher up are used for column headings and ## for the "not listed" lines at the bottom of the reports.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Host Report host hosts n Host Redirection Report host hosts n Host Failure Report host hosts n Directory Report directory directories n File Type Report extension extensions n Request Report file files n Redirection Report file files n Failure Report file files n Referrer Report referring URL referring URLs n Referring Site Report referring site referring sites n Redirected Referrer Report referring URL referring URLs n Failed Referrer Report referring URL referring URLs n Search Query Report query queries n Search Word Report query word query words n Internal Search Query Report query queries n Internal Search Word Report query word query words n Virtual Host Report virtual host virtual hosts n Virtual Host Redirection Report virtual host virtual hosts n Virtual Host Failure Report virtual host virtual hosts n User Report user users n User Redirection Report user users n User Failure Report user users n Browser Summary browser browsers n Browser Report browser browsers n Operating System Report operating system operating systems n Domain Report domain domains n Organization Report organization organizations n Status Code Report status code status codes n Processing Time Report File Size Report ## Used at the bottom of the report This analysis was produced by Running time Less than 1 ## Used in the time reports Each unit represents or part thereof request for a page requests for pages ## Used at the bottom of each non-time report: need m, f & n genders * * not listed ## Used on the pie charts: again need m, f & n genders * * Other ## Used at the top of the report Program started on Analyzed requests from to ## Used in the General Summary Successful requests Average successful requests per day Successful requests for pages Average successful requests for pages per day Logfile lines without status code Failed requests Redirected requests Requests with informational status code Distinct files requested Distinct hosts served Corrupt logfile lines Unwanted logfile entries Data transferred Average data transferred per day Figures in parentheses refer to the 7-day period ending last 7 days Go To Top ## Some special phrases for particular reports. [unresolved numerical addresses] [domain not given] [unknown domain] [root directory] [no directory] [no extension] [directories] Unknown Windows Other Unix Known robots OS unknown ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) #reqs 7-day reqs %reqs %7-day reqs #pages 7-day pages %pages %7-day pages bytes ?bytes 7-day bytes 7-day ?bytes %bytes %7-day bytes # ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Listing the top %s * * Listing the top %d %s * * Listing %s ## "by" in the phrase "listing the top 3 files BY number of requests" by ## All requests WITH AT LEAST 10 requests with at least ## Different ways of doing floors request in the last 7 days requests in the last 7 days request for a page in the last 7 days requests for pages in the last 7 days redirected request redirected requests redirected request in the last 7 days redirected requests in the last 7 days failed request failed requests failed request in the last 7 days failed requests in the last 7 days % of the traffic % of the traffic in the last 7 days % of the maximum amount of traffic % of the maximum amount of traffic in the last 7 days byte of traffic bytes of traffic ## ?bytes represents kbytes, Mbytes etc. ?bytes of traffic byte of traffic in the last 7 days bytes of traffic in the last 7 days ?bytes of traffic in the last 7 days with a request since with a redirected request since with a failed request since with first request since with first redirected request since with first failed request since ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sorted by ## Used at the top of each report This report contains data from ## Used in pie charts The wedges are plotted by ## different ways of sorting the amount of traffic the amount of traffic in the last 7 days % of the requests % of the requests in the last 7 days % of the maximum number of requests % of the maximum number of requests in the last 7 days the number of requests the number of requests in the last 7 days % of the requests for pages % of the requests for pages in the last 7 days % of the maximum number of requests for pages % of the maximum number of requests for pages in the last 7 days the number of requests for pages the number of requests for pages in the last 7 days % of the redirected requests % of the redirected requests in the last 7 days % of the maximum number of redirected requests % of the maximum number of redirected requests in the last 7 days the number of redirected requests the number of redirected requests in the last 7 days % of the failed requests % of the failed requests in the last 7 days % of the maximum number of failed requests % of the maximum number of failed requests in the last 7 days the number of failed requests the number of failed requests in the last 7 days the time of the last request the time of the last redirected request the time of the last failed request the time of the first request the time of the first redirected request the time of the first failed request ## 3 other ways of sorting in m, f, & n * * sorted alphabetically * * sorted numerically * * unsorted ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. AM PM ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %m %D %Y at %j:%n %a ## "Program started at" and "Analysed requests from" %w, %m %D %Y at %j:%n %a ## In Daily Report %m/%d/%y ## In Daily Summary %w ## In Hourly Report %m/%d/%y %j:%n %a%x%k:%o %b ## In Hourly Summary %h ## In Hour of the Week Summary %w %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Reports %m/%d/%y %j:%n %a%x%k:%o %b ## In Quarter-Hour and Five-Minute Summaries %j:%n %a%x%k:%o %b ## In Weekly Report %m/%d/%y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %m/%d/%y ## The date & time (D) column in non-time reports %m/%d/%y %j:%n %a ## In non-time reports: "listing files with requests since [date]" %m/%d/%y at %j:%n %a ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Continue with request 101 Switching protocols 1xx [Miscellaneous informational] 200 OK 201 Created 202 Accepted for future processing 203 Non-authoritative information 204 OK, but nothing to send 205 Reset document 206 Partial content 2xx [Miscellaneous successes] 300 Multiple documents available 301 Document moved permanently 302 Document found elsewhere 303 See other document 304 Not modified since last retrieval 305 Use proxy 306 Switch proxy 307 Document moved temporarily 3xx [Miscellaneous redirections] 400 Bad request 401 Authentication required 402 Payment required 403 Access forbidden 404 Document not found 405 Method not allowed 406 Document not acceptable to client 407 Proxy authentication required 408 Request timeout 409 Request conflicts with state of resource 410 Document gone permanently 411 Length required 412 Precondition failed 413 Request too long 414 Requested filename too long 415 Unsupported media type 416 Requested range not valid 417 Expectation failed 4xx [Miscellaneous client/user errors] 500 Internal server error 501 Request type not supported 502 Error at upstream server 503 Service temporarily unavailable 504 Gateway timeout 505 HTTP version not supported 506 Redirection failed 5xx [Miscellaneous server errors] xxx [Unknown] analog-6.0/lang/usdesc.txt0000644000175000017500000001032410161303542015701 0ustar sret1sret100000000000000# Report descriptions file for analog 6.0. # # This file contains descriptions of each report. Lines starting with a # hash (#) are comments. Otherwise, each report must take EXACTLY ONE LINE. # Yearly Report This report lists the activity in each year. # Quarterly Report This report lists the activity in each quarter. # Monthly Report This report lists the activity in each month. # Weekly Report This report lists the activity in each week. # Daily Report This report lists the activity in each day. # Hourly Report This report lists the activity in each hour. # Quarter-Hour Report This report lists the activity in each quarter-hour period. # Five-Minute Report This report lists the activity in each five-minute period. # Daily Summary This report lists the total activity for each day of the week, summed over all the weeks in the report. # Hourly Summary This report lists the total activity for each hour of the day, summed over all the days in the report. # Hour of the Week Summary This report lists the total activity for each hour of the week, summed over all the weeks in the report. # Quarter-Hour Summary This report lists the total activity for each quarter-hour period of the day, summed over all the days in the report. # Five-Minute Summary This report lists the total activity for each five-minute period of the day, summed over all the days in the report. # General Summary This report contains overall statistics. # Request Report This report lists the files on the site. # Redirection Report This report lists the files that caused requests to be redirected to another file. (Usually directories with the final slash missing, or CGI scripts that forced redirections.) # Failure Report This report lists the files that caused failures, for example files not found. # File Type Report This report lists the extensions of files. # Directory Report This report lists the directories from which files were requested. (The figures for each directory include all of its subdirectories.) # Host Report This report lists the computers which requested files. # Host Redirection Report This report lists the computers which were redirected to another file. # Host Failure Report This report lists the computers which encountered failed requests. # Domain Report This report lists the countries of the computers which requested files. # Referrer Report This report lists the referrers (where people followed links from, or pages which included this site's images). # Referring Site Report This report lists which servers people followed links from. # Redirected Referrer Report This report lists the referrers that caused redirected requests. # Failed Referrer Report This report lists the referrers containing broken links to the site. # Browser Report This report lists the browsers used by visitors. # Virtual Host Report This report lists the activity on each of the virtual domains at the site. # Virtual Host Redirection Report This report lists the redirected requests to each of the virtual domains. # Virtual Host Failure Report This report lists the failed requests to each of the virtual domains. # User Report This report lists the users who requested files, if users have been authenticated or can be identified by cookies. # User Redirection Report This report lists the users who were redirected to another file. # User Failure Report This report lists the users who encountered failed requests. # Organisation Report This report lists the organizations of the computers which requested files. # Search Query Report This report lists which queries people used in search engines to find the site. # Search Word Report This report lists which words people used in search engines to find the site. # Internal Search Query Report This report lists which queries people used on scripts within the site. # Internal Search Word Report This report lists which words people used on scripts within the site. # Browser Summary This report lists the vendors of visitors' browsers. # Operating System Report This report lists the operating systems used by visitors. # File Size Report This report lists the sizes of files. # Status Code Report This report lists the HTTP status codes of all requests. # Processing Time Report This report lists the times taken to process successful requests. analog-6.0/lang/usdom.tab0000644000175000017500000001221410161303542015471 0ustar sret1sret100000000000000# Generic and Infrastructure domains aero 2 Air Transport Industry arpa 1 Arpanet biz 2 Businesses com 2 Commercial coop 2 Cooperatives edu 2 US Higher Education gov 2 US Government info 2 Informational int 2 International Treaty Organizations mil 2 US Military museum 2 Museums name 3 Individuals net 2 Networks org 2 Non Profit Making Organizations pro 3 Professionals # Country code domains ac 1 Ascension Island ad 2 Andorra ae 3 United Arab Emirates af 1 Afghanistan ag 2 Antigua and Barbuda ai 1 Anguilla al 1 Albania am 2 Armenia an 1 Netherlands Antilles ao 1 Angola aq 1 Antarctica ar 3 Argentina as 1 American Samoa at 3 Austria au 3 Australia aw 1 Aruba az 1 Azerbaijan ba 3 Bosnia-Herzegovina bb 2 Barbados bd 1 Bangladesh be 3 Belgium bf 1 Burkina Faso bg 2 Bulgaria bh 1 Bahrain bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei Darussalam bo 3 Bolivia br 3 Brazil bs 1 Bahamas bt 1 Bhutan bv 1 Bouvet Island bw 1 Botswana by 1 Belarus bz 1 Belize ca 3 Canada cc 1 Cocos (Keeling) Islands cd 1 Democratic Republic of the Congo cf 1 Central African Republic cg 1 Congo ch 2 Switzerland ci 1 Ivory Coast ck 1 Cook Islands cl 2 Chile cm 1 Cameroon cn 3 China co 3 Colombia cr 3 Costa Rica cs 3 Serbia and Montenegro cu 2 Cuba cv 1 Cape Verde cx 2 Christmas Island cy 3 Cyprus cz 2 Czech Republic de 2 Germany dj 1 Djibouti dk 2 Denmark dm 2 Dominica do 3 Dominican Republic dz 1 Algeria ec 3 Ecuador ee 2 Estonia eg 3 Egypt eh 1 Western Sahara er 1 Eritrea es 2 Spain et 1 Ethiopia fi 2 Finland fj 3 Fiji fk 1 Falkland Islands fm 1 Micronesia fo 1 Faroe Islands fr 2 France fx 1 France (European Territory) ga 1 Gabon gb 1 United Kingdom gd 1 Grenada ge 1 Georgia gf 1 French Guiana gg 1 Guernsey gh 3 Ghana gi 1 Gibraltar gl 1 Greenland gm 1 Gambia gn 1 Guinea gp 1 Guadeloupe gq 1 Equatorial Guinea gr 2 Greece gs 1 South Georgia and South Sandwich Islands gt 3 Guatemala gu 1 Guam gw 1 Guinea-Bissau gy 1 Guyana hk 3 Hong Kong hm 1 Heard and McDonald Islands hn 2 Honduras hr 2 Croatia ht 1 Haiti hu 2 Hungary id 3 Indonesia ie 2 Ireland il 3 Israel im 1 Isle of Man in 3 India io 1 British Indian Ocean Territory iq 1 Iraq ir 1 Iran is 2 Iceland it 2 Italy je 1 Jersey jm 3 Jamaica jo 3 Jordan jp 3 Japan ke 3 Kenya kg 1 Kyrgyzstan kh 1 Cambodia ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts and Nevis kp 1 North Korea kr 3 South Korea kw 3 Kuwait ky 1 Cayman Islands kz 1 Kazakhstan la 1 Laos lb 3 Lebanon lc 1 Saint Lucia li 2 Liechtenstein lk 1 Sri Lanka lr 1 Liberia ls 1 Lesotho lt 2 Lithuania lu 2 Luxembourg lv 2 Latvia ly 1 Libya ma 1 Morocco mc 2 Monaco md 1 Moldova mg 1 Madagascar mh 1 Marshall Islands mk 3 Macedonia (Former Yugoslav Republic) ml 1 Mali mm 1 Myanmar mn 1 Mongolia mo 1 Macao mp 1 Northern Mariana Islands mq 1 Martinique mr 1 Mauritania ms 1 Montserrat mt 3 Malta mu 1 Mauritius mv 1 Maldives mw 1 Malawi mx 3 Mexico my 3 Malaysia mz 1 Mozambique na 1 Namibia nc 1 New Caledonia ne 1 Niger nf 1 Norfolk Island ng 1 Nigeria ni 3 Nicaragua nl 2 Netherlands no 2 Norway np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 New Zealand om 1 Oman pa 3 Panama pe 3 Peru pf 1 French Polynesia pg 3 Papua New Guinea ph 3 Philippines pk 3 Pakistan pl 3 Poland pm 1 Saint Pierre and Miquelon pn 1 Pitcairn Island pr 1 Puerto Rico ps 3 Occupied Palestinian Territory pt 2 Portugal pw 1 Palau py 3 Paraguay qa 1 Qatar re 1 Reunion ro 2 Romania ru 2 Russia rw 1 Rwanda sa 3 Saudi Arabia sb 1 Solomon Islands sc 1 Seychelles sd 1 Sudan se 2 Sweden sg 3 Singapore sh 1 Saint Helena si 2 Slovenia sj 1 Svalbard and Jan Mayen Islands sk 2 Slovakia sl 1 Sierra Leone sm 1 San Marino sn 1 Senegal so 1 Somalia sr 1 Suriname st 1 Saint Tome and Principe su 2 Former USSR sv 3 El Salvador sy 1 Syria sz 1 Swaziland tc 1 Turks and Caicos Islands td 1 Chad tf 1 French Southern Territories tg 1 Togo th 3 Thailand tj 1 Tajikistan tk 1 Tokelau tl 1 East Timor tm 1 Turkmenistan tn 1 Tunisia to 1 Tonga tp 1 East Timor tr 3 Turkey tt 3 Trinidad and Tobago tv 1 Tuvalu tw 3 Taiwan tz 1 Tanzania ua 3 Ukraine ug 3 Uganda uk 3 United Kingdom um 1 USA Minor Outlying Islands us 4 United States uy 3 Uruguay uz 1 Uzbekistan va 1 Vatican City State vc 1 Saint Vincent and Grenadines ve 3 Venezuela vg 1 Virgin Islands (British) vi 1 Virgin Islands (USA) vn 1 Vietnam vu 1 Vanuatu wf 1 Wallis and Futuna Islands ws 1 Samoa ye 1 Yemen yt 1 Mayotte yu 3 Former Yugoslavia za 3 South Africa zm 1 Zambia zr 1 Democratic Republic of the Congo zw 3 Zimbabwe analog-6.0/lang/usform.html0000644000175000017500000002003410161303542016052 0ustar sret1sret100000000000000 Analog form interface

Analog form interface


1. Report choices

N.B. This form will not work - e.g. the buttons may not even appear - until you've configured it according to the instructions. When you've configured it, you should remove this paragraph.
See the analog home page for the meanings of the various reports.

Which reports do you want to see?


[On] [Off] General Summary
[On] [Off] Monthly Report
[On] [Off] Weekly Report
[On] [Off] Daily Summary
[On] [Off] Daily Report
[On] [Off] Hourly Summary
[On] [Off] Domain Report
[On] [Off] Organization Report
[On] [Off] Directory Report
[On] [Off] File Type Report
[On] [Off] Request Report
[On] [Off] File Size Report
[On] [Off] Referrer Report
[On] [Off] Search Query Report
[On] [Off] Search Word Report
[On] [Off] Browser Summary
[On] [Off] Operating System Report
[On] [Off] Status Code Report

You can now run the program:
Or you can fill in the options below for individual reports. You can use bytes to mean 10 Megabytes; also to mean the 50 items with the most bytes.


2. Detailed report options

Domain Report options

Sort the Domain Report
Include all domains with at least

Organization Report options

Sort the Organization Report
Include all organizations with at least

Directory Report options

Sort the Directory Report
Include all directories with at least

Request Report options

Sort the Request Report
Include all files with at least
Show

Referrer Report options

Sort the Referrer Report
Include all referrers with at least

3. Analyzing only part of the logfile

Only certain dates
You can analyze only the requests from certain dates. Enter the range of dates below in the from yymmdd; e.g., 980301 for 1st March 1998 (or fill in just one box to limit the range of dates on just one side).
From to

Only certain files
Only look at the following files (list, separated by commas; can contain wild character *)

Ignore the following files


4. Layout

Your organization's name (for the title of the page)

Your organization's home page
URL:


analog-6.0/lang/yu.lng0000644000175000017500000003262010161303542015014 0ustar sret1sret100000000000000## Serbian language file for analog 6.0. ## May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## ## Serbian versions (5.0.01) ISO-8859-2 and ASCII 7bit - by Deli Radivoje ## ## ## Corrections welcome! SUGESTIJE I POMOC SU DOBRO DOSLI! ## deliradivoje@yahoo.com, webmaster@ppc.psc.ac.yu ## ## The character set of this language file (ISO Latin 2) ## ISO-8859-2 ## ## Abbreviations for the day and month names. ned. pon. uto. sre. et. pet. sub. jan. feb. mar. apr. maj. jun. jul. avg. sep. okt. nov. dec. ## Next some standard common words. ## Abbreviation for "week beginning" po. nedelje godina ## Quarter of a year tromeseje mesec dan dana sat min min sek sek bajt Bajta ## ?bytes represents kbytes, Mbytes etc. ?bajtova zahtev zahteva dana ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum vreme vreme poetni datum poetno vreme vreme posl.akt. poslednje vreme dokument dokumenat/a host host(ov)a virtuelni host virtuelna hosta direktorijum direktorijum/a domen domena organizacija organizacije tip tip/ova URL URL-a brauzer brauzeri OS OS-i ## (= operating system, operating systems) veliina izraz za pretragu izrazi za pretragu WWW sajt WWW sajtova korisnik korisnik/a oznaka statusa oznake statusa Statistika servera ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Opti pregled ## The time reports, plus "busiest" strings (at the bottom of each report) Godinji izvetaj Najaktivnija godina Tromeseni izvetaj Najaktivnije tromeseje Statistika po mesecima Najaktivniji mesec: Statistika po nedeljama Najaktivnija nedelja: sedmica poela Statistika po danima u nedelji Statistika po danima Najaktivniji dan: Statistika po satima Statistika po satima Pregled po satima Najaktivniji sat: 15-to minutna statistika 15-to minutni pregled Najaktivnijih 15 min.: 5-to minutna statistika 5-to minutni pregled Najaktivnijih 5 min.: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Statistika po hostovima host host(ov)a n Statistika po redirektovanim hostovima host host(ov)a n Statistika greaka po hostovima host host(ov)a n Statistika po direktorijumima direktorijum direktorijuma n Statistika po tipovima dokumenata tip dokumenta razliitih tipova dokumenata n Statistika po zahtevima dokument dokumenata n Statistika po preusmeravanjima dokument dokumenata n Statistika po grekama dokument dokumenata n Statistika po stranama sa kojih se stizalo dolazei URL dolazeih URL-a n Statistika po WWW serverima sa kojih se stizalo dolazei WWW server dolazeih WWW servera n Statistika po preusmerenim dolascima dolazei URL dolazeih URL-a n Statistika pogrenih pristizanja dolazei URL dolazeih URL-a n Statistika po upitima za pretragu upit upita n Statistika po reima za pretragu re za pretragu rei za pretrage n Interna statistika po upitima za pretragu re za pretragu rei za pretrage n Interna statistika po reima za pretragu re za pretragu rei za pretrage n Statistika po virtuelnim hostovima virtuelni host virtuelnih host(ov)a n Statistika redirekcije po virtuelnim hostovima virtuelni host virtuelnih host(ov)a n Statistika greaka po virtuelnim hostovima virtuelni host virtuelnih host(ov)a n Statistika po korisnicima korisnik korisnika n Statistika po preusmerenim korisnicima korisnik korisnika n Statistika greaka po korisnicima korisnik korisnika n Pregled po brauzerima brauzer brauzera n Statistika po brauzerima brauzer brauzera n Statistika po operativnim sistemima operativni sistem operativnih sistema n Statistika po domenima domen domena n Statistika po organizacijama organizacija organizacija n Statistika po statusnim oznakama statusna oznaka statusnih oznaka n Izvetaj o utroenom vremenu Statistika po veliini dokumenata ## Used at the bottom of the report Ova analiza je napravljena automatski sa programom Vreme rada programa Manje od 1 ## Used in the time reports Svaki simbol predstavlja ili neto manje od toga zahteva za stranicu zahteva za strane ## Used at the bottom of each non-time report: need m, f & n genders nije na listi nije na listi nije na listi ## Used on the pie charts: again need m, f & n genders * * Ostalo ## Used at the top of the report Datum i vreme kada je ova automatska analiza obavljena - Analizirani su zahtevi serveru u periodu od do ## Used in the General Summary Ukupno uspenih zahteva Dnevni prosek uspenih zahteva Ukupno uspenih zahteva za HTML strane Dnevni prosek uspenih zahteva za HTML strane Broj linija u dnevniku bez vraenih oznaka statusa Neuspenih zahteva Preusmerenih zahteva Broj zahteva sa vraenim oznakama statusa (100-101) Broj zahteva za razliitim dokumentima Broj razliitih opsluenih hostova Neispravnih linija u dnevniku Broj zahteva koji su izuzeti iz ove analize Ukupna koliina prenesenih podataka Dnevni prosek prenesenih podataka Brojevi u zagradama se odnose na 7 dana pre prethodnih 7 dana Idi na Vrh strane ## Some special phrases for particular reports. [nerazreen IP] [domen nije zadat] [nepoznati domen] [server/root direktorijum] [nema direktorijuma] [nema tipa dokumenta] [direktorijum/a] Nepoznat Windows Ostali Unix-i Roboti OS nije prepoznat ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) # zahteva Ned. zaht. % zahteva Ned. zaht. stranica Ned. str. % strana Ned. str. Bajta ?bajtova Ned. bajt. Ned. ?bajt. % bajtova %Ned. bajt. br. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Ispis prvih %s * * Ispis prvih %d %s * * Spisak %s ## "by" in the phrase "listing the top 3 files BY number of requests" po ## All requests WITH AT LEAST 10 requests sa minimum ## Different ways of doing floors zahtev u zadnjih 7 dana zahteva u zadnjih 7 dana zahteva za stranu u zadnjih 7 dana zahteva za strane u zadnjih 7 dana preusmereni zahtev preusmerenih zahteva redirektovani zahtev u zadnjih 7 dana redirektovanih zahteva u zadnjih 7 dana neuspeni zahtev neuspenih zahteva neuspean zahtev u zadnjih 7 dana neuspenih zahteva u zadnjih 7 dana % saobraaja % saobraaja u zadnjih 7 dana % najveeg obima saobraaja % najveeg obima saobraaja u zadnjih 7 dana bajt saobraaja bajtova saobraaja ## ?bytes represents kbytes, Mbytes etc. ?bytes saobraaja bajt saobraaja u zadnjih 7 dana bajtova saobraaja u zadnjih 7 dana ?bytes saobraaja u zadnjih 7 dana zahtevano od sa preusmerenim zahtevom od sa neuspenim zahtevom od sa prvim zahtevom od sa prvim preusmerenim zahtevom od sa prvim neuspenim zahtevom od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortirano prema ## Used at the top of each report Ova statistika sadri podatke iz ## Used in pie charts Grafikon iscrtan prema ## different ways of sorting obimu saobraaja obimu saobraaja u zadnjih 7 dana % zahteva % zahteva u zadnjih 7 dana % najveeg broja zahteva % maksimalnom broju zahteva u zadnjih 7 dana broju zahteva broju zahteva u zadnjih 7 dana % zahteva za strane % broju zahteva za strane u zadnjih 7 dana % najveeg broja zahteva za HTML strane % maksimalnom broju zahteva za HTML strane u zadnjih 7 dana broju zahteva za HTML strane broju zahteva za HTML strane u zadnjih 7 dana % preusmerenih zahteva % preusmerenih zahteva u zadnjih 7 dana % maksimalnom broju preusmerenih zahteva % maksimalnom broju preusmerenih zahteva u zadnjih 7 dana broju preusmerenih zahteva broju preusmerenih zahteva u zadnjih 7 dana % neuspenih zahteva % broj neuspenih zahteva u zadnjih 7 dana % maksimalnom broju broja neuspenih zahteva % maksimalni broj neuspenih zahteva u zadnjih 7 dana koliini greaka broj neuspenih zahteva u zadnjih 7 dana vremenu poslednjeg zahteva vremenu poslednjeg preusmerenog zahteva vremenu poslednjeg neuspenog zahteva vremenu prvog zahteva vremenu prvog preusmerenog zahteva vremenu prvog neuspenog zahteva ## 3 other ways of sorting in m, f, & n * * sortirano po abecedi * * sortirano brojano * * nesortirano ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. pre podne popodne ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y. u %H:%n ## "Program started at" and "Analysed requests from" %w %d. %m %Y. u %H:%n ## In Daily Report %d.%m %Y ## In Daily Summary %w ## In Hourly Report %d.%m %Y. %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m %Y. %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m %y ## The date & time (D) column in non-time reports %d.%m %y. %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m %Y. u %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Nastavi sa zahtevom 101 Promena protokola 1xx [Raznovrsne informacije] 200 Uspeno 201 Kreirano 202 Prihvaeno za buduu obradu 203 Nepotvrdjena informacija 204 OK, ali nema nieg za slanje 205 Poniti dokument 206 Delimian sadraj 2xx Razni uspesi 300 Postoje viestruki dokumenti 301 Dokument premeten za stalno 302 Dokument nadjen drugde 303 Vidi drugi dokument 304 Nepromenjeno od poslednjeg zahteva 305 Upotrebi proxy 306 Promena proxy-ja 307 Dokument privremeno premeten 3xx Razne redirekcije 400 Neispravan zahtev 401 Zahtevana provera verodostojnosti 402 Traeno plaanje 403 Zabrana pristupa 404 Nema dokumenta 405 Nedozvoljen metod 406 Dokument neprihvatljiv za klijenta 407 Proxy zahteva potvrdu verodostojnosti 408 Istekao zahtev 409 Sukob zahteva sa stanjem resursa 410 Dokument bespovratno nestao 411 Traena duina 412 Preduslov neispravan 413 Predugaak zahtev 414 Traeni dokument ima predugo ime 415 Vrsta medija nije podrana 416 Zahtevani raspon neispravan 417 Neuspeno oekivanje 4xx Razne greke od klijenata/korisnika 500 Interna greka na serveru 501 Vrsta zahteva nije ppodrana 502 Greka na prethodnom serveru 503 Servis privremeno nije dostupan 504 Gateway istekao 505 Nepodrana HTTP verzija 506 Neuspena redirekcija 5xx Razne greke servera xxx Nepoznato analog-6.0/lang/yua.lng0000644000175000017500000003261510161303542015161 0ustar sret1sret100000000000000## Serbian language file for analog 6.0. ## May not work with any other version. ## ## This is a language file for analog. Lines beginning with ## are comments. ## Each language should have one language file in its own character set, ## and can have an additional one for ASCII (7 bit) output. ## ## ## Serbian versions (5.0.01) ISO-8859-2 and ASCII 7bit - by Deli Radivoje ## ## ## Corrections welcome! SUGESTIJE I POMOC SU DOBRO DOSLI! ## deliradivoje@yahoo.com, webmaster@ppc.psc.ac.yu ## ## The character set of this language file (ASCII 7bit) ## US-ASCII ## ## Abbreviations for the day and month names. ned. pon. uto. sre. cet. pet. sub. jan. feb. mar. apr. maj. jun. jul. avg. sep. okt. nov. dec. ## Next some standard common words. ## Abbreviation for "week beginning" poc. nedelje godina ## Quarter of a year tromesecje mesec dan dana sat min min sek sek bajt Bajta ## ?bytes represents kbytes, Mbytes etc. ?bajtova zahtev zahteva dana ## This has the right spacing for a column like 23/Mar/98 15:00-15:05 datum vreme vreme pocetni datum pocetno vreme vreme posl.akt. poslednje vreme dokument dokumenat/a host host(ov)a virtuelni host virtuelna hosta direktorijum direktorijum/a domen domena organizacija organizacije tip tip/ova URL URL-a brauzer brauzeri OS OS-i ## (= operating system, operating systems) velicina izraz za pretragu izrazi za pretragu WWW sajt WWW sajtova korisnik korisnik/a oznaka statusa oznake statusa Statistika servera ## Prefixes kilo, mega etc. to make kilobytes, megabytes etc. kilo mega giga tera peta exa zeta yotta ## Shorter versions of the same prefixes for column headings k M G T P E Z Y ## Names for the rows in the File Size Report. Note that changing these will ## NOT change the boundaries! These are just labels for predetermined buckets. ## They should line up nicely when right-aligned. 0 1B- 10B 11B- 100B 101B- 1kB 1kB- 10kB 10kB-100kB 100kB- 1MB 1MB- 10MB 10MB-100MB 100MB- 1GB > 1GB ## Now the names of reports Opsti pregled ## The time reports, plus "busiest" strings (at the bottom of each report) Godisnji izvestaj Najaktivnija godina Tromesecni izvestaj Najaktivnije tromesecje Statistika po mesecima Najaktivniji mesec: Statistika po nedeljama Najaktivnija nedelja: sedmica pocela Statistika po danima u nedelji Statistika po danima Najaktivniji dan: Statistika po satima Statistika po satima Pregled po satima Najaktivniji sat: 15-to minutna statistika 15-to minutni pregled Najaktivnijih 15 min.: 5-to minutna statistika 5-to minutni pregled Najaktivnijih 5 min.: ## The non-time reports. In each case, we have the name of the report, ## followed by the type of item in the report, once in the singular and once ## in the plural. These are used in phrases like "including all ??? with at ## least 200 requests". (The words higher up are used for column headings.) ## Finally we have the gender of this type of object, which can be m, f or n. ## ## So for example, in German a directory is Verzeichnis (neuter gender), which ## was given above. But "listing the top directory" is "Ausgabe des ersten ## Verzeichnisses" and "listing the top two directories" is "Ausgabe der ## ersten zwei Verzeichnisse". So here, we would have for the directory report: ## ## Verzeichnis-Bericht ## Verzeichnisses ## Verzeichnisse ## n ## ## I hope that makes sense! Statistika po hostovima host host(ov)a n Statistika po redirektovanim hostovima host host(ov)a n Statistika gresaka po hostovima host host(ov)a n Statistika po direktorijumima direktorijum direktorijuma n Statistika po tipovima dokumenata tip dokumenta razlicitih tipova dokumenata n Statistika po zahtevima dokument dokumenata n Statistika po preusmeravanjima dokument dokumenata n Statistika po greskama dokument dokumenata n Statistika po stranama sa kojih se stizalo dolazeci URL dolazecih URL-a n Statistika po WWW serverima sa kojih se stizalo dolazeci WWW server dolazecih WWW servera n Statistika po preusmerenim dolascima dolazeci URL dolazecih URL-a n Statistika pogresnih pristizanja dolazeci URL dolazecih URL-a n Statistika po upitima za pretragu upit upita n Statistika po recima za pretragu rec za pretragu reci za pretrage n Interna statistika po upitima za pretragu rec za pretragu reci za pretrage n Interna statistika po recima za pretragu rec za pretragu reci za pretrage n Statistika po virtuelnim hostovima virtuelni host virtuelnih host(ov)a n Statistika redirekcije po virtuelnim hostovima virtuelni host virtuelnih host(ov)a n Statistika gresaka po virtuelnim hostovima virtuelni host virtuelnih host(ov)a n Statistika po korisnicima korisnik korisnika n Statistika po preusmerenim korisnicima korisnik korisnika n Statistika gresaka po korisnicima korisnik korisnika n Pregled po brauzerima brauzer brauzera n Statistika po brauzerima brauzer brauzera n Statistika po operativnim sistemima operativni sistem operativnih sistema n Statistika po domenima domen domena n Statistika po organizacijama organizacija organizacija n Statistika po statusnim oznakama statusna oznaka statusnih oznaka n Izvestaj o utrosenom vremenu Statistika po velicini dokumenata ## Used at the bottom of the report Ova analiza je napravljena automatski sa programom Vreme rada programa Manje od 1 ## Used in the time reports Svaki simbol predstavlja ili nesto manje od toga zahteva za stranicu zahteva za strane ## Used at the bottom of each non-time report: need m, f & n genders nije na listi nije na listi nije na listi ## Used on the pie charts: again need m, f & n genders * * Ostalo ## Used at the top of the report Datum i vreme kada je ova automatska analiza obavljena - Analizirani su zahtevi serveru u periodu od do ## Used in the General Summary Ukupno uspesnih zahteva Dnevni prosek uspesnih zahteva Ukupno uspesnih zahteva za HTML strane Dnevni prosek uspesnih zahteva za HTML strane Broj linija u dnevniku bez vracenih oznaka statusa Neuspesnih zahteva Preusmerenih zahteva Broj zahteva sa vracenim oznakama statusa (100-101) Broj zahteva za razlicitim dokumentima Broj razlicitih opsluzenih hostova Neispravnih linija u dnevniku Broj zahteva koji su izuzeti iz ove analize Ukupna kolicina prenesenih podataka Dnevni prosek prenesenih podataka Brojevi u zagradama se odnose na 7 dana pre prethodnih 7 dana Idi na Vrh strane ## Some special phrases for particular reports. [nerazresen IP] [domen nije zadat] [nepoznati domen] [server/root direktorijum] [nema direktorijuma] [nema tipa dokumenta] [direktorijum/a] Nepoznat Windows Ostali Unix-i Roboti OS nije prepoznat ## Column headings for requests, pages, bytes and number (ie position in list) ## and percentages and last-7-day versions of these. ## Should be as short as possible -- abbreviate if necessary. ## (The ?bytes represents kbytes, Mbytes etc.) # zahteva Ned. zaht. % zahteva Ned. zaht. stranica Ned. str. % strana Ned. str. Bajta ?bajtova Ned. bajt. Ned. ?bajt. % bajtova %Ned. bajt. br. ## Now we need to know how to say "listing the top ", "listing ## the top ", and "listing ". The %s and %d ## will be replaced by the appropriate things. There may be three of each of ## these statements, for the genders m, f and n. Any genders that aren't used, ## you can just put a * there instead. So, for example, French starts ## Affichage du premier %s ## Affichage de la première %s ## * ## with entries for m & f, but not n * * Ispis prvih %s * * Ispis prvih %d %s * * Spisak %s ## "by" in the phrase "listing the top 3 files BY number of requests" po ## All requests WITH AT LEAST 10 requests sa minimum ## Different ways of doing floors zahtev u zadnjih 7 dana zahteva u zadnjih 7 dana zahteva za stranu u zadnjih 7 dana zahteva za strane u zadnjih 7 dana preusmereni zahtev preusmerenih zahteva redirektovani zahtev u zadnjih 7 dana redirektovanih zahteva u zadnjih 7 dana neuspesni zahtev neuspesnih zahteva neuspesan zahtev u zadnjih 7 dana neuspesnih zahteva u zadnjih 7 dana % saobracaja % saobracaja u zadnjih 7 dana % najveceg obima saobracaja % najveceg obima saobracaja u zadnjih 7 dana bajt saobracaja bajtova saobracaja ## ?bytes represents kbytes, Mbytes etc. ?bytes saobracaja bajt saobracaja u zadnjih 7 dana bajtova saobracaja u zadnjih 7 dana ?bytes saobracaja u zadnjih 7 dana zahtevano od sa preusmerenim zahtevom od sa neuspesnim zahtevom od sa prvim zahtevom od sa prvim preusmerenim zahtevom od sa prvim neuspesnim zahtevom od ## Now "sorted by": again, in m, f & n (only needed in plural though) * * sortirano prema ## Used at the top of each report Ova statistika sadrzi podatke iz ## Used in pie charts Grafikon iscrtan prema ## different ways of sorting obimu saobracaja obimu saobracaja u zadnjih 7 dana % zahteva % zahteva u zadnjih 7 dana % najveceg broja zahteva % maksimalnom broju zahteva u zadnjih 7 dana broju zahteva broju zahteva u zadnjih 7 dana % zahteva za strane % broju zahteva za strane u zadnjih 7 dana % najveceg broja zahteva za HTML strane % maksimalnom broju zahteva za HTML strane u zadnjih 7 dana broju zahteva za HTML strane broju zahteva za HTML strane u zadnjih 7 dana % preusmerenih zahteva % preusmerenih zahteva u zadnjih 7 dana % maksimalnom broju preusmerenih zahteva % maksimalnom broju preusmerenih zahteva u zadnjih 7 dana broju preusmerenih zahteva broju preusmerenih zahteva u zadnjih 7 dana % neuspesnih zahteva % broj neuspesnih zahteva u zadnjih 7 dana % maksimalnom broju broja neuspesnih zahteva % maksimalni broj neuspesnih zahteva u zadnjih 7 dana kolicini gresaka broj neuspesnih zahteva u zadnjih 7 dana vremenu poslednjeg zahteva vremenu poslednjeg preusmerenog zahteva vremenu poslednjeg neuspesnog zahteva vremenu prvog zahteva vremenu prvog preusmerenog zahteva vremenu prvog neuspesnog zahteva ## 3 other ways of sorting in m, f, & n * * sortirano po abecedi * * sortirano brojhano * * nesortirano ## The separators to use between thousands, and as a decimal point. For ## example, English generally uses "3,000.25" so has , and . here. French uses ## "3 000,25", so has space and , instead. , . ## There's a colon here, because the French like to put a space before a colon, ## so they have space-colon instead here. : ## am and pm in the sense of morning and afternoon. pre podne popodne ## Some date formats. E.g. for 9am on 1st January 1997 use ## %d for date " 1" ## %D for 0-padded date "01" ## %e or %E for date at end of time interval (where this makes sense) ## %m for month "Jan" ## %l for month at end of time interval ## %q for quarter of the year "1" ## %y for short year "97" ## %Y for long year "1997" ## %z or %Z for year at end of time interval ## %X for ISO 8601 extended date format (yyyy-mm-dd) "1997-01-01" ## %h for hour in 24-hour clock " 9" ## %H for 0-padded hour "09" ## %j for hour in 12-hour clock " 9" ## %i, %I or %k for hour at end of time interval ## %n for minute "00" ## %o for minute at end of time interval ## %a for am or pm "am" ## %b for am or pm at end of time interval ## %w for weekday "Wed" ## %x for a dash in a range e.g. in 14:00-14:15. This is necessary because in ## proper typesetting, this should be an en-dash not a regular dash. ## ## So for a date, English might have %d/%m/%y for 1/Jan/97, whereas German ## would have %d.%m %y for 1.Jan 97). Note: the month number is not available ## because it can produce ambiguous dates. ## ## The different date formats are as follows ## "refer to the 7 days to [date]" %D. %m %Y. u %H:%n ## "Program started at" and "Analysed requests from" %w %d. %m %Y. u %H:%n ## In Daily Report %d.%m %Y ## In Daily Summary %w ## In Hourly Report %d.%m %Y. %H:%n%x%I:%o ## In Hourly Summary %h ## In Hour of the Week Summary %w %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Reports %d.%m %Y. %H:%n%x%I:%o ## In Quarter-Hour and Five-Minute Summaries %H:%n%x%I:%o ## In Weekly Report %d.%m %Y ## In Monthly Report %m %Y ## In Quarterly Report %m%x%l %Y ## An alternative for Quarterly Report: %Y Q%q ## In Yearly Report %Y ## The date (d) column in non-time reports %d.%m %y ## The date & time (D) column in non-time reports %d.%m %y. %H:%n ## In non-time reports: "including all files with requests since [date]" %d.%m %Y. u %H:%n ## Finally, definitions of the HTTP status codes (see ## ftp://ftp.isi.edu/in-notes/rfc2616.txt). You're welcome to leave these in ## English if you think they look better that way. 100 Nastavi sa zahtevom 101 Promena protokola 1xx [Raznovrsne informacije] 200 Uspesno 201 Kreirano 202 Prihvaceno za buducu obradu 203 Nepotvrdjena informacija 204 OK, ali nema niceg za slanje 205 Ponisti dokument 206 Delimican sadrzaj 2xx Razni uspesi 300 Postoje visestruki dokumenti 301 Dokument premesten za stalno 302 Dokument nadjen drugde 303 Vidi drugi dokument 304 Nepromenjeno od poslednjeg zahteva 305 Upotrebi proxy 306 Promena proxy-ja 307 Dokument privremeno premesten 3xx Razne redirekcije 400 Neispravan zahtev 401 Zahtevana provera verodostojnosti 402 Trazeno placanje 403 Zabrana pristupa 404 Nema dokumenta 405 Nedozvoljen metod 406 Dokument neprihvatljiv za klijenta 407 Proxy zahteva potvrdu verodostojnosti 408 Istekao zahtev 409 Sukob zahteva sa stanjem resursa 410 Dokument bespovratno nestao 411 Trazena duzina 412 Preduslov neispravan 413 Predugacak zahtev 414 Trazeni dokument ima predugo ime 415 Vrsta medija nije podrzana 416 Zahtevani raspon neispravan 417 Neuspesno ocekivanje 4xx Razne greske od klijenata/korisnika 500 Interna greska na serveru 501 Vrsta zahteva nije ppodrzana 502 Greska na prethodnom serveru 503 Servis privremeno nije dostupan 504 Gateway istekao 505 Nepodrzana HTTP verzija 506 Neuspesna redirekcija 5xx Razne greske servera xxx Nepoznato analog-6.0/lang/yudom.tab0000644000175000017500000001157710161303542015512 0ustar sret1sret100000000000000ad 2 Andora ae 3 Ujedinjeni Arapski Emirati af 1 Avganistan ag 2 Antigva i Barbuda ai 1 Anguilla al 1 Albanija am 2 Jermenija an 1 Holandski Antili ao 1 Angola aq 1 Antarktik ar 3 Argentina arpa 1 Stara Arpanet mreza as 1 Americka Samoa at 3 Austrija au 3 Australija aw 1 Aruba az 1 Azerbejdzan ba 3 Bosna i Hercegovina bb 2 Barbados bd 1 Banglades be 3 Belgija bf 1 Burkina Faso bg 2 Bugarska bh 1 Bahrein bi 1 Burundi bj 1 Benin bm 1 Bermuda bn 1 Brunei bo 3 Bolivija br 3 Brazil bs 1 Bahami bt 1 Butan bv 1 Bouvet Island bw 1 Botsvana by 1 Belorusija bz 1 Belize ca 3 Kanada cc 1 Kakao (Keeling) ostrva cd 1 Demokratska Repulika Kongo cf 1 Centralno Africka Republika cg 1 Kongo ch 2 Svajcarska ci 1 Obala Slonovace ck 1 Kukova ostrva cl 2 Cile cm 1 Kameron cn 3 Kina co 3 Kolombija com 2 Firme cr 3 Kostarika cu 2 Kuba cv 1 Kapa Verde cx 2 Bozicna ostrva cy 3 Kipar cz 2 Ceska republika de 2 Nemacka dj 1 Dzibuti dk 2 Danska dm 2 Dominika do 3 Dominikanska Republika dz 1 Alzir ec 3 Ekvador edu 2 Americke obrazovne ustanove ee 2 Estonija eg 3 Egipat eh 1 Zapadna Sahara er 1 Eritreja es 2 Spanija et 1 Etiopija fi 2 Finska fj 3 Fidzi fk 1 Foklandska ostrva fm 1 Mikronezija fo 1 Farska ostrva fr 2 Francucka fx 1 Francuska (Evropske teritorije) ga 1 Gabon gb 1 Velika Britanija gd 1 Grenada ge 1 Gruzija gf 1 Francuska Gajana gg 1 Guernsey gh 3 Gana gi 1 Gibraltar gl 1 Grenland gm 1 Zambija gn 1 Gineja gov 2 Americka vlada gp 1 Gvadelupe (Franc.) gq 1 Ekvatorijalna Gvineja gr 2 Grcka gs 1 S. Georgia & S. Sandwich ostrva gt 3 Gvatemala gu 1 Guam (SAD) gw 1 Gvineja Bisao gy 1 Gvajana hk 3 Hong Kong hm 1 Heard i Mekdonald ostrva hn 2 Honduras hr 2 Hrvatska ht 1 Haiti hu 2 Madjarska id 3 Indonezija ie 2 Irska il 3 Izrael im 1 Isle of Man in 3 Indija int 1 Medjunarodne ustanove io 1 British Indian Ocean Territory iq 1 Irak ir 1 Iran is 2 Island it 2 Italija je 1 Jersey jm 3 Jamajka jo 3 Jordan jp 3 Japan ke 3 Kenija kg 1 Kirgistan kh 1 Kambodza ki 1 Kiribati km 1 Comoros kn 1 Saint Kitts & Nevis kp 1 Severna Koreja kr 3 Juzna Koreja kw 3 Kuvajt ky 1 Kajmanska ostrva kz 1 Kazahstan la 1 Laos lb 3 Liban lc 1 Santa Lucia li 2 Lihtenstajn lk 1 Sri Lanka lr 1 Liberia ls 1 Lesoto lt 2 Litvania lu 2 Luksemburg lv 2 Latvija ly 1 Libija ma 1 Moroko mc 2 Monako md 1 Moldavija mg 1 Madagaskar mh 1 Marsalska ostrva mil 2 Americka vojska mk 3 Makedonija ml 1 Mali mm 1 Myanmar mn 1 Mongolija mo 1 Makao mp 1 Severno Marijanska ostrva mq 1 Martinik (Franc.) mr 1 Mauritanija ms 1 Montserat mt 3 Malta mu 1 Mauricijus mv 1 Maldivi mw 1 Malavi mx 3 Meksiko my 3 Malezija mz 1 Mozambik na 1 Namibija nc 1 Nova Kaledonija (Franc.) ne 1 Nigerija net 2 Mrezni domen nf 1 Norfolk ostrva ng 1 Nigerija ni 3 Nikaragva nl 2 Holandija no 2 Norveska np 1 Nepal nr 1 Nauru nu 2 Niue nz 3 Novi Zeland om 1 Oman org 2 Neprofitne organizacije pa 3 Panama pe 3 Peru pf 1 Polinezija (Franc.) pg 3 Papua Nova Gvineja ph 3 FIlipini pk 3 Pakistan pl 2 Poljska pm 1 Saint Pierre and Miquelon pn 1 Pitcairn Island pr 1 Portoriko pt 2 Portugalija pw 1 Palau py 3 Paragvaj qa 1 Katar re 1 Reunion (Franc.) ro 2 Rumunija ru 2 Rusija rw 1 Ruanda sa 3 Saudijska Arabija sb 1 Solomonska ostrva sc 1 Sejselska ostrva sd 1 Sudan se 2 Svedska sg 3 Singapur sh 1 Sveta Helena si 2 Slovenija sj 1 Svalbard i Jan Mayen ostrva sk 2 Slovacka Republika sl 1 Sijera Leone sm 1 San Marino sn 1 Senegal so 1 Somalija sr 1 Surinam st 1 Sent Tome i Principe su 2 Bivsi SSSR sv 3 El Salvador sy 1 Sirija sz 1 Svazilend tc 1 Turks i Caicos ostrva td 1 Cad tf 1 Francuske Juzne Teritorije tg 1 Togo th 3 Tajland tj 1 Tadzikistan tk 1 Tokelau tl 1 Istocni Timor tm 1 Turkmenistan tn 1 Tunis to 1 Tonga tp 1 Istocni Timor tr 3 Turska tt 3 Trinidad i Tobago tv 1 Tuvalu tw 3 Tajvan tz 1 Tanzanija ua 3 Ukrajina ug 3 Uganda uk 3 Velika Britanija (Ujedinjeno Kraljevstvo) um 1 USA Minor Outlying Islands us 4 Sjedinjene Americke Drzave uy 3 Urugvaj uz 1 Uzbekistan va 1 Vatikan vc 1 Saint Vincent & Grenadines ve 3 Venecuela vg 1 Devicanska ostrva (Britanska) vi 1 Devicanska ostrva (SAD) vn 1 Vijetnam vu 1 Vanuatu wf 1 Wallis i Futuna ostrva ws 1 Samoa ye 1 Jemen yt 1 Mayotte yu 3 Jugoslavija za 3 Juzna Afrika zm 1 Zambija zr 1 Demokratska republika Kongo zw 3 Zimbabve analog-6.0/src/0000755000175000017500000000000010161303543013521 5ustar sret1sret100000000000000analog-6.0/src/build/0000755000175000017500000000000010161303531014615 5ustar sret1sret100000000000000analog-6.0/src/build/openvms/0000755000175000017500000000000010161303543016307 5ustar sret1sret100000000000000analog-6.0/src/build/openvms/Instructions0000644000175000017500000000043210161303543020735 0ustar sret1sret100000000000000make-vms.zip contains OpenVMS build scripts, which have to be unzipped within the analog source directory. Full instructions can be found in the file startux.html in the analog docs. Note: these files worked with version 5.90beta2, but haven't been updated for version 5.91beta1. analog-6.0/src/build/openvms/make-vms.zip0000644000175000017500000002060610161303543020557 0ustar sret1sret100000000000000PKXg+ batch.comUT ;w}>Ux%ъ@ E2k}EDbS]ީB!^bnZ-<ÃBEXr @8Q}9GBS=(4ѝ-V"<)Dz,3I[L0+!/z.J|YVݦG#oY1gKW ;uY|s ??%\;^PKjyw.C{build_analog.comUT }>w}>UxXksF_q^!#Lx&6 cHIYV*+ UlO.Qlt?N=߅1?  $< 䊃 |6Q \IpP2GBI ixN*,C3N' w!Jm.f'g%GL}W'd4@yNʄ&,Ox[!JpIܯ"Cq=@m^E.,0Dّ~{cv;s~d< +&`}|);$^.RbB$J1x*Ǜiw*pX’ch)jZ0QGlrQvQ~ g|o ;)EdGiHzAe"(}ULfF (}YPt#9R[}TU),qΌlc[BH$np{Sc-lee (=a_sHhk [FGr Wq H0[-5T6U4q4%L۝7؀0dzd{D6`Ӧ1 0}`{`@k -"I]Cw_w)GI("U\Ĭ 劳SkUN RQ14?A:[ɧۏQT2%˨?c$>43qFWPP?ǡMib[2 *B?1tHLk!/*U+9|Cfh0t ^|;c ӊ &^^SFc,0@mۃ RA.:UtHmG)NcNʰ:AJP]RL^~R4xb=sM9tǣ`دNgWaMZ^-քtۚZXa$ʰړ B5^O2c`Eј 4,「tC3:xm-L"G2خ!A[8NMaQ[wdt}B5N1 04w=|@ʜT+o uLҶX~Փ'(spVӻ. aΊKBOxe"UEDML4S2VW$ |QГ˓ڪɣ\2QRs>|2],̵vr3BcV>xxV炻VzH)tp< "7 ,!M$7 #G,+U.xR(o늮dҰF |'G?b ?=e~EJ(n@; ˢcV$>T >ȟ wHs?爿~j5&Mup ]1qMųۑ(#F: Oa\) [0 .!$ϨBYd\i7T>S7V3]Ti)EK[yI lϘJ6zBB[aQ/SH"iJ\1.K} []G)D[~.BWe*t1U2/SA AuZv@$1OF CF~9VYaKEK~ r'#iЅU״QE]ں .42MB ﴦg^w?fWڭww" Vp6 )@LFKl杙+g=Pw=P@_!_+3s ((ddtop.R.Jб`)P/\PKyw. m descrip.mmsUT }>w}>UxVr8}gsK  T2@ؐԔX.KNodL3AnGGG˕],d툅r; Xen1t ]k=@wdOi*s>,"O6&׽h<4xfr(T29 q~ %4w# 44-8|=/ī5j[0p E}`*Cn Ub 'Yp^=̃oc̽BRp E/ODnx<2# "ZH3! "mUŀ>װRU4K\+x c\B@g-Yʼn<ӂ'W1ӂyY=Jt U|jHx$2EypS%\2o}M(|Kz#Y5las׻\\  Ա3}qeYs֧rO_w ̴ 畁gM>̾zM!C Lw{G%|F+?)vbPQd-$7Eǹ:bX(ȒɘW"% 񟓫@DB!2ꙅc~(.c ^"s3Ы0CLy2y~q"=l%kܷˬC <(0YO"j / z]Vie4g}>L_ϑ 6iE'bA!ePqM? pݜpfD;aFX8KA@Z&YFP{V7q6\nPx1݀-g <»|PÌ Ѿm./⻈·D:vnKӸӭfF{udWK|81ISo2-D J f~]R?#pF}>UxPKXg+p Nlibgd/descrip.mmsUT ;w}>UxmmO0_ǟT*am {h-M*CI.P*rMfF4I][(Տ ,鑿X\DZ!s(7@8Ǡիlx&Ck*a?;|l+"baΧLjIHPAȞ`g>m6<8[]>m%,l̴9-4K[F'WB >`W>*r R? 3V6-T=7@ 6*CJq ʡԛr|_a8Sa.Ri(fl|1?no|X/&;|| wYRcwѻ5W5:L|&;dmE2B(Wp݉OAۻmi1z0-S!uf=1 It$I'wBx#}2z6ܛV/vvx*qa`0Tg$r# `Ru闱Vt5oO BN) ( ])OAy~PKX-ْ"&libgd/make.comUT =w}>UxKk@qa`:,_L ( AL2Rh}Tҭs\7CaxzA]Ђ }m .ZwYÑ碖ցN~X> ,UYJIee0Wۆº,ay%[haX'I cg_ZK*'fyud;hCd")J <wΉNQ^&̰x%MhcpTȼg>3߅arq 1LD{k b֋wPJC_'?K);9?PK xw.libpng/UT o}>}>UxPKXg+\Gvlibpng/descrip.mmsUT ;w}>UxRMs0=_8L\!әfh=jl#a]{+ 4eT7"G( ϱHAIX(֬˺T>S\l!_r X&o;jDȫ?p6/'T"G2{j/$Ϟ|an|Tfyő^ǣǵό x:^leH5hkw_YAE¢Nd :4B.j iC}uy3=UٲpA_!D!SE# pNw/ '8V Y!cY!넰zb?*][\)jLǛk~H};FK;r(3&bx~л+g2v*5& ^it{DZ7?ׂ7po>EYԢ9-loVd0sPK-+_0libpng/make.comUT D=w}>UxN0)& zay,5f5ưl7K†oo Mof2/ǃ8gދS [Aжj[R>JЂYDbG,%wW7(ѼDGs!gт탸(oW3F$ɿ!r&FA&Q!̚lD-!IL#;ͤC5vKrbZ˖tm*P%NLj1LhfeOKeX4b2tEյcNBʯw:u8Lus\1 1PK xw.pcre/UT o}>}>UxPKXg+)N(pcre/descrip.mmsUT ;w}>UxmPO0~A t!q[ +k {h|龻~?z7f SMP:ii^Jh87\#ޱY!tDR9)ugC%%VxG W!4IN'{_&b|Qqw*Ȟ~9ttMmwp1A'CNemhڀ2W,̱ߍ16 " ~uQP't DS[woNH%\J lQHIK;BjWPKXg+nQD| pcre/make.comUT ;w}>UxSQpvVwqEi 99@1 '/p swwQKM-I{>!N^!Az@BArQ^2BxQfIBpeiIAi[f^fqFjBRifNJf^XPK xw.zlib/UT o}>}>UxPKJ-Zfzlib/descrip.mmsUT ;=w}>UxTo0~ũI)մ)դ2ئnIA mҴ$v`#'Y &?Em;҅KCŷf:zXɸA$9O(kpy pge⇷"]OR1xxoMKk<`GR +-'f4 ~,obװtgNΨɞfX*L5P\ڢfj|LUoFL+t-7":-V7>M2lKӃb(3fKcp t%܌4+ vXOJz#cBޖI@:wSjy30Wk.&aض/  ^_7a0TS)2.rF{5f KOR>bWu5+4vlظmY -c_`  pt,XjA( q"60Cq9ԙ LSX!ӍzavH:y#e8?㽑b'DB;&-9GN4TŒO7o(]%Z?UOB\ۘy+zHG`)b|f _5go9-={FҚW$%9S5(G׬#?PK-9(_ zlib/make.comUT =w}>UxMk0{?C]"l4-k:Re]J/}ezanD?BpY}3ߡHk=r 9fX`3MI ԦKs)L@ Re!ԦQ`wؕ.YD[N֓L2BGw{3wkc4akNkSr5a|/MI8y1Z7/R>ªN"!-d/f:={aݸ^Юwz%Sf&{1):jakNkr.D:p>5ũU:B@|oKb6m[;/jM~PKXg+ batch.comUT;UxPKjyw.C{ build_analog.comUT}>UxPKyw. m 聳 descrip.mmsUT}>UxPK xw. Eylibgd/UTo}>UxPKXg+p N libgd/descrip.mmsUT;UxPKX-ْ"& Dlibgd/make.comUT=UxPK xw. Elibpng/UTo}>UxPKXg+\Gv libpng/descrip.mmsUT;UxPK-+_0 libpng/make.comUTD=UxPK xw. Espcre/UTo}>UxPKXg+)N( pcre/descrip.mmsUT;UxPKXg+nQD| pcre/make.comUT;UxPK xw. Ezlib/UTo}>UxPKJ-Zf  zlib/descrip.mmsUT;=UxPK-9(_ zlib/make.comUT=UxPK*Fanalog-6.0/src/build/riscos/0000755000175000017500000000000010161303543016122 5ustar sret1sret100000000000000analog-6.0/src/build/riscos/Makefile0000644000175000017500000001131210161303543017560 0ustar sret1sret100000000000000# Makefile for analog 6.0, RISC OS # Please read docs/Readme.html, or http://www.analog.cx/ # CC = cc # which compiler to use: eg cc, acc, gcc. NB Different # compilers need different CFLAGS, e.g., -O instead of -O2. CFLAGS = -throwback -Wp -ansi -IC:,TCPIPLibs: -UCOMPAT_INET4 -DMINORVERSION="\"-sb1\"" # options, e.g. for optimisation or ANSI compilation. DEFS = -DNOUNCRYPT -DBZ_STRICT_ANSI # -DDEBUGSAFE=1024 # ... -DNOOPEN -DNOPIPES -DNODNS -DNODIRENT # ... -DEBCDIC -DNOGMTIME -DNEED_STRCMP -DNEED_MEMMOVE ... # ... -DNEED_STRTOUL -DNEED_DIFFTIME -DHAVE_ADDR_T ... # ... -DNEED_FLOATINGPOINT_H # All the options are explained at the bottom of this file. OS = RISCOS # Operating system: UNIX, DOS, WIN32, MAC, OS2, OSX, VMS # RISCOS, BEOS, NEXTSTEP, MPEIX, BS2000, AS400 LIBS = C:o.stubs TCPIPLibs:o.Socklib5 TCPIPLibs:o.Inetlib TCPIPLibs:o.Unixlib DEPEND=-depend !Depend OBJS = alias.o analog.o cache.o dates.o globals.o hash.o init.o init2.o \ input.o output.o output2.o process.o settings.o sort.o tree.o \ utils.o outcro.o outhtml.o outlatex.o outplain.o outxhtml.o \ outxml.o GD_OBJS = libgd.o.gd libgd.o.gd_io libgd.o.gd_io_file libgd.o.gd_png \ libgd.o.gdfontf libgd.o.gdfonts libgd.o.gdtables PNG_OBJS = libpng.o.png libpng.o.pngerror libpng.o.pngmem libpng.o.pngset \ libpng.o.pngtrans libpng.o.pngwio libpng.o.pngwrite \ libpng.o.pngwtran libpng.o.pngwutil ZLIB_OBJS = zlib.o.adler32 zlib.o.compress zlib.o.crc32 zlib.o.deflate \ zlib.o.gzio zlib.o.infblock zlib.o.infcodes zlib.o.inffast \ zlib.o.inflate zlib.o.inftrees zlib.o.infutil zlib.o.trees \ zlib.o.uncompr zlib.o.zutil PCRE_OBJS = pcre.o.pcre BZIP2_OBJS = bzip2.o.blocksort bzip2.o.bzlib bzip2.o.compress \ bzip2.o.crctable bzip2.o.decompress bzip2.o.huffman \ bzip2.o.randtable UNZIP_OBJS = unzip.o.ioapi unzip.o.unzip .INIT: @cdir ^.!Analog @cdir o @cdir bzip2.o @cdir libgd.o @cdir libpng.o @cdir pcre.o @cdir unzip.o @cdir zlib.o all: ^.!Analog.analog ^.!Analog.analog: $(OBJS) $(GD_OBJS) $(PNG_OBJS) $(ZLIB_OBJS) $(PCRE_OBJS) $(BZIP2_OBJS) $(UNZIP_OBJS) link -aif -o ^.!Analog.analog $(OBJS) $(GD_OBJS) $(PNG_OBJS) $(ZLIB_OBJS) $(PCRE_OBJS) $(BZIP2_OBJS) $(UNZIP_OBJS) $(LIBS) @echo '***' @echo '***IMPORTANT: You must read the licence before using analog' @echo '***' .SUFFIXES: .o .c .c.o:; $(CC) $(CFLAGS) $(DEPEND) -c $(DEFS) -D$(OS) -o $@ $< clean: -remove ^.!Analog.analog -wipe o.* ~v~c cleanall: -remove ^.!Analog.analog -wipe o.* ~v~c -wipe libgd.o.* ~v~c -wipe libpng.o.* ~v~c -wipe pcre.o.* ~v~c -wipe zlib.o.* ~v~c -wipe bzip2.o.* ~v~c -wipe unzip.o.* ~v~c # OK, here's the details on all the DEFS options, in case anyone needs to know. # NOPIPES excludes non-ANSI functions popen() and pclose(). You will lose the # UNCOMPRESS command. # NODNS excludes all the DNS lookup code. This is platform-dependent, but # typically involves header files and functions like inet_addr() # and gethostbyaddr(). # NODIRENT stops you using wildcards in logfile names. Again, the code is # platform-dependent, but usually the header file and functions # stat(), opendir(), readdir() and closedir() are involved. # NOOPEN excludes non-ANSI functions open() and fdopen(). This results in an # alternative, less safe locking mechanism for DNS files and cache files. # NOFOLLOW omits code including the functions realpath(), access() and stat() # and the header file and possibly . Analog won't # then follow symbolic links when guessing path names. # NOALARM omits code including the function alarm() and the header file # . You will lose the ability to set a DNS timeout. # # ** If all of the above are defined only features defined in ANSI C are used. # # NOGRAPHICS omits the code for generating pie charts, including all of libgd, # libpng and zlib. # HAVE_GD means you already have libgd, libpng and zlib, and you want to use # your version not mine. This is likely to reduce the size of the binary. # You will also need to include "-lgd -lpng -lz" in the LIBS. # HAVE_PCRE means you already have libpcre, and you want to use your version # not mine. This is likely to reduce the size of the binary. # You will also need to include "-lpcre" in the LIBS. # EBCDIC is needed if your server uses the EBCDIC character set, not ASCII. # USE_PLAIN_SETJMP uses ANSI setjmp() instead of POSIX sigsetjmp(). # NEED_STRCMP, NEED_MEMMOVE, NEED_STRTOUL and NEED_DIFFTIME provide # replacements for standard functions missing on some systems. # NOGMTIME doesn't use the gmtime() function. # NEED_FLOATINGPOINT_H includes a header file called . # HAVE_ADDR_T is needed if inet_addr() returns in_addr_t which is not the # same as unsigned long. # Dynamic dependencies: analog-6.0/src/build/riscos/README0000644000175000017500000000025410161303543017003 0ustar sret1sret100000000000000This directory contains an anlghead.h and Makefile for analog on RISC OS. Note: these files worked with version 5.90beta2, but haven't been updated for version 5.91beta1. analog-6.0/src/build/riscos/anlghead.h0000644000175000017500000001077710161303543020052 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. Distribution, usage and modification of this program is *** subject to the conditions of the Licence which you should have received *** with it. This program comes with no warranty, expressed or implied. ***/ /*** anlghead.h: first header file ***/ /*** This file contains the user-definable options which you are most likely to *** want to change. Edit any of the #define lines according to your desires. *** However, all of them except MANDATORYCONFIGFILE can be changed at run *** time as well. ***/ /*** These settings are overridden by any in your configuration file. ***/ /*** DON'T REMOVE THE #'S -- THEY'RE NOT COMMENTS! ***/ #ifndef ANLGHEAD_H #define ANLGHEAD_H #ifndef HOSTNAME #define HOSTNAME "[my organisation]" /* The name of your organisation or web server. This is used for printing at the top of the output. */ #endif #ifndef HOSTURL #define HOSTURL "none" /* The URL of your host's home page, for linking to at the top of the output; use "none" for no linking. */ #endif #ifndef LOGFILE #define LOGFILE "logfile/log" /* The name of the default logfile. Can be a list, separated by commas (but no spaces), and can include wild cards. */ #endif #ifndef OUTFILE #define OUTFILE "Report" /* The default file for output. Use "stdout" for stdout. */ #endif #ifndef IMAGEDIR #define IMAGEDIR "file://images/" /* URL of the directory where the images for the graphical reports live. The URL can be absolute, or relative to the output page: e.g., just the empty string "" for the same directory as the output page. */ #endif #ifndef LOGO #define LOGO "analogo" /* the file where the analog logo lives: within the IMAGEDIR unless it starts with / or contains :// . You can put another logo in here (your organisation's logo, for example -- but if you do, change the LOGOURL below too). Use "none" for no logo. */ #endif #ifndef LOGOURL #define LOGOURL "http://www.analog.cx/" /* Where the logo links to, in XHTML output. */ #endif #ifndef STYLESHEET #define STYLESHEET "none" /* The URL of your style sheet. Use "none" for no style sheet. */ #endif #ifndef DEFAULTCONFIGFILE #define DEFAULTCONFIGFILE ".analog/cfg" /* The name of the default configuration file. */ #endif #ifndef MANDATORYCONFIGFILE #define MANDATORYCONFIGFILE "none" /* A mandatory configuration file; read after all other arguments so overrides everything. Program exits if it is not found. Use "none" for none. */ #endif /* Finally, some directories where particularly files are looked for (you MUST include the trailing slash in the directory name!). You can also use "" to mean "the current working directory at the time you run the program". * If any of these directories is defined to be NULL, analog will attempt to deduce the directory of the analog binary from the command name you used, and use that directory; or the current directory if it couldn't deduce a directory. This may or may not work, so it's better to specify a location explicitly here if you know where the files will be kept. */ #ifndef LANGDIR #define LANGDIR ".lang." #endif /* Directory where the language files live. Actually, if this one is defined to be NULL, they will be looked for inside the "lang" subdirectory of the directory containing the analog binary. */ #ifndef CONFIGDIR #define CONFIGDIR NULL #endif /* Directory containing configuration files. */ #ifndef LOGSDIR #define LOGSDIR NULL #endif /* Directory containing logfiles. */ #ifndef CACHEDIR #define CACHEDIR NULL #endif /* Directory containing cache files. */ #ifndef OUTDIR #define OUTDIR NULL #endif /* Directory for writing output files: must already exist. */ #ifndef HEADERDIR #define HEADERDIR NULL #endif /* Directory containing header and footer files. */ #ifndef DNSDIR #define DNSDIR ".dns." #endif /* Directory containing DNS files. */ #ifndef LOCKDIR #define LOCKDIR ".lock." #endif /* Directory containing the DNS lock file. */ #ifndef ERRDIR #define ERRDIR NULL #endif /* Directory containing the ERRFILE. */ /* strncasecmp() is not defined in the clib headers, but it's present in the latest release */ extern int strncasecmp(const char *a, const char *b, size_t n); #include "anlghea2.h" /* You can edit anlghea2.h as well. But the options in there are ones which you're unlikely to want to change now. */ #endif /* ANLGHEAD_H */ analog-6.0/src/build/windows/0000755000175000017500000000000010161303543016312 5ustar sret1sret100000000000000analog-6.0/src/build/windows/Instructions0000644000175000017500000000037010161303543020741 0ustar sret1sret100000000000000These Makefiles for Microsoft Visual C++ contributed by Takayuki Matsuki unzip make-msvc++.zip within the analog folder Then within the src folder, run the command NMAKE /f "analog.mak" CFG="analog - Win32 Release" analog-6.0/src/build/windows/make-msvc++.zip0000644000175000017500000002321410161303543021051 0ustar sret1sret100000000000000PK D0 resource/UT 7 @8@UxPKo+e7Iresource/analog.rcUT I;8@UxTo0GїVš<.sG! akHX"6MIkHxY- 5m%̙`VbZ` sw .-x[}oṎUA0N"I>J!OIv'\k8q̂OI<2 Meu'w K80"]z^uvbIl29+x~C48Zv1?I1m xuˠiWVj$0[ŀ6M j_%Bۨ0ai]mKm Q_dݎH: &(Fx%zY) =c}y$1:a $vU10buZqߍL̈́ptAԟ]6ԾN/cS-g1/9!BwPKĶo+Fresource/resource.hUT G;8@UxmQk0UǾ3yӤ-Sz In/\+=Qy0\7m{H7 iEty} {{ ͽl-v 0KaQl ?T=.u?7'6n֝weY&N0&D1\R(N?JoCUte "N-FkȞxKڢiuPK D0src/UT Y!@8@UxPKD07 src/analog.makUT 9 @8@UxYmo6Wb\:%p؁, %:f-$'NI L+ EyHޝpE퀅l<$3:%H`Eā!K>,=N~Õ&Kԁ% ކ }XEĂh \IR浸>|~yp4.z ua‰)nŕQ!67.+xFqO;K I>^{>'[2ѳOșn,z ;b3y $>q:g1ڟp"~fU[KFxڻ貥A>Q;g4/aGR{ T+<3㍆{ ?dGo {nù=.ݤiy$7ssshkdVEAI5^)ދ^(ш)փ w pOS読 aP@"UyȔJƲl-b9_ G(ξ\֝R+V!q;B1`AcಅipU#;r[7m#q hk]Z;r)*\w Xm֭WHKJ <R0Y[΢BsȨ3V.E-%;Fɍw'`m@w| Tb!ك;\ eړd ,2QY堲$}ʲ4iQ :%U!rBeKA]](/ʲB&9,HCY兲$;7);kxNj,Nd:Z:x$T<3|fw'~4 [x;M-|J"OZϾTp5?}c=xzt0ԜMEۑo^/8b9Ww0lߩ]]:S> 'ɯxr ݗ*A"L㓓9֫{c3g7q(^}ڭ\*vbQ?{0 ̻e\6nE2J.7ԃ2NN4$K&+9`BUȪWc%HQ^QJJ\0( 6$Th Kv \;bC{qwSj iW)v]R8IW* db6=[mCemCe\l( 6 lvqm KlSB2<#S H^_y(U}v0k(_'G'>xU|3.Ps|(U>*48&4eNt)[`~$4`ԿPH~x Lǜs֑10}U\q04ꟿ ^7מQ4PHr?PK D0 src/bzip2/UT Y!@8@UxPKD0|LS src/bzip2/bzip2.makUT ^!@^!@UxUn@}.RaK]U(F"VBB^-ƋlTo^TxZ\̙3gP;`!s#P ؆`F[2VD4ЩGcx|XMCrEpU=QEAᇒ SrgbX[9V%.E׵4FKc;ؤO$vzV)tLg!Y{Z qjG#֏ I u [cE.+xj>m2MElB*to#3SB:W8>bwéa(a(ɧ* b{١&fW <>"Z04K G% 55O7)a48[x^,$)yd'쨋M@KC!r뺨*#DE2!lj0._yzРdINҬq dshLEǞl*u@8< ̰ޣ;[*<˓܌xsy: \U ꪦx.8AdW"7K§G8 Yx2z( ?5A}yY !9U35#ƓhtV2boPA@MbZݦIMw5GIWАZFU7(+RTU%<@*zFyxσVe΂U>_̳̃U,HcUBPK =D0 src/libgd/UT V8 @8@UxPK#D0K|MB src/libgd/libgd.makUT Z!@8@UxUn@}.0qĮ)P,A"VBB^m.MJZ; ڝۙ93 <^:y#>_hR=H`Gą̀.%OKWquvtt{TE3|`XVg@0 6ND1 5qGE"pgo(A(C)^eqYTH|+Âņ.KiBDJ06QLȹBF86KGN<+y4F/W+X$# [{IT8&Phw]LjZ;/ kw_Sfc6 1[gWpL&xGDrK!3wcVӿ?fMI2J)&<؍PA*T`L8HHqUx; iPK =D0 src/libpng/UT V8 @8@UxPKD0Xc src/libpng/libpng.makUT N_!@8@UxV[kH~@é64Ғ@)&"![0Y5fh]Y99߹Üg<0&${"rFD I 0 2| ۳V&`\Fia)0p w]_$?w}0uaY&!- IHcJ" |"!"qpH$mYh]o`wI)Hct)BPZ-{@h?O[ 0`eQ;&1Eh`U*=4 Xa2b[JcQ;p;v2% /Y^c;'4D fנ^/0c$>NTƛw=m1ŭ9 %C10Z0v9",ڱ6u_}0Ms2;0o]~)LD.CRdDH8yr49y chtyհ0Jh&= K"*Zܐ7^_b L}f<_9 ]GB.}6豦aUl*FX#JE rꄭBbA ;NfkəYT|2͍z yJtԕB>z)`/㺘-iq·#RH5rjJ:T—6CѿVcKS#w*bP5L >{ SNƓ/S]Nƕ$WNƕ8WPK =D0 src/pcre/UT V8 @8@UxPKĬD0T,src/pcre/pcre.makUT @f!@8@UxuTmoP<)$-,4)IU!閘\ڻ",;c~:>s|#)xNh㰠1M` 0YDae1$$J%i0 YMI 'GЈb)f ם. 8ӂ bCPBF\C@Cr`+qvw 1tHi8;pOSJrQBcH8fs%5Axq̚: <\H`?8# GDt(j԰bW m:gB#ڠi0)Hsxz+x9#`1?wIn3g2am#>/kk*_~Drֲ4nbJ`h$RqZJ*{}ԗ>nri_ze$eWj1_^jSPO7ʫU.J7rEa _LKHXX^#=,s\ o;,mDFr6ixW6ڹ7ԘGʋ|҄`h9"f٤ C02d TNxN)%6T}zEAY?y,PƠ.,H*M[7fEeW[-3^&ov"9t蠒#G4_l,#;8qC殷jI}9w2VrֈZHNֿ/PK D0 src/unzip/UT Z!@8@UxPKD0{src/unzip/unzip.makUT f!@f!@UxTn@}.RaK]U(FFvP ZU `SP\9{G1TF" xY0ig4{6b"z #?ň,V4\NMcs"Ki Ihe 4،3ƂY!K Ҙ2( yI( [-.q=RcElD@BD$ %{zsƿU\"߱٫ӐaG 07qDƱz 5)UBm2,uDL< P$ U3FbO%g”0썶4*>u]82?ҕeiES+ϣx>H-ZBxԧ,֜Ǒв`Z*kCP7OIKT ?fXN+7rIa>ޡP?[fpȫWBۼ,idJ k:4k :2T."M*lv`8 ફʜZ0b\d+"rqy׽ڋ<H,PN@tSߓʣŤ:fW.p}?ՌL<#)eQtPIibڧ~ |'_]K:vO|}/PK =D0 src/zlib/UT V8 @8@UxPKD0~,src/zlib/zlib.makUT e!@8@UxVmkF@Ü\bQL*`]H #V6%͹w$YJV(X33̬%#!ÔQhvÜ4tbj9Äg;Jxg47:|Z@MfsUE#{xb[StEiۣ Dqa4AcN0QWRId4 e}{ sQt@C|ܥUK:!%&=$X73vqK?ЭLR-_ЏN wxPp=^^vt^Habݨ%sP]l mWrjJnoFCP]mWR)F g 2ԝ45~[[BEm&!i sdX<oQ;F[h9QnAh#$f~G kzY@)U3b!]}gQ ^|EBAA"Ϭ6Γx(z6`^fSWcOʒMĦ`SQcDYN,']M2ަȩN Bxpכla*Ss\D*|}xH%I.>jC[ŘOq.VWSs8xb_OXcZ҉/5nMte[K4_ͦ,6IgzA|rS@ 0POW-4ϨD*Ǩ Un NP o&l_4a% Fz8V$XŠ +[jav$Cmv_ vz:Au=ĩZ };wӵگPK D0 Aresource/UT7 @UxPKo+e7I <resource/analog.rcUTI;UxPKĶo+F |resource/resource.hUTG;UxPK D0 Asrc/UTY!@UxPKD07  src/analog.makUT9 @UxPK D0 A. src/bzip2/UTY!@UxPKD0|LS  k src/bzip2/bzip2.makUT^!@UxPK =D0 Asrc/libgd/UTV8 @UxPK#D0K|MB  :src/libgd/libgd.makUTZ!@UxPK =D0 Asrc/libpng/UTV8 @UxPKD0Xc   src/libpng/libpng.makUTN_!@UxPK =D0 Asrc/pcre/UTV8 @UxPKĬD0T, src/pcre/pcre.makUT@f!@UxPK D0 Asrc/unzip/UTZ!@UxPKD0{ 7src/unzip/unzip.makUTf!@UxPK =D0 Absrc/zlib/UTV8 @UxPKD0~, src/zlib/zlib.makUTe!@UxPK!analog-6.0/src/bzip2/0000755000175000017500000000000010161303543014547 5ustar sret1sret100000000000000analog-6.0/src/bzip2/LICENSE0000644000175000017500000000417110161303543015557 0ustar sret1sret100000000000000The files in this directory are from version 1.0.2 of Julian Seward's bzip2 library. The source files are unchanged except for being wrapped in my own #ifdef's, but the documentation, programs etc. have been removed. You can get the full distribution of bzip2 from http://sources.redhat.com/bzip2/ . Many thanks to Julian Seward for his excellent routines and generous licence. === AUTHOR'S COPYRIGHT AND LICENCE START HERE === This program, "bzip2" and associated library "libbzip2", are copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0.2 of 30 December 2001 analog-6.0/src/bzip2/Makefile0000644000175000017500000000144610161303543016214 0ustar sret1sret100000000000000# Makefile for analog 6.0, zlib subdirectory # Please read docs/Readme.html, or http://www.analog.cx/ HEADERS = bzlib.h bzlib_private.h OBJS = bzlib.o blocksort.o compress.o crctable.o decompress.o huffman.o \ randtable.o all: $(OBJS) bzlib.o: bzlib.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c bzlib.c blocksort.o: blocksort.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c blocksort.c compress.o: compress.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c compress.c crctable.o: crctable.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c crctable.c decompress.o: decompress.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c decompress.c huffman.o: huffman.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c huffman.c randtable.o: randtable.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c randtable.c clean: rm -f *.o *~ analog-6.0/src/bzip2/blocksort.c0000644000175000017500000007757310161303543016740 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Block sorting machinery ---*/ /*--- blocksort.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. To get some idea how the block sorting algorithms in this file work, read my paper On the Performance of BWT Sorting Algorithms in Proceedings of the IEEE Data Compression Conference 2000, Snowbird, Utah, USA, 27-30 March 2000. The main sort in this file implements the algorithm called cache in the paper. --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*---------------------------------------------*/ /*--- Fallback O(N log(N)^2) sorting ---*/ /*--- algorithm, for repetitive blocks ---*/ /*---------------------------------------------*/ /*---------------------------------------------*/ static __inline__ void fallbackSimpleSort ( UInt32* fmap, UInt32* eclass, Int32 lo, Int32 hi ) { Int32 i, j, tmp; UInt32 ec_tmp; if (lo == hi) return; if (hi - lo > 3) { for ( i = hi-4; i >= lo; i-- ) { tmp = fmap[i]; ec_tmp = eclass[tmp]; for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) fmap[j-4] = fmap[j]; fmap[j-4] = tmp; } } for ( i = hi-1; i >= lo; i-- ) { tmp = fmap[i]; ec_tmp = eclass[tmp]; for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) fmap[j-1] = fmap[j]; fmap[j-1] = tmp; } } /*---------------------------------------------*/ #define fswap(zz1, zz2) \ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } #define fvswap(zzp1, zzp2, zzn) \ { \ Int32 yyp1 = (zzp1); \ Int32 yyp2 = (zzp2); \ Int32 yyn = (zzn); \ while (yyn > 0) { \ fswap(fmap[yyp1], fmap[yyp2]); \ yyp1++; yyp2++; yyn--; \ } \ } #define fmin(a,b) ((a) < (b)) ? (a) : (b) #define fpush(lz,hz) { stackLo[sp] = lz; \ stackHi[sp] = hz; \ sp++; } #define fpop(lz,hz) { sp--; \ lz = stackLo[sp]; \ hz = stackHi[sp]; } #define FALLBACK_QSORT_SMALL_THRESH 10 #define FALLBACK_QSORT_STACK_SIZE 100 static void fallbackQSort3 ( UInt32* fmap, UInt32* eclass, Int32 loSt, Int32 hiSt ) { Int32 unLo, unHi, ltLo, gtHi, n, m; Int32 sp, lo, hi; UInt32 med, r, r3; Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; r = 0; sp = 0; fpush ( loSt, hiSt ); while (sp > 0) { AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 ); fpop ( lo, hi ); if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { fallbackSimpleSort ( fmap, eclass, lo, hi ); continue; } /* Random partitioning. Median of 3 sometimes fails to avoid bad cases. Median of 9 seems to help but looks rather expensive. This too seems to work but is cheaper. Guidance for the magic constants 7621 and 32768 is taken from Sedgewick's algorithms book, chapter 35. */ r = ((r * 7621) + 1) % 32768; r3 = r % 3; if (r3 == 0) med = eclass[fmap[lo]]; else if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else med = eclass[fmap[hi]]; unLo = ltLo = lo; unHi = gtHi = hi; while (1) { while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unLo]] - (Int32)med; if (n == 0) { fswap(fmap[unLo], fmap[ltLo]); ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; } while (1) { if (unLo > unHi) break; n = (Int32)eclass[fmap[unHi]] - (Int32)med; if (n == 0) { fswap(fmap[unHi], fmap[gtHi]); gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; } if (unLo > unHi) break; fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; } AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); if (gtHi < ltLo) continue; n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); n = lo + unLo - ltLo - 1; m = hi - (gtHi - unHi) + 1; if (n - lo > hi - m) { fpush ( lo, n ); fpush ( m, hi ); } else { fpush ( m, hi ); fpush ( lo, n ); } } } #undef fmin #undef fpush #undef fpop #undef fswap #undef fvswap #undef FALLBACK_QSORT_SMALL_THRESH #undef FALLBACK_QSORT_STACK_SIZE /*---------------------------------------------*/ /* Pre: nblock > 0 eclass exists for [0 .. nblock-1] ((UChar*)eclass) [0 .. nblock-1] holds block ptr exists for [0 .. nblock-1] Post: ((UChar*)eclass) [0 .. nblock-1] holds block All other areas of eclass destroyed fmap [0 .. nblock-1] holds sorted order bhtab [ 0 .. 2+(nblock/32) ] destroyed */ #define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) #define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) #define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) #define WORD_BH(zz) bhtab[(zz) >> 5] #define UNALIGNED_BH(zz) ((zz) & 0x01f) static void fallbackSort ( UInt32* fmap, UInt32* eclass, UInt32* bhtab, Int32 nblock, Int32 verb ) { Int32 ftab[257]; Int32 ftabCopy[256]; Int32 H, i, j, k, l, r, cc, cc1; Int32 nNotDone; Int32 nBhtab; UChar* eclass8 = (UChar*)eclass; /*-- Initial 1-char radix sort to generate initial fmap and initial BH bits. --*/ if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); for (i = 0; i < 257; i++) ftab[i] = 0; for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; for (i = 0; i < nblock; i++) { j = eclass8[i]; k = ftab[j] - 1; ftab[j] = k; fmap[k] = i; } nBhtab = 2 + (nblock / 32); for (i = 0; i < nBhtab; i++) bhtab[i] = 0; for (i = 0; i < 256; i++) SET_BH(ftab[i]); /*-- Inductively refine the buckets. Kind-of an "exponential radix sort" (!), inspired by the Manber-Myers suffix array construction algorithm. --*/ /*-- set sentinel bits for block-end detection --*/ for (i = 0; i < 32; i++) { SET_BH(nblock + 2*i); CLEAR_BH(nblock + 2*i + 1); } /*-- the log(N) loop --*/ H = 1; while (1) { if (verb >= 4) VPrintf1 ( " depth %6d has ", H ); j = 0; for (i = 0; i < nblock; i++) { if (ISSET_BH(i)) j = i; k = fmap[i] - H; if (k < 0) k += nblock; eclass[k] = j; } nNotDone = 0; r = -1; while (1) { /*-- find the next non-singleton bucket --*/ k = r + 1; while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; if (ISSET_BH(k)) { while (WORD_BH(k) == 0xffffffff) k += 32; while (ISSET_BH(k)) k++; } l = k - 1; if (l >= nblock) break; while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; if (!ISSET_BH(k)) { while (WORD_BH(k) == 0x00000000) k += 32; while (!ISSET_BH(k)) k++; } r = k - 1; if (r >= nblock) break; /*-- now [l, r] bracket current bucket --*/ if (r > l) { nNotDone += (r - l + 1); fallbackQSort3 ( fmap, eclass, l, r ); /*-- scan bucket and generate header bits-- */ cc = -1; for (i = l; i <= r; i++) { cc1 = eclass[fmap[i]]; if (cc != cc1) { SET_BH(i); cc = cc1; }; } } } if (verb >= 4) VPrintf1 ( "%6d unresolved strings\n", nNotDone ); H *= 2; if (H > nblock || nNotDone == 0) break; } /*-- Reconstruct the original block in eclass8 [0 .. nblock-1], since the previous phase destroyed it. --*/ if (verb >= 4) VPrintf0 ( " reconstructing block ...\n" ); j = 0; for (i = 0; i < nblock; i++) { while (ftabCopy[j] == 0) j++; ftabCopy[j]--; eclass8[fmap[i]] = (UChar)j; } AssertH ( j < 256, 1005 ); } #undef SET_BH #undef CLEAR_BH #undef ISSET_BH #undef WORD_BH #undef UNALIGNED_BH /*---------------------------------------------*/ /*--- The main, O(N^2 log(N)) sorting ---*/ /*--- algorithm. Faster for "normal" ---*/ /*--- non-repetitive blocks. ---*/ /*---------------------------------------------*/ /*---------------------------------------------*/ static __inline__ Bool mainGtU ( UInt32 i1, UInt32 i2, UChar* block, UInt16* quadrant, UInt32 nblock, Int32* budget ) { Int32 k; UChar c1, c2; UInt16 s1, s2; AssertD ( i1 != i2, "mainGtU" ); /* 1 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 2 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 3 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 4 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 5 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 6 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 7 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 8 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 9 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 10 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 11 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; /* 12 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); i1++; i2++; k = nblock + 8; do { /* 1 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 2 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 3 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 4 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 5 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 6 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 7 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; /* 8 */ c1 = block[i1]; c2 = block[i2]; if (c1 != c2) return (c1 > c2); s1 = quadrant[i1]; s2 = quadrant[i2]; if (s1 != s2) return (s1 > s2); i1++; i2++; if (i1 >= nblock) i1 -= nblock; if (i2 >= nblock) i2 -= nblock; k -= 8; (*budget)--; } while (k >= 0); return False; } /*---------------------------------------------*/ /*-- Knuth's increments seem to work better than Incerpi-Sedgewick here. Possibly because the number of elems to sort is usually small, typically <= 20. --*/ static Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484 }; static void mainSimpleSort ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, Int32 lo, Int32 hi, Int32 d, Int32* budget ) { Int32 i, j, h, bigN, hp; UInt32 v; bigN = hi - lo + 1; if (bigN < 2) return; hp = 0; while (incs[hp] < bigN) hp++; hp--; for (; hp >= 0; hp--) { h = incs[hp]; i = lo + h; while (True) { /*-- copy 1 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; /*-- copy 2 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; /*-- copy 3 --*/ if (i > hi) break; v = ptr[i]; j = i; while ( mainGtU ( ptr[j-h]+d, v+d, block, quadrant, nblock, budget ) ) { ptr[j] = ptr[j-h]; j = j - h; if (j <= (lo + h - 1)) break; } ptr[j] = v; i++; if (*budget < 0) return; } } } /*---------------------------------------------*/ /*-- The following is an implementation of an elegant 3-way quicksort for strings, described in a paper "Fast Algorithms for Sorting and Searching Strings", by Robert Sedgewick and Jon L. Bentley. --*/ #define mswap(zz1, zz2) \ { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } #define mvswap(zzp1, zzp2, zzn) \ { \ Int32 yyp1 = (zzp1); \ Int32 yyp2 = (zzp2); \ Int32 yyn = (zzn); \ while (yyn > 0) { \ mswap(ptr[yyp1], ptr[yyp2]); \ yyp1++; yyp2++; yyn--; \ } \ } static __inline__ UChar mmed3 ( UChar a, UChar b, UChar c ) { UChar t; if (a > b) { t = a; a = b; b = t; }; if (b > c) { b = c; if (a > b) b = a; } return b; } #define mmin(a,b) ((a) < (b)) ? (a) : (b) #define mpush(lz,hz,dz) { stackLo[sp] = lz; \ stackHi[sp] = hz; \ stackD [sp] = dz; \ sp++; } #define mpop(lz,hz,dz) { sp--; \ lz = stackLo[sp]; \ hz = stackHi[sp]; \ dz = stackD [sp]; } #define mnextsize(az) (nextHi[az]-nextLo[az]) #define mnextswap(az,bz) \ { Int32 tz; \ tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } #define MAIN_QSORT_SMALL_THRESH 20 #define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) #define MAIN_QSORT_STACK_SIZE 100 static void mainQSort3 ( UInt32* ptr, UChar* block, UInt16* quadrant, Int32 nblock, Int32 loSt, Int32 hiSt, Int32 dSt, Int32* budget ) { Int32 unLo, unHi, ltLo, gtHi, n, m, med; Int32 sp, lo, hi, d; Int32 stackLo[MAIN_QSORT_STACK_SIZE]; Int32 stackHi[MAIN_QSORT_STACK_SIZE]; Int32 stackD [MAIN_QSORT_STACK_SIZE]; Int32 nextLo[3]; Int32 nextHi[3]; Int32 nextD [3]; sp = 0; mpush ( loSt, hiSt, dSt ); while (sp > 0) { AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 ); mpop ( lo, hi, d ); if (hi - lo < MAIN_QSORT_SMALL_THRESH || d > MAIN_QSORT_DEPTH_THRESH) { mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); if (*budget < 0) return; continue; } med = (Int32) mmed3 ( block[ptr[ lo ]+d], block[ptr[ hi ]+d], block[ptr[ (lo+hi)>>1 ]+d] ); unLo = ltLo = lo; unHi = gtHi = hi; while (True) { while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unLo]+d]) - med; if (n == 0) { mswap(ptr[unLo], ptr[ltLo]); ltLo++; unLo++; continue; }; if (n > 0) break; unLo++; } while (True) { if (unLo > unHi) break; n = ((Int32)block[ptr[unHi]+d]) - med; if (n == 0) { mswap(ptr[unHi], ptr[gtHi]); gtHi--; unHi--; continue; }; if (n < 0) break; unHi--; } if (unLo > unHi) break; mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; } AssertD ( unHi == unLo-1, "mainQSort3(2)" ); if (gtHi < ltLo) { mpush(lo, hi, d+1 ); continue; } n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); n = lo + unLo - ltLo - 1; m = hi - (gtHi - unHi) + 1; nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); mpush (nextLo[0], nextHi[0], nextD[0]); mpush (nextLo[1], nextHi[1], nextD[1]); mpush (nextLo[2], nextHi[2], nextD[2]); } } #undef mswap #undef mvswap #undef mpush #undef mpop #undef mmin #undef mnextsize #undef mnextswap #undef MAIN_QSORT_SMALL_THRESH #undef MAIN_QSORT_DEPTH_THRESH #undef MAIN_QSORT_STACK_SIZE /*---------------------------------------------*/ /* Pre: nblock > N_OVERSHOOT block32 exists for [0 .. nblock-1 +N_OVERSHOOT] ((UChar*)block32) [0 .. nblock-1] holds block ptr exists for [0 .. nblock-1] Post: ((UChar*)block32) [0 .. nblock-1] holds block All other areas of block32 destroyed ftab [0 .. 65536 ] destroyed ptr [0 .. nblock-1] holds sorted order if (*budget < 0), sorting was abandoned */ #define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) #define SETMASK (1 << 21) #define CLEARMASK (~(SETMASK)) static void mainSort ( UInt32* ptr, UChar* block, UInt16* quadrant, UInt32* ftab, Int32 nblock, Int32 verb, Int32* budget ) { Int32 i, j, k, ss, sb; Int32 runningOrder[256]; Bool bigDone[256]; Int32 copyStart[256]; Int32 copyEnd [256]; UChar c1; Int32 numQSorted; UInt16 s; if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); /*-- set up the 2-byte frequency table --*/ for (i = 65536; i >= 0; i--) ftab[i] = 0; j = block[0] << 8; i = nblock-1; for (; i >= 3; i -= 4) { quadrant[i] = 0; j = (j >> 8) | ( ((UInt16)block[i]) << 8); ftab[j]++; quadrant[i-1] = 0; j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); ftab[j]++; quadrant[i-2] = 0; j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); ftab[j]++; quadrant[i-3] = 0; j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); ftab[j]++; } for (; i >= 0; i--) { quadrant[i] = 0; j = (j >> 8) | ( ((UInt16)block[i]) << 8); ftab[j]++; } /*-- (emphasises close relationship of block & quadrant) --*/ for (i = 0; i < BZ_N_OVERSHOOT; i++) { block [nblock+i] = block[i]; quadrant[nblock+i] = 0; } if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); /*-- Complete the initial radix sort --*/ for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; s = block[0] << 8; i = nblock-1; for (; i >= 3; i -= 4) { s = (s >> 8) | (block[i] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i; s = (s >> 8) | (block[i-1] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-1; s = (s >> 8) | (block[i-2] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-2; s = (s >> 8) | (block[i-3] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i-3; } for (; i >= 0; i--) { s = (s >> 8) | (block[i] << 8); j = ftab[s] -1; ftab[s] = j; ptr[j] = i; } /*-- Now ftab contains the first loc of every small bucket. Calculate the running order, from smallest to largest big bucket. --*/ for (i = 0; i <= 255; i++) { bigDone [i] = False; runningOrder[i] = i; } { Int32 vv; Int32 h = 1; do h = 3 * h + 1; while (h <= 256); do { h = h / 3; for (i = h; i <= 255; i++) { vv = runningOrder[i]; j = i; while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { runningOrder[j] = runningOrder[j-h]; j = j - h; if (j <= (h - 1)) goto zero; } zero: runningOrder[j] = vv; } } while (h != 1); } /*-- The main sorting loop. --*/ numQSorted = 0; for (i = 0; i <= 255; i++) { /*-- Process big buckets, starting with the least full. Basically this is a 3-step process in which we call mainQSort3 to sort the small buckets [ss, j], but also make a big effort to avoid the calls if we can. --*/ ss = runningOrder[i]; /*-- Step 1: Complete the big bucket [ss] by quicksorting any unsorted small buckets [ss, j], for j != ss. Hopefully previous pointer-scanning phases have already completed many of the small buckets [ss, j], so we don't have to sort them at all. --*/ for (j = 0; j <= 255; j++) { if (j != ss) { sb = (ss << 8) + j; if ( ! (ftab[sb] & SETMASK) ) { Int32 lo = ftab[sb] & CLEARMASK; Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; if (hi > lo) { if (verb >= 4) VPrintf4 ( " qsort [0x%x, 0x%x] " "done %d this %d\n", ss, j, numQSorted, hi - lo + 1 ); mainQSort3 ( ptr, block, quadrant, nblock, lo, hi, BZ_N_RADIX, budget ); numQSorted += (hi - lo + 1); if (*budget < 0) return; } } ftab[sb] |= SETMASK; } } AssertH ( !bigDone[ss], 1006 ); /*-- Step 2: Now scan this big bucket [ss] so as to synthesise the sorted order for small buckets [t, ss] for all t, including, magically, the bucket [ss,ss] too. This will avoid doing Real Work in subsequent Step 1's. --*/ { for (j = 0; j <= 255; j++) { copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; } for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; if (!bigDone[c1]) ptr[ copyStart[c1]++ ] = k; } for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { k = ptr[j]-1; if (k < 0) k += nblock; c1 = block[k]; if (!bigDone[c1]) ptr[ copyEnd[c1]-- ] = k; } } AssertH ( (copyStart[ss]-1 == copyEnd[ss]) || /* Extremely rare case missing in bzip2-1.0.0 and 1.0.1. Necessity for this case is demonstrated by compressing a sequence of approximately 48.5 million of character 251; 1.0.0/1.0.1 will then die here. */ (copyStart[ss] == 0 && copyEnd[ss] == nblock-1), 1007 ) for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; /*-- Step 3: The [ss] big bucket is now done. Record this fact, and update the quadrant descriptors. Remember to update quadrants in the overshoot area too, if necessary. The "if (i < 255)" test merely skips this updating for the last bucket processed, since updating for the last bucket is pointless. The quadrant array provides a way to incrementally cache sort orderings, as they appear, so as to make subsequent comparisons in fullGtU() complete faster. For repetitive blocks this makes a big difference (but not big enough to be able to avoid the fallback sorting mechanism, exponential radix sort). The precise meaning is: at all times: for 0 <= i < nblock and 0 <= j <= nblock if block[i] != block[j], then the relative values of quadrant[i] and quadrant[j] are meaningless. else { if quadrant[i] < quadrant[j] then the string starting at i lexicographically precedes the string starting at j else if quadrant[i] > quadrant[j] then the string starting at j lexicographically precedes the string starting at i else the relative ordering of the strings starting at i and j has not yet been determined. } --*/ bigDone[ss] = True; if (i < 255) { Int32 bbStart = ftab[ss << 8] & CLEARMASK; Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; Int32 shifts = 0; while ((bbSize >> shifts) > 65534) shifts++; for (j = bbSize-1; j >= 0; j--) { Int32 a2update = ptr[bbStart + j]; UInt16 qVal = (UInt16)(j >> shifts); quadrant[a2update] = qVal; if (a2update < BZ_N_OVERSHOOT) quadrant[a2update + nblock] = qVal; } AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); } } if (verb >= 4) VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", nblock, numQSorted, nblock - numQSorted ); } #undef BIGFREQ #undef SETMASK #undef CLEARMASK /*---------------------------------------------*/ /* Pre: nblock > 0 arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] ((UChar*)arr2) [0 .. nblock-1] holds block arr1 exists for [0 .. nblock-1] Post: ((UChar*)arr2) [0 .. nblock-1] holds block All other areas of block destroyed ftab [ 0 .. 65536 ] destroyed arr1 [0 .. nblock-1] holds sorted order */ void BZ2_blockSort ( EState* s ) { UInt32* ptr = s->ptr; UChar* block = s->block; UInt32* ftab = s->ftab; Int32 nblock = s->nblock; Int32 verb = s->verbosity; Int32 wfact = s->workFactor; UInt16* quadrant; Int32 budget; Int32 budgetInit; Int32 i; if (nblock < 10000) { fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); } else { /* Calculate the location for quadrant, remembering to get the alignment right. Assumes that &(block[0]) is at least 2-byte aligned -- this should be ok since block is really the first section of arr2. */ i = nblock+BZ_N_OVERSHOOT; if (i & 1) i++; quadrant = (UInt16*)(&(block[i])); /* (wfact-1) / 3 puts the default-factor-30 transition point at very roughly the same place as with v0.1 and v0.9.0. Not that it particularly matters any more, since the resulting compressed stream is now the same regardless of whether or not we use the main sort or fallback sort. */ if (wfact < 1 ) wfact = 1; if (wfact > 100) wfact = 100; budgetInit = nblock * ((wfact-1) / 3); budget = budgetInit; mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); if (verb >= 3) VPrintf3 ( " %d work, %d block, ratio %5.2f\n", budgetInit - budget, nblock, (float)(budgetInit - budget) / (float)(nblock==0 ? 1 : nblock) ); if (budget < 0) { if (verb >= 2) VPrintf0 ( " too repetitive; using fallback" " sorting algorithm\n" ); fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); } } s->origPtr = -1; for (i = 0; i < s->nblock; i++) if (ptr[i] == 0) { s->origPtr = i; break; }; AssertH( s->origPtr != -1, 1003 ); } #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end blocksort.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/bzlib.c0000644000175000017500000013330010161303543016015 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Library top-level functions. ---*/ /*--- bzlib.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ /*-- CHANGES ~~~~~~~ 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. 0.9.0c * made zero-length BZ_FLUSH work correctly in bzCompress(). * fixed bzWrite/bzRead to ignore zero-length requests. * fixed bzread to correctly handle read requests after EOF. * wrong parameter order in call to bzDecompressInit in bzBuffToBuffDecompress. Fixed. --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*---------------------------------------------------*/ /*--- Compression stuff ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ #ifndef BZ_NO_STDIO void BZ2_bz__AssertH__fail ( int errcode ) { fprintf(stderr, "\n\nbzip2/libbzip2: internal error number %d.\n" "This is a bug in bzip2/libbzip2, %s.\n" "Please report it to me at: jseward@acm.org. If this happened\n" "when you were using some program which uses libbzip2 as a\n" "component, you should also report this bug to the author(s)\n" "of that program. Please make an effort to report this bug;\n" "timely and accurate bug reports eventually lead to higher\n" "quality software. Thanks. Julian Seward, 30 December 2001.\n\n", errcode, BZ2_bzlibVersion() ); if (errcode == 1007) { fprintf(stderr, "\n*** A special note about internal error number 1007 ***\n" "\n" "Experience suggests that a common cause of i.e. 1007\n" "is unreliable memory or other hardware. The 1007 assertion\n" "just happens to cross-check the results of huge numbers of\n" "memory reads/writes, and so acts (unintendedly) as a stress\n" "test of your memory system.\n" "\n" "I suggest the following: try compressing the file again,\n" "possibly monitoring progress in detail with the -vv flag.\n" "\n" "* If the error cannot be reproduced, and/or happens at different\n" " points in compression, you may have a flaky memory system.\n" " Try a memory-test program. I have used Memtest86\n" " (www.memtest86.com). At the time of writing it is free (GPLd).\n" " Memtest86 tests memory much more thorougly than your BIOSs\n" " power-on test, and may find failures that the BIOS doesn't.\n" "\n" "* If the error can be repeatably reproduced, this is a bug in\n" " bzip2, and I would very much like to hear about it. Please\n" " let me know, and, ideally, save a copy of the file causing the\n" " problem -- without which I will be unable to investigate it.\n" "\n" ); } exit(3); } #endif /*---------------------------------------------------*/ static int bz_config_ok ( void ) { if (sizeof(int) != 4) return 0; if (sizeof(short) != 2) return 0; if (sizeof(char) != 1) return 0; return 1; } /*---------------------------------------------------*/ static void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) { void* v = malloc ( items * size ); return v; } static void default_bzfree ( void* opaque, void* addr ) { if (addr != NULL) free ( addr ); } /*---------------------------------------------------*/ static void prepare_new_block ( EState* s ) { Int32 i; s->nblock = 0; s->numZ = 0; s->state_out_pos = 0; BZ_INITIALISE_CRC ( s->blockCRC ); for (i = 0; i < 256; i++) s->inUse[i] = False; s->blockNo++; } /*---------------------------------------------------*/ static void init_RL ( EState* s ) { s->state_in_ch = 256; s->state_in_len = 0; } static Bool isempty_RL ( EState* s ) { if (s->state_in_ch < 256 && s->state_in_len > 0) return False; else return True; } /*---------------------------------------------------*/ int BZ_API(BZ2_bzCompressInit) ( bz_stream* strm, int blockSize100k, int verbosity, int workFactor ) { Int32 n; EState* s; if (!bz_config_ok()) return BZ_CONFIG_ERROR; if (strm == NULL || blockSize100k < 1 || blockSize100k > 9 || workFactor < 0 || workFactor > 250) return BZ_PARAM_ERROR; if (workFactor == 0) workFactor = 30; if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; if (strm->bzfree == NULL) strm->bzfree = default_bzfree; s = BZALLOC( sizeof(EState) ); if (s == NULL) return BZ_MEM_ERROR; s->strm = strm; s->arr1 = NULL; s->arr2 = NULL; s->ftab = NULL; n = 100000 * blockSize100k; s->arr1 = BZALLOC( n * sizeof(UInt32) ); s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { if (s->arr1 != NULL) BZFREE(s->arr1); if (s->arr2 != NULL) BZFREE(s->arr2); if (s->ftab != NULL) BZFREE(s->ftab); if (s != NULL) BZFREE(s); return BZ_MEM_ERROR; } s->blockNo = 0; s->state = BZ_S_INPUT; s->mode = BZ_M_RUNNING; s->combinedCRC = 0; s->blockSize100k = blockSize100k; s->nblockMAX = 100000 * blockSize100k - 19; s->verbosity = verbosity; s->workFactor = workFactor; s->block = (UChar*)s->arr2; s->mtfv = (UInt16*)s->arr1; s->zbits = NULL; s->ptr = (UInt32*)s->arr1; strm->state = s; strm->total_in_lo32 = 0; strm->total_in_hi32 = 0; strm->total_out_lo32 = 0; strm->total_out_hi32 = 0; init_RL ( s ); prepare_new_block ( s ); return BZ_OK; } /*---------------------------------------------------*/ static void add_pair_to_block ( EState* s ) { Int32 i; UChar ch = (UChar)(s->state_in_ch); for (i = 0; i < s->state_in_len; i++) { BZ_UPDATE_CRC( s->blockCRC, ch ); } s->inUse[s->state_in_ch] = True; switch (s->state_in_len) { case 1: s->block[s->nblock] = (UChar)ch; s->nblock++; break; case 2: s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; break; case 3: s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; break; default: s->inUse[s->state_in_len-4] = True; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = (UChar)ch; s->nblock++; s->block[s->nblock] = ((UChar)(s->state_in_len-4)); s->nblock++; break; } } /*---------------------------------------------------*/ static void flush_RL ( EState* s ) { if (s->state_in_ch < 256) add_pair_to_block ( s ); init_RL ( s ); } /*---------------------------------------------------*/ #define ADD_CHAR_TO_BLOCK(zs,zchh0) \ { \ UInt32 zchh = (UInt32)(zchh0); \ /*-- fast track the common case --*/ \ if (zchh != zs->state_in_ch && \ zs->state_in_len == 1) { \ UChar ch = (UChar)(zs->state_in_ch); \ BZ_UPDATE_CRC( zs->blockCRC, ch ); \ zs->inUse[zs->state_in_ch] = True; \ zs->block[zs->nblock] = (UChar)ch; \ zs->nblock++; \ zs->state_in_ch = zchh; \ } \ else \ /*-- general, uncommon cases --*/ \ if (zchh != zs->state_in_ch || \ zs->state_in_len == 255) { \ if (zs->state_in_ch < 256) \ add_pair_to_block ( zs ); \ zs->state_in_ch = zchh; \ zs->state_in_len = 1; \ } else { \ zs->state_in_len++; \ } \ } /*---------------------------------------------------*/ static Bool copy_input_until_stop ( EState* s ) { Bool progress_in = False; if (s->mode == BZ_M_RUNNING) { /*-- fast track the common case --*/ while (True) { /*-- block full? --*/ if (s->nblock >= s->nblockMAX) break; /*-- no input? --*/ if (s->strm->avail_in == 0) break; progress_in = True; ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; } } else { /*-- general, uncommon case --*/ while (True) { /*-- block full? --*/ if (s->nblock >= s->nblockMAX) break; /*-- no input? --*/ if (s->strm->avail_in == 0) break; /*-- flush/finish end? --*/ if (s->avail_in_expect == 0) break; progress_in = True; ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); s->strm->next_in++; s->strm->avail_in--; s->strm->total_in_lo32++; if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; s->avail_in_expect--; } } return progress_in; } /*---------------------------------------------------*/ static Bool copy_output_until_stop ( EState* s ) { Bool progress_out = False; while (True) { /*-- no output space? --*/ if (s->strm->avail_out == 0) break; /*-- block done? --*/ if (s->state_out_pos >= s->numZ) break; progress_out = True; *(s->strm->next_out) = s->zbits[s->state_out_pos]; s->state_out_pos++; s->strm->avail_out--; s->strm->next_out++; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } return progress_out; } /*---------------------------------------------------*/ static Bool handle_compress ( bz_stream* strm ) { Bool progress_in = False; Bool progress_out = False; EState* s = strm->state; while (True) { if (s->state == BZ_S_OUTPUT) { progress_out |= copy_output_until_stop ( s ); if (s->state_out_pos < s->numZ) break; if (s->mode == BZ_M_FINISHING && s->avail_in_expect == 0 && isempty_RL(s)) break; prepare_new_block ( s ); s->state = BZ_S_INPUT; if (s->mode == BZ_M_FLUSHING && s->avail_in_expect == 0 && isempty_RL(s)) break; } if (s->state == BZ_S_INPUT) { progress_in |= copy_input_until_stop ( s ); if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { flush_RL ( s ); BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); s->state = BZ_S_OUTPUT; } else if (s->nblock >= s->nblockMAX) { BZ2_compressBlock ( s, False ); s->state = BZ_S_OUTPUT; } else if (s->strm->avail_in == 0) { break; } } } return progress_in || progress_out; } /*---------------------------------------------------*/ int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) { Bool progress; EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; preswitch: switch (s->mode) { case BZ_M_IDLE: return BZ_SEQUENCE_ERROR; case BZ_M_RUNNING: if (action == BZ_RUN) { progress = handle_compress ( strm ); return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; } else if (action == BZ_FLUSH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FLUSHING; goto preswitch; } else if (action == BZ_FINISH) { s->avail_in_expect = strm->avail_in; s->mode = BZ_M_FINISHING; goto preswitch; } else return BZ_PARAM_ERROR; case BZ_M_FLUSHING: if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FLUSH_OK; s->mode = BZ_M_RUNNING; return BZ_RUN_OK; case BZ_M_FINISHING: if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect != s->strm->avail_in) return BZ_SEQUENCE_ERROR; progress = handle_compress ( strm ); if (!progress) return BZ_SEQUENCE_ERROR; if (s->avail_in_expect > 0 || !isempty_RL(s) || s->state_out_pos < s->numZ) return BZ_FINISH_OK; s->mode = BZ_M_IDLE; return BZ_STREAM_END; } return BZ_OK; /*--not reached--*/ } /*---------------------------------------------------*/ int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) { EState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; if (s->arr1 != NULL) BZFREE(s->arr1); if (s->arr2 != NULL) BZFREE(s->arr2); if (s->ftab != NULL) BZFREE(s->ftab); BZFREE(strm->state); strm->state = NULL; return BZ_OK; } /*---------------------------------------------------*/ /*--- Decompression stuff ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ int BZ_API(BZ2_bzDecompressInit) ( bz_stream* strm, int verbosity, int small ) { DState* s; if (!bz_config_ok()) return BZ_CONFIG_ERROR; if (strm == NULL) return BZ_PARAM_ERROR; if (small != 0 && small != 1) return BZ_PARAM_ERROR; if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; if (strm->bzfree == NULL) strm->bzfree = default_bzfree; s = BZALLOC( sizeof(DState) ); if (s == NULL) return BZ_MEM_ERROR; s->strm = strm; strm->state = s; s->state = BZ_X_MAGIC_1; s->bsLive = 0; s->bsBuff = 0; s->calculatedCombinedCRC = 0; strm->total_in_lo32 = 0; strm->total_in_hi32 = 0; strm->total_out_lo32 = 0; strm->total_out_hi32 = 0; s->smallDecompress = (Bool)small; s->ll4 = NULL; s->ll16 = NULL; s->tt = NULL; s->currBlockNo = 0; s->verbosity = verbosity; return BZ_OK; } /*---------------------------------------------------*/ static void unRLE_obuf_to_output_FAST ( DState* s ) { UChar k1; if (s->blockRandomised) { while (True) { /* try to finish existing run */ while (True) { if (s->strm->avail_out == 0) return; if (s->state_out_len == 0) break; *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); s->state_out_len--; s->strm->next_out++; s->strm->avail_out--; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } /* can a new run be started? */ if (s->nblock_used == s->save_nblock+1) return; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; s->nblock_used++; } } else { /* restore */ UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; UChar c_state_out_ch = s->state_out_ch; Int32 c_state_out_len = s->state_out_len; Int32 c_nblock_used = s->nblock_used; Int32 c_k0 = s->k0; UInt32* c_tt = s->tt; UInt32 c_tPos = s->tPos; char* cs_next_out = s->strm->next_out; unsigned int cs_avail_out = s->strm->avail_out; /* end restore */ UInt32 avail_out_INIT = cs_avail_out; Int32 s_save_nblockPP = s->save_nblock+1; unsigned int total_out_lo32_old; while (True) { /* try to finish existing run */ if (c_state_out_len > 0) { while (True) { if (cs_avail_out == 0) goto return_notr; if (c_state_out_len == 1) break; *( (UChar*)(cs_next_out) ) = c_state_out_ch; BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); c_state_out_len--; cs_next_out++; cs_avail_out--; } s_state_out_len_eq_one: { if (cs_avail_out == 0) { c_state_out_len = 1; goto return_notr; }; *( (UChar*)(cs_next_out) ) = c_state_out_ch; BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); cs_next_out++; cs_avail_out--; } } /* can a new run be started? */ if (c_nblock_used == s_save_nblockPP) { c_state_out_len = 0; goto return_notr; }; c_state_out_ch = c_k0; BZ_GET_FAST_C(k1); c_nblock_used++; if (k1 != c_k0) { c_k0 = k1; goto s_state_out_len_eq_one; }; if (c_nblock_used == s_save_nblockPP) goto s_state_out_len_eq_one; c_state_out_len = 2; BZ_GET_FAST_C(k1); c_nblock_used++; if (c_nblock_used == s_save_nblockPP) continue; if (k1 != c_k0) { c_k0 = k1; continue; }; c_state_out_len = 3; BZ_GET_FAST_C(k1); c_nblock_used++; if (c_nblock_used == s_save_nblockPP) continue; if (k1 != c_k0) { c_k0 = k1; continue; }; BZ_GET_FAST_C(k1); c_nblock_used++; c_state_out_len = ((Int32)k1) + 4; BZ_GET_FAST_C(c_k0); c_nblock_used++; } return_notr: total_out_lo32_old = s->strm->total_out_lo32; s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); if (s->strm->total_out_lo32 < total_out_lo32_old) s->strm->total_out_hi32++; /* save */ s->calculatedBlockCRC = c_calculatedBlockCRC; s->state_out_ch = c_state_out_ch; s->state_out_len = c_state_out_len; s->nblock_used = c_nblock_used; s->k0 = c_k0; s->tt = c_tt; s->tPos = c_tPos; s->strm->next_out = cs_next_out; s->strm->avail_out = cs_avail_out; /* end save */ } } /*---------------------------------------------------*/ __inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) { Int32 nb, na, mid; nb = 0; na = 256; do { mid = (nb + na) >> 1; if (indx >= cftab[mid]) nb = mid; else na = mid; } while (na - nb != 1); return nb; } /*---------------------------------------------------*/ static void unRLE_obuf_to_output_SMALL ( DState* s ) { UChar k1; if (s->blockRandomised) { while (True) { /* try to finish existing run */ while (True) { if (s->strm->avail_out == 0) return; if (s->state_out_len == 0) break; *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); s->state_out_len--; s->strm->next_out++; s->strm->avail_out--; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } /* can a new run be started? */ if (s->nblock_used == s->save_nblock+1) return; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; k1 ^= BZ_RAND_MASK; s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; s->nblock_used++; } } else { while (True) { /* try to finish existing run */ while (True) { if (s->strm->avail_out == 0) return; if (s->state_out_len == 0) break; *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); s->state_out_len--; s->strm->next_out++; s->strm->avail_out--; s->strm->total_out_lo32++; if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; } /* can a new run be started? */ if (s->nblock_used == s->save_nblock+1) return; s->state_out_len = 1; s->state_out_ch = s->k0; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 2; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; s->state_out_len = 3; BZ_GET_SMALL(k1); s->nblock_used++; if (s->nblock_used == s->save_nblock+1) continue; if (k1 != s->k0) { s->k0 = k1; continue; }; BZ_GET_SMALL(k1); s->nblock_used++; s->state_out_len = ((Int32)k1) + 4; BZ_GET_SMALL(s->k0); s->nblock_used++; } } } /*---------------------------------------------------*/ int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) { DState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; while (True) { if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; if (s->state == BZ_X_OUTPUT) { if (s->smallDecompress) unRLE_obuf_to_output_SMALL ( s ); else unRLE_obuf_to_output_FAST ( s ); if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { BZ_FINALISE_CRC ( s->calculatedBlockCRC ); if (s->verbosity >= 3) VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC, s->calculatedBlockCRC ); if (s->verbosity >= 2) VPrintf0 ( "]" ); if (s->calculatedBlockCRC != s->storedBlockCRC) return BZ_DATA_ERROR; s->calculatedCombinedCRC = (s->calculatedCombinedCRC << 1) | (s->calculatedCombinedCRC >> 31); s->calculatedCombinedCRC ^= s->calculatedBlockCRC; s->state = BZ_X_BLKHDR_1; } else { return BZ_OK; } } if (s->state >= BZ_X_MAGIC_1) { Int32 r = BZ2_decompress ( s ); if (r == BZ_STREAM_END) { if (s->verbosity >= 3) VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x", s->storedCombinedCRC, s->calculatedCombinedCRC ); if (s->calculatedCombinedCRC != s->storedCombinedCRC) return BZ_DATA_ERROR; return r; } if (s->state != BZ_X_OUTPUT) return r; } } AssertH ( 0, 6001 ); return 0; /*NOTREACHED*/ } /*---------------------------------------------------*/ int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) { DState* s; if (strm == NULL) return BZ_PARAM_ERROR; s = strm->state; if (s == NULL) return BZ_PARAM_ERROR; if (s->strm != strm) return BZ_PARAM_ERROR; if (s->tt != NULL) BZFREE(s->tt); if (s->ll16 != NULL) BZFREE(s->ll16); if (s->ll4 != NULL) BZFREE(s->ll4); BZFREE(strm->state); strm->state = NULL; return BZ_OK; } #ifndef BZ_NO_STDIO /*---------------------------------------------------*/ /*--- File I/O stuff ---*/ /*---------------------------------------------------*/ #define BZ_SETERR(eee) \ { \ if (bzerror != NULL) *bzerror = eee; \ if (bzf != NULL) bzf->lastErr = eee; \ } typedef struct { FILE* handle; Char buf[BZ_MAX_UNUSED]; Int32 bufN; Bool writing; bz_stream strm; Int32 lastErr; Bool initialisedOk; } bzFile; /*---------------------------------------------*/ static Bool myfeof ( FILE* f ) { Int32 c = fgetc ( f ); if (c == EOF) return True; ungetc ( c, f ); return False; } /*---------------------------------------------------*/ BZFILE* BZ_API(BZ2_bzWriteOpen) ( int* bzerror, FILE* f, int blockSize100k, int verbosity, int workFactor ) { Int32 ret; bzFile* bzf = NULL; BZ_SETERR(BZ_OK); if (f == NULL || (blockSize100k < 1 || blockSize100k > 9) || (workFactor < 0 || workFactor > 250) || (verbosity < 0 || verbosity > 4)) { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; if (ferror(f)) { BZ_SETERR(BZ_IO_ERROR); return NULL; }; bzf = malloc ( sizeof(bzFile) ); if (bzf == NULL) { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; BZ_SETERR(BZ_OK); bzf->initialisedOk = False; bzf->bufN = 0; bzf->handle = f; bzf->writing = True; bzf->strm.bzalloc = NULL; bzf->strm.bzfree = NULL; bzf->strm.opaque = NULL; if (workFactor == 0) workFactor = 30; ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, verbosity, workFactor ); if (ret != BZ_OK) { BZ_SETERR(ret); free(bzf); return NULL; }; bzf->strm.avail_in = 0; bzf->initialisedOk = True; return bzf; } /*---------------------------------------------------*/ void BZ_API(BZ2_bzWrite) ( int* bzerror, BZFILE* b, void* buf, int len ) { Int32 n, n2, ret; bzFile* bzf = (bzFile*)b; BZ_SETERR(BZ_OK); if (bzf == NULL || buf == NULL || len < 0) { BZ_SETERR(BZ_PARAM_ERROR); return; }; if (!(bzf->writing)) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; if (len == 0) { BZ_SETERR(BZ_OK); return; }; bzf->strm.avail_in = len; bzf->strm.next_in = buf; while (True) { bzf->strm.avail_out = BZ_MAX_UNUSED; bzf->strm.next_out = bzf->buf; ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); if (ret != BZ_RUN_OK) { BZ_SETERR(ret); return; }; if (bzf->strm.avail_out < BZ_MAX_UNUSED) { n = BZ_MAX_UNUSED - bzf->strm.avail_out; n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), n, bzf->handle ); if (n != n2 || ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; } if (bzf->strm.avail_in == 0) { BZ_SETERR(BZ_OK); return; }; } } /*---------------------------------------------------*/ void BZ_API(BZ2_bzWriteClose) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in, unsigned int* nbytes_out ) { BZ2_bzWriteClose64 ( bzerror, b, abandon, nbytes_in, NULL, nbytes_out, NULL ); } void BZ_API(BZ2_bzWriteClose64) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in_lo32, unsigned int* nbytes_in_hi32, unsigned int* nbytes_out_lo32, unsigned int* nbytes_out_hi32 ) { Int32 n, n2, ret; bzFile* bzf = (bzFile*)b; if (bzf == NULL) { BZ_SETERR(BZ_OK); return; }; if (!(bzf->writing)) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; if ((!abandon) && bzf->lastErr == BZ_OK) { while (True) { bzf->strm.avail_out = BZ_MAX_UNUSED; bzf->strm.next_out = bzf->buf; ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) { BZ_SETERR(ret); return; }; if (bzf->strm.avail_out < BZ_MAX_UNUSED) { n = BZ_MAX_UNUSED - bzf->strm.avail_out; n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), n, bzf->handle ); if (n != n2 || ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; } if (ret == BZ_STREAM_END) break; } } if ( !abandon && !ferror ( bzf->handle ) ) { fflush ( bzf->handle ); if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return; }; } if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = bzf->strm.total_in_lo32; if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = bzf->strm.total_in_hi32; if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = bzf->strm.total_out_lo32; if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = bzf->strm.total_out_hi32; BZ_SETERR(BZ_OK); BZ2_bzCompressEnd ( &(bzf->strm) ); free ( bzf ); } /*---------------------------------------------------*/ BZFILE* BZ_API(BZ2_bzReadOpen) ( int* bzerror, FILE* f, int verbosity, int small, void* unused, int nUnused ) { bzFile* bzf = NULL; int ret; BZ_SETERR(BZ_OK); if (f == NULL || (small != 0 && small != 1) || (verbosity < 0 || verbosity > 4) || (unused == NULL && nUnused != 0) || (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; if (ferror(f)) { BZ_SETERR(BZ_IO_ERROR); return NULL; }; bzf = malloc ( sizeof(bzFile) ); if (bzf == NULL) { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; BZ_SETERR(BZ_OK); bzf->initialisedOk = False; bzf->handle = f; bzf->bufN = 0; bzf->writing = False; bzf->strm.bzalloc = NULL; bzf->strm.bzfree = NULL; bzf->strm.opaque = NULL; while (nUnused > 0) { bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; unused = ((void*)( 1 + ((UChar*)(unused)) )); nUnused--; } ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); if (ret != BZ_OK) { BZ_SETERR(ret); free(bzf); return NULL; }; bzf->strm.avail_in = bzf->bufN; bzf->strm.next_in = bzf->buf; bzf->initialisedOk = True; return bzf; } /*---------------------------------------------------*/ void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) { bzFile* bzf = (bzFile*)b; BZ_SETERR(BZ_OK); if (bzf == NULL) { BZ_SETERR(BZ_OK); return; }; if (bzf->writing) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (bzf->initialisedOk) (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); free ( bzf ); } /*---------------------------------------------------*/ int BZ_API(BZ2_bzRead) ( int* bzerror, BZFILE* b, void* buf, int len ) { Int32 n, ret; bzFile* bzf = (bzFile*)b; BZ_SETERR(BZ_OK); if (bzf == NULL || buf == NULL || len < 0) { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; if (bzf->writing) { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; if (len == 0) { BZ_SETERR(BZ_OK); return 0; }; bzf->strm.avail_out = len; bzf->strm.next_out = buf; while (True) { if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return 0; }; if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { n = fread ( bzf->buf, sizeof(UChar), BZ_MAX_UNUSED, bzf->handle ); if (ferror(bzf->handle)) { BZ_SETERR(BZ_IO_ERROR); return 0; }; bzf->bufN = n; bzf->strm.avail_in = bzf->bufN; bzf->strm.next_in = bzf->buf; } ret = BZ2_bzDecompress ( &(bzf->strm) ); if (ret != BZ_OK && ret != BZ_STREAM_END) { BZ_SETERR(ret); return 0; }; if (ret == BZ_OK && myfeof(bzf->handle) && bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; if (ret == BZ_STREAM_END) { BZ_SETERR(BZ_STREAM_END); return len - bzf->strm.avail_out; }; if (bzf->strm.avail_out == 0) { BZ_SETERR(BZ_OK); return len; }; } return 0; /*not reached*/ } /*---------------------------------------------------*/ void BZ_API(BZ2_bzReadGetUnused) ( int* bzerror, BZFILE* b, void** unused, int* nUnused ) { bzFile* bzf = (bzFile*)b; if (bzf == NULL) { BZ_SETERR(BZ_PARAM_ERROR); return; }; if (bzf->lastErr != BZ_STREAM_END) { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; if (unused == NULL || nUnused == NULL) { BZ_SETERR(BZ_PARAM_ERROR); return; }; BZ_SETERR(BZ_OK); *nUnused = bzf->strm.avail_in; *unused = bzf->strm.next_in; } #endif /*---------------------------------------------------*/ /*--- Misc convenience stuff ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ int BZ_API(BZ2_bzBuffToBuffCompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int blockSize100k, int verbosity, int workFactor ) { bz_stream strm; int ret; if (dest == NULL || destLen == NULL || source == NULL || blockSize100k < 1 || blockSize100k > 9 || verbosity < 0 || verbosity > 4 || workFactor < 0 || workFactor > 250) return BZ_PARAM_ERROR; if (workFactor == 0) workFactor = 30; strm.bzalloc = NULL; strm.bzfree = NULL; strm.opaque = NULL; ret = BZ2_bzCompressInit ( &strm, blockSize100k, verbosity, workFactor ); if (ret != BZ_OK) return ret; strm.next_in = source; strm.next_out = dest; strm.avail_in = sourceLen; strm.avail_out = *destLen; ret = BZ2_bzCompress ( &strm, BZ_FINISH ); if (ret == BZ_FINISH_OK) goto output_overflow; if (ret != BZ_STREAM_END) goto errhandler; /* normal termination */ *destLen -= strm.avail_out; BZ2_bzCompressEnd ( &strm ); return BZ_OK; output_overflow: BZ2_bzCompressEnd ( &strm ); return BZ_OUTBUFF_FULL; errhandler: BZ2_bzCompressEnd ( &strm ); return ret; } /*---------------------------------------------------*/ int BZ_API(BZ2_bzBuffToBuffDecompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int small, int verbosity ) { bz_stream strm; int ret; if (dest == NULL || destLen == NULL || source == NULL || (small != 0 && small != 1) || verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; strm.bzalloc = NULL; strm.bzfree = NULL; strm.opaque = NULL; ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); if (ret != BZ_OK) return ret; strm.next_in = source; strm.next_out = dest; strm.avail_in = sourceLen; strm.avail_out = *destLen; ret = BZ2_bzDecompress ( &strm ); if (ret == BZ_OK) goto output_overflow_or_eof; if (ret != BZ_STREAM_END) goto errhandler; /* normal termination */ *destLen -= strm.avail_out; BZ2_bzDecompressEnd ( &strm ); return BZ_OK; output_overflow_or_eof: if (strm.avail_out > 0) { BZ2_bzDecompressEnd ( &strm ); return BZ_UNEXPECTED_EOF; } else { BZ2_bzDecompressEnd ( &strm ); return BZ_OUTBUFF_FULL; }; errhandler: BZ2_bzDecompressEnd ( &strm ); return ret; } /*---------------------------------------------------*/ /*-- Code contributed by Yoshioka Tsuneo (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp), to support better zlib compatibility. This code is not _officially_ part of libbzip2 (yet); I haven't tested it, documented it, or considered the threading-safeness of it. If this code breaks, please contact both Yoshioka and me. --*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ /*-- return version like "0.9.0c". --*/ const char * BZ_API(BZ2_bzlibVersion)(void) { return BZ_VERSION; } #ifndef BZ_NO_STDIO /*---------------------------------------------------*/ #if defined(_WIN32) || defined(OS2) || defined(MSDOS) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) #else # define SET_BINARY_MODE(file) #endif static BZFILE * bzopen_or_bzdopen ( const char *path, /* no use when bzdopen */ int fd, /* no use when bzdopen */ const char *mode, int open_mode) /* bzopen: 0, bzdopen:1 */ { int bzerr; char unused[BZ_MAX_UNUSED]; int blockSize100k = 9; int writing = 0; char mode2[10] = ""; FILE *fp = NULL; BZFILE *bzfp = NULL; int verbosity = 0; int workFactor = 30; int smallMode = 0; int nUnused = 0; if (mode == NULL) return NULL; while (*mode) { switch (*mode) { case 'r': writing = 0; break; case 'w': writing = 1; break; case 's': smallMode = 1; break; default: if (isdigit((int)(*mode))) { blockSize100k = *mode-BZ_HDR_0; } } mode++; } strcat(mode2, writing ? "w" : "r" ); strcat(mode2,"b"); /* binary mode */ if (open_mode==0) { if (path==NULL || strcmp(path,"")==0) { fp = (writing ? stdout : stdin); SET_BINARY_MODE(fp); } else { fp = fopen(path,mode2); } } else { #ifdef BZ_STRICT_ANSI fp = NULL; #else fp = fdopen(fd,mode2); #endif } if (fp == NULL) return NULL; if (writing) { /* Guard against total chaos and anarchy -- JRS */ if (blockSize100k < 1) blockSize100k = 1; if (blockSize100k > 9) blockSize100k = 9; bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, verbosity,workFactor); } else { bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, unused,nUnused); } if (bzfp == NULL) { if (fp != stdin && fp != stdout) fclose(fp); return NULL; } return bzfp; } /*---------------------------------------------------*/ /*-- open file for read or write. ex) bzopen("file","w9") case path="" or NULL => use stdin or stdout. --*/ BZFILE * BZ_API(BZ2_bzopen) ( const char *path, const char *mode ) { return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); } /*---------------------------------------------------*/ BZFILE * BZ_API(BZ2_bzdopen) ( int fd, const char *mode ) { return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); } /*---------------------------------------------------*/ int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) { int bzerr, nread; if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; nread = BZ2_bzRead(&bzerr,b,buf,len); if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { return nread; } else { return -1; } } /*---------------------------------------------------*/ int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) { int bzerr; BZ2_bzWrite(&bzerr,b,buf,len); if(bzerr == BZ_OK){ return len; }else{ return -1; } } /*---------------------------------------------------*/ int BZ_API(BZ2_bzflush) (BZFILE *b) { /* do nothing now... */ return 0; } /*---------------------------------------------------*/ void BZ_API(BZ2_bzclose) (BZFILE* b) { int bzerr; FILE *fp = ((bzFile *)b)->handle; if (b==NULL) {return;} if(((bzFile*)b)->writing){ BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); if(bzerr != BZ_OK){ BZ2_bzWriteClose(NULL,b,1,NULL,NULL); } }else{ BZ2_bzReadClose(&bzerr,b); } if(fp!=stdin && fp!=stdout){ fclose(fp); } } /*---------------------------------------------------*/ /*-- return last error code --*/ static char *bzerrorstrings[] = { "OK" ,"SEQUENCE_ERROR" ,"PARAM_ERROR" ,"MEM_ERROR" ,"DATA_ERROR" ,"DATA_ERROR_MAGIC" ,"IO_ERROR" ,"UNEXPECTED_EOF" ,"OUTBUFF_FULL" ,"CONFIG_ERROR" ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ ,"???" /* for future */ }; const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) { int err = ((bzFile *)b)->lastErr; if(err>0) err = 0; *errnum = err; return bzerrorstrings[err*-1]; } #endif #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end bzlib.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/bzlib.h0000644000175000017500000001733510161303543016033 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Public header file for the library. ---*/ /*--- bzlib.h ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifdef HAVE_BZLIB #include #else #ifndef _BZLIB_H #define _BZLIB_H #ifdef __cplusplus extern "C" { #endif #define BZ_RUN 0 #define BZ_FLUSH 1 #define BZ_FINISH 2 #define BZ_OK 0 #define BZ_RUN_OK 1 #define BZ_FLUSH_OK 2 #define BZ_FINISH_OK 3 #define BZ_STREAM_END 4 #define BZ_SEQUENCE_ERROR (-1) #define BZ_PARAM_ERROR (-2) #define BZ_MEM_ERROR (-3) #define BZ_DATA_ERROR (-4) #define BZ_DATA_ERROR_MAGIC (-5) #define BZ_IO_ERROR (-6) #define BZ_UNEXPECTED_EOF (-7) #define BZ_OUTBUFF_FULL (-8) #define BZ_CONFIG_ERROR (-9) typedef struct { char *next_in; unsigned int avail_in; unsigned int total_in_lo32; unsigned int total_in_hi32; char *next_out; unsigned int avail_out; unsigned int total_out_lo32; unsigned int total_out_hi32; void *state; void *(*bzalloc)(void *,int,int); void (*bzfree)(void *,void *); void *opaque; } bz_stream; #ifndef BZ_IMPORT #define BZ_EXPORT #endif /* Need a definitition for FILE */ #include #ifdef _WIN32 # include # ifdef small /* windows.h define small to char */ # undef small # endif # ifdef BZ_EXPORT # define BZ_API(func) WINAPI func # define BZ_EXTERN extern # else /* import windows dll dynamically */ # define BZ_API(func) (WINAPI * func) # define BZ_EXTERN # endif #else # define BZ_API(func) func # define BZ_EXTERN extern #endif /*-- Core (low-level) library functions --*/ BZ_EXTERN int BZ_API(BZ2_bzCompressInit) ( bz_stream* strm, int blockSize100k, int verbosity, int workFactor ); BZ_EXTERN int BZ_API(BZ2_bzCompress) ( bz_stream* strm, int action ); BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) ( bz_stream* strm ); BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) ( bz_stream *strm, int verbosity, int small ); BZ_EXTERN int BZ_API(BZ2_bzDecompress) ( bz_stream* strm ); BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ); /*-- High(er) level library functions --*/ #ifndef BZ_NO_STDIO #define BZ_MAX_UNUSED 5000 typedef void BZFILE; BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) ( int* bzerror, FILE* f, int verbosity, int small, void* unused, int nUnused ); BZ_EXTERN void BZ_API(BZ2_bzReadClose) ( int* bzerror, BZFILE* b ); BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) ( int* bzerror, BZFILE* b, void** unused, int* nUnused ); BZ_EXTERN int BZ_API(BZ2_bzRead) ( int* bzerror, BZFILE* b, void* buf, int len ); BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) ( int* bzerror, FILE* f, int blockSize100k, int verbosity, int workFactor ); BZ_EXTERN void BZ_API(BZ2_bzWrite) ( int* bzerror, BZFILE* b, void* buf, int len ); BZ_EXTERN void BZ_API(BZ2_bzWriteClose) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in, unsigned int* nbytes_out ); BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) ( int* bzerror, BZFILE* b, int abandon, unsigned int* nbytes_in_lo32, unsigned int* nbytes_in_hi32, unsigned int* nbytes_out_lo32, unsigned int* nbytes_out_hi32 ); #endif /*-- Utility functions --*/ BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int blockSize100k, int verbosity, int workFactor ); BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) ( char* dest, unsigned int* destLen, char* source, unsigned int sourceLen, int small, int verbosity ); /*-- Code contributed by Yoshioka Tsuneo (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp), to support better zlib compatibility. This code is not _officially_ part of libbzip2 (yet); I haven't tested it, documented it, or considered the threading-safeness of it. If this code breaks, please contact both Yoshioka and me. --*/ BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) ( void ); #ifndef BZ_NO_STDIO BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) ( const char *path, const char *mode ); BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) ( int fd, const char *mode ); BZ_EXTERN int BZ_API(BZ2_bzread) ( BZFILE* b, void* buf, int len ); BZ_EXTERN int BZ_API(BZ2_bzwrite) ( BZFILE* b, void* buf, int len ); BZ_EXTERN int BZ_API(BZ2_bzflush) ( BZFILE* b ); BZ_EXTERN void BZ_API(BZ2_bzclose) ( BZFILE* b ); BZ_EXTERN const char * BZ_API(BZ2_bzerror) ( BZFILE *b, int *errnum ); #endif #ifdef __cplusplus } #endif #endif #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end bzlib.h ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/bzlib_private.h0000644000175000017500000003366010161303543017564 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Private header file for the library. ---*/ /*--- bzlib_private.h ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef _BZLIB_PRIVATE_H #define _BZLIB_PRIVATE_H #include #ifndef BZ_NO_STDIO #include #include #include #endif #include "bzlib.h" /*-- General stuff. --*/ #define BZ_VERSION "1.0.2, 30-Dec-2001" typedef char Char; typedef unsigned char Bool; typedef unsigned char UChar; typedef int Int32; typedef unsigned int UInt32; typedef short Int16; typedef unsigned short UInt16; #define True ((Bool)1) #define False ((Bool)0) #ifndef __GNUC__ #define __inline__ /* */ #endif #ifndef BZ_NO_STDIO extern void BZ2_bz__AssertH__fail ( int errcode ); #define AssertH(cond,errcode) \ { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } #if BZ_DEBUG #define AssertD(cond,msg) \ { if (!(cond)) { \ fprintf ( stderr, \ "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ exit(1); \ }} #else #define AssertD(cond,msg) /* */ #endif #define VPrintf0(zf) \ fprintf(stderr,zf) #define VPrintf1(zf,za1) \ fprintf(stderr,zf,za1) #define VPrintf2(zf,za1,za2) \ fprintf(stderr,zf,za1,za2) #define VPrintf3(zf,za1,za2,za3) \ fprintf(stderr,zf,za1,za2,za3) #define VPrintf4(zf,za1,za2,za3,za4) \ fprintf(stderr,zf,za1,za2,za3,za4) #define VPrintf5(zf,za1,za2,za3,za4,za5) \ fprintf(stderr,zf,za1,za2,za3,za4,za5) #else extern void bz_internal_error ( int errcode ); #define AssertH(cond,errcode) \ { if (!(cond)) bz_internal_error ( errcode ); } #define AssertD(cond,msg) /* */ #define VPrintf0(zf) /* */ #define VPrintf1(zf,za1) /* */ #define VPrintf2(zf,za1,za2) /* */ #define VPrintf3(zf,za1,za2,za3) /* */ #define VPrintf4(zf,za1,za2,za3,za4) /* */ #define VPrintf5(zf,za1,za2,za3,za4,za5) /* */ #endif #define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) #define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) /*-- Header bytes. --*/ #define BZ_HDR_B 0x42 /* 'B' */ #define BZ_HDR_Z 0x5a /* 'Z' */ #define BZ_HDR_h 0x68 /* 'h' */ #define BZ_HDR_0 0x30 /* '0' */ /*-- Constants for the back end. --*/ #define BZ_MAX_ALPHA_SIZE 258 #define BZ_MAX_CODE_LEN 23 #define BZ_RUNA 0 #define BZ_RUNB 1 #define BZ_N_GROUPS 6 #define BZ_G_SIZE 50 #define BZ_N_ITERS 4 #define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) /*-- Stuff for randomising repetitive blocks. --*/ extern Int32 BZ2_rNums[512]; #define BZ_RAND_DECLS \ Int32 rNToGo; \ Int32 rTPos \ #define BZ_RAND_INIT_MASK \ s->rNToGo = 0; \ s->rTPos = 0 \ #define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) #define BZ_RAND_UPD_MASK \ if (s->rNToGo == 0) { \ s->rNToGo = BZ2_rNums[s->rTPos]; \ s->rTPos++; \ if (s->rTPos == 512) s->rTPos = 0; \ } \ s->rNToGo--; /*-- Stuff for doing CRCs. --*/ extern UInt32 BZ2_crc32Table[256]; #define BZ_INITIALISE_CRC(crcVar) \ { \ crcVar = 0xffffffffL; \ } #define BZ_FINALISE_CRC(crcVar) \ { \ crcVar = ~(crcVar); \ } #define BZ_UPDATE_CRC(crcVar,cha) \ { \ crcVar = (crcVar << 8) ^ \ BZ2_crc32Table[(crcVar >> 24) ^ \ ((UChar)cha)]; \ } /*-- States and modes for compression. --*/ #define BZ_M_IDLE 1 #define BZ_M_RUNNING 2 #define BZ_M_FLUSHING 3 #define BZ_M_FINISHING 4 #define BZ_S_OUTPUT 1 #define BZ_S_INPUT 2 #define BZ_N_RADIX 2 #define BZ_N_QSORT 12 #define BZ_N_SHELL 18 #define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) /*-- Structure holding all the compression-side stuff. --*/ typedef struct { /* pointer back to the struct bz_stream */ bz_stream* strm; /* mode this stream is in, and whether inputting */ /* or outputting data */ Int32 mode; Int32 state; /* remembers avail_in when flush/finish requested */ UInt32 avail_in_expect; /* for doing the block sorting */ UInt32* arr1; UInt32* arr2; UInt32* ftab; Int32 origPtr; /* aliases for arr1 and arr2 */ UInt32* ptr; UChar* block; UInt16* mtfv; UChar* zbits; /* for deciding when to use the fallback sorting algorithm */ Int32 workFactor; /* run-length-encoding of the input */ UInt32 state_in_ch; Int32 state_in_len; BZ_RAND_DECLS; /* input and output limits and current posns */ Int32 nblock; Int32 nblockMAX; Int32 numZ; Int32 state_out_pos; /* map of bytes used in block */ Int32 nInUse; Bool inUse[256]; UChar unseqToSeq[256]; /* the buffer for bit stream creation */ UInt32 bsBuff; Int32 bsLive; /* block and combined CRCs */ UInt32 blockCRC; UInt32 combinedCRC; /* misc administratium */ Int32 verbosity; Int32 blockNo; Int32 blockSize100k; /* stuff for coding the MTF values */ Int32 nMTF; Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; UChar selector [BZ_MAX_SELECTORS]; UChar selectorMtf[BZ_MAX_SELECTORS]; UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; /* second dimension: only 3 needed; 4 makes index calculations faster */ UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; } EState; /*-- externs for compression. --*/ extern void BZ2_blockSort ( EState* ); extern void BZ2_compressBlock ( EState*, Bool ); extern void BZ2_bsInitWrite ( EState* ); extern void BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); extern void BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); /*-- states for decompression. --*/ #define BZ_X_IDLE 1 #define BZ_X_OUTPUT 2 #define BZ_X_MAGIC_1 10 #define BZ_X_MAGIC_2 11 #define BZ_X_MAGIC_3 12 #define BZ_X_MAGIC_4 13 #define BZ_X_BLKHDR_1 14 #define BZ_X_BLKHDR_2 15 #define BZ_X_BLKHDR_3 16 #define BZ_X_BLKHDR_4 17 #define BZ_X_BLKHDR_5 18 #define BZ_X_BLKHDR_6 19 #define BZ_X_BCRC_1 20 #define BZ_X_BCRC_2 21 #define BZ_X_BCRC_3 22 #define BZ_X_BCRC_4 23 #define BZ_X_RANDBIT 24 #define BZ_X_ORIGPTR_1 25 #define BZ_X_ORIGPTR_2 26 #define BZ_X_ORIGPTR_3 27 #define BZ_X_MAPPING_1 28 #define BZ_X_MAPPING_2 29 #define BZ_X_SELECTOR_1 30 #define BZ_X_SELECTOR_2 31 #define BZ_X_SELECTOR_3 32 #define BZ_X_CODING_1 33 #define BZ_X_CODING_2 34 #define BZ_X_CODING_3 35 #define BZ_X_MTF_1 36 #define BZ_X_MTF_2 37 #define BZ_X_MTF_3 38 #define BZ_X_MTF_4 39 #define BZ_X_MTF_5 40 #define BZ_X_MTF_6 41 #define BZ_X_ENDHDR_2 42 #define BZ_X_ENDHDR_3 43 #define BZ_X_ENDHDR_4 44 #define BZ_X_ENDHDR_5 45 #define BZ_X_ENDHDR_6 46 #define BZ_X_CCRC_1 47 #define BZ_X_CCRC_2 48 #define BZ_X_CCRC_3 49 #define BZ_X_CCRC_4 50 /*-- Constants for the fast MTF decoder. --*/ #define MTFA_SIZE 4096 #define MTFL_SIZE 16 /*-- Structure holding all the decompression-side stuff. --*/ typedef struct { /* pointer back to the struct bz_stream */ bz_stream* strm; /* state indicator for this stream */ Int32 state; /* for doing the final run-length decoding */ UChar state_out_ch; Int32 state_out_len; Bool blockRandomised; BZ_RAND_DECLS; /* the buffer for bit stream reading */ UInt32 bsBuff; Int32 bsLive; /* misc administratium */ Int32 blockSize100k; Bool smallDecompress; Int32 currBlockNo; Int32 verbosity; /* for undoing the Burrows-Wheeler transform */ Int32 origPtr; UInt32 tPos; Int32 k0; Int32 unzftab[256]; Int32 nblock_used; Int32 cftab[257]; Int32 cftabCopy[257]; /* for undoing the Burrows-Wheeler transform (FAST) */ UInt32 *tt; /* for undoing the Burrows-Wheeler transform (SMALL) */ UInt16 *ll16; UChar *ll4; /* stored and calculated CRCs */ UInt32 storedBlockCRC; UInt32 storedCombinedCRC; UInt32 calculatedBlockCRC; UInt32 calculatedCombinedCRC; /* map of bytes used in block */ Int32 nInUse; Bool inUse[256]; Bool inUse16[16]; UChar seqToUnseq[256]; /* for decoding the MTF values */ UChar mtfa [MTFA_SIZE]; Int32 mtfbase[256 / MTFL_SIZE]; UChar selector [BZ_MAX_SELECTORS]; UChar selectorMtf[BZ_MAX_SELECTORS]; UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 minLens[BZ_N_GROUPS]; /* save area for scalars in the main decompress code */ Int32 save_i; Int32 save_j; Int32 save_t; Int32 save_alphaSize; Int32 save_nGroups; Int32 save_nSelectors; Int32 save_EOB; Int32 save_groupNo; Int32 save_groupPos; Int32 save_nextSym; Int32 save_nblockMAX; Int32 save_nblock; Int32 save_es; Int32 save_N; Int32 save_curr; Int32 save_zt; Int32 save_zn; Int32 save_zvec; Int32 save_zj; Int32 save_gSel; Int32 save_gMinlen; Int32* save_gLimit; Int32* save_gBase; Int32* save_gPerm; } DState; /*-- Macros for decompression. --*/ #define BZ_GET_FAST(cccc) \ s->tPos = s->tt[s->tPos]; \ cccc = (UChar)(s->tPos & 0xff); \ s->tPos >>= 8; #define BZ_GET_FAST_C(cccc) \ c_tPos = c_tt[c_tPos]; \ cccc = (UChar)(c_tPos & 0xff); \ c_tPos >>= 8; #define SET_LL4(i,n) \ { if (((i) & 0x1) == 0) \ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ } #define GET_LL4(i) \ ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) #define SET_LL(i,n) \ { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ SET_LL4(i, n >> 16); \ } #define GET_LL(i) \ (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) #define BZ_GET_SMALL(cccc) \ cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ s->tPos = GET_LL(s->tPos); /*-- externs for decompression. --*/ extern Int32 BZ2_indexIntoF ( Int32, Int32* ); extern Int32 BZ2_decompress ( DState* ); extern void BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, Int32, Int32, Int32 ); #endif /*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ #ifdef BZ_NO_STDIO #ifndef NULL #define NULL 0 #endif #endif /*-------------------------------------------------------------*/ /*--- end bzlib_private.h ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/compress.c0000644000175000017500000005305610161303543016557 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Compression machinery (not incl block sorting) ---*/ /*--- compress.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ /*-- CHANGES ~~~~~~~ 0.9.0 -- original version. 0.9.0a/b -- no changes in this file. 0.9.0c * changed setting of nGroups in sendMTFValues() so as to do a bit better on small files --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*---------------------------------------------------*/ /*--- Bit stream I/O ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ void BZ2_bsInitWrite ( EState* s ) { s->bsLive = 0; s->bsBuff = 0; } /*---------------------------------------------------*/ static void bsFinishWrite ( EState* s ) { while (s->bsLive > 0) { s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); s->numZ++; s->bsBuff <<= 8; s->bsLive -= 8; } } /*---------------------------------------------------*/ #define bsNEEDW(nz) \ { \ while (s->bsLive >= 8) { \ s->zbits[s->numZ] \ = (UChar)(s->bsBuff >> 24); \ s->numZ++; \ s->bsBuff <<= 8; \ s->bsLive -= 8; \ } \ } /*---------------------------------------------------*/ static __inline__ void bsW ( EState* s, Int32 n, UInt32 v ) { bsNEEDW ( n ); s->bsBuff |= (v << (32 - s->bsLive - n)); s->bsLive += n; } /*---------------------------------------------------*/ static void bsPutUInt32 ( EState* s, UInt32 u ) { bsW ( s, 8, (u >> 24) & 0xffL ); bsW ( s, 8, (u >> 16) & 0xffL ); bsW ( s, 8, (u >> 8) & 0xffL ); bsW ( s, 8, u & 0xffL ); } /*---------------------------------------------------*/ static void bsPutUChar ( EState* s, UChar c ) { bsW( s, 8, (UInt32)c ); } /*---------------------------------------------------*/ /*--- The back end proper ---*/ /*---------------------------------------------------*/ /*---------------------------------------------------*/ static void makeMaps_e ( EState* s ) { Int32 i; s->nInUse = 0; for (i = 0; i < 256; i++) if (s->inUse[i]) { s->unseqToSeq[i] = s->nInUse; s->nInUse++; } } /*---------------------------------------------------*/ static void generateMTFValues ( EState* s ) { UChar yy[256]; Int32 i, j; Int32 zPend; Int32 wr; Int32 EOB; /* After sorting (eg, here), s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, and ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] holds the original block data. The first thing to do is generate the MTF values, and put them in ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. Because there are strictly fewer or equal MTF values than block values, ptr values in this area are overwritten with MTF values only when they are no longer needed. The final compressed bitstream is generated into the area starting at (UChar*) (&((UChar*)s->arr2)[s->nblock]) These storage aliases are set up in bzCompressInit(), except for the last one, which is arranged in compressBlock(). */ UInt32* ptr = s->ptr; UChar* block = s->block; UInt16* mtfv = s->mtfv; makeMaps_e ( s ); EOB = s->nInUse+1; for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; wr = 0; zPend = 0; for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; for (i = 0; i < s->nblock; i++) { UChar ll_i; AssertD ( wr <= i, "generateMTFValues(1)" ); j = ptr[i]-1; if (j < 0) j += s->nblock; ll_i = s->unseqToSeq[block[j]]; AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); if (yy[0] == ll_i) { zPend++; } else { if (zPend > 0) { zPend--; while (True) { if (zPend & 1) { mtfv[wr] = BZ_RUNB; wr++; s->mtfFreq[BZ_RUNB]++; } else { mtfv[wr] = BZ_RUNA; wr++; s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; }; zPend = 0; } { register UChar rtmp; register UChar* ryy_j; register UChar rll_i; rtmp = yy[1]; yy[1] = yy[0]; ryy_j = &(yy[1]); rll_i = ll_i; while ( rll_i != rtmp ) { register UChar rtmp2; ryy_j++; rtmp2 = rtmp; rtmp = *ryy_j; *ryy_j = rtmp2; }; yy[0] = rtmp; j = ryy_j - &(yy[0]); mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; } } } if (zPend > 0) { zPend--; while (True) { if (zPend & 1) { mtfv[wr] = BZ_RUNB; wr++; s->mtfFreq[BZ_RUNB]++; } else { mtfv[wr] = BZ_RUNA; wr++; s->mtfFreq[BZ_RUNA]++; } if (zPend < 2) break; zPend = (zPend - 2) / 2; }; zPend = 0; } mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; s->nMTF = wr; } /*---------------------------------------------------*/ #define BZ_LESSER_ICOST 0 #define BZ_GREATER_ICOST 15 static void sendMTFValues ( EState* s ) { Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; Int32 nGroups, nBytes; /*-- UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; is a global since the decoder also needs it. Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; are also globals only used in this proc. Made global to keep stack frame size small. --*/ UInt16 cost[BZ_N_GROUPS]; Int32 fave[BZ_N_GROUPS]; UInt16* mtfv = s->mtfv; if (s->verbosity >= 3) VPrintf3( " %d in block, %d after MTF & 1-2 coding, " "%d+2 syms in use\n", s->nblock, s->nMTF, s->nInUse ); alphaSize = s->nInUse+2; for (t = 0; t < BZ_N_GROUPS; t++) for (v = 0; v < alphaSize; v++) s->len[t][v] = BZ_GREATER_ICOST; /*--- Decide how many coding tables to use ---*/ AssertH ( s->nMTF > 0, 3001 ); if (s->nMTF < 200) nGroups = 2; else if (s->nMTF < 600) nGroups = 3; else if (s->nMTF < 1200) nGroups = 4; else if (s->nMTF < 2400) nGroups = 5; else nGroups = 6; /*--- Generate an initial set of coding tables ---*/ { Int32 nPart, remF, tFreq, aFreq; nPart = nGroups; remF = s->nMTF; gs = 0; while (nPart > 0) { tFreq = remF / nPart; ge = gs-1; aFreq = 0; while (aFreq < tFreq && ge < alphaSize-1) { ge++; aFreq += s->mtfFreq[ge]; } if (ge > gs && nPart != nGroups && nPart != 1 && ((nGroups-nPart) % 2 == 1)) { aFreq -= s->mtfFreq[ge]; ge--; } if (s->verbosity >= 3) VPrintf5( " initial group %d, [%d .. %d], " "has %d syms (%4.1f%%)\n", nPart, gs, ge, aFreq, (100.0 * (float)aFreq) / (float)(s->nMTF) ); for (v = 0; v < alphaSize; v++) if (v >= gs && v <= ge) s->len[nPart-1][v] = BZ_LESSER_ICOST; else s->len[nPart-1][v] = BZ_GREATER_ICOST; nPart--; gs = ge+1; remF -= aFreq; } } /*--- Iterate up to BZ_N_ITERS times to improve the tables. ---*/ for (iter = 0; iter < BZ_N_ITERS; iter++) { for (t = 0; t < nGroups; t++) fave[t] = 0; for (t = 0; t < nGroups; t++) for (v = 0; v < alphaSize; v++) s->rfreq[t][v] = 0; /*--- Set up an auxiliary length table which is used to fast-track the common case (nGroups == 6). ---*/ if (nGroups == 6) { for (v = 0; v < alphaSize; v++) { s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; } } nSelectors = 0; totc = 0; gs = 0; while (True) { /*--- Set group start & end marks. --*/ if (gs >= s->nMTF) break; ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; /*-- Calculate the cost of this group as coded by each of the coding tables. --*/ for (t = 0; t < nGroups; t++) cost[t] = 0; if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ register UInt32 cost01, cost23, cost45; register UInt16 icv; cost01 = cost23 = cost45 = 0; # define BZ_ITER(nn) \ icv = mtfv[gs+(nn)]; \ cost01 += s->len_pack[icv][0]; \ cost23 += s->len_pack[icv][1]; \ cost45 += s->len_pack[icv][2]; \ BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); # undef BZ_ITER cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { UInt16 icv = mtfv[i]; for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; } } /*-- Find the coding table which is best for this group, and record its identity in the selector table. --*/ bc = 999999999; bt = -1; for (t = 0; t < nGroups; t++) if (cost[t] < bc) { bc = cost[t]; bt = t; }; totc += bc; fave[bt]++; s->selector[nSelectors] = bt; nSelectors++; /*-- Increment the symbol frequencies for the selected table. --*/ if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ # define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); # undef BZ_ITUR } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) s->rfreq[bt][ mtfv[i] ]++; } gs = ge+1; } if (s->verbosity >= 3) { VPrintf2 ( " pass %d: size is %d, grp uses are ", iter+1, totc/8 ); for (t = 0; t < nGroups; t++) VPrintf1 ( "%d ", fave[t] ); VPrintf0 ( "\n" ); } /*-- Recompute the tables based on the accumulated frequencies. --*/ for (t = 0; t < nGroups; t++) BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), alphaSize, 20 ); } AssertH( nGroups < 8, 3002 ); AssertH( nSelectors < 32768 && nSelectors <= (2 + (900000 / BZ_G_SIZE)), 3003 ); /*--- Compute MTF values for the selectors. ---*/ { UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; for (i = 0; i < nGroups; i++) pos[i] = i; for (i = 0; i < nSelectors; i++) { ll_i = s->selector[i]; j = 0; tmp = pos[j]; while ( ll_i != tmp ) { j++; tmp2 = tmp; tmp = pos[j]; pos[j] = tmp2; }; pos[0] = tmp; s->selectorMtf[i] = j; } }; /*--- Assign actual codes for the tables. --*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } AssertH ( !(maxLen > 20), 3004 ); AssertH ( !(minLen < 1), 3005 ); BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); } /*--- Transmit the mapping table. ---*/ { Bool inUse16[16]; for (i = 0; i < 16; i++) { inUse16[i] = False; for (j = 0; j < 16; j++) if (s->inUse[i * 16 + j]) inUse16[i] = True; } nBytes = s->numZ; for (i = 0; i < 16; i++) if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); for (i = 0; i < 16; i++) if (inUse16[i]) for (j = 0; j < 16; j++) { if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); } if (s->verbosity >= 3) VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); } /*--- Now the selectors. ---*/ nBytes = s->numZ; bsW ( s, 3, nGroups ); bsW ( s, 15, nSelectors ); for (i = 0; i < nSelectors; i++) { for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); bsW(s,1,0); } if (s->verbosity >= 3) VPrintf1( "selectors %d, ", s->numZ-nBytes ); /*--- Now the coding tables. ---*/ nBytes = s->numZ; for (t = 0; t < nGroups; t++) { Int32 curr = s->len[t][0]; bsW ( s, 5, curr ); for (i = 0; i < alphaSize; i++) { while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; bsW ( s, 1, 0 ); } } if (s->verbosity >= 3) VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); /*--- And finally, the block data proper ---*/ nBytes = s->numZ; selCtr = 0; gs = 0; while (True) { if (gs >= s->nMTF) break; ge = gs + BZ_G_SIZE - 1; if (ge >= s->nMTF) ge = s->nMTF-1; AssertH ( s->selector[selCtr] < nGroups, 3006 ); if (nGroups == 6 && 50 == ge-gs+1) { /*--- fast track the common case ---*/ UInt16 mtfv_i; UChar* s_len_sel_selCtr = &(s->len[s->selector[selCtr]][0]); Int32* s_code_sel_selCtr = &(s->code[s->selector[selCtr]][0]); # define BZ_ITAH(nn) \ mtfv_i = mtfv[gs+(nn)]; \ bsW ( s, \ s_len_sel_selCtr[mtfv_i], \ s_code_sel_selCtr[mtfv_i] ) BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); # undef BZ_ITAH } else { /*--- slow version which correctly handles all situations ---*/ for (i = gs; i <= ge; i++) { bsW ( s, s->len [s->selector[selCtr]] [mtfv[i]], s->code [s->selector[selCtr]] [mtfv[i]] ); } } gs = ge+1; selCtr++; } AssertH( selCtr == nSelectors, 3007 ); if (s->verbosity >= 3) VPrintf1( "codes %d\n", s->numZ-nBytes ); } /*---------------------------------------------------*/ void BZ2_compressBlock ( EState* s, Bool is_last_block ) { if (s->nblock > 0) { BZ_FINALISE_CRC ( s->blockCRC ); s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); s->combinedCRC ^= s->blockCRC; if (s->blockNo > 1) s->numZ = 0; if (s->verbosity >= 2) VPrintf4( " block %d: crc = 0x%8x, " "combined CRC = 0x%8x, size = %d\n", s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); BZ2_blockSort ( s ); } s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); /*-- If this is the first block, create the stream header. --*/ if (s->blockNo == 1) { BZ2_bsInitWrite ( s ); bsPutUChar ( s, BZ_HDR_B ); bsPutUChar ( s, BZ_HDR_Z ); bsPutUChar ( s, BZ_HDR_h ); bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) ); } if (s->nblock > 0) { bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); /*-- Now the block's CRC, so it is in a known place. --*/ bsPutUInt32 ( s, s->blockCRC ); /*-- Now a single bit indicating (non-)randomisation. As of version 0.9.5, we use a better sorting algorithm which makes randomisation unnecessary. So always set the randomised bit to 'no'. Of course, the decoder still needs to be able to handle randomised blocks so as to maintain backwards compatibility with older versions of bzip2. --*/ bsW(s,1,0); bsW ( s, 24, s->origPtr ); generateMTFValues ( s ); sendMTFValues ( s ); } /*-- If this is the last block, add the stream trailer. --*/ if (is_last_block) { bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); bsPutUInt32 ( s, s->combinedCRC ); if (s->verbosity >= 2) VPrintf1( " final combined CRC = 0x%x\n ", s->combinedCRC ); bsFinishWrite ( s ); } } #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end compress.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/crctable.c0000644000175000017500000001444710161303543016504 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Table for doing CRCs ---*/ /*--- crctable.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*-- I think this is an implementation of the AUTODIN-II, Ethernet & FDDI 32-bit CRC standard. Vaguely derived from code by Rob Warnock, in Section 51 of the comp.compression FAQ. --*/ UInt32 BZ2_crc32Table[256] = { /*-- Ugly, innit? --*/ 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L }; #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end crctable.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/decompress.c0000644000175000017500000005170610161303543017070 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Decompression machinery ---*/ /*--- decompress.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*---------------------------------------------------*/ static void makeMaps_d ( DState* s ) { Int32 i; s->nInUse = 0; for (i = 0; i < 256; i++) if (s->inUse[i]) { s->seqToUnseq[s->nInUse] = i; s->nInUse++; } } /*---------------------------------------------------*/ #define RETURN(rrr) \ { retVal = rrr; goto save_state_and_return; }; #define GET_BITS(lll,vvv,nnn) \ case lll: s->state = lll; \ while (True) { \ if (s->bsLive >= nnn) { \ UInt32 v; \ v = (s->bsBuff >> \ (s->bsLive-nnn)) & ((1 << nnn)-1); \ s->bsLive -= nnn; \ vvv = v; \ break; \ } \ if (s->strm->avail_in == 0) RETURN(BZ_OK); \ s->bsBuff \ = (s->bsBuff << 8) | \ ((UInt32) \ (*((UChar*)(s->strm->next_in)))); \ s->bsLive += 8; \ s->strm->next_in++; \ s->strm->avail_in--; \ s->strm->total_in_lo32++; \ if (s->strm->total_in_lo32 == 0) \ s->strm->total_in_hi32++; \ } #define GET_UCHAR(lll,uuu) \ GET_BITS(lll,uuu,8) #define GET_BIT(lll,uuu) \ GET_BITS(lll,uuu,1) /*---------------------------------------------------*/ #define GET_MTF_VAL(label1,label2,lval) \ { \ if (groupPos == 0) { \ groupNo++; \ if (groupNo >= nSelectors) \ RETURN(BZ_DATA_ERROR); \ groupPos = BZ_G_SIZE; \ gSel = s->selector[groupNo]; \ gMinlen = s->minLens[gSel]; \ gLimit = &(s->limit[gSel][0]); \ gPerm = &(s->perm[gSel][0]); \ gBase = &(s->base[gSel][0]); \ } \ groupPos--; \ zn = gMinlen; \ GET_BITS(label1, zvec, zn); \ while (1) { \ if (zn > 20 /* the longest code */) \ RETURN(BZ_DATA_ERROR); \ if (zvec <= gLimit[zn]) break; \ zn++; \ GET_BIT(label2, zj); \ zvec = (zvec << 1) | zj; \ }; \ if (zvec - gBase[zn] < 0 \ || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ RETURN(BZ_DATA_ERROR); \ lval = gPerm[zvec - gBase[zn]]; \ } /*---------------------------------------------------*/ Int32 BZ2_decompress ( DState* s ) { UChar uc; Int32 retVal; Int32 minLen, maxLen; bz_stream* strm = s->strm; /* stuff that needs to be saved/restored */ Int32 i; Int32 j; Int32 t; Int32 alphaSize; Int32 nGroups; Int32 nSelectors; Int32 EOB; Int32 groupNo; Int32 groupPos; Int32 nextSym; Int32 nblockMAX; Int32 nblock; Int32 es; Int32 N; Int32 curr; Int32 zt; Int32 zn; Int32 zvec; Int32 zj; Int32 gSel; Int32 gMinlen; Int32* gLimit; Int32* gBase; Int32* gPerm; if (s->state == BZ_X_MAGIC_1) { /*initialise the save area*/ s->save_i = 0; s->save_j = 0; s->save_t = 0; s->save_alphaSize = 0; s->save_nGroups = 0; s->save_nSelectors = 0; s->save_EOB = 0; s->save_groupNo = 0; s->save_groupPos = 0; s->save_nextSym = 0; s->save_nblockMAX = 0; s->save_nblock = 0; s->save_es = 0; s->save_N = 0; s->save_curr = 0; s->save_zt = 0; s->save_zn = 0; s->save_zvec = 0; s->save_zj = 0; s->save_gSel = 0; s->save_gMinlen = 0; s->save_gLimit = NULL; s->save_gBase = NULL; s->save_gPerm = NULL; } /*restore from the save area*/ i = s->save_i; j = s->save_j; t = s->save_t; alphaSize = s->save_alphaSize; nGroups = s->save_nGroups; nSelectors = s->save_nSelectors; EOB = s->save_EOB; groupNo = s->save_groupNo; groupPos = s->save_groupPos; nextSym = s->save_nextSym; nblockMAX = s->save_nblockMAX; nblock = s->save_nblock; es = s->save_es; N = s->save_N; curr = s->save_curr; zt = s->save_zt; zn = s->save_zn; zvec = s->save_zvec; zj = s->save_zj; gSel = s->save_gSel; gMinlen = s->save_gMinlen; gLimit = s->save_gLimit; gBase = s->save_gBase; gPerm = s->save_gPerm; retVal = BZ_OK; switch (s->state) { GET_UCHAR(BZ_X_MAGIC_1, uc); if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC); GET_UCHAR(BZ_X_MAGIC_2, uc); if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC); GET_UCHAR(BZ_X_MAGIC_3, uc) if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC); GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) if (s->blockSize100k < (BZ_HDR_0 + 1) || s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC); s->blockSize100k -= BZ_HDR_0; if (s->smallDecompress) { s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); s->ll4 = BZALLOC( ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) ); if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); } else { s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); if (s->tt == NULL) RETURN(BZ_MEM_ERROR); } GET_UCHAR(BZ_X_BLKHDR_1, uc); if (uc == 0x17) goto endhdr_2; if (uc != 0x31) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_2, uc); if (uc != 0x41) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_3, uc); if (uc != 0x59) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_4, uc); if (uc != 0x26) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_5, uc); if (uc != 0x53) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_BLKHDR_6, uc); if (uc != 0x59) RETURN(BZ_DATA_ERROR); s->currBlockNo++; if (s->verbosity >= 2) VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); s->storedBlockCRC = 0; GET_UCHAR(BZ_X_BCRC_1, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_BCRC_2, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_BCRC_3, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_BCRC_4, uc); s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); s->origPtr = 0; GET_UCHAR(BZ_X_ORIGPTR_1, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); GET_UCHAR(BZ_X_ORIGPTR_2, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); GET_UCHAR(BZ_X_ORIGPTR_3, uc); s->origPtr = (s->origPtr << 8) | ((Int32)uc); if (s->origPtr < 0) RETURN(BZ_DATA_ERROR); if (s->origPtr > 10 + 100000*s->blockSize100k) RETURN(BZ_DATA_ERROR); /*--- Receive the mapping table ---*/ for (i = 0; i < 16; i++) { GET_BIT(BZ_X_MAPPING_1, uc); if (uc == 1) s->inUse16[i] = True; else s->inUse16[i] = False; } for (i = 0; i < 256; i++) s->inUse[i] = False; for (i = 0; i < 16; i++) if (s->inUse16[i]) for (j = 0; j < 16; j++) { GET_BIT(BZ_X_MAPPING_2, uc); if (uc == 1) s->inUse[i * 16 + j] = True; } makeMaps_d ( s ); if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); alphaSize = s->nInUse+2; /*--- Now the selectors ---*/ GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); if (nSelectors < 1) RETURN(BZ_DATA_ERROR); for (i = 0; i < nSelectors; i++) { j = 0; while (True) { GET_BIT(BZ_X_SELECTOR_3, uc); if (uc == 0) break; j++; if (j >= nGroups) RETURN(BZ_DATA_ERROR); } s->selectorMtf[i] = j; } /*--- Undo the MTF values for the selectors. ---*/ { UChar pos[BZ_N_GROUPS], tmp, v; for (v = 0; v < nGroups; v++) pos[v] = v; for (i = 0; i < nSelectors; i++) { v = s->selectorMtf[i]; tmp = pos[v]; while (v > 0) { pos[v] = pos[v-1]; v--; } pos[0] = tmp; s->selector[i] = tmp; } } /*--- Now the coding tables ---*/ for (t = 0; t < nGroups; t++) { GET_BITS(BZ_X_CODING_1, curr, 5); for (i = 0; i < alphaSize; i++) { while (True) { if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); GET_BIT(BZ_X_CODING_2, uc); if (uc == 0) break; GET_BIT(BZ_X_CODING_3, uc); if (uc == 0) curr++; else curr--; } s->len[t][i] = curr; } } /*--- Create the Huffman decoding tables ---*/ for (t = 0; t < nGroups; t++) { minLen = 32; maxLen = 0; for (i = 0; i < alphaSize; i++) { if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; if (s->len[t][i] < minLen) minLen = s->len[t][i]; } BZ2_hbCreateDecodeTables ( &(s->limit[t][0]), &(s->base[t][0]), &(s->perm[t][0]), &(s->len[t][0]), minLen, maxLen, alphaSize ); s->minLens[t] = minLen; } /*--- Now the MTF values ---*/ EOB = s->nInUse+1; nblockMAX = 100000 * s->blockSize100k; groupNo = -1; groupPos = 0; for (i = 0; i <= 255; i++) s->unzftab[i] = 0; /*-- MTF init --*/ { Int32 ii, jj, kk; kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); kk--; } s->mtfbase[ii] = kk + 1; } } /*-- end MTF init --*/ nblock = 0; GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); while (True) { if (nextSym == EOB) break; if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { es = -1; N = 1; do { if (nextSym == BZ_RUNA) es = es + (0+1) * N; else if (nextSym == BZ_RUNB) es = es + (1+1) * N; N = N * 2; GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); } while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); es++; uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; s->unzftab[uc] += es; if (s->smallDecompress) while (es > 0) { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); s->ll16[nblock] = (UInt16)uc; nblock++; es--; } else while (es > 0) { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); s->tt[nblock] = (UInt32)uc; nblock++; es--; }; continue; } else { if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); /*-- uc = MTF ( nextSym-1 ) --*/ { Int32 ii, jj, kk, pp, lno, off; UInt32 nn; nn = (UInt32)(nextSym - 1); if (nn < MTFL_SIZE) { /* avoid general-case expense */ pp = s->mtfbase[0]; uc = s->mtfa[pp+nn]; while (nn > 3) { Int32 z = pp+nn; s->mtfa[(z) ] = s->mtfa[(z)-1]; s->mtfa[(z)-1] = s->mtfa[(z)-2]; s->mtfa[(z)-2] = s->mtfa[(z)-3]; s->mtfa[(z)-3] = s->mtfa[(z)-4]; nn -= 4; } while (nn > 0) { s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; }; s->mtfa[pp] = uc; } else { /* general case */ lno = nn / MTFL_SIZE; off = nn % MTFL_SIZE; pp = s->mtfbase[lno] + off; uc = s->mtfa[pp]; while (pp > s->mtfbase[lno]) { s->mtfa[pp] = s->mtfa[pp-1]; pp--; }; s->mtfbase[lno]++; while (lno > 0) { s->mtfbase[lno]--; s->mtfa[s->mtfbase[lno]] = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; lno--; } s->mtfbase[0]--; s->mtfa[s->mtfbase[0]] = uc; if (s->mtfbase[0] == 0) { kk = MTFA_SIZE-1; for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { for (jj = MTFL_SIZE-1; jj >= 0; jj--) { s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; kk--; } s->mtfbase[ii] = kk + 1; } } } } /*-- end uc = MTF ( nextSym-1 ) --*/ s->unzftab[s->seqToUnseq[uc]]++; if (s->smallDecompress) s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); nblock++; GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); continue; } } /* Now we know what nblock is, we can do a better sanity check on s->origPtr. */ if (s->origPtr < 0 || s->origPtr >= nblock) RETURN(BZ_DATA_ERROR); s->state_out_len = 0; s->state_out_ch = 0; BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); s->state = BZ_X_OUTPUT; if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); /*-- Set up cftab to facilitate generation of T^(-1) --*/ s->cftab[0] = 0; for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; if (s->smallDecompress) { /*-- Make a copy of cftab, used in generation of T --*/ for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; /*-- compute the T vector --*/ for (i = 0; i < nblock; i++) { uc = (UChar)(s->ll16[i]); SET_LL(i, s->cftabCopy[uc]); s->cftabCopy[uc]++; } /*-- Compute T^(-1) by pointer reversal on T --*/ i = s->origPtr; j = GET_LL(i); do { Int32 tmp = GET_LL(j); SET_LL(j, i); i = j; j = tmp; } while (i != s->origPtr); s->tPos = s->origPtr; s->nblock_used = 0; if (s->blockRandomised) { BZ_RAND_INIT_MASK; BZ_GET_SMALL(s->k0); s->nblock_used++; BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; } else { BZ_GET_SMALL(s->k0); s->nblock_used++; } } else { /*-- compute the T^(-1) vector --*/ for (i = 0; i < nblock; i++) { uc = (UChar)(s->tt[i] & 0xff); s->tt[s->cftab[uc]] |= (i << 8); s->cftab[uc]++; } s->tPos = s->tt[s->origPtr] >> 8; s->nblock_used = 0; if (s->blockRandomised) { BZ_RAND_INIT_MASK; BZ_GET_FAST(s->k0); s->nblock_used++; BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; } else { BZ_GET_FAST(s->k0); s->nblock_used++; } } RETURN(BZ_OK); endhdr_2: GET_UCHAR(BZ_X_ENDHDR_2, uc); if (uc != 0x72) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_3, uc); if (uc != 0x45) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_4, uc); if (uc != 0x38) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_5, uc); if (uc != 0x50) RETURN(BZ_DATA_ERROR); GET_UCHAR(BZ_X_ENDHDR_6, uc); if (uc != 0x90) RETURN(BZ_DATA_ERROR); s->storedCombinedCRC = 0; GET_UCHAR(BZ_X_CCRC_1, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_CCRC_2, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_CCRC_3, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); GET_UCHAR(BZ_X_CCRC_4, uc); s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); s->state = BZ_X_IDLE; RETURN(BZ_STREAM_END); default: AssertH ( False, 4001 ); } AssertH ( False, 4002 ); save_state_and_return: s->save_i = i; s->save_j = j; s->save_t = t; s->save_alphaSize = alphaSize; s->save_nGroups = nGroups; s->save_nSelectors = nSelectors; s->save_EOB = EOB; s->save_groupNo = groupNo; s->save_groupPos = groupPos; s->save_nextSym = nextSym; s->save_nblockMAX = nblockMAX; s->save_nblock = nblock; s->save_es = es; s->save_N = N; s->save_curr = curr; s->save_zt = zt; s->save_zn = zn; s->save_zvec = zvec; s->save_zj = zj; s->save_gSel = gSel; s->save_gMinlen = gMinlen; s->save_gLimit = gLimit; s->save_gBase = gBase; s->save_gPerm = gPerm; return retVal; } #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end decompress.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/huffman.c0000644000175000017500000001673210161303543016350 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Huffman coding low-level stuff ---*/ /*--- huffman.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*---------------------------------------------------*/ #define WEIGHTOF(zz0) ((zz0) & 0xffffff00) #define DEPTHOF(zz1) ((zz1) & 0x000000ff) #define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) #define ADDWEIGHTS(zw1,zw2) \ (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) #define UPHEAP(z) \ { \ Int32 zz, tmp; \ zz = z; tmp = heap[zz]; \ while (weight[tmp] < weight[heap[zz >> 1]]) { \ heap[zz] = heap[zz >> 1]; \ zz >>= 1; \ } \ heap[zz] = tmp; \ } #define DOWNHEAP(z) \ { \ Int32 zz, yy, tmp; \ zz = z; tmp = heap[zz]; \ while (True) { \ yy = zz << 1; \ if (yy > nHeap) break; \ if (yy < nHeap && \ weight[heap[yy+1]] < weight[heap[yy]]) \ yy++; \ if (weight[tmp] < weight[heap[yy]]) break; \ heap[zz] = heap[yy]; \ zz = yy; \ } \ heap[zz] = tmp; \ } /*---------------------------------------------------*/ void BZ2_hbMakeCodeLengths ( UChar *len, Int32 *freq, Int32 alphaSize, Int32 maxLen ) { /*-- Nodes and heap entries run from 1. Entry 0 for both the heap and nodes is a sentinel. --*/ Int32 nNodes, nHeap, n1, n2, i, j, k; Bool tooLong; Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; for (i = 0; i < alphaSize; i++) weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; while (True) { nNodes = alphaSize; nHeap = 0; heap[0] = 0; weight[0] = 0; parent[0] = -2; for (i = 1; i <= alphaSize; i++) { parent[i] = -1; nHeap++; heap[nHeap] = i; UPHEAP(nHeap); } AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); while (nHeap > 1) { n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); nNodes++; parent[n1] = parent[n2] = nNodes; weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); parent[nNodes] = -1; nHeap++; heap[nHeap] = nNodes; UPHEAP(nHeap); } AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); tooLong = False; for (i = 1; i <= alphaSize; i++) { j = 0; k = i; while (parent[k] >= 0) { k = parent[k]; j++; } len[i-1] = j; if (j > maxLen) tooLong = True; } if (! tooLong) break; for (i = 1; i < alphaSize; i++) { j = weight[i] >> 8; j = 1 + (j / 2); weight[i] = j << 8; } } } /*---------------------------------------------------*/ void BZ2_hbAssignCodes ( Int32 *code, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize ) { Int32 n, vec, i; vec = 0; for (n = minLen; n <= maxLen; n++) { for (i = 0; i < alphaSize; i++) if (length[i] == n) { code[i] = vec; vec++; }; vec <<= 1; } } /*---------------------------------------------------*/ void BZ2_hbCreateDecodeTables ( Int32 *limit, Int32 *base, Int32 *perm, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize ) { Int32 pp, i, j, vec; pp = 0; for (i = minLen; i <= maxLen; i++) for (j = 0; j < alphaSize; j++) if (length[j] == i) { perm[pp] = j; pp++; }; for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; for (i = 0; i < alphaSize; i++) base[length[i]+1]++; for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; vec = 0; for (i = minLen; i <= maxLen; i++) { vec += (base[i+1] - base[i]); limit[i] = vec-1; vec <<= 1; } for (i = minLen + 1; i <= maxLen; i++) base[i] = ((limit[i-1] + 1) << 1) - base[i]; } #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end huffman.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/bzip2/randtable.c0000644000175000017500000001255110161303543016653 0ustar sret1sret100000000000000 /*-------------------------------------------------------------*/ /*--- Table for randomising repetitive blocks ---*/ /*--- randtable.c ---*/ /*-------------------------------------------------------------*/ /*-- This file is a part of bzip2 and/or libbzip2, a program and library for lossless, block-sorting data compression. Copyright (C) 1996-2002 Julian R Seward. All rights reserved. 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. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. Julian Seward, Cambridge, UK. jseward@acm.org bzip2/libbzip2 version 1.0 of 21 March 2000 This program is based on (at least) the work of: Mike Burrows David Wheeler Peter Fenwick Alistair Moffat Radford Neal Ian H. Witten Robert Sedgewick Jon L. Bentley For more information on these sources, see the manual. --*/ #ifndef HAVE_BZLIB #include "bzlib_private.h" /*---------------------------------------------*/ Int32 BZ2_rNums[512] = { 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, 936, 638 }; #endif /* HAVE_BZLIB */ /*-------------------------------------------------------------*/ /*--- end randtable.c ---*/ /*-------------------------------------------------------------*/ analog-6.0/src/libgd/0000755000175000017500000000000010161303543014602 5ustar sret1sret100000000000000analog-6.0/src/libgd/LICENSE0000644000175000017500000000535110161303543015613 0ustar sret1sret100000000000000The files in this directory are from version 1.8.1 of Thomas Boutell's gd library, but have been heavily modified by Stephen Turner for use in analog. In particular: * Only functions I use in analog have been retained; * Most source comments have been removed. Therefore these routines are NOT SUITABLE for use in your own program. Get the latest version of libgd from http://www.boutell.com/gd/ instead. Many thanks to Thomas Boutell for his excellent routines and generous licence. === AUTHOR'S COPYRIGHT AND LICENCE START HERE === In order to resolve any possible confusion regarding the authorship of gd, the following copyright statement covers all of the authors who have required such a statement. _If you are aware of any oversights in this copyright notice, please contact Thomas Boutell who will be pleased to correct them._ COPYRIGHT STATEMENT FOLLOWS THIS LINE Portions copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000 by Cold Spring Harbor Laboratory. Funded under Grant P41-RR02188 by the National Institutes of Health. Portions copyright 1996, 1997, 1998, 1999, 2000 by Boutell.Com, Inc. Portions relating to GD2 format copyright 1999, 2000 Philip Warner. Portions relating to PNG copyright 1999, 2000 Greg Roelofs. Portions relating to libttf copyright 1999, 2000 John Ellson (ellson@lucent.com). Portions relating to JPEG copyright 2000, Doug Becker and copyright (C) 1994-1998, Thomas G. Lane. This software is based in part on the work of the Independent JPEG Group. Portions relating to WBMP copyright 2000 Maurice Szmurlo. _Permission has been granted to copy, distribute and modify gd in any context without fee, including a commercial application, provided that this notice is present in user-accessible supporting documentation._ This does not affect your ownership of the derived work itself, and the intent is to assure proper credit for the authors of gd, not to interfere with your productive use of gd. If you have questions, ask. "Derived works" includes all programs that utilize the library. Credit must be given in user-accessible documentation. _This software is provided "AS IS."_ The copyright holders disclaim all warranties, either express or implied, including but not limited to implied warranties of merchantability and fitness for a particular purpose, with respect to this code and accompanying documentation. Although their code does not appear in gd 1.8.1, the authors wish to thank David Koblas, David Rowley, and Hutchison Avenue Software Corporation for their prior contributions. END OF COPYRIGHT STATEMENT analog-6.0/src/libgd/Makefile0000644000175000017500000000146410161303543016247 0ustar sret1sret100000000000000# Makefile for analog 6.0, libgd subdirectory # Please read docs/Readme.html, or http://www.analog.cx/ HEADERS = gd.h gd_io.h gdfontf.h gdfonts.h ../zlib/zlib.h ../libpng/png.h OBJS = gd.o gd_io.o gd_io_file.o gd_png.o gdfontf.o gdfonts.o gdtables.o all: $(OBJS) gd.o: gd.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c gd.c gd_io.o: gd_io.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c gd_io.c gd_io_file.o: gd_io_file.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c gd_io_file.c gd_png.o: gd_png.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c gd_png.c gdfontf.o: gdfontf.c $(HEADERS) gdfontf.h Makefile $(CC) $(ALLCFLAGS) -c gdfontf.c gdfonts.o: gdfonts.c $(HEADERS) gdfonts.h Makefile $(CC) $(ALLCFLAGS) -c gdfonts.c gdtables.o: gdtables.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c gdtables.c clean: rm -f *.o *~ analog-6.0/src/libgd/gd.c0000644000175000017500000001533410161303543015346 0ustar sret1sret100000000000000/******************************** * GD Graphics Library * ********************************/ /* This file contains code from Thomas Boutell's gd library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #include #include #include #include #include "../zlib/zlib.h" #include "gd.h" extern int gdCosT[]; extern int gdSinT[]; gdImagePtr gdImageCreate(int sx, int sy) { int i; gdImagePtr im; im = (gdImage *) malloc(sizeof(gdImage)); im->pixels = (unsigned char **) malloc(sizeof(unsigned char *) * sy); im->polyInts = 0; im->polyAllocated = 0; im->brush = 0; im->tile = 0; im->style = 0; for (i=0; (ipixels[i] = (unsigned char *) calloc( sx, sizeof(unsigned char)); } im->sx = sx; im->sy = sy; im->colorsTotal = 0; im->transparent = (-1); im->interlace = 0; for (i=0; (i < gdMaxColors); i++) { im->open[i] = 1; im->red[i] = 0; im->green[i] = 0; im->blue[i] = 0; }; return im; } void gdImageDestroy(gdImagePtr im) { int i; for (i=0; (isy); i++) { free(im->pixels[i]); } free(im->pixels); if (im->polyInts) { free(im->polyInts); } if (im->style) { free(im->style); } free(im); } int gdImageColorAllocate(gdImagePtr im, int r, int g, int b) { int i; int ct = (-1); for (i=0; (i<(im->colorsTotal)); i++) { if (im->open[i]) { ct = i; break; } } if (ct == (-1)) { ct = im->colorsTotal; if (ct == gdMaxColors) { return -1; } im->colorsTotal++; } im->red[ct] = r; im->green[ct] = g; im->blue[ct] = b; im->open[ct] = 0; return ct; } void gdImageColorDeallocate(gdImagePtr im, int color) { im->open[color] = 1; } void gdImageColorTransparent(gdImagePtr im, int color) { im->transparent = color; } void gdImageSetPixel(gdImagePtr im, int x, int y, int color) { /* all other cases removed for analog S.R.E.T. */ if (gdImageBoundsSafe(im, x, y)) im->pixels[y][x] = color; } int gdImageGetPixel(gdImagePtr im, int x, int y) { if (gdImageBoundsSafe(im, x, y)) { return im->pixels[y][x]; } else { return 0; } } void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color) { int dx, dy, incr1, incr2, d, x, y, xend, yend, xdirflag, ydirflag; dx = abs(x2-x1); dy = abs(y2-y1); if (dy <= dx) { d = 2*dy - dx; incr1 = 2*dy; incr2 = 2 * (dy - dx); if (x1 > x2) { x = x2; y = y2; ydirflag = (-1); xend = x1; } else { x = x1; y = y1; ydirflag = 1; xend = x2; } gdImageSetPixel(im, x, y, color); if (((y2 - y1) * ydirflag) > 0) { while (x < xend) { x++; if (d <0) { d+=incr1; } else { y++; d+=incr2; } gdImageSetPixel(im, x, y, color); } } else { while (x < xend) { x++; if (d <0) { d+=incr1; } else { y--; d+=incr2; } gdImageSetPixel(im, x, y, color); } } } else { d = 2*dx - dy; incr1 = 2*dx; incr2 = 2 * (dx - dy); if (y1 > y2) { y = y2; x = x2; yend = y1; xdirflag = (-1); } else { y = y1; x = x1; yend = y2; xdirflag = 1; } gdImageSetPixel(im, x, y, color); if (((x2 - x1) * xdirflag) > 0) { while (y < yend) { y++; if (d <0) { d+=incr1; } else { x++; d+=incr2; } gdImageSetPixel(im, x, y, color); } } else { while (y < yend) { y++; if (d <0) { d+=incr1; } else { x--; d+=incr2; } gdImageSetPixel(im, x, y, color); } } } } int gdImageBoundsSafe(gdImagePtr im, int x, int y) { return (!(((y < 0) || (y >= im->sy)) || ((x < 0) || (x >= im->sx)))); } void gdImageChar(gdImagePtr im, gdFontPtr f, int x, int y, int c, int color) { int cx, cy; int px, py; int fline; cx = 0; cy = 0; if ((c < f->offset) || (c >= (f->offset + f->nchars))) { return; } fline = (c - f->offset) * f->h * f->w; for (py = y; (py < (y + f->h)); py++) { for (px = x; (px < (x + f->w)); px++) { if (f->data[fline + cy * f->w + cx]) { gdImageSetPixel(im, px, py, color); } cx++; } cx = 0; cy++; } } void gdImageString(gdImagePtr im, gdFontPtr f, int x, int y, unsigned char *s, int color) { int i; int l; l = strlen((char *) s); for (i=0; (iw; } } void gdImageArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color) { int i; int lx = 0, ly = 0; int w2, h2; w2 = w/2; h2 = h/2; while (e < s) { e += 360; } for (i=s; (i <= e); i++) { int x, y; x = ((long)gdCosT[i % 360] * (long)w2 / 1024) + cx; y = ((long)gdSinT[i % 360] * (long)h2 / 1024) + cy; if (i != s) { gdImageLine(im, lx, ly, x, y, color); } lx = x; ly = y; } } void gdImageFill(gdImagePtr im, int x, int y, int color) { int lastBorder; int old; int leftLimit, rightLimit; int i; old = gdImageGetPixel(im, x, y); if (color == gdTiled) { int p, tileColor; int srcx, srcy; if (!im->tile) { return; } if (gdImageGetTransparent(im->tile) != (-1)) { return; } srcx = x % gdImageSX(im->tile); srcy = y % gdImageSY(im->tile); p = gdImageGetPixel(im->tile, srcx, srcy); tileColor = im->tileColorMap[p]; if (old == tileColor) { return; } } else { if (old == color) { return; } } leftLimit = (-1); for (i = x; (i >= 0); i--) { if (gdImageGetPixel(im, i, y) != old) { break; } gdImageSetPixel(im, i, y, color); leftLimit = i; } if (leftLimit == (-1)) { return; } rightLimit = x; for (i = (x+1); (i < im->sx); i++) { if (gdImageGetPixel(im, i, y) != old) { break; } gdImageSetPixel(im, i, y, color); rightLimit = i; } if (y > 0) { lastBorder = 1; for (i = leftLimit; (i <= rightLimit); i++) { int c; c = gdImageGetPixel(im, i, y-1); if (lastBorder) { if (c == old) { gdImageFill(im, i, y-1, color); lastBorder = 0; } } else if (c != old) { lastBorder = 1; } } } if (y < ((im->sy) - 1)) { lastBorder = 1; for (i = leftLimit; (i <= rightLimit); i++) { int c; c = gdImageGetPixel(im, i, y+1); if (lastBorder) { if (c == old) { gdImageFill(im, i, y+1, color); lastBorder = 0; } } else if (c != old) { lastBorder = 1; } } } } void gdImageRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color) { gdImageLine(im, x1, y1, x2, y1, color); gdImageLine(im, x1, y2, x2, y2, color); gdImageLine(im, x1, y1, x1, y2, color); gdImageLine(im, x2, y1, x2, y2, color); } void gdImageFilledRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color) { int x, y; for (y=y1; (y<=y2); y++) { for (x=x1; (x<=x2); x++) { gdImageSetPixel(im, x, y, color); } } } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gd.h0000644000175000017500000000546210161303543015354 0ustar sret1sret100000000000000/******************************** * GD Graphics Library * ********************************/ /* This file contains code from Thomas Boutell's gd library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifdef HAVE_GD #include #else #ifndef GD_H #define GD_H 1 #ifdef __cplusplus extern "C" { #endif #include #include "gd_io.h" #define gdMaxColors 256 typedef struct gdImageStruct { unsigned char ** pixels; int sx; int sy; int colorsTotal; int red[gdMaxColors]; int green[gdMaxColors]; int blue[gdMaxColors]; int open[gdMaxColors]; int transparent; int *polyInts; int polyAllocated; struct gdImageStruct *brush; struct gdImageStruct *tile; int brushColorMap[gdMaxColors]; int tileColorMap[gdMaxColors]; int styleLength; int stylePos; int *style; int interlace; } gdImage; typedef gdImage * gdImagePtr; typedef struct { int nchars; int offset; int w; int h; char *data; } gdFont; typedef gdFont *gdFontPtr; #define gdDashSize 4 #define gdStyled (-2) #define gdBrushed (-3) #define gdStyledBrushed (-4) #define gdTiled (-5) #define gdTransparent (-6) gdImagePtr gdImageCreate(int sx, int sy); void gdImageDestroy(gdImagePtr im); void gdImageSetPixel(gdImagePtr im, int x, int y, int color); int gdImageGetPixel(gdImagePtr im, int x, int y); void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color); void gdImageRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color); void gdImageFilledRectangle(gdImagePtr im, int x1, int y1, int x2, int y2, int color); int gdImageBoundsSafe(gdImagePtr im, int x, int y); void gdImageChar(gdImagePtr im, gdFontPtr f, int x, int y, int c, int color); void gdImageString(gdImagePtr im, gdFontPtr f, int x, int y, unsigned char *s, int color); int gdImageColorAllocate(gdImagePtr im, int r, int g, int b); void gdImageColorDeallocate(gdImagePtr im, int color); void gdImageColorTransparent(gdImagePtr im, int color); void gdImagePng(gdImagePtr im, FILE *out); void gdImagePngCtx(gdImagePtr im, gdIOCtx *out); void gdImageArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color); void gdImageFill(gdImagePtr im, int x, int y, int color); void gdImageInterlace(gdImagePtr im, int interlaceArg); #define gdImageSX(im) ((im)->sx) #define gdImageSY(im) ((im)->sy) #define gdImageColorsTotal(im) ((im)->colorsTotal) #define gdImageRed(im, c) ((im)->red[(c)]) #define gdImageGreen(im, c) ((im)->green[(c)]) #define gdImageBlue(im, c) ((im)->blue[(c)]) #define gdImageGetTransparent(im) ((im)->transparent) #define gdImageGetInterlaced(im) ((im)->interlace) gdIOCtx* gdNewFileCtx(FILE*); gdIOCtx* gdNewDynamicCtx(int, void*); #ifdef __cplusplus } #endif #endif /* GD_H */ #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gd_io.c0000644000175000017500000000105610161303543016031 0ustar sret1sret100000000000000/******************************** * GD Graphics Library * ********************************/ /* This file contains code from Thomas Boutell's gd library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #include #include #include #include "gd.h" int gdPutBuf(const void *buf, int size, gdIOCtx* ctx) { return (ctx->putBuf)(ctx, buf, size); } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gd_io.h0000644000175000017500000000111610161303543016033 0ustar sret1sret100000000000000#ifndef NOGRAPHICS #ifdef HAVE_GD #include #else #ifndef GD_IO_H #define GD_IO_H 1 #include typedef struct gdIOCtx { int (*getC)(struct gdIOCtx*); int (*getBuf)(struct gdIOCtx*, void*, int); void (*putC)(struct gdIOCtx*, int); int (*putBuf)(struct gdIOCtx*, const void*, int); int (*seek)(struct gdIOCtx*, const int); long (*tell)(struct gdIOCtx*); void (*free)(struct gdIOCtx*); } gdIOCtx; typedef struct gdIOCtx *gdIOCtxPtr; int gdPutBuf(const void *, int, gdIOCtx*); #endif /* GD_IO_H */ #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gd_io_file.c0000644000175000017500000000433310161303543017031 0ustar sret1sret100000000000000/******************************** * GD Graphics Library * ********************************/ /* This file contains code from Thomas Boutell's gd library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #ifndef SEEK_SET #define SEEK_SET 0 #endif #include #include #include #include "gd.h" typedef struct fileIOCtx { gdIOCtx ctx; FILE *f; } fileIOCtx; struct fileIOCtx *fileIOCtxPtr; gdIOCtx* newFileCtx(FILE *f); static int fileGetbuf( gdIOCtx*, void *, int ); static int filePutbuf( gdIOCtx*, const void *, int ); static void filePutchar( gdIOCtx*, int ); static int fileGetchar( gdIOCtx* ctx); static int fileSeek(struct gdIOCtx*, const int); static long fileTell(struct gdIOCtx*); static void freeFileCtx(gdIOCtx *ctx); gdIOCtx* gdNewFileCtx (FILE *f) { fileIOCtx *ctx; ctx = (fileIOCtx*) malloc(sizeof(fileIOCtx)); if (ctx == NULL) { return NULL; } ctx->f = f; ctx->ctx.getC = fileGetchar; ctx->ctx.putC = filePutchar; ctx->ctx.getBuf = fileGetbuf; ctx->ctx.putBuf = filePutbuf; ctx->ctx.tell = fileTell; ctx->ctx.seek = fileSeek; ctx->ctx.free = freeFileCtx; return (gdIOCtx*)ctx; } static void freeFileCtx(gdIOCtx *ctx) { free(ctx); } static int filePutbuf( gdIOCtx* ctx, const void *buf, int size ) { fileIOCtx *fctx; fctx = (fileIOCtx*) ctx; return fwrite(buf, 1, size, fctx->f); } static int fileGetbuf( gdIOCtx* ctx, void *buf, int size ) { fileIOCtx *fctx; fctx = (fileIOCtx*) ctx; return (fread(buf, 1, size, fctx->f)); } static void filePutchar( gdIOCtx* ctx, int a ) { unsigned char b; fileIOCtx *fctx; fctx = (fileIOCtx*) ctx; b = a; putc(b, fctx->f); } static int fileGetchar( gdIOCtx* ctx) { fileIOCtx *fctx; fctx = (fileIOCtx*) ctx; return getc(fctx->f); } static int fileSeek(struct gdIOCtx* ctx, const int pos) { fileIOCtx *fctx; fctx = (fileIOCtx*) ctx; return (fseek(fctx->f, pos, SEEK_SET) == 0); } static long fileTell(struct gdIOCtx* ctx) { fileIOCtx *fctx; fctx = (fileIOCtx*) ctx; return ftell(fctx->f); } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gd_png.c0000644000175000017500000001264210161303543016211 0ustar sret1sret100000000000000/******************************** * GD Graphics Library * ********************************/ /* This file contains code from Thomas Boutell's gd library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #include #include #include #include #include "gd.h" #include "../libpng/png.h" #undef TRUE #define TRUE 1 #undef FALSE #define FALSE 0 typedef struct _jmpbuf_wrapper { jmp_buf jmpbuf; } jmpbuf_wrapper; static jmpbuf_wrapper gdPngJmpbufStruct; static void gdPngErrorHandler(png_structp png_ptr, png_const_charp msg) { jmpbuf_wrapper *jmpbuf_ptr; fprintf(stderr, "gd-png: fatal libpng error: %s\n", msg); fflush(stderr); jmpbuf_ptr = png_get_error_ptr(png_ptr); if (jmpbuf_ptr == NULL) { fprintf(stderr, "gd-png: EXTREMELY fatal error: jmpbuf unrecoverable; terminating.\n"); fflush(stderr); exit(99); } longjmp(jmpbuf_ptr->jmpbuf, 1); } static void gdPngWriteData(png_structp png_ptr, png_bytep data, png_size_t length) { gdPutBuf(data, length, (gdIOCtx *) png_get_io_ptr(png_ptr)); } static void gdPngFlushData(png_structp png_ptr) { } void gdImagePng(gdImagePtr im, FILE *outFile) { gdIOCtx *out = gdNewFileCtx(outFile); gdImagePngCtx(im, out); out->free(out); } void gdImagePngCtx(gdImagePtr im, gdIOCtx *outfile) { int i, j, bit_depth, interlace_type; int width = im->sx; int height = im->sy; int colors = im->colorsTotal; int *open = im->open; int mapping[gdMaxColors]; png_byte trans_value = 0; png_color palette[gdMaxColors]; png_structp png_ptr; png_infop info_ptr; volatile int transparent = im->transparent; volatile int remap = FALSE; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, &gdPngJmpbufStruct, gdPngErrorHandler, NULL); if (png_ptr == NULL) { fprintf(stderr, "gd-png error: cannot allocate libpng main struct\n"); return; } info_ptr = png_create_info_struct (png_ptr); if (info_ptr == NULL) { fprintf(stderr, "gd-png error: cannot allocate libpng info struct\n"); png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return; } if (setjmp(gdPngJmpbufStruct.jmpbuf)) { fprintf(stderr, "gd-png error: setjmp returns error condition\n"); png_destroy_write_struct(&png_ptr, &info_ptr); return; } png_set_write_fn(png_ptr, (void *)outfile, gdPngWriteData, gdPngFlushData); if (transparent >= im->colorsTotal || (transparent >= 0 && open[transparent])) transparent = -1; for (i = 0; i < gdMaxColors; ++i) mapping[i] = -1; colors = 0; for (i = 0; i < im->colorsTotal; ++i) { if (!open[i]) { mapping[i] = colors; ++colors; } } if (colors < im->colorsTotal) { remap = TRUE; if (transparent >= 0) transparent = mapping[transparent]; } if (colors <= 2) bit_depth = 1; else if (colors <= 4) bit_depth = 2; else if (colors <= 16) bit_depth = 4; else bit_depth = 8; interlace_type = im->interlace? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE; png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, PNG_COLOR_TYPE_PALETTE, interlace_type, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if (transparent >= 0) { if (transparent != 0) { if (!remap) { remap = TRUE; for (i = 0; i < colors; ++i) mapping[i] = i; } mapping[transparent] = 0; mapping[0] = transparent; } png_set_tRNS(png_ptr, info_ptr, &trans_value, 1, NULL); } if (remap) for (i = 0; i < im->colorsTotal; ++i) { if (mapping[i] < 0) continue; palette[mapping[i]].red = im->red[i]; palette[mapping[i]].green = im->green[i]; palette[mapping[i]].blue = im->blue[i]; } else for (i = 0; i < colors; ++i) { palette[i].red = im->red[i]; palette[i].green = im->green[i]; palette[i].blue = im->blue[i]; } png_set_PLTE(png_ptr, info_ptr, palette, colors); png_write_info(png_ptr, info_ptr); png_set_packing(png_ptr); if (remap) { png_bytep *row_pointers; row_pointers = malloc(sizeof(png_bytep) * height); if (row_pointers == NULL) { fprintf(stderr, "gd-png error: unable to allocate row_pointers\n"); } for (j = 0; j < height; ++j) { if ((row_pointers[j] = (png_bytep)malloc(width)) == NULL) { fprintf(stderr, "gd-png error: unable to allocate rows\n"); for (i = 0; i < j; ++i) free(row_pointers[i]); return; } for (i = 0; i < width; ++i) row_pointers[j][i] = mapping[im->pixels[j][i]]; } png_write_image(png_ptr, row_pointers); png_write_end(png_ptr, info_ptr); for (j = 0; j < height; ++j) free(row_pointers[j]); free(row_pointers); } else { png_write_image(png_ptr, im->pixels); png_write_end(png_ptr, info_ptr); } png_destroy_write_struct(&png_ptr, &info_ptr); } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gdfontf.c0000644000175000017500000013522610161303543016406 0ustar sret1sret100000000000000/* This file generated by Stephen Turner using Jan Pazdziora's bdftogd */ /* The original font -Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1 included this message: "Public domain font. Share and enjoy." */ #ifndef NOGRAPHICS /* As this is not part of the gd distribution, it isn't in #ifndef HAVE_GD */ #include "gdfontf.h" char gdFontFixedData[] = { /* Char 0 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 1 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 2 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 3 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 4 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 5 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 6 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 7 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 8 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 9 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 10 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 11 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 12 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 13 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 14 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 15 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 16 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 17 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 18 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 19 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 20 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 21 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 22 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 23 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 24 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 25 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 26 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 27 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 28 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 29 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 30 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 31 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 32 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 33 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 34 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 35 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 1,1,1,1,1,0, 0,1,0,1,0,0, 1,1,1,1,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 36 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,1,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 0,1,1,1,0,0, 0,0,1,0,1,0, 0,0,1,0,1,0, 1,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 37 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 1,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,1,0,0, 1,0,1,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 38 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 1,0,0,1,1,0, 1,0,0,1,0,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 39 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 40 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 41 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 42 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 1,0,1,0,1,0, 1,1,1,1,1,0, 0,1,1,1,0,0, 1,1,1,1,1,0, 1,0,1,0,1,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 43 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 44 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, /* Char 45 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 46 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, /* Char 47 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 48 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 49 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,0,0,0, 1,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 50 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 51 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 52 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 1,0,0,1,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 53 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 54 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 55 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 56 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 57 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 58 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, /* Char 59 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, /* Char 60 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 61 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 62 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 63 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 64 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,1,0,0, 1,0,0,0,0,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 65 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 66 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 67 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 68 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 69 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 70 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 71 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 72 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 73 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 74 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 1,0,0,1,0,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 75 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,0,0, 1,0,1,0,0,0, 1,1,0,0,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 76 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 77 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,1,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 78 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,1,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,1,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 79 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 80 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 81 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,0,0, /* Char 82 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 83 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 84 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 85 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 86 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 87 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,1,0,1,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 88 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 89 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 90 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 91 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 92 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 93 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 94 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 95 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, /* Char 96 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 97 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 98 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 99 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 100 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 101 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 102 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 103 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, /* Char 104 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 105 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 106 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 1,0,0,1,0,0, 1,0,0,1,0,0, 0,1,1,0,0,0, /* Char 107 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,1,0,0, 1,0,1,0,0,0, 1,1,0,0,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 108 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 109 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,0,1,0,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 110 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 111 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 112 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, /* Char 113 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, /* Char 114 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 115 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 116 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 117 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 118 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 119 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 120 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 121 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, /* Char 122 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 123 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 124 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 125 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 126 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 1,0,1,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 127 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 128 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 129 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 130 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 131 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 132 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 133 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 134 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 135 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 136 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 137 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 138 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 139 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 140 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 141 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 142 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 143 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 144 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 145 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 146 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 147 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 148 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 149 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 150 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 151 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 152 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 153 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 154 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 155 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 156 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 157 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 158 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 159 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 160 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 161 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 162 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 1,0,1,0,1,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 1,0,1,0,1,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 163 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,1,0, 1,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 164 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 165 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 166 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 167 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 168 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,0,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 169 */ 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 1,1,0,1,1,0, 1,1,0,0,1,0, 1,1,0,1,1,0, 1,0,1,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 170 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 171 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 0,1,0,1,0,0, 0,0,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 172 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 173 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 174 */ 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,0,1,0, 1,1,0,1,1,0, 1,1,0,1,1,0, 1,1,1,0,1,0, 1,1,0,1,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 175 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 176 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 177 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 178 */ 0,0,0,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,1,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 179 */ 0,0,0,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 1,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 180 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 181 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 1,1,1,0,1,0, 1,0,0,0,0,0, 0,0,0,0,0,0, /* Char 182 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,1,0, 1,1,1,0,1,0, 1,1,1,0,1,0, 1,1,1,0,1,0, 1,1,1,0,1,0, 0,1,1,0,1,0, 0,0,1,0,1,0, 0,0,1,0,1,0, 0,0,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 183 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 184 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, /* Char 185 */ 0,0,0,0,0,0, 0,1,0,0,0,0, 1,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 186 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 187 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,0,0,0, 0,1,0,1,0,0, 0,0,1,0,1,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 1,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 188 */ 0,0,0,0,0,0, 0,1,0,0,0,0, 1,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,0,0,0, 0,0,0,0,1,0, 0,0,0,1,1,0, 0,0,1,0,1,0, 0,0,1,1,1,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 189 */ 0,0,0,0,0,0, 0,1,0,0,0,0, 1,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,0,0,0, 0,0,0,1,0,0, 0,0,1,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 190 */ 0,0,0,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 1,0,1,0,0,0, 0,1,0,0,1,0, 0,0,0,1,1,0, 0,0,1,0,1,0, 0,0,1,1,1,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 191 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 192 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 193 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 194 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 195 */ 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 196 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 197 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 198 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,1,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 1,0,1,1,0,0, 1,1,1,0,0,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 1,0,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 199 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, /* Char 200 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 201 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 202 */ 0,0,0,0,0,0, 0,1,1,0,0,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 203 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 204 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 205 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 206 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 207 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 208 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 1,1,1,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 209 */ 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,0,1,0,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 210 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 211 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 212 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 213 */ 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 214 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 215 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 216 */ 0,0,0,0,0,0, 0,0,0,0,1,0, 0,1,1,1,0,0, 1,0,0,1,1,0, 1,0,0,1,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,1,0,0,1,0, 1,1,0,0,1,0, 0,1,1,1,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, /* Char 217 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 218 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 219 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 220 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 221 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 222 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 223 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,0,1,1,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, /* Char 224 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 225 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 226 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 227 */ 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 228 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 229 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 230 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,1,0,1,0, 0,1,1,1,0,0, 1,0,1,0,0,0, 1,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 231 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, /* Char 232 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 233 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 234 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 235 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 236 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 237 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 238 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 239 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 240 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 241 */ 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 242 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 243 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 244 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 245 */ 0,0,0,0,0,0, 0,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 246 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 247 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 248 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,1,1,1,0,0, 1,0,0,1,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,1,0,0,1,0, 0,1,1,1,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, /* Char 249 */ 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 250 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 251 */ 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 252 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 253 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, /* Char 254 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,0,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, /* Char 255 */ 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, }; gdFont gdFontFixedRep = { 256, 0, 6, 13, gdFontFixedData }; gdFontPtr gdFontFixed = &gdFontFixedRep; #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gdfontf.h0000644000175000017500000000031210161303543016376 0ustar sret1sret100000000000000#ifndef NOGRAPHICS /* As this is not part of the gd distribution, it isn't in #ifndef HAVE_GD */ #ifndef _GDFONTF_H_ #define _GDFONTF_H_ 1 #include "gd.h" extern gdFontPtr gdFontFixed; #endif #endif analog-6.0/src/libgd/gdfonts.c0000644000175000017500000013523610161303543016424 0ustar sret1sret100000000000000/* This is a header file for gd font, generated using bdftogd version 0.5 by Jan Pazdziora, adelton@fi.muni.cz from bdf font -misc-fixed-medium-r-semicondensed-sans-12-116-75-75-c-60-iso8859-2 at Thu Jan 8 14:13:20 1998. No copyright info was found in the original bdf. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #include "gdfonts.h" char gdFontSmallData[] = { /* Char 0 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 1 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 2 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 3 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 4 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 5 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 6 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 7 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 8 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 9 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 10 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 11 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 12 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 13 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 14 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 15 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 16 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 17 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 18 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 19 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 20 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 21 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 22 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 23 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 24 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 25 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 26 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 27 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 28 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 29 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 30 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 31 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 32 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 33 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 34 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 35 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 1,1,1,1,1,0, 0,1,0,1,0,0, 1,1,1,1,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 36 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,1,1,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 0,1,1,1,0,0, 0,0,1,0,1,0, 0,0,1,0,1,0, 1,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, /* Char 37 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 1,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,1,0,0, 1,0,1,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 38 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 1,0,1,0,0,0, 0,1,0,0,0,0, 1,0,1,0,0,0, 1,0,0,1,1,0, 1,0,0,1,0,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 39 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 40 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 41 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 42 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 1,0,1,0,1,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 1,0,1,0,1,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 43 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 44 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, /* Char 45 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 46 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 47 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, /* Char 48 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 49 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,1,0,0,0, 1,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 50 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 51 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,0,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 52 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,1,0,0, 0,1,0,1,0,0, 1,0,0,1,0,0, 1,0,0,1,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 53 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 54 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,1,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 55 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 56 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 57 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 1,1,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 58 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 59 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, /* Char 60 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 61 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 62 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 63 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 64 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,1,0,0, 1,0,0,0,0,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 65 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 66 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 67 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 68 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 69 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 70 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 71 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 72 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 73 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 74 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 1,0,0,1,0,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 75 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,0,0, 1,0,1,0,0,0, 1,1,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 76 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 77 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,1,0,1,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 78 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,1,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,1,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 79 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 80 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 81 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,0,0,0,0,0, /* Char 82 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 83 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 84 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 85 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 86 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 87 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,1,0,1,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 88 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 89 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 90 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 91 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 92 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,0,0,0,0,0, /* Char 93 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 94 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 95 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, /* Char 96 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 97 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 98 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 99 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 100 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,0,1,0, 0,1,1,0,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 101 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 102 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 103 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, /* Char 104 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 105 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 106 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 0,0,0,1,0,0, 1,0,0,1,0,0, 1,0,0,1,0,0, 0,1,1,0,0,0, /* Char 107 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,1,0,0, 1,0,1,0,0,0, 1,1,0,0,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 108 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 109 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,0,1,0,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 110 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 111 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 112 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,0,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, /* Char 113 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,1,0, 0,0,0,0,1,0, /* Char 114 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 115 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 116 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 117 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 118 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 119 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 120 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 121 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 1,1,1,0,0,0, /* Char 122 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 123 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,1,0, 0,0,0,0,0,0, /* Char 124 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, /* Char 125 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 1,1,0,0,0,0, 0,0,0,0,0,0, /* Char 126 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 1,0,1,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 127 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 128 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 129 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 130 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 131 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 132 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 133 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 134 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 135 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 136 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 137 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 138 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 139 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 140 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 141 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 142 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 143 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 144 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 145 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 146 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 147 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 148 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 149 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 150 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 151 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 152 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 153 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 154 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 155 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 156 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 157 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 158 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 159 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 160 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 161 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,1,0,0, 0,0,0,0,1,1, /* Char 162 */ 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 163 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,1,0,0,0, 0,1,0,0,0,0, 1,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 164 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 165 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 1,0,0,1,0,0, 1,0,1,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 166 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 167 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, /* Char 168 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,0,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 169 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 170 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 0,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, /* Char 171 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 172 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 173 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 174 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 175 */ 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 176 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 177 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,1,0,0, 0,0,0,0,1,1, /* Char 178 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,0,0,1,1,0, /* Char 179 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,1,0,0, 0,0,1,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 180 */ 0,0,0,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 181 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,1, 0,1,1,0,0,1, 0,0,1,0,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 182 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 183 */ 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 184 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,1,1,0,0,0, /* Char 185 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 186 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 0,1,1,0,0,0, 0,0,0,1,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, /* Char 187 */ 0,0,0,0,0,0, 0,0,0,1,1,0, 0,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 188 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 189 */ 0,0,0,0,0,0, 0,0,1,0,0,1, 0,1,0,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 190 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 191 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,1,0,0, 0,0,1,0,0,0, 0,1,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 192 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 193 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 194 */ 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 195 */ 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 196 */ 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 197 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 198 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 199 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,1,0,0, 0,1,1,0,0,0, /* Char 200 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 201 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 202 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,0,1,1,0, /* Char 203 */ 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 204 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 205 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 206 */ 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 207 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 208 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 1,1,1,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 1,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 209 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,1,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,1,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 210 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,1,0,0,1,0, 1,0,1,0,1,0, 1,0,1,0,1,0, 1,0,0,1,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 211 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 212 */ 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 213 */ 0,0,1,0,0,1, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 214 */ 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 215 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 216 */ 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,1,0,0,0, 1,0,0,1,0,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 217 */ 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 218 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 219 */ 0,0,1,0,0,1, 0,1,0,0,1,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 220 */ 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 221 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 222 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, /* Char 223 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,1,0,0,1,0, 1,0,1,1,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, /* Char 224 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 225 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 226 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 227 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 228 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 0,1,0,0,1,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,1,0, 0,1,1,1,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 229 */ 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 230 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 231 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,1,0,0, 0,1,1,0,0,0, /* Char 232 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 233 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 234 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 0,0,1,0,0,0, 0,0,0,1,1,0, /* Char 235 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 236 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,1,1,1,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 237 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 238 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 239 */ 0,0,0,0,0,0, 0,0,0,0,1,1, 0,0,0,0,0,1, 0,0,0,1,1,0, 0,0,0,1,0,0, 0,1,0,1,0,0, 1,0,1,1,0,0, 1,0,0,1,0,0, 1,0,0,1,0,0, 1,0,0,1,0,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 240 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,1,0, 0,0,0,1,1,1, 0,0,0,0,1,0, 0,1,1,0,1,0, 1,0,0,1,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 241 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 242 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 243 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 244 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 245 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 246 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 0,1,1,1,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 0,1,1,1,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 247 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,1,1,1,1,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 248 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 1,0,1,1,0,0, 1,1,0,0,1,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 1,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 249 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,1,0,1,0,0, 0,0,1,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 250 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 251 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,1,0, 1,0,0,1,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 252 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,1,0,0, 0,1,0,1,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, /* Char 253 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,1,1,0, 0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,0,1,0, 1,0,0,1,1,0, 0,1,1,0,1,0, 0,0,0,0,1,0, 0,0,0,1,0,0, 1,1,1,0,0,0, /* Char 254 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 1,1,1,1,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,0,0, 0,1,0,0,1,0, 0,0,1,1,0,0, 0,0,0,1,0,0, 0,0,1,0,0,0, /* Char 255 */ 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,1,0,0,0, 0,0,1,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, }; gdFont gdFontSmallRep = { 256, 0, 6, 13, gdFontSmallData }; gdFontPtr gdFontSmall = &gdFontSmallRep; #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libgd/gdfonts.h0000644000175000017500000000025510161303543016421 0ustar sret1sret100000000000000#ifndef NOGRAPHICS #ifdef HAVE_GD #include #else #ifndef _GDFONTS_H_ #define _GDFONTS_H_ 1 #include "gd.h" extern gdFontPtr gdFontSmall; #endif #endif #endif analog-6.0/src/libgd/gdtables.c0000644000175000017500000001336310161303543016541 0ustar sret1sret100000000000000/******************************** * GD Graphics Library * ********************************/ /* This file contains code from Thomas Boutell's gd library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD int gdCosT[] = { 1024, 1023, 1023, 1022, 1021, 1020, 1018, 1016, 1014, 1011, 1008, 1005, 1001, 997, 993, 989, 984, 979, 973, 968, 962, 955, 949, 942, 935, 928, 920, 912, 904, 895, 886, 877, 868, 858, 848, 838, 828, 817, 806, 795, 784, 772, 760, 748, 736, 724, 711, 698, 685, 671, 658, 644, 630, 616, 601, 587, 572, 557, 542, 527, 512, 496, 480, 464, 448, 432, 416, 400, 383, 366, 350, 333, 316, 299, 282, 265, 247, 230, 212, 195, 177, 160, 142, 124, 107, 89, 71, 53, 35, 17, 0, -17, -35, -53, -71, -89, -107, -124, -142, -160, -177, -195, -212, -230, -247, -265, -282, -299, -316, -333, -350, -366, -383, -400, -416, -432, -448, -464, -480, -496, -512, -527, -542, -557, -572, -587, -601, -616, -630, -644, -658, -671, -685, -698, -711, -724, -736, -748, -760, -772, -784, -795, -806, -817, -828, -838, -848, -858, -868, -877, -886, -895, -904, -912, -920, -928, -935, -942, -949, -955, -962, -968, -973, -979, -984, -989, -993, -997, -1001, -1005, -1008, -1011, -1014, -1016, -1018, -1020, -1021, -1022, -1023, -1023, -1024, -1023, -1023, -1022, -1021, -1020, -1018, -1016, -1014, -1011, -1008, -1005, -1001, -997, -993, -989, -984, -979, -973, -968, -962, -955, -949, -942, -935, -928, -920, -912, -904, -895, -886, -877, -868, -858, -848, -838, -828, -817, -806, -795, -784, -772, -760, -748, -736, -724, -711, -698, -685, -671, -658, -644, -630, -616, -601, -587, -572, -557, -542, -527, -512, -496, -480, -464, -448, -432, -416, -400, -383, -366, -350, -333, -316, -299, -282, -265, -247, -230, -212, -195, -177, -160, -142, -124, -107, -89, -71, -53, -35, -17, 0, 17, 35, 53, 71, 89, 107, 124, 142, 160, 177, 195, 212, 230, 247, 265, 282, 299, 316, 333, 350, 366, 383, 400, 416, 432, 448, 464, 480, 496, 512, 527, 542, 557, 572, 587, 601, 616, 630, 644, 658, 671, 685, 698, 711, 724, 736, 748, 760, 772, 784, 795, 806, 817, 828, 838, 848, 858, 868, 877, 886, 895, 904, 912, 920, 928, 935, 942, 949, 955, 962, 968, 973, 979, 984, 989, 993, 997, 1001, 1005, 1008, 1011, 1014, 1016, 1018, 1020, 1021, 1022, 1023, 1023 }; int gdSinT[] = { 0, 17, 35, 53, 71, 89, 107, 124, 142, 160, 177, 195, 212, 230, 247, 265, 282, 299, 316, 333, 350, 366, 383, 400, 416, 432, 448, 464, 480, 496, 512, 527, 542, 557, 572, 587, 601, 616, 630, 644, 658, 671, 685, 698, 711, 724, 736, 748, 760, 772, 784, 795, 806, 817, 828, 838, 848, 858, 868, 877, 886, 895, 904, 912, 920, 928, 935, 942, 949, 955, 962, 968, 973, 979, 984, 989, 993, 997, 1001, 1005, 1008, 1011, 1014, 1016, 1018, 1020, 1021, 1022, 1023, 1023, 1024, 1023, 1023, 1022, 1021, 1020, 1018, 1016, 1014, 1011, 1008, 1005, 1001, 997, 993, 989, 984, 979, 973, 968, 962, 955, 949, 942, 935, 928, 920, 912, 904, 895, 886, 877, 868, 858, 848, 838, 828, 817, 806, 795, 784, 772, 760, 748, 736, 724, 711, 698, 685, 671, 658, 644, 630, 616, 601, 587, 572, 557, 542, 527, 512, 496, 480, 464, 448, 432, 416, 400, 383, 366, 350, 333, 316, 299, 282, 265, 247, 230, 212, 195, 177, 160, 142, 124, 107, 89, 71, 53, 35, 17, 0, -17, -35, -53, -71, -89, -107, -124, -142, -160, -177, -195, -212, -230, -247, -265, -282, -299, -316, -333, -350, -366, -383, -400, -416, -432, -448, -464, -480, -496, -512, -527, -542, -557, -572, -587, -601, -616, -630, -644, -658, -671, -685, -698, -711, -724, -736, -748, -760, -772, -784, -795, -806, -817, -828, -838, -848, -858, -868, -877, -886, -895, -904, -912, -920, -928, -935, -942, -949, -955, -962, -968, -973, -979, -984, -989, -993, -997, -1001, -1005, -1008, -1011, -1014, -1016, -1018, -1020, -1021, -1022, -1023, -1023, -1024, -1023, -1023, -1022, -1021, -1020, -1018, -1016, -1014, -1011, -1008, -1005, -1001, -997, -993, -989, -984, -979, -973, -968, -962, -955, -949, -942, -935, -928, -920, -912, -904, -895, -886, -877, -868, -858, -848, -838, -828, -817, -806, -795, -784, -772, -760, -748, -736, -724, -711, -698, -685, -671, -658, -644, -630, -616, -601, -587, -572, -557, -542, -527, -512, -496, -480, -464, -448, -432, -416, -400, -383, -366, -350, -333, -316, -299, -282, -265, -247, -230, -212, -195, -177, -160, -142, -124, -107, -89, -71, -53, -35, -17 }; #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/0000755000175000017500000000000010161303544014775 5ustar sret1sret100000000000000analog-6.0/src/libpng/LICENSE0000644000175000017500000000563110161303543016006 0ustar sret1sret100000000000000The files in this directory are from version 1.0.6 of the PNG reference library, but have been heavily modified by Stephen Turner for use in analog. In particular: * Only functions I use in analog have been retained; * Most source comments have been removed. Therefore these routines are NOT SUITABLE for use in your own program. Get the latest version of libpng from http://www.libpng.org/pub/png/libpng.html instead. Many thanks to the authors for their excellent routines and generous licence. === AUTHORS' COPYRIGHT AND LICENCE START HERE === COPYRIGHT NOTICE: Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. (libpng versions 0.5, May 1995, through 0.89c, May 1996) Copyright (c) 1996, 1997 Andreas Dilger (libpng versions 0.90, December 1996, through 0.96, May 1997) Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson (libpng versions 0.97, January 1998, through 1.0.6, March 21, 2000) For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: John Bowler Kevin Bracey Sam Bushell Andreas Dilger Magnus Holmgren Tom Lane Dave Martindale Glenn Randers-Pehrson Eric S. Raymond Greg Roelofs Guy Eric Schalnat Paul Schmidt Tom Tanner Willem van Schaik Tim Wegner The PNG Reference Library is supplied "AS IS". The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: 1. The origin of this source code must not be misrepresented. 2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. 3. This Copyright notice may not be removed or altered from any source or altered source distribution. The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. A "png_get_copyright" function is available, for convenient use in "about" boxes and the like: printf("%s",png_get_copyright(NULL)); Also, the PNG logo (in PNG format, of course) is supplied in the file "pngnow.png". Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a certification mark of the Open Source Initiative. Glenn Randers-Pehrson randeg@alum.rpi.edu March 21, 2000 analog-6.0/src/libpng/Makefile0000644000175000017500000000203010161303543016427 0ustar sret1sret100000000000000# Makefile for analog 6.0, libpng subdirectory # Please read docs/Readme.html, or http://www.analog.cx/ HEADERS = png.h pngconf.h ../zlib/zlib.h OBJS = png.o pngerror.o pngmem.o pngset.o pngtrans.o pngwio.o pngwrite.o \ pngwtran.o pngwutil.o all: $(OBJS) png.o: png.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c png.c pngerror.o: pngerror.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngerror.c pngmem.o: pngmem.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngmem.c pngset.o: pngset.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngset.c pngtrans.o: pngtrans.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngtrans.c pngwio.o: pngwio.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngwio.c pngwrite.o: pngwrite.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngwrite.c pngwtran.o: pngwtran.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngwtran.c pngwutil.o: pngwutil.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c pngwutil.c clean: rm -f *.o *~ analog-6.0/src/libpng/png.c0000644000175000017500000001044510161303544015731 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #define PNG_NO_EXTERN #include #include "png.h" typedef version_1_0_6 Your_png_h_is_not_version_1_0_6; #ifdef PNG_USE_GLOBAL_ARRAYS char png_libpng_ver[12] = "1.0.6"; png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; PNG_IHDR; PNG_IDAT; PNG_IEND; PNG_PLTE; PNG_bKGD; PNG_cHRM; PNG_gAMA; PNG_hIST; PNG_iCCP; PNG_iTXt; PNG_oFFs; PNG_pCAL; PNG_sCAL; PNG_pHYs; PNG_sBIT; PNG_sRGB; PNG_tEXt; PNG_tIME; PNG_tRNS; PNG_zTXt; int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; #endif int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; int FARDATA png_pass_dsp_mask[] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; #endif voidpf png_zalloc(voidpf png_ptr, uInt items, uInt size) { png_uint_32 num_bytes = (png_uint_32)items * size; png_voidp ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); if (num_bytes > (png_uint_32)0x8000L) { png_memset(ptr, 0, (png_size_t)0x8000L); png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, (png_size_t)(num_bytes - (png_uint_32)0x8000L)); } else { png_memset(ptr, 0, (png_size_t)num_bytes); } return ((voidpf)ptr); } void png_zfree(voidpf png_ptr, voidpf ptr) { png_free((png_structp)png_ptr, (png_voidp)ptr); } void png_reset_crc(png_structp png_ptr) { png_ptr->crc = crc32(0, Z_NULL, 0); } void png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) { int need_crc = 1; if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ { if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) need_crc = 0; } else /* critical */ { if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) need_crc = 0; } if (need_crc) png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); } png_infop png_create_info_struct(png_structp png_ptr) { png_infop info_ptr; png_debug(1, "in png_create_info_struct\n"); if(png_ptr == NULL) return (NULL); if ((info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO)) != NULL) { png_info_init(info_ptr); } return (info_ptr); } void png_info_init(png_infop info_ptr) { png_debug(1, "in png_info_init\n"); png_memset(info_ptr, 0, sizeof (png_info)); } void png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, int num) { if (png_ptr == NULL || info_ptr == NULL) return; #if defined(PNG_tRNS_SUPPORTED) if (mask & PNG_FREE_TRNS) { if (info_ptr->valid & PNG_INFO_tRNS) { if (info_ptr->free_me & PNG_FREE_TRNS) png_free(png_ptr, info_ptr->trans); info_ptr->valid &= ~PNG_INFO_tRNS; } } #endif if (mask & PNG_FREE_PLTE) { if (info_ptr->valid & PNG_INFO_PLTE) { if (info_ptr->free_me & PNG_FREE_PLTE) png_zfree(png_ptr, info_ptr->palette); info_ptr->valid &= ~(PNG_INFO_PLTE); info_ptr->num_palette = 0; } } #if defined(PNG_INFO_IMAGE_SUPPORTED) if (mask & PNG_FREE_ROWS) { if (info_ptr->free_me & PNG_FREE_ROWS) { int row; for (row = 0; row < (int)info_ptr->height; row++) png_free(png_ptr, info_ptr->row_pointers[row]); png_free(png_ptr, info_ptr->row_pointers); } } #endif if(num == -1) info_ptr->free_me &= ~mask; } png_voidp png_get_io_ptr(png_structp png_ptr) { return (png_ptr->io_ptr); } png_charp png_get_header_ver(png_structp png_ptr) { /* Version of *.h files used when building libpng */ if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ return(PNG_LIBPNG_VER_STRING); return(PNG_LIBPNG_VER_STRING); } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/png.h0000644000175000017500000005270310161303544015741 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifdef HAVE_GD #include #else #ifndef _PNG_H #define _PNG_H #include "../zlib/zlib.h" #include "pngconf.h" #if defined(PNG_INTERNAL) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) # include "pngasmrd.h" #endif #define PNG_LIBPNG_VER_STRING "1.0.6" #define PNG_LIBPNG_VER 10006 /* 1.0.6 */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (char) png_libpng_ver[12]; #else #define png_libpng_ver png_get_header_ver(NULL) #endif #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (int FARDATA) png_pass_start[7]; PNG_EXPORT_VAR (int FARDATA) png_pass_inc[7]; PNG_EXPORT_VAR (int FARDATA) png_pass_ystart[7]; PNG_EXPORT_VAR (int FARDATA) png_pass_yinc[7]; PNG_EXPORT_VAR (int FARDATA) png_pass_mask[7]; PNG_EXPORT_VAR (int FARDATA) png_pass_dsp_mask[7]; #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW extern int FARDATA png_pass_width[7]; #endif #endif #endif /* PNG_NO_EXTERN */ typedef struct png_color_struct { png_byte red; png_byte green; png_byte blue; } png_color; typedef png_color FAR * png_colorp; typedef png_color FAR * FAR * png_colorpp; typedef struct png_color_16_struct { png_byte index; png_uint_16 red; png_uint_16 green; png_uint_16 blue; png_uint_16 gray; } png_color_16; typedef png_color_16 FAR * png_color_16p; typedef png_color_16 FAR * FAR * png_color_16pp; typedef struct png_color_8_struct { png_byte red; png_byte green; png_byte blue; png_byte gray; png_byte alpha; } png_color_8; typedef png_color_8 FAR * png_color_8p; typedef png_color_8 FAR * FAR * png_color_8pp; #define PNG_TEXT_COMPRESSION_NONE_WR -3 #define PNG_TEXT_COMPRESSION_zTXt_WR -2 #define PNG_TEXT_COMPRESSION_NONE -1 #define PNG_TEXT_COMPRESSION_zTXt 0 #define PNG_ITXT_COMPRESSION_NONE 1 #define PNG_ITXT_COMPRESSION_zTXt 2 #define PNG_TEXT_COMPRESSION_LAST 3 typedef struct png_time_struct { png_uint_16 year; png_byte month; png_byte day; png_byte hour; png_byte minute; png_byte second; } png_time; typedef png_time FAR * png_timep; typedef png_time FAR * FAR * png_timepp; typedef struct png_info_struct { png_uint_32 width; png_uint_32 height; png_uint_32 valid; png_uint_32 rowbytes; png_colorp palette; png_uint_16 num_palette; png_uint_16 num_trans; png_byte bit_depth; png_byte color_type; png_byte compression_type; png_byte filter_type; png_byte interlace_type; png_byte channels; png_byte pixel_depth; png_byte spare_byte; png_byte signature[8]; png_uint_32 free_me; #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep trans; png_color_16 trans_values; #endif #if defined(PNG_INFO_IMAGE_SUPPORTED) png_bytepp row_pointers; #endif } png_info; typedef png_info FAR * png_infop; typedef png_info FAR * FAR * png_infopp; #define PNG_MAX_UINT ((png_uint_32)0x7fffffffL) #define PNG_COLOR_MASK_PALETTE 1 #define PNG_COLOR_MASK_COLOR 2 #define PNG_COLOR_MASK_ALPHA 4 #define PNG_COLOR_TYPE_GRAY 0 #define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) #define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) #define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) #define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) #define PNG_COMPRESSION_TYPE_BASE 0 #define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE #define PNG_FILTER_TYPE_BASE 0 #define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE #define PNG_INTERLACE_NONE 0 #define PNG_INTERLACE_ADAM7 1 #define PNG_INTERLACE_LAST 2 #define PNG_INFO_gAMA 0x0001 #define PNG_INFO_sBIT 0x0002 #define PNG_INFO_cHRM 0x0004 #define PNG_INFO_PLTE 0x0008 #define PNG_INFO_tRNS 0x0010 #define PNG_INFO_bKGD 0x0020 #define PNG_INFO_hIST 0x0040 #define PNG_INFO_pHYs 0x0080 #define PNG_INFO_oFFs 0x0100 #define PNG_INFO_tIME 0x0200 #define PNG_INFO_pCAL 0x0400 #define PNG_INFO_sRGB 0x0800 #define PNG_INFO_iCCP 0x1000 #define PNG_INFO_sPLT 0x2000 #define PNG_INFO_sCAL 0x4000 #define PNG_INFO_IDAT 0x8000L typedef struct png_row_info_struct { png_uint_32 width; png_uint_32 rowbytes; png_byte color_type; png_byte bit_depth; png_byte channels; png_byte pixel_depth; } png_row_info; typedef png_row_info FAR * png_row_infop; typedef png_row_info FAR * FAR * png_row_infopp; typedef struct png_struct_def png_struct; typedef png_struct FAR * png_structp; typedef void (*png_error_ptr) PNGARG((png_structp, png_const_charp)); typedef void (*png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); typedef void (*png_flush_ptr) PNGARG((png_structp)); typedef void (*png_read_status_ptr) PNGARG((png_structp, png_uint_32, int)); typedef void (*png_write_status_ptr) PNGARG((png_structp, png_uint_32, int)); #define PNG_TRANSFORM_IDENTITY 0x0000 #define PNG_TRANSFORM_STRIP_16 0x0001 #define PNG_TRANSFORM_STRIP_ALPHA 0x0002 #define PNG_TRANSFORM_PACKING 0x0004 #define PNG_TRANSFORM_PACKSWAP 0x0008 #define PNG_TRANSFORM_EXPAND 0x0010 #define PNG_TRANSFORM_INVERT_MONO 0x0020 #define PNG_TRANSFORM_SHIFT 0x0040 #define PNG_TRANSFORM_BGR 0x0080 #define PNG_TRANSFORM_SWAP_ALPHA 0x0100 #define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 #define PNG_TRANSFORM_INVERT_ALPHA 0x0200 #define PNG_TRANSFORM_STRIP_FILLER 0x0800 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); struct png_struct_def { #ifdef PNG_SETJMP_SUPPORTED jmp_buf jmpbuf; #endif png_error_ptr error_fn; png_error_ptr warning_fn; png_voidp error_ptr; png_rw_ptr write_data_fn; png_rw_ptr read_data_fn; png_voidp io_ptr; png_uint_32 mode; png_uint_32 flags; png_uint_32 free_me; png_uint_32 transformations; z_stream zstream; png_bytep zbuf; png_size_t zbuf_size; int zlib_level; int zlib_method; int zlib_window_bits; int zlib_mem_level; int zlib_strategy; png_uint_32 width; png_uint_32 height; png_uint_32 num_rows; png_uint_32 usr_width; png_uint_32 rowbytes; png_uint_32 irowbytes; png_uint_32 iwidth; png_uint_32 row_number; png_bytep prev_row; png_bytep row_buf; png_bytep sub_row; png_bytep up_row; png_bytep avg_row; png_bytep paeth_row; png_row_info row_info; png_uint_32 idat_size; png_uint_32 crc; png_colorp palette; png_uint_16 num_palette; png_uint_16 num_trans; png_byte chunk_name[5]; png_byte compression; png_byte filter; png_byte interlaced; png_byte pass; png_byte do_filter; png_byte color_type; png_byte bit_depth; png_byte usr_bit_depth; png_byte pixel_depth; png_byte channels; png_byte usr_channels; png_byte sig_bytes; #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_flush_ptr output_flush_fn; png_uint_32 flush_dist; png_uint_32 flush_rows; #endif png_read_status_ptr read_row_fn; png_write_status_ptr write_row_fn; #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) png_bytepp offset_table_ptr; png_bytep offset_table; png_uint_16 offset_table_number; png_uint_16 offset_table_count; png_uint_16 offset_table_count_free; #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_byte heuristic_method; png_byte num_prev_filters; png_bytep prev_filters; png_uint_16p filter_weights; png_uint_16p inv_filter_weights; png_uint_16p filter_costs; png_uint_16p inv_filter_costs; #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_charp time_buffer; #endif #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) png_byte empty_plte_permitted; #endif }; typedef png_structp version_1_0_6; typedef png_struct FAR * FAR * png_structpp; extern PNG_EXPORT(png_structp,png_create_write_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length)); extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_uint_32 length)); extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_infop,png_create_info_struct) PNGARG((png_structp png_ptr)); extern void png_info_init PNGARG((png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, png_bytep row)); extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, png_bytepp image)); extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_destroy_write_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); extern void png_write_destroy PNGARG((png_structp png_ptr)); #define PNG_CRC_DEFAULT 0 #define PNG_CRC_ERROR_QUIT 1 #define PNG_CRC_WARN_DISCARD 2 #define PNG_CRC_WARN_USE 3 #define PNG_CRC_QUIET_USE 4 #define PNG_CRC_NO_CHANGE 5 #define PNG_NO_FILTERS 0x00 #define PNG_FILTER_NONE 0x08 #define PNG_FILTER_SUB 0x10 #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ PNG_FILTER_AVG | PNG_FILTER_PAETH) #define PNG_FILTER_VALUE_NONE 0 #define PNG_FILTER_VALUE_SUB 1 #define PNG_FILTER_VALUE_UP 2 #define PNG_FILTER_VALUE_AVG 3 #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs)); #endif #endif #define PNG_FILTER_HEURISTIC_DEFAULT 0 #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 #define PNG_FILTER_HEURISTIC_WEIGHTED 2 #define PNG_FILTER_HEURISTIC_LAST 3 extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, png_uint_32 size)); extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); #define PNG_FREE_PLTE 0x0001 #define PNG_FREE_TRNS 0x0002 #define PNG_FREE_TEXT 0x0004 #define PNG_FREE_HIST 0x0008 #define PNG_FREE_ICCP 0x0010 #define PNG_FREE_SPLT 0x0020 #define PNG_FREE_ROWS 0x0040 #define PNG_FREE_PCAL 0x0080 #define PNG_FREE_SCAL 0x0100 #define PNG_FREE_UNKN 0x0200 #define PNG_FREE_LIST 0x0400 #define PNG_FREE_ALL 0x07ff extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 size)); #if defined(USE_FAR_KEYWORD) extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, int check)); #endif extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, png_const_charp error)); extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, png_const_charp error)); extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, png_const_charp message)); extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, png_const_charp message)); extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_type, int compression_type, int filter_type)); extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette)); #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values)); #endif #if defined(PNG_INFO_IMAGE_SUPPORTED) extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, voidp params)); #endif #define png_debug(l, m) #define png_debug1(l, m, p1) #define png_debug2(l, m, p1, p2) extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); #define PNG_HEADER_VERSION_STRING \ " libpng version 1.0.6 - March 21, 2000 (header)\n" #if defined(PNG_INTERNAL) #define PNG_HAVE_IHDR 0x01 #define PNG_HAVE_PLTE 0x02 #define PNG_HAVE_IDAT 0x04 #define PNG_AFTER_IDAT 0x08 #define PNG_HAVE_IEND 0x10 #define PNG_HAVE_gAMA 0x20 #define PNG_HAVE_cHRM 0x40 #define PNG_HAVE_sRGB 0x80 #define PNG_HAVE_CHUNK_HEADER 0x100 #define PNG_WROTE_tIME 0x200 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400 #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_BGR 0x0001 #define PNG_INTERLACE 0x0002 #define PNG_PACK 0x0004 #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 #define PNG_DITHER 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 #define PNG_GAMMA 0x2000 #define PNG_GRAY_TO_RGB 0x4000 #define PNG_FILLER 0x8000L #define PNG_PACKSWAP 0x10000L #define PNG_SWAP_ALPHA 0x20000L #define PNG_STRIP_ALPHA 0x40000L #define PNG_INVERT_ALPHA 0x80000L #define PNG_USER_TRANSFORM 0x100000L #define PNG_RGB_TO_GRAY_ERR 0x200000L #define PNG_RGB_TO_GRAY_WARN 0x400000L #define PNG_RGB_TO_GRAY 0x600000L #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 #define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) #define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 #define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 #define PNG_FLAG_ZLIB_FINISHED 0x0020 #define PNG_FLAG_ROW_INIT 0x0040 #define PNG_FLAG_FILLER_AFTER 0x0080 #define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 #define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 #define PNG_FLAG_CRC_CRITICAL_USE 0x0400 #define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x1000 #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x2000 #define HANDLE_CHUNK_AS_DEFAULT 0 #define HANDLE_CHUNK_NEVER 1 #define HANDLE_CHUNK_IF_SAFE 2 #define HANDLE_CHUNK_ALWAYS 3 #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ PNG_FLAG_CRC_ANCILLARY_NOWARN) #define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ PNG_FLAG_CRC_CRITICAL_IGNORE) #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ abs((int)((c1).green) - (int)((c2).green)) + \ abs((int)((c1).blue) - (int)((c2).blue))) #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (png_byte FARDATA) png_sig[8]; #else #define png_sig png_sig_bytes(NULL) #endif #endif #define PNG_IHDR const png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} #define PNG_IDAT const png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} #define PNG_IEND const png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} #define PNG_PLTE const png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} #define PNG_bKGD const png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} #define PNG_cHRM const png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} #define PNG_gAMA const png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} #define PNG_hIST const png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} #define PNG_iCCP const png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} #define PNG_iTXt const png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} #define PNG_oFFs const png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} #define PNG_pCAL const png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} #define PNG_sCAL const png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} #define PNG_pHYs const png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} #define PNG_sBIT const png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} #define PNG_sPLT const png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} #define PNG_sRGB const png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} #define PNG_tEXt const png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} #define PNG_tIME const png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} #define PNG_tRNS const png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} #define PNG_zTXt const png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5]; #endif /* PNG_USE_GLOBAL_ARRAYS */ PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); #endif PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i)); PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_type, int filter_type, int interlace_type)); PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #if defined(PNG_WRITE_tRNS_SUPPORTED) PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, png_color_16p values, int number, int color_type)); #endif PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, png_row_infop row_info)); PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, png_bytep filtered_row)); #if defined(PNG_WRITE_PACK_SUPPORTED) PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)); #endif PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); #endif /* PNG_INTERNAL */ #endif /* _PNG_H */ #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngconf.h0000644000175000017500000001773410161303544016614 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifdef HAVE_GD #include #else #ifndef PNGCONF_H #define PNGCONF_H #ifndef PNG_ZBUF_SIZE #define PNG_ZBUF_SIZE 8192 #endif #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) #define PNG_MAX_MALLOC_64K #endif # ifdef PNG_NO_STDIO # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # ifdef PNG_DEBUG # if (PNG_DEBUG > 0) # include # endif # endif # else # include # endif #ifndef PNGARG #ifdef OF #define PNGARG(arglist) OF(arglist) #else #ifdef _NO_PROTO #define PNGARG(arglist) () #else #define PNGARG(arglist) arglist #endif #endif /* OF */ #endif /* PNGARG */ #ifndef MACOS #if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) #define MACOS #endif #endif #if !defined(MACOS) && !defined(RISCOS) #include #endif #ifndef PNG_SETJMP_NOT_SUPPORTED # define PNG_SETJMP_SUPPORTED #endif #ifdef PNG_SETJMP_SUPPORTED # ifdef __linux__ # ifdef _BSD_SOURCE # define _PNG_SAVE_BSD_SOURCE # undef _BSD_SOURCE # endif # ifdef _SETJMP_H __png.h__ already includes setjmp.h __dont__ include it again # endif #endif /* __linux__ */ #include # ifdef __linux__ # ifdef _PNG_SAVE_BSD_SOURCE # define _BSD_SOURCE # undef _PNG_SAVE_BSD_SOURCE # endif # endif /* __linux__ */ #endif /* PNG_SETJMP_SUPPORTED */ #ifdef BSD #include #else #include #endif #ifdef PNG_INTERNAL #include #define PNG_EXTERN #if !defined(PNG_NO_FLOATING_POINT_SUPPORTED) #if defined(MACOS) #if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) #include #endif #else #include #endif #endif #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) #define PNG_ALWAYS_EXTERN #endif #ifdef __TURBOC__ #include #include "alloc.h" #endif #ifdef _MSC_VER #include #endif #ifndef PNG_DITHER_RED_BITS #define PNG_DITHER_RED_BITS 5 #endif #ifndef PNG_DITHER_GREEN_BITS #define PNG_DITHER_GREEN_BITS 5 #endif #ifndef PNG_DITHER_BLUE_BITS #define PNG_DITHER_BLUE_BITS 5 #endif #ifndef PNG_MAX_GAMMA_8 #define PNG_MAX_GAMMA_8 11 #endif #ifndef PNG_GAMMA_THRESHOLD #define PNG_GAMMA_THRESHOLD 0.05 #endif #endif /* PNG_INTERNAL */ #ifndef PNG_NO_CONST # define PNG_CONST const #else # define PNG_CONST #endif #define PNG_WRITE_PACK_SUPPORTED #define PNG_tRNS_SUPPORTED #ifndef PNG_NO_WRITE_WEIGHTED_FILTER #define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #endif #ifndef PNG_NO_WRITE_FLUSH #define PNG_WRITE_FLUSH_SUPPORTED #endif #ifndef PNG_NO_WRITE_EMPTY_PLTE #define PNG_WRITE_EMPTY_PLTE_SUPPORTED #endif #ifndef PNG_NO_STDIO #define PNG_TIME_RFC1123_SUPPORTED #endif #if defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD) && \ !defined(PNG_NO_ASSEMBLER_CODE) #define PNG_ASSEMBLER_CODE_SUPPORTED #endif #ifndef PNG_NO_FLOATING_POINT_SUPPORTED #define PNG_FLOATING_POINT_SUPPORTED #endif #ifndef PNG_NO_FIXED_POINT_SUPPORTED #define PNG_FIXED_POINT_SUPPORTED #endif #ifdef PNG_NO_GLOBAL_ARRAYS # define PNG_USE_LOCAL_ARRAYS #else # if defined(__GNUC__) && defined(WIN32) # define PNG_NO_GLOBAL_ARRAYS # define PNG_USE_LOCAL_ARRAYS # else # define PNG_USE_GLOBAL_ARRAYS # endif #endif #ifndef PNG_NO_INFO_IMAGE # define PNG_INFO_IMAGE_SUPPORTED #endif #if defined(PNG_tIME_SUPPORTED) # include #endif typedef unsigned long png_uint_32; typedef long png_int_32; typedef unsigned short png_uint_16; typedef short png_int_16; typedef unsigned char png_byte; typedef size_t png_size_t; #ifdef __BORLANDC__ #if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) #define LDATA 1 #else #define LDATA 0 #endif #if !defined(__WIN32__) && !defined(__FLAT__) #define PNG_MAX_MALLOC_64K #if (LDATA != 1) #ifndef FAR #define FAR __far #endif #define USE_FAR_KEYWORD #endif /* LDATA != 1 */ #endif /* __WIN32__, __FLAT__ */ #endif /* __BORLANDC__ */ #if defined(FAR) # if defined(M_I86MM) # define USE_FAR_KEYWORD # define FARDATA FAR # include # endif #endif #ifndef FAR # define FAR #endif #ifndef FARDATA #define FARDATA #endif typedef png_int_32 png_fixed_point; typedef void FAR * png_voidp; typedef png_byte FAR * png_bytep; typedef png_uint_32 FAR * png_uint_32p; typedef png_int_32 FAR * png_int_32p; typedef png_uint_16 FAR * png_uint_16p; typedef png_int_16 FAR * png_int_16p; typedef PNG_CONST char FAR * png_const_charp; typedef char FAR * png_charp; typedef png_fixed_point FAR * png_fixed_point_p; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * png_doublep; #endif typedef png_byte FAR * FAR * png_bytepp; typedef png_uint_32 FAR * FAR * png_uint_32pp; typedef png_int_32 FAR * FAR * png_int_32pp; typedef png_uint_16 FAR * FAR * png_uint_16pp; typedef png_int_16 FAR * FAR * png_int_16pp; typedef PNG_CONST char FAR * FAR * png_const_charpp; typedef char FAR * FAR * png_charpp; typedef png_fixed_point FAR * FAR * png_fixed_point_pp; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * FAR * png_doublepp; #endif typedef char FAR * FAR * FAR * png_charppp; typedef charf * png_zcharp; typedef charf * FAR * png_zcharpp; typedef z_stream FAR * png_zstreamp; #ifndef PNG_EXPORT # if defined(_MSC_VER) && defined(_DLL) # define PNG_EXPORT(type,symbol) type __declspec(dllexport) symbol # endif # ifdef __WIN32DLL__ # define PNG_EXPORT(type,symbol) __declspec(dllexport) type symbol # endif # ifdef ALT_WIN32_DLL # define PNG_EXPORT(type,symbol) type __attribute__((dllexport)) symbol # endif # if defined(__BORLANDC__) && defined(_Windows) && defined(__DLL__) # define PNG_EXPORT(type,symbol) type _export symbol # endif # ifdef __BEOSDLL__ # define PNG_EXPORT(type,symbol) __declspec(export) type symbol # endif #endif #ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) type symbol #endif #if defined(__MINGW32__) || defined(__CYGWIN32__) # define PNG_ATTR_DLLIMP #endif #ifndef PNG_EXPORT_VAR # if defined(_MSC_VER) && defined(_DLL) # define PNG_EXPORT_VAR(type) extern type __declspec(dllexport) # endif # ifdef PNG_DECL_DLLEXP # define PNG_EXPORT_VAR(type) extern __declspec(dllexport) type # endif # ifdef PNG_ATTR_DLLEXP # define PNG_EXPORT_VAR(type) extern type __attribute__((dllexport)) # endif # ifdef PNG_DECL_DLLIMP # define PNG_EXPORT_VAR(type) extern __declspec(dllimport) type # endif # ifdef PNG_ATTR_DLLIMP # define PNG_EXPORT_VAR(type) extern type __attribute__((dllimport)) # endif #endif #ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) extern type #endif #ifndef PNG_ABORT # define PNG_ABORT() abort() #endif #ifdef PNG_SETJMP_SUPPORTED # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #else # define png_jmpbuf(png_ptr) \ (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) #endif #if defined(USE_FAR_KEYWORD) # define CHECK 1 # define NOCHECK 0 # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) # define png_strcpy _fstrcpy # define png_strlen _fstrlen # define png_memcmp _fmemcmp # define png_memcpy _fmemcpy # define png_memset _fmemset #else # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # define png_strcpy strcpy # define png_strlen strlen # define png_memcmp memcmp # define png_memcpy memcpy # define png_memset memset #endif #if (PNG_ZBUF_SIZE > 65536) && defined(PNG_MAX_MALLOC_64K) #undef PNG_ZBUF_SIZE #define PNG_ZBUF_SIZE 65536 #endif #endif /* PNGCONF_H */ #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngerror.c0000644000175000017500000000624310161303544017004 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" static void png_default_error PNGARG((png_structp png_ptr, png_const_charp message)); static void png_default_warning PNGARG((png_structp png_ptr, png_const_charp message)); void png_error(png_structp png_ptr, png_const_charp message) { if (png_ptr->error_fn != NULL) (*(png_ptr->error_fn))(png_ptr, message); png_default_error(png_ptr, message); } void png_warning(png_structp png_ptr, png_const_charp message) { if (png_ptr->warning_fn != NULL) (*(png_ptr->warning_fn))(png_ptr, message); else png_default_warning(png_ptr, message); } #define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97)) static PNG_CONST char png_digit[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static void png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp message) { int iout = 0, iin = 0; while (iin < 4) { int c = png_ptr->chunk_name[iin++]; if (isnonalpha(c)) { buffer[iout++] = '['; buffer[iout++] = png_digit[(c & 0xf0) >> 4]; buffer[iout++] = png_digit[c & 0x0f]; buffer[iout++] = ']'; } else { buffer[iout++] = (png_byte)c; } } if (message == NULL) buffer[iout] = 0; else { buffer[iout++] = ':'; buffer[iout++] = ' '; png_memcpy(buffer+iout, message, 64); buffer[iout+63] = 0; } } void png_chunk_error(png_structp png_ptr, png_const_charp message) { char msg[16+64]; png_format_buffer(png_ptr, msg, message); png_error(png_ptr, msg); } void png_chunk_warning(png_structp png_ptr, png_const_charp message) { char msg[16+64]; png_format_buffer(png_ptr, msg, message); png_warning(png_ptr, msg); } static void png_default_error(png_structp png_ptr, png_const_charp message) { #ifndef PNG_NO_CONSOLE_IO fprintf(stderr, "libpng error: %s\n", message); #endif #ifdef PNG_SETJMP_SUPPORTED # ifdef USE_FAR_KEYWORD { jmp_buf jmpbuf; png_memcpy(jmpbuf,png_ptr->jmpbuf,sizeof(jmp_buf)); longjmp(jmpbuf, 1); } # else longjmp(png_ptr->jmpbuf, 1); # endif #else if (png_ptr == NULL) PNG_ABORT(); #endif } static void png_default_warning(png_structp png_ptr, png_const_charp message) { #ifndef PNG_NO_CONSOLE_IO fprintf(stderr, "libpng warning: %s\n", message); #endif if (png_ptr == NULL) return; } void png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn) { png_ptr->error_ptr = error_ptr; png_ptr->error_fn = error_fn; png_ptr->warning_fn = warning_fn; } png_voidp png_get_error_ptr(png_structp png_ptr) { return ((png_voidp)png_ptr->error_ptr); } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngmem.c0000644000175000017500000001514610161303544016433 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" /* This paragraph added for analog by Jason Linhart */ #ifdef MACOS extern void *mac_png_malloc(unsigned long size); extern void mac_png_free(void *ptr); #define malloc(size) mac_png_malloc(size) #define free(ptr) mac_png_free(ptr) #endif #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) png_voidp png_create_struct(int type) { png_size_t size; png_voidp struct_ptr; if (type == PNG_STRUCT_INFO) size = sizeof(png_info); else if (type == PNG_STRUCT_PNG) size = sizeof(png_struct); else return ((png_voidp)NULL); if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL) { png_memset(struct_ptr, 0, size); } return (struct_ptr); } void png_destroy_struct(png_voidp struct_ptr) { if (struct_ptr != NULL) { farfree (struct_ptr); } } png_voidp png_malloc(png_structp png_ptr, png_uint_32 size) { png_voidp ret; if (png_ptr == NULL || size == 0) return ((png_voidp)NULL); #ifdef PNG_MAX_MALLOC_64K if (size > (png_uint_32)65536L) png_error(png_ptr, "Cannot Allocate > 64K"); #endif if (size == (png_uint_32)65536L) { if (png_ptr->offset_table == NULL) { ret = farmalloc(size); if (ret == NULL || ((png_size_t)ret & 0xffff)) { int num_blocks; png_uint_32 total_size; png_bytep table; int i; png_byte huge * hptr; if (ret != NULL) { farfree(ret); ret = NULL; } if(png_ptr->zlib_window_bits > 14) num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); else num_blocks = 1; if (png_ptr->zlib_mem_level >= 7) num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); else num_blocks++; total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; table = farmalloc(total_size); if (table == NULL) { png_error(png_ptr, "Out Of Memory."); } if ((png_size_t)table & 0xfff0) { png_error(png_ptr, "Farmalloc didn't return normalized pointer"); } png_ptr->offset_table = table; png_ptr->offset_table_ptr = farmalloc(num_blocks * sizeof (png_bytep)); if (png_ptr->offset_table_ptr == NULL) { png_error(png_ptr, "Out Of memory."); } hptr = (png_byte huge *)table; if ((png_size_t)hptr & 0xf) { hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); hptr = hptr + 16L; } for (i = 0; i < num_blocks; i++) { png_ptr->offset_table_ptr[i] = (png_bytep)hptr; hptr = hptr + (png_uint_32)65536L; } png_ptr->offset_table_number = num_blocks; png_ptr->offset_table_count = 0; png_ptr->offset_table_count_free = 0; } } if (png_ptr->offset_table_count >= png_ptr->offset_table_number) png_error(png_ptr, "Out of Memory."); ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; } else ret = farmalloc(size); if (ret == NULL) { png_error(png_ptr, "Out of memory."); } return (ret); } void png_free(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL || ptr == NULL) return; if (png_ptr->offset_table != NULL) { int i; for (i = 0; i < png_ptr->offset_table_count; i++) { if (ptr == png_ptr->offset_table_ptr[i]) { ptr = NULL; png_ptr->offset_table_count_free++; break; } } if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) { farfree(png_ptr->offset_table); farfree(png_ptr->offset_table_ptr); png_ptr->offset_table = NULL; png_ptr->offset_table_ptr = NULL; } } if (ptr != NULL) { farfree(ptr); } } #else /* Not the Borland DOS special memory handler */ png_voidp png_create_struct(int type) { png_size_t size; png_voidp struct_ptr; if (type == PNG_STRUCT_INFO) size = sizeof(png_info); else if (type == PNG_STRUCT_PNG) size = sizeof(png_struct); else return ((png_voidp)NULL); #if defined(__TURBOC__) && !defined(__FLAT__) if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL) #else # if defined(_MSC_VER) && defined(MAXSEG_64K) if ((struct_ptr = (png_voidp)halloc(size,1)) != NULL) # else if ((struct_ptr = (png_voidp)malloc(size)) != NULL) # endif #endif { png_memset(struct_ptr, 0, size); } return (struct_ptr); } void png_destroy_struct(png_voidp struct_ptr) { if (struct_ptr != NULL) { #if defined(__TURBOC__) && !defined(__FLAT__) farfree(struct_ptr); #else # if defined(_MSC_VER) && defined(MAXSEG_64K) hfree(struct_ptr); # else free(struct_ptr); # endif #endif } } png_voidp png_malloc(png_structp png_ptr, png_uint_32 size) { png_voidp ret; if (png_ptr == NULL || size == 0) return ((png_voidp)NULL); #ifdef PNG_MAX_MALLOC_64K if (size > (png_uint_32)65536L) png_error(png_ptr, "Cannot Allocate > 64K"); #endif #if defined(__TURBOC__) && !defined(__FLAT__) ret = farmalloc(size); #else # if defined(_MSC_VER) && defined(MAXSEG_64K) ret = halloc(size, 1); # else ret = malloc((size_t)size); # endif #endif if (ret == NULL) { png_error(png_ptr, "Out of Memory"); } return (ret); } void png_free(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL || ptr == NULL) return; #if defined(__TURBOC__) && !defined(__FLAT__) farfree(ptr); #else # if defined(_MSC_VER) && defined(MAXSEG_64K) hfree(ptr); # else free(ptr); # endif #endif } #endif /* Not Borland DOS special memory handler */ png_voidp png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 length) { png_size_t size; size = (png_size_t)length; if ((png_uint_32)size != length) png_error(png_ptr,"Overflow in png_memcpy_check."); return(png_memcpy (s1, s2, size)); } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngset.c0000644000175000017500000000527310161303544016450 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" void png_set_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_type, int compression_type, int filter_type) { int rowbytes_per_pixel; png_debug1(1, "in %s storage function\n", "IHDR"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->width = width; info_ptr->height = height; info_ptr->bit_depth = (png_byte)bit_depth; info_ptr->color_type =(png_byte) color_type; info_ptr->compression_type = (png_byte)compression_type; info_ptr->filter_type = (png_byte)filter_type; info_ptr->interlace_type = (png_byte)interlace_type; if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) info_ptr->channels = 3; else info_ptr->channels = 1; if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) info_ptr->channels++; info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); rowbytes_per_pixel = (info_ptr->pixel_depth + 7) >> 3; if (( width > PNG_MAX_UINT/rowbytes_per_pixel)) { png_warning(png_ptr, "Width too large to process image data; rowbytes will overflow."); info_ptr->rowbytes = (png_size_t)0; } else info_ptr->rowbytes = (info_ptr->width * info_ptr->pixel_depth + 7) >> 3; } void png_set_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette) { png_debug1(1, "in %s storage function\n", "PLTE"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->palette = palette; info_ptr->num_palette = (png_uint_16)num_palette; info_ptr->valid |= PNG_INFO_PLTE; } #if defined(PNG_tRNS_SUPPORTED) void png_set_tRNS(png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values) { png_debug1(1, "in %s storage function\n", "tRNS"); if (png_ptr == NULL || info_ptr == NULL) return; if (trans != NULL) info_ptr->trans = trans; if (trans_values != NULL) { png_memcpy(&(info_ptr->trans_values), trans_values, sizeof(png_color_16)); if (num_trans == 0) num_trans = 1; } info_ptr->num_trans = (png_uint_16)num_trans; info_ptr->valid |= PNG_INFO_tRNS; } #endif #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngtrans.c0000644000175000017500000000131210161303544016772 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) void png_set_packing(png_structp png_ptr) { png_debug(1, "in png_set_packing\n"); if (png_ptr->bit_depth < 8) { png_ptr->transformations |= PNG_PACK; png_ptr->usr_bit_depth = 8; } } #endif #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngwio.c0000644000175000017500000000757410161303544016461 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" void png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { if (png_ptr->write_data_fn != NULL ) (*(png_ptr->write_data_fn))(png_ptr, data, length); else png_error(png_ptr, "Call to NULL write function"); } #if !defined(PNG_NO_STDIO) #ifndef USE_FAR_KEYWORD static void png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; check = fwrite(data, 1, length, (FILE *)(png_ptr->io_ptr)); if (check != length) { png_error(png_ptr, "Write Error"); } } #else #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) static void png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; png_byte *near_data; FILE *io_ptr; near_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (FILE *)CVT_PTR(png_ptr->io_ptr); if ((png_bytep)near_data == data) { check = fwrite(near_data, 1, length, io_ptr); } else { png_byte buf[NEAR_BUF_SIZE]; png_size_t written, remaining, err; check = 0; remaining = length; do { written = MIN(NEAR_BUF_SIZE, remaining); png_memcpy(buf, data, written); err = fwrite(buf, 1, written, io_ptr); if (err != written) break; else check += err; data += written; remaining -= written; } while (remaining != 0); } if (check != length) { png_error(png_ptr, "Write Error"); } } #endif #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) void png_flush(png_structp png_ptr) { if (png_ptr->output_flush_fn != NULL) (*(png_ptr->output_flush_fn))(png_ptr); } #if !defined(PNG_NO_STDIO) static void png_default_flush(png_structp png_ptr) { FILE *io_ptr; io_ptr = (FILE *)CVT_PTR((png_ptr->io_ptr)); if (io_ptr != NULL) fflush(io_ptr); } #endif #endif void png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) { png_ptr->io_ptr = io_ptr; #if !defined(PNG_NO_STDIO) if (write_data_fn != NULL) png_ptr->write_data_fn = write_data_fn; else png_ptr->write_data_fn = png_default_write_data; #else png_ptr->write_data_fn = write_data_fn; #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) if (output_flush_fn != NULL) png_ptr->output_flush_fn = output_flush_fn; else png_ptr->output_flush_fn = png_default_flush; #else png_ptr->output_flush_fn = output_flush_fn; #endif #endif if (png_ptr->read_data_fn != NULL) { png_ptr->read_data_fn = NULL; png_warning(png_ptr, "Attempted to set both read_data_fn and write_data_fn in"); png_warning(png_ptr, "the same structure. Resetting read_data_fn to NULL."); } } #if defined(USE_FAR_KEYWORD) #if defined(_MSC_VER) void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) { void *near_ptr; void FAR *far_ptr; FP_OFF(near_ptr) = FP_OFF(ptr); far_ptr = (void FAR *)near_ptr; if(check != 0) if(FP_SEG(ptr) != FP_SEG(far_ptr)) png_error(png_ptr,"segment lost in conversion"); return(near_ptr); } #else void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) { void *near_ptr; void FAR *far_ptr; near_ptr = (void FAR *)ptr; far_ptr = (void FAR *)near_ptr; if(check != 0) if(far_ptr != ptr) png_error(png_ptr,"segment lost in conversion"); return(near_ptr); } #endif #endif #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngwrite.c0000644000175000017500000002633310161303544017007 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" void png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_write_info_before_PLTE\n"); if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) { png_write_sig(png_ptr); png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, info_ptr->filter_type, 0); png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; } } void png_write_info(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_write_info\n"); png_write_info_before_PLTE(png_ptr, info_ptr); if (info_ptr->valid & PNG_INFO_PLTE) png_write_PLTE(png_ptr, info_ptr->palette, (png_uint_32)info_ptr->num_palette); else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) png_error(png_ptr, "Valid palette required for paletted images\n"); #if defined(PNG_WRITE_tRNS_SUPPORTED) if (info_ptr->valid & PNG_INFO_tRNS) { png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), info_ptr->num_trans, info_ptr->color_type); } #endif } void png_write_end(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_write_end\n"); if (!(png_ptr->mode & PNG_HAVE_IDAT)) png_error(png_ptr, "No IDATs written into file"); png_ptr->mode |= PNG_AFTER_IDAT; png_write_IEND(png_ptr); } png_structp png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn) { png_structp png_ptr; #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD jmp_buf jmpbuf; #endif #endif png_debug(1, "in png_create_write_struct\n"); if ((png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG)) == NULL) { return ((png_structp)NULL); } #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD if (setjmp(jmpbuf)) #else if (setjmp(png_ptr->jmpbuf)) #endif { png_free(png_ptr, png_ptr->zbuf); png_destroy_struct(png_ptr); return ((png_structp)NULL); } #ifdef USE_FAR_KEYWORD png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf)); #endif #endif png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || (png_libpng_ver[0] == '0' && user_png_ver[2] < '9')) { png_error(png_ptr, "Incompatible libpng version in application and library"); } png_ptr->zbuf_size = PNG_ZBUF_SIZE; png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); png_set_write_fn(png_ptr, NULL, NULL, NULL); #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 1, NULL, NULL); #endif return ((png_structp)png_ptr); } void png_write_image(png_structp png_ptr, png_bytepp image) { png_uint_32 i; int pass, num_pass; png_bytepp rp; png_debug(1, "in png_write_image\n"); num_pass = 1; for (pass = 0; pass < num_pass; pass++) { for (i = 0, rp = image; i < png_ptr->height; i++, rp++) { png_write_row(png_ptr, *rp); } } } void png_write_row(png_structp png_ptr, png_bytep row) { png_debug2(1, "in png_write_row (row %ld, pass %d)\n", png_ptr->row_number, png_ptr->pass); if (png_ptr->row_number == 0 && png_ptr->pass == 0) { png_write_start_row(png_ptr); } png_ptr->row_info.color_type = png_ptr->color_type; png_ptr->row_info.width = png_ptr->usr_width; png_ptr->row_info.channels = png_ptr->usr_channels; png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * png_ptr->row_info.channels); png_ptr->row_info.rowbytes = ((png_ptr->row_info.width * (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3); png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); png_debug1(3, "row_info->width = %d\n", png_ptr->row_info.width); png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); png_debug1(3, "row_info->rowbytes = %d\n", png_ptr->row_info.rowbytes); png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, png_ptr->row_info.rowbytes); if (png_ptr->transformations) png_do_write_transformations(png_ptr); png_write_find_filter(png_ptr, &(png_ptr->row_info)); if (png_ptr->write_row_fn != NULL) (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); } #if defined(PNG_WRITE_FLUSH_SUPPORTED) void png_write_flush(png_structp png_ptr) { int wrote_IDAT; png_debug(1, "in png_write_flush\n"); if (png_ptr->row_number >= png_ptr->num_rows) return; do { int ret; ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); wrote_IDAT = 0; if (ret != Z_OK) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } if (!(png_ptr->zstream.avail_out)) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; wrote_IDAT = 1; } } while(wrote_IDAT == 1); if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } png_ptr->flush_rows = 0; png_flush(png_ptr); } #endif /* PNG_WRITE_FLUSH_SUPPORTED */ void png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) { png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_debug(1, "in png_destroy_write_struct\n"); if (png_ptr_ptr != NULL) { png_ptr = *png_ptr_ptr; } if (info_ptr_ptr != NULL) info_ptr = *info_ptr_ptr; if (info_ptr != NULL) { png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); png_destroy_struct((png_voidp)info_ptr); *info_ptr_ptr = (png_infop)NULL; } if (png_ptr != NULL) { png_write_destroy(png_ptr); png_destroy_struct((png_voidp)png_ptr); *png_ptr_ptr = (png_structp)NULL; } } void png_write_destroy(png_structp png_ptr) { #ifdef PNG_SETJMP_SUPPORTED jmp_buf tmp_jmp; #endif png_error_ptr error_fn; png_error_ptr warning_fn; png_voidp error_ptr; png_debug(1, "in png_write_destroy\n"); deflateEnd(&png_ptr->zstream); png_free(png_ptr, png_ptr->zbuf); png_free(png_ptr, png_ptr->row_buf); png_free(png_ptr, png_ptr->prev_row); png_free(png_ptr, png_ptr->sub_row); png_free(png_ptr, png_ptr->up_row); png_free(png_ptr, png_ptr->avg_row); png_free(png_ptr, png_ptr->paeth_row); #if defined(PNG_TIME_RFC1123_SUPPORTED) png_free(png_ptr, png_ptr->time_buffer); #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_free(png_ptr, png_ptr->prev_filters); png_free(png_ptr, png_ptr->filter_weights); png_free(png_ptr, png_ptr->inv_filter_weights); png_free(png_ptr, png_ptr->filter_costs); png_free(png_ptr, png_ptr->inv_filter_costs); #endif #ifdef PNG_SETJMP_SUPPORTED png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf)); #endif error_fn = png_ptr->error_fn; warning_fn = png_ptr->warning_fn; error_ptr = png_ptr->error_ptr; png_memset(png_ptr, 0, sizeof (png_struct)); png_ptr->error_fn = error_fn; png_ptr->warning_fn = warning_fn; png_ptr->error_ptr = error_ptr; #ifdef PNG_SETJMP_SUPPORTED png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf)); #endif } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) void png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs) { int i; png_debug(1, "in png_set_filter_heuristics\n"); if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) { png_warning(png_ptr, "Unknown filter heuristic method"); return; } if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) { heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; } if (num_weights < 0 || filter_weights == NULL || heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) { num_weights = 0; } png_ptr->num_prev_filters = (png_byte)num_weights; png_ptr->heuristic_method = (png_byte)heuristic_method; if (num_weights > 0) { if (png_ptr->prev_filters == NULL) { png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, (png_uint_32)(sizeof(png_byte) * num_weights)); for (i = 0; i < num_weights; i++) { png_ptr->prev_filters[i] = 255; } } if (png_ptr->filter_weights == NULL) { png_ptr->filter_weights = (png_uint_16p) png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * num_weights)); png_ptr->inv_filter_weights = (png_uint_16p) png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * num_weights)); for (i = 0; i < num_weights; i++) { png_ptr->inv_filter_weights[i] = png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; } } for (i = 0; i < num_weights; i++) { if (filter_weights[i] < 0.0) { png_ptr->inv_filter_weights[i] = png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; } else { png_ptr->inv_filter_weights[i] = (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); png_ptr->filter_weights[i] = (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); } } } if (png_ptr->filter_costs == NULL) { png_ptr->filter_costs = (png_uint_16p) png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); png_ptr->inv_filter_costs = (png_uint_16p) png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) { png_ptr->inv_filter_costs[i] = png_ptr->filter_costs[i] = PNG_COST_FACTOR; } } for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) { if (filter_costs == NULL || filter_costs[i] < 0.0) { png_ptr->inv_filter_costs[i] = png_ptr->filter_costs[i] = PNG_COST_FACTOR; } else if (filter_costs[i] >= 1.0) { png_ptr->inv_filter_costs[i] = (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); png_ptr->filter_costs[i] = (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); } } } #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngwtran.c0000644000175000017500000000711510161303544017005 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" void png_do_write_transformations(png_structp png_ptr) { png_debug(1, "in png_do_write_transformations\n"); if (png_ptr == NULL) return; #if defined(PNG_WRITE_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, (png_uint_32)png_ptr->bit_depth); #endif } #if defined(PNG_WRITE_PACK_SUPPORTED) void png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) { png_debug(1, "in png_do_pack\n"); if (row_info->bit_depth == 8 && #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif row_info->channels == 1) { switch ((int)bit_depth) { case 1: { png_bytep sp, dp; int mask, v; png_uint_32 i; png_uint_32 row_width = row_info->width; sp = row; dp = row; mask = 0x80; v = 0; for (i = 0; i < row_width; i++) { if (*sp != 0) v |= mask; sp++; if (mask > 1) mask >>= 1; else { mask = 0x80; *dp = (png_byte)v; dp++; v = 0; } } if (mask != 0x80) *dp = (png_byte)v; break; } case 2: { png_bytep sp, dp; int shift, v; png_uint_32 i; png_uint_32 row_width = row_info->width; sp = row; dp = row; shift = 6; v = 0; for (i = 0; i < row_width; i++) { png_byte value; value = (png_byte)(*sp & 0x03); v |= (value << shift); if (shift == 0) { shift = 6; *dp = (png_byte)v; dp++; v = 0; } else shift -= 2; sp++; } if (shift != 6) *dp = (png_byte)v; break; } case 4: { png_bytep sp, dp; int shift, v; png_uint_32 i; png_uint_32 row_width = row_info->width; sp = row; dp = row; shift = 4; v = 0; for (i = 0; i < row_width; i++) { png_byte value; value = (png_byte)(*sp & 0x0f); v |= (value << shift); if (shift == 0) { shift = 4; *dp = (png_byte)v; dp++; v = 0; } else shift -= 4; sp++; } if (shift != 4) *dp = (png_byte)v; break; } } row_info->bit_depth = (png_byte)bit_depth; row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); row_info->rowbytes = ((row_info->width * row_info->pixel_depth + 7) >> 3); } } #endif #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/libpng/pngwutil.c0000644000175000017500000006616010161303544017023 0ustar sret1sret100000000000000/********************************* * PNG Graphics Library * *********************************/ /* This file contains code from the PNG reference library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details and copyright statement. */ #ifndef NOGRAPHICS #ifndef HAVE_GD #define PNG_INTERNAL #include "png.h" void png_save_uint_32(png_bytep buf, png_uint_32 i) { buf[0] = (png_byte)((i >> 24) & 0xff); buf[1] = (png_byte)((i >> 16) & 0xff); buf[2] = (png_byte)((i >> 8) & 0xff); buf[3] = (png_byte)(i & 0xff); } void png_write_chunk(png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length) { png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); png_write_chunk_data(png_ptr, data, length); png_write_chunk_end(png_ptr); } void png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, png_uint_32 length) { png_byte buf[4]; png_debug2(0, "Writing %s chunk (%d bytes)\n", chunk_name, length); png_save_uint_32(buf, length); png_write_data(png_ptr, buf, (png_size_t)4); png_write_data(png_ptr, chunk_name, (png_size_t)4); png_reset_crc(png_ptr); png_calculate_crc(png_ptr, chunk_name, (png_size_t)4); } void png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length) { if (data != NULL && length > 0) { png_calculate_crc(png_ptr, data, length); png_write_data(png_ptr, data, length); } } void png_write_chunk_end(png_structp png_ptr) { png_byte buf[4]; png_save_uint_32(buf, png_ptr->crc); png_write_data(png_ptr, buf, (png_size_t)4); } void png_write_sig(png_structp png_ptr) { png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], (png_size_t)8 - png_ptr->sig_bytes); } void png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_type, int filter_type, int interlace_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IHDR; #endif png_byte buf[13]; png_debug(1, "in png_write_IHDR\n"); switch (color_type) { case PNG_COLOR_TYPE_GRAY: switch (bit_depth) { case 1: case 2: case 4: case 8: case 16: png_ptr->channels = 1; break; default: png_error(png_ptr,"Invalid bit depth for grayscale image"); } break; case PNG_COLOR_TYPE_RGB: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for RGB image"); png_ptr->channels = 3; break; case PNG_COLOR_TYPE_PALETTE: switch (bit_depth) { case 1: case 2: case 4: case 8: png_ptr->channels = 1; break; default: png_error(png_ptr, "Invalid bit depth for paletted image"); } break; case PNG_COLOR_TYPE_GRAY_ALPHA: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); png_ptr->channels = 2; break; case PNG_COLOR_TYPE_RGB_ALPHA: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for RGBA image"); png_ptr->channels = 4; break; default: png_error(png_ptr, "Invalid image color type specified"); } if (compression_type != PNG_COMPRESSION_TYPE_BASE) { png_warning(png_ptr, "Invalid compression type specified"); compression_type = PNG_COMPRESSION_TYPE_BASE; } if (filter_type != PNG_FILTER_TYPE_BASE) { png_warning(png_ptr, "Invalid filter type specified"); filter_type = PNG_FILTER_TYPE_BASE; } interlace_type=PNG_INTERLACE_NONE; png_ptr->bit_depth = (png_byte)bit_depth; png_ptr->color_type = (png_byte)color_type; png_ptr->interlaced = (png_byte)interlace_type; png_ptr->width = width; png_ptr->height = height; png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels); png_ptr->rowbytes = ((width * (png_size_t)png_ptr->pixel_depth + 7) >> 3); png_ptr->usr_width = png_ptr->width; png_ptr->usr_bit_depth = png_ptr->bit_depth; png_ptr->usr_channels = png_ptr->channels; png_save_uint_32(buf, width); png_save_uint_32(buf + 4, height); buf[8] = (png_byte)bit_depth; buf[9] = (png_byte)color_type; buf[10] = (png_byte)compression_type; buf[11] = (png_byte)filter_type; buf[12] = (png_byte)interlace_type; png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); png_ptr->zstream.zalloc = png_zalloc; png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; if (!(png_ptr->do_filter)) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || png_ptr->bit_depth < 8) png_ptr->do_filter = PNG_FILTER_NONE; else png_ptr->do_filter = PNG_ALL_FILTERS; } if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) { if (png_ptr->do_filter != PNG_FILTER_NONE) png_ptr->zlib_strategy = Z_FILTERED; else png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; } if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) png_ptr->zlib_mem_level = 8; if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) png_ptr->zlib_window_bits = 15; if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) png_ptr->zlib_method = 8; deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, png_ptr->zlib_method, png_ptr->zlib_window_bits, png_ptr->zlib_mem_level, png_ptr->zlib_strategy); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->mode = PNG_HAVE_IHDR; } void png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_PLTE; #endif png_uint_32 i; png_colorp pal_ptr; png_byte buf[3]; png_debug(1, "in png_write_PLTE\n"); if (( #ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED !png_ptr->empty_plte_permitted && #endif num_pal == 0) || num_pal > 256) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { png_error(png_ptr, "Invalid number of colors in palette"); } else { png_warning(png_ptr, "Invalid number of colors in palette"); return; } } png_ptr->num_palette = (png_uint_16)num_pal; png_debug1(3, "num_palette = %d\n", png_ptr->num_palette); png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, num_pal * 3); for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) { buf[0] = pal_ptr->red; buf[1] = pal_ptr->green; buf[2] = pal_ptr->blue; png_write_chunk_data(png_ptr, buf, (png_size_t)3); } png_write_chunk_end(png_ptr); png_ptr->mode |= PNG_HAVE_PLTE; } void png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IDAT; #endif png_debug(1, "in png_write_IDAT\n"); png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length); png_ptr->mode |= PNG_HAVE_IDAT; } void png_write_IEND(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IEND; #endif png_debug(1, "in png_write_IEND\n"); png_write_chunk(png_ptr, (png_bytep)png_IEND, NULL, (png_size_t)0); png_ptr->mode |= PNG_HAVE_IEND; } void png_write_start_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; #endif png_size_t buf_size; png_debug(1, "in png_write_start_row\n"); buf_size = (png_size_t)(((png_ptr->width * png_ptr->usr_channels * png_ptr->usr_bit_depth + 7) >> 3) + 1); png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; if (png_ptr->do_filter & PNG_FILTER_SUB) { png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; } if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) { png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); png_memset(png_ptr->prev_row, 0, buf_size); if (png_ptr->do_filter & PNG_FILTER_UP) { png_ptr->up_row = (png_bytep )png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; } if (png_ptr->do_filter & PNG_FILTER_AVG) { png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; } if (png_ptr->do_filter & PNG_FILTER_PAETH) { png_ptr->paeth_row = (png_bytep )png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; } } { png_ptr->num_rows = png_ptr->height; png_ptr->usr_width = png_ptr->width; } png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_out = png_ptr->zbuf; } void png_write_finish_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; #endif int ret; png_debug(1, "in png_write_finish_row\n"); png_ptr->row_number++; if (png_ptr->row_number < png_ptr->num_rows) return; do { ret = deflate(&png_ptr->zstream, Z_FINISH); if (ret != Z_OK && ret != Z_STREAM_END) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } if (!(png_ptr->zstream.avail_out) && ret == Z_OK) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } } while (ret != Z_STREAM_END); if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); } deflateReset(&png_ptr->zstream); } #define PNG_MAXSUM (~((png_uint_32)0) >> 1) #define PNG_HISHIFT 10 #define PNG_LOMASK ((png_uint_32)0xffffL) #define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) void png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep prev_row, best_row, row_buf; png_uint_32 mins, bpp; png_byte filter_to_do = png_ptr->do_filter; png_uint_32 row_bytes = row_info->rowbytes; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) int num_p_filters = (int)png_ptr->num_prev_filters; #endif png_debug(1, "in png_write_find_filter\n"); bpp = (row_info->pixel_depth + 7) / 8; prev_row = png_ptr->prev_row; best_row = row_buf = png_ptr->row_buf; mins = PNG_MAXSUM; if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE) { png_bytep rp; png_uint_32 sum = 0; png_uint_32 i; int v; for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) { v = *rp; sum += (v < 128) ? v : 256 - v; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { png_uint_32 sumhi, sumlo; int j; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif mins = sum; } if (filter_to_do == PNG_FILTER_SUB) { png_bytep rp, lp, dp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; i++, rp++, dp++) { *dp = *rp; } for (lp = row_buf + 1; i < row_bytes; i++, rp++, lp++, dp++) { *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); } best_row = png_ptr->sub_row; } else if (filter_to_do & PNG_FILTER_SUB) { png_bytep rp, dp, lp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; i++, rp++, dp++) { v = *dp = *rp; sum += (v < 128) ? v : 256 - v; } for (lp = row_buf + 1; i < row_info->rowbytes; i++, rp++, lp++, dp++) { v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) { sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { mins = sum; best_row = png_ptr->sub_row; } } if (filter_to_do == PNG_FILTER_UP) { png_bytep rp, dp, pp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, pp = prev_row + 1; i < row_bytes; i++, rp++, pp++, dp++) { *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); } best_row = png_ptr->up_row; } else if (filter_to_do & PNG_FILTER_UP) { png_bytep rp, dp, pp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, pp = prev_row + 1; i < row_bytes; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { mins = sum; best_row = png_ptr->up_row; } } if (filter_to_do == PNG_FILTER_AVG) { png_bytep rp, dp, pp, lp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, pp = prev_row + 1; i < bpp; i++) { *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); } for (lp = row_buf + 1; i < row_bytes; i++) { *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); } best_row = png_ptr->avg_row; } else if (filter_to_do & PNG_FILTER_AVG) { png_bytep rp, dp, pp, lp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, pp = prev_row + 1; i < bpp; i++) { v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); sum += (v < 128) ? v : 256 - v; } for (lp = row_buf + 1; i < row_bytes; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { mins = sum; best_row = png_ptr->avg_row; } } if (filter_to_do == PNG_FILTER_PAETH) { png_bytep rp, dp, pp, cp, lp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, pp = prev_row + 1; i < bpp; i++) { *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); } for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) { int a, b, c, pa, pb, pc, p; b = *pp++; c = *cp++; a = *lp++; p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); } best_row = png_ptr->paeth_row; } else if (filter_to_do & PNG_FILTER_PAETH) { png_bytep rp, dp, pp, cp, lp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, pp = prev_row + 1; i < bpp; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); sum += (v < 128) ? v : 256 - v; } for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) { int a, b, c, pa, pb, pc, p; b = *pp++; c = *cp++; a = *lp++; #ifndef PNG_SLOW_PAETH p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; #else /* PNG_SLOW_PAETH */ p = a + b - c; pa = abs(p - a); pb = abs(p - b); pc = abs(p - c); if (pa <= pb && pa <= pc) p = a; else if (pb <= pc) p = b; else p = c; #endif /* PNG_SLOW_PAETH */ v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { best_row = png_ptr->paeth_row; } } png_write_filtered_row(png_ptr, best_row); #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->num_prev_filters > 0) { int j; for (j = 1; j < num_p_filters; j++) { png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; } png_ptr->prev_filters[j] = best_row[0]; } #endif } void png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) { png_debug(1, "in png_write_filtered_row\n"); png_debug1(2, "filter = %d\n", filtered_row[0]); png_ptr->zstream.next_in = filtered_row; png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; do { int ret; ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); if (ret != Z_OK) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } if (!(png_ptr->zstream.avail_out)) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } } while (png_ptr->zstream.avail_in); if (png_ptr->prev_row != NULL) { png_bytep tptr; tptr = png_ptr->prev_row; png_ptr->prev_row = png_ptr->row_buf; png_ptr->row_buf = tptr; } png_write_finish_row(png_ptr); #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_ptr->flush_rows++; if (png_ptr->flush_dist > 0 && png_ptr->flush_rows >= png_ptr->flush_dist) { png_write_flush(png_ptr); } #endif } #endif /* HAVE_GD */ #endif /* NOGRAPHICS */ analog-6.0/src/pcre/0000755000175000017500000000000010161303542014451 5ustar sret1sret100000000000000analog-6.0/src/pcre/LICENSE0000644000175000017500000000317010161303542015457 0ustar sret1sret100000000000000The files in this directory are from version 3.4 of Philip Hazel's PCRE library, but have been heavily modified by Stephen Turner for use in analog. In particular: * All filenames now begin with "pcre"; * Only functions I use in analog have been retained; * All debugging code has been removed; * Most source comments have been removed. Therefore these routines are NOT SUITABLE for use in your own program. Get the latest version of PCRE from http://www.pcre.org/ instead. Many thanks to Philip Hazel for his excellent routines and generous licence. === AUTHOR'S COPYRIGHT AND LICENCE START HERE === Written by: Philip Hazel Copyright (c) 1997-2000 University of Cambridge ----------------------------------------------------------------------------- Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: 1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. 4. If PCRE is embedded in any software that is released under the GNU General Purpose Licence (GPL), then the terms of that licence shall supersede any condition above with which it is incompatible. ----------------------------------------------------------------------------- analog-6.0/src/pcre/Makefile0000644000175000017500000000040210161303542016105 0ustar sret1sret100000000000000# Makefile for analog 6.0, pcre subdirectory # Please read docs/Readme.html, or http://www.analog.cx/ HEADERS = pcre.h pcrechar.h pcreintl.h OBJS = pcre.o all: $(OBJS) pcre.o: pcre.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c pcre.c clean: rm -f *.o *~ analog-6.0/src/pcre/pcre.c0000644000175000017500000022274310161303542015560 0ustar sret1sret100000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file contains code from Philip Hazel's PCRE library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details. */ /* Copyright (c) 1997-2000 University of Cambridge */ #ifndef HAVE_PCRE #include "pcreintl.h" #ifdef __cplusplus #define class pcre_class #endif #define BRASTACK_SIZE 200 #ifdef SUPPORT_UTF8 #define MAXLIT 250 #else #define MAXLIT 255 #endif static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; static const short int escapes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ':', ';', '<', '=', '>', '?', '@', -ESC_A, -ESC_B, 0, -ESC_D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -ESC_S, 0, 0, 0, -ESC_W, 0, 0, -ESC_Z, '[', '\\', ']', '^', '_', '`', 7, -ESC_b, 0, -ESC_d, 27, '\f', 0, 0, 0, 0, 0, 0, 0, '\n', 0, 0, 0, '\r', -ESC_s, '\t', 0, 0, -ESC_w, 0, 0, -ESC_z }; static const char *posix_names[] = { "alpha", "lower", "upper", "alnum", "ascii", "cntrl", "digit", "graph", "print", "punct", "space", "word", "xdigit" }; static const uschar posix_name_lengths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; static const int posix_class_maps[] = { cbit_lower, cbit_upper, -1, cbit_lower, -1, -1, cbit_upper, -1, -1, cbit_digit, cbit_lower, cbit_upper, cbit_print, cbit_cntrl, -1, cbit_cntrl, -1, -1, cbit_digit, -1, -1, cbit_graph, -1, -1, cbit_print, -1, -1, cbit_punct, -1, -1, cbit_space, -1, -1, cbit_word, -1, -1, cbit_xdigit,-1, -1 }; static BOOL compile_regex(int, int, int *, uschar **, const uschar **, const char **, BOOL, int, int *, int *, compile_data *); typedef struct eptrblock { struct eptrblock *prev; const uschar *saved_eptr; } eptrblock; #define match_condassert 0x01 #define match_isgroup 0x02 void *(*pcre_malloc)(size_t) = malloc; void (*pcre_free)(void *) = free; #ifndef SUPPORT_UTF8 #define GETCHARINC(c, eptr) c = *eptr++; #define GETCHARLEN(c, eptr, len) c = *eptr; #define BACKCHAR(eptr) #else /* SUPPORT_UTF8 */ #define GETCHARINC(c, eptr) \ c = *eptr++; \ if (md->utf8 && (c & 0xc0) == 0xc0) \ { \ int a = utf8_table4[c & 0x3f]; \ int s = 6 - a; \ c &= utf8_table3[a]; \ while (a-- > 0) \ { \ c |= (*eptr++ & 0x3f) << s; \ s += 6; \ } \ } #define GETCHARLEN(c, eptr, len) \ c = *eptr; \ len = 1; \ if (md->utf8 && (c & 0xc0) == 0xc0) \ { \ int i; \ int a = utf8_table4[c & 0x3f]; \ int s = 6 - a; \ c &= utf8_table3[a]; \ for (i = 1; i <= a; i++) \ { \ c |= (eptr[i] & 0x3f) << s; \ s += 6; \ } \ len += a; \ } #define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--; #endif #include "pcrechar.h" #ifdef SUPPORT_UTF8 static int utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; static int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; static int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; static uschar utf8_table4[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; static int ord2utf8(int cvalue, uschar *buffer) { register int i, j; for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) if (cvalue <= utf8_table1[i]) break; *buffer++ = utf8_table2[i] | (cvalue & utf8_table3[i]); cvalue >>= 6 - i; for (j = 0; j < i; j++) { *buffer++ = 0x80 | (cvalue & 0x3f); cvalue >>= 6; } return i + 1; } #endif int pcre_fullinfo(const pcre *external_re, const pcre_extra *study_data, int what, void *where) { const real_pcre *re = (const real_pcre *)external_re; const real_pcre_extra *study = (const real_pcre_extra *)study_data; if (re == NULL || where == NULL) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; switch (what) { case PCRE_INFO_OPTIONS: *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; break; case PCRE_INFO_SIZE: *((size_t *)where) = re->size; break; case PCRE_INFO_CAPTURECOUNT: *((int *)where) = re->top_bracket; break; case PCRE_INFO_BACKREFMAX: *((int *)where) = re->top_backref; break; case PCRE_INFO_FIRSTCHAR: *((int *)where) = ((re->options & PCRE_FIRSTSET) != 0)? re->first_char : ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; break; case PCRE_INFO_FIRSTTABLE: *((const uschar **)where) = (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? study->start_bits : NULL; break; case PCRE_INFO_LASTLITERAL: *((int *)where) = ((re->options & PCRE_REQCHSET) != 0)? re->req_char : -1; break; default: return PCRE_ERROR_BADOPTION; } return 0; } static int check_escape(const uschar **ptrptr, const char **errorptr, int bracount, int options, BOOL isclass, compile_data *cd) { const uschar *ptr = *ptrptr; int c, i; c = *(++ptr); if (c == 0) *errorptr = ERR1; else if (c < '0' || c > 'z') {} else if ((i = escapes[c - '0']) != 0) c = i; else { const uschar *oldptr; switch (c) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!isclass) { oldptr = ptr; c -= '0'; while ((cd->ctypes[ptr[1]] & ctype_digit) != 0) c = c * 10 + *(++ptr) - '0'; if (c < 10 || c <= bracount) { c = -(ESC_REF + c); break; } ptr = oldptr; } if ((c = *ptr) >= '8') { ptr--; c = 0; break; } case '0': c -= '0'; while(i++ < 2 && (cd->ctypes[ptr[1]] & ctype_digit) != 0 && ptr[1] != '8' && ptr[1] != '9') c = c * 8 + *(++ptr) - '0'; c &= 255; break; case 'x': #ifdef SUPPORT_UTF8 if (ptr[1] == '{' && (options & PCRE_UTF8) != 0) { const uschar *pt = ptr + 2; register int count = 0; c = 0; while ((cd->ctypes[*pt] & ctype_xdigit) != 0) { count++; c = c * 16 + cd->lcc[*pt] - (((cd->ctypes[*pt] & ctype_digit) != 0)? '0' : 'W'); pt++; } if (*pt == '}') { if (c < 0 || count > 8) *errorptr = ERR34; ptr = pt; break; } } #endif c = 0; while (i++ < 2 && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0) { ptr++; c = c * 16 + cd->lcc[*ptr] - (((cd->ctypes[*ptr] & ctype_digit) != 0)? '0' : 'W'); } break; case 'c': c = *(++ptr); if (c == 0) { *errorptr = ERR2; return 0; } if (c >= 'a' && c <= 'z') c = cd->fcc[c]; c ^= 0x40; break; default: if ((options & PCRE_EXTRA) != 0) switch(c) { default: *errorptr = ERR3; break; } break; } } *ptrptr = ptr; return c; } static BOOL is_counted_repeat(const uschar *p, compile_data *cd) { if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; while ((cd->ctypes[*p] & ctype_digit) != 0) p++; if (*p == '}') return TRUE; if (*p++ != ',') return FALSE; if (*p == '}') return TRUE; if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; while ((cd->ctypes[*p] & ctype_digit) != 0) p++; return (*p == '}'); } static const uschar * read_repeat_counts(const uschar *p, int *minp, int *maxp, const char **errorptr, compile_data *cd) { int min = 0; int max = -1; while ((cd->ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; if (*p == '}') max = min; else { if (*(++p) != '}') { max = 0; while((cd->ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; if (max < min) { *errorptr = ERR4; return p; } } } if (min > 65535 || max > 65535) *errorptr = ERR5; else { *minp = min; *maxp = max; } return p; } static int find_fixedlength(uschar *code, int options) { int length = -1; register int branchlength = 0; register uschar *cc = code + 3; for (;;) { int d; register int op = *cc; if (op >= OP_BRA) op = OP_BRA; switch (op) { case OP_BRA: case OP_ONCE: case OP_COND: d = find_fixedlength(cc, options); if (d < 0) return -1; branchlength += d; do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); cc += 3; break; case OP_ALT: case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_END: if (length < 0) length = branchlength; else if (length != branchlength) return -1; if (*cc != OP_ALT) return length; cc += 3; branchlength = 0; break; case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); cc += 3; break; case OP_REVERSE: cc++; /* Fall through */ case OP_CREF: case OP_OPT: cc++; /* Fall through */ case OP_SOD: case OP_EOD: case OP_EODN: case OP_CIRC: case OP_DOLL: case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: cc++; break; case OP_CHARS: branchlength += *(++cc); #ifdef SUPPORT_UTF8 for (d = 1; d <= *cc; d++) if ((cc[d] & 0xc0) == 0x80) branchlength--; #endif cc += *cc + 1; break; case OP_EXACT: case OP_TYPEEXACT: branchlength += (cc[1] << 8) + cc[2]; cc += 4; break; case OP_NOT_DIGIT: case OP_DIGIT: case OP_NOT_WHITESPACE: case OP_WHITESPACE: case OP_NOT_WORDCHAR: case OP_WORDCHAR: case OP_ANY: branchlength++; cc++; break; case OP_CLASS: cc += (*cc == OP_REF)? 2 : 33; switch (*cc) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: return -1; case OP_CRRANGE: case OP_CRMINRANGE: if ((cc[1] << 8) + cc[2] != (cc[3] << 8) + cc[4]) return -1; branchlength += (cc[1] << 8) + cc[2]; cc += 5; break; default: branchlength++; } break; default: return -1; } } } static BOOL check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd) { int terminator; terminator = *(++ptr); if (*(++ptr) == '^') ptr++; while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; if (*ptr == terminator && ptr[1] == ']') { *endptr = ptr; return TRUE; } return FALSE; } static int check_posix_name(const uschar *ptr, int len) { register int yield = 0; while (posix_name_lengths[yield] != 0) { if (len == posix_name_lengths[yield] && strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; yield++; } return -1; } static BOOL compile_branch(int options, int *brackets, uschar **codeptr, const uschar **ptrptr, const char **errorptr, int *optchanged, int *reqchar, int *countlits, compile_data *cd) { int repeat_type, op_type; int repeat_min, repeat_max; int bravalue, length; int greedy_default, greedy_non_default; int prevreqchar; int condcount = 0; int subcountlits = 0; register int c; register uschar *code = *codeptr; uschar *tempcode; const uschar *ptr = *ptrptr; const uschar *tempptr; uschar *previous = NULL; uschar class[32]; greedy_default = ((options & PCRE_UNGREEDY) != 0); greedy_non_default = greedy_default ^ 1; *reqchar = prevreqchar = -1; *countlits = 0; for (;; ptr++) { BOOL negate_class; int class_charcount; int class_lastchar; int newoptions; int condref; int subreqchar; c = *ptr; if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { while ((c = *(++ptr)) != 0 && c != '\n') ; continue; } } switch(c) { case 0: case '|': case ')': *codeptr = code; *ptrptr = ptr; return TRUE; case '^': previous = NULL; *code++ = OP_CIRC; break; case '$': previous = NULL; *code++ = OP_DOLL; break; case '.': previous = code; *code++ = OP_ANY; break; case '[': previous = code; *code++ = OP_CLASS; if ((c = *(++ptr)) == '^') { negate_class = TRUE; c = *(++ptr); } else negate_class = FALSE; class_charcount = 0; class_lastchar = -1; memset(class, 0, 32 * sizeof(uschar)); do { if (c == 0) { *errorptr = ERR6; goto FAILED; } if (c == '[' && (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax(ptr, &tempptr, cd)) { BOOL local_negate = FALSE; int posix_class, i; register const uschar *cbits = cd->cbits; if (ptr[1] != ':') { *errorptr = ERR31; goto FAILED; } ptr += 2; if (*ptr == '^') { local_negate = TRUE; ptr++; } posix_class = check_posix_name(ptr, tempptr - ptr); if (posix_class < 0) { *errorptr = ERR30; goto FAILED; } if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) posix_class = 0; posix_class *= 3; for (i = 0; i < 3; i++) { int taboffset = posix_class_maps[posix_class + i]; if (taboffset < 0) break; if (local_negate) for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset]; else for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset]; } ptr = tempptr + 1; class_charcount = 10; continue; } if (c == '\\') { c = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd); if (-c == ESC_b) c = '\b'; else if (c < 0) { register const uschar *cbits = cd->cbits; class_charcount = 10; switch (-c) { case ESC_d: for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit]; continue; case ESC_D: for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit]; continue; case ESC_w: for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word]; continue; case ESC_W: for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word]; continue; case ESC_s: for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space]; continue; case ESC_S: for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space]; continue; default: *errorptr = ERR7; goto FAILED; } } #ifdef SUPPORT_UTF8 if (c > 255) { *errorptr = ERR33; goto FAILED; } #endif } if (ptr[1] == '-' && ptr[2] != ']') { int d; ptr += 2; d = *ptr; if (d == 0) { *errorptr = ERR6; goto FAILED; } if (d == '\\') { const uschar *oldptr = ptr; d = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd); #ifdef SUPPORT_UTF8 if (d > 255) { *errorptr = ERR33; goto FAILED; } #endif if (d < 0) { if (d == -ESC_b) d = '\b'; else { ptr = oldptr - 2; goto SINGLE_CHARACTER; } } } if (d < c) { *errorptr = ERR8; goto FAILED; } for (; c <= d; c++) { class[c/8] |= (1 << (c&7)); if ((options & PCRE_CASELESS) != 0) { int uc = cd->fcc[c]; class[uc/8] |= (1 << (uc&7)); } class_charcount++; class_lastchar = c; } continue; } SINGLE_CHARACTER: class [c/8] |= (1 << (c&7)); if ((options & PCRE_CASELESS) != 0) { c = cd->fcc[c]; class[c/8] |= (1 << (c&7)); } class_charcount++; class_lastchar = c; } while ((c = *(++ptr)) != ']'); if (class_charcount == 1 && class_lastchar >= 0) { if (negate_class) { code[-1] = OP_NOT; } else { code[-1] = OP_CHARS; *code++ = 1; } *code++ = class_lastchar; } else { if (negate_class) for (c = 0; c < 32; c++) code[c] = ~class[c]; else memcpy(code, class, 32); code += 32; } break; case '{': if (!is_counted_repeat(ptr+1, cd)) goto NORMAL_CHAR; ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr, cd); if (*errorptr != NULL) goto FAILED; goto REPEAT; case '*': repeat_min = 0; repeat_max = -1; goto REPEAT; case '+': repeat_min = 1; repeat_max = -1; goto REPEAT; case '?': repeat_min = 0; repeat_max = 1; REPEAT: if (previous == NULL) { *errorptr = ERR9; goto FAILED; } if (ptr[1] == '?') { repeat_type = greedy_non_default; ptr++; } else repeat_type = greedy_default; if (*previous == OP_CHARS) { int len = previous[1]; if (repeat_min == 0) *reqchar = prevreqchar; *countlits += repeat_min - 1; if (len == 1) { c = previous[2]; code = previous; } else { c = previous[len+1]; previous[1]--; code--; } op_type = 0; goto OUTPUT_SINGLE_REPEAT; } else if ((int)*previous == OP_NOT) { op_type = OP_NOTSTAR - OP_STAR; c = previous[1]; code = previous; goto OUTPUT_SINGLE_REPEAT; } else if ((int)*previous < OP_EODN || *previous == OP_ANY) { op_type = OP_TYPESTAR - OP_STAR; c = *previous; code = previous; OUTPUT_SINGLE_REPEAT: if (repeat_max == 0) goto END_REPEAT; repeat_type += op_type; if (repeat_min == 0) { if (repeat_max == -1) *code++ = OP_STAR + repeat_type; else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; else { *code++ = OP_UPTO + repeat_type; *code++ = repeat_max >> 8; *code++ = (repeat_max & 255); } } else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_PLUS + repeat_type; else { if (repeat_min != 1) { *code++ = OP_EXACT + op_type; *code++ = repeat_min >> 8; *code++ = (repeat_min & 255); } else if (*previous == OP_CHARS) { if (code == previous) code += 2; else previous[1]++; } else if (*previous == OP_NOT) code++; if (repeat_max < 0) { *code++ = c; *code++ = OP_STAR + repeat_type; } else if (repeat_max != repeat_min) { *code++ = c; repeat_max -= repeat_min; *code++ = OP_UPTO + repeat_type; *code++ = repeat_max >> 8; *code++ = (repeat_max & 255); } } *code++ = c; } else if (*previous == OP_CLASS || *previous == OP_REF) { if (repeat_max == 0) { code = previous; goto END_REPEAT; } if (repeat_min == 0 && repeat_max == -1) *code++ = OP_CRSTAR + repeat_type; else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_CRPLUS + repeat_type; else if (repeat_min == 0 && repeat_max == 1) *code++ = OP_CRQUERY + repeat_type; else { *code++ = OP_CRRANGE + repeat_type; *code++ = repeat_min >> 8; *code++ = repeat_min & 255; if (repeat_max == -1) repeat_max = 0; *code++ = repeat_max >> 8; *code++ = repeat_max & 255; } } else if ((int)*previous >= OP_BRA || (int)*previous == OP_ONCE || (int)*previous == OP_COND) { register int i; int ketoffset = 0; int len = code - previous; uschar *bralink = NULL; if (repeat_max == -1) { register uschar *ket = previous; do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET); ketoffset = code - ket; } if (repeat_min == 0) { if (subcountlits > 0) { *reqchar = prevreqchar; *countlits -= subcountlits; } if (repeat_max == 0) { code = previous; goto END_REPEAT; } if (repeat_max <= 1) { memmove(previous+1, previous, len); code++; *previous++ = OP_BRAZERO + repeat_type; } else { int offset; memmove(previous+4, previous, len); code += 4; *previous++ = OP_BRAZERO + repeat_type; *previous++ = OP_BRA; offset = (bralink == NULL)? 0 : previous - bralink; bralink = previous; *previous++ = offset >> 8; *previous++ = offset & 255; } repeat_max--; } else { for (i = 1; i < repeat_min; i++) { memcpy(code, previous, len); code += len; } if (repeat_max > 0) repeat_max -= repeat_min; } if (repeat_max >= 0) { for (i = repeat_max - 1; i >= 0; i--) { *code++ = OP_BRAZERO + repeat_type; if (i != 0) { int offset; *code++ = OP_BRA; offset = (bralink == NULL)? 0 : code - bralink; bralink = code; *code++ = offset >> 8; *code++ = offset & 255; } memcpy(code, previous, len); code += len; } while (bralink != NULL) { int oldlinkoffset; int offset = code - bralink + 1; uschar *bra = code - offset; oldlinkoffset = (bra[1] << 8) + bra[2]; bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; *code++ = OP_KET; *code++ = bra[1] = offset >> 8; *code++ = bra[2] = (offset & 255); } } else code[-ketoffset] = OP_KETRMAX + repeat_type; } else { *errorptr = ERR11; goto FAILED; } END_REPEAT: previous = NULL; break; case '(': newoptions = options; condref = -1; if (*(++ptr) == '?') { int set, unset; int *optset; switch (*(++ptr)) { case '#': ptr++; while (*ptr != ')') ptr++; continue; case ':': bravalue = OP_BRA; ptr++; break; case '(': bravalue = OP_COND; if ((cd->ctypes[*(++ptr)] & ctype_digit) != 0) { condref = *ptr - '0'; while (*(++ptr) != ')') condref = condref*10 + *ptr - '0'; if (condref == 0) { *errorptr = ERR35; goto FAILED; } ptr++; } else ptr--; break; case '=': bravalue = OP_ASSERT; ptr++; break; case '!': bravalue = OP_ASSERT_NOT; ptr++; break; case '<': switch (*(++ptr)) { case '=': bravalue = OP_ASSERTBACK; ptr++; break; case '!': bravalue = OP_ASSERTBACK_NOT; ptr++; break; default: *errorptr = ERR24; goto FAILED; } break; case '>': bravalue = OP_ONCE; ptr++; break; case 'R': *code++ = OP_RECURSE; ptr++; continue; default: set = unset = 0; optset = &set; while (*ptr != ')' && *ptr != ':') { switch (*ptr++) { case '-': optset = &unset; break; case 'i': *optset |= PCRE_CASELESS; break; case 'm': *optset |= PCRE_MULTILINE; break; case 's': *optset |= PCRE_DOTALL; break; case 'x': *optset |= PCRE_EXTENDED; break; case 'U': *optset |= PCRE_UNGREEDY; break; case 'X': *optset |= PCRE_EXTRA; break; default: *errorptr = ERR12; goto FAILED; } } newoptions = (options | set) & (~unset); if (*ptr == ')') { if ((options & PCRE_INGROUP) != 0 && (options & PCRE_IMS) != (newoptions & PCRE_IMS)) { *code++ = OP_OPT; *code++ = *optchanged = newoptions & PCRE_IMS; } options = newoptions; previous = NULL; continue; } bravalue = OP_BRA; ptr++; } } else { if (++(*brackets) > EXTRACT_MAX) { *errorptr = ERR13; goto FAILED; } bravalue = OP_BRA + *brackets; } previous = (bravalue >= OP_ONCE)? code : NULL; *code = bravalue; tempcode = code; if (!compile_regex( options | PCRE_INGROUP, ((options & PCRE_IMS) != (newoptions & PCRE_IMS))? newoptions & PCRE_IMS : -1, brackets, &tempcode, &ptr, errorptr, (bravalue == OP_ASSERTBACK || bravalue == OP_ASSERTBACK_NOT), condref, &subreqchar, &subcountlits, cd)) goto FAILED; if (bravalue == OP_COND) { uschar *tc = code; condcount = 0; do { condcount++; tc += (tc[1] << 8) | tc[2]; } while (*tc != OP_KET); if (condcount > 2) { *errorptr = ERR27; goto FAILED; } } if (subreqchar > 0 && (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT || (bravalue == OP_COND && condcount == 2))) { prevreqchar = *reqchar; *reqchar = subreqchar; if (bravalue != OP_ASSERT) *countlits += subcountlits; } code = tempcode; if (*ptr != ')') { *errorptr = ERR14; goto FAILED; } break; case '\\': tempptr = ptr; c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd); if (c < 0) { if (-c >= ESC_REF) { previous = code; *code++ = OP_REF; *code++ = -c - ESC_REF; } else { previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; *code++ = -c; } continue; } ptr = tempptr; c = '\\'; NORMAL_CHAR: default: previous = code; *code = OP_CHARS; code += 2; length = 0; do { if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { while ((c = *(++ptr)) != 0 && c != '\n') ; if (c == 0) break; continue; } } if (c == '\\') { tempptr = ptr; c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd); if (c < 0) { ptr = tempptr; break; } #ifdef SUPPORT_UTF8 if (c > 127 && (options & PCRE_UTF8) != 0) { uschar buffer[8]; int len = ord2utf8(c, buffer); for (c = 0; c < len; c++) *code++ = buffer[c]; length += len; continue; } #endif } *code++ = c; length++; } while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0); prevreqchar = (length > 1)? code[-2] : *reqchar; *reqchar = code[-1]; *countlits += length; previous[1] = length; if (length < MAXLIT) ptr--; break; } } FAILED: *ptrptr = ptr; return FALSE; } static BOOL compile_regex(int options, int optchanged, int *brackets, uschar **codeptr, const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int condref, int *reqchar, int *countlits, compile_data *cd) { const uschar *ptr = *ptrptr; uschar *code = *codeptr; uschar *last_branch = code; uschar *start_bracket = code; uschar *reverse_count = NULL; int oldoptions = options & PCRE_IMS; int branchreqchar, branchcountlits; *reqchar = -1; *countlits = INT_MAX; code += 3; if (condref >= 0) { *code++ = OP_CREF; *code++ = condref; } for (;;) { int length; if (optchanged >= 0) { *code++ = OP_OPT; *code++ = optchanged; options = (options & ~PCRE_IMS) | optchanged; } if (lookbehind) { *code++ = OP_REVERSE; reverse_count = code; *code++ = 0; *code++ = 0; } if (!compile_branch(options, brackets, &code, &ptr, errorptr, &optchanged, &branchreqchar, &branchcountlits, cd)) { *ptrptr = ptr; return FALSE; } length = code - last_branch; last_branch[1] = length >> 8; last_branch[2] = length & 255; if (*reqchar != -2) { if (branchreqchar >= 0) { if (*reqchar == -1) *reqchar = branchreqchar; else if (*reqchar != branchreqchar) *reqchar = -2; } else *reqchar = -2; } if (branchcountlits < *countlits) *countlits = branchcountlits; if (lookbehind) { *code = OP_END; length = find_fixedlength(last_branch, options); if (length < 0) { *errorptr = ERR25; *ptrptr = ptr; return FALSE; } reverse_count[0] = (length >> 8); reverse_count[1] = length & 255; } if (*ptr != '|') { length = code - start_bracket; *code++ = OP_KET; *code++ = length >> 8; *code++ = length & 255; if (optchanged >= 0) { *code++ = OP_OPT; *code++ = oldoptions; } *codeptr = code; *ptrptr = ptr; return TRUE; } *code = OP_ALT; last_branch = code; code += 3; ptr++; } } static const uschar* first_significant_code(const uschar *code, int *options, int optbit, BOOL optstop) { for (;;) { switch ((int)*code) { case OP_OPT: if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) { if (optstop) return code; *options = (int)code[1]; } code += 2; break; case OP_CREF: code += 2; break; case OP_WORD_BOUNDARY: case OP_NOT_WORD_BOUNDARY: code++; break; case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do code += (code[1] << 8) + code[2]; while (*code == OP_ALT); code += 3; break; default: return code; } } } static BOOL is_anchored(register const uschar *code, int *options) { do { const uschar *scode = first_significant_code(code + 3, options, PCRE_MULTILINE, FALSE); register int op = *scode; if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_anchored(scode, options)) return FALSE; } else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) && (*options & PCRE_DOTALL) != 0) { if (scode[1] != OP_ANY) return FALSE; } else if (op != OP_SOD && ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) return FALSE; code += (code[1] << 8) + code[2]; } while (*code == OP_ALT); return TRUE; } static BOOL is_startline(const uschar *code) { do { const uschar *scode = first_significant_code(code + 3, NULL, 0, FALSE); register int op = *scode; if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_startline(scode)) return FALSE; } else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR) { if (scode[1] != OP_ANY) return FALSE; } else if (op != OP_CIRC) return FALSE; code += (code[1] << 8) + code[2]; } while (*code == OP_ALT); return TRUE; } static int find_firstchar(const uschar *code, int *options) { register int c = -1; do { int d; const uschar *scode = first_significant_code(code + 3, options, PCRE_CASELESS, TRUE); register int op = *scode; if (op >= OP_BRA) op = OP_BRA; switch(op) { default: return -1; case OP_BRA: case OP_ASSERT: case OP_ONCE: case OP_COND: if ((d = find_firstchar(scode, options)) < 0) return -1; if (c < 0) c = d; else if (c != d) return -1; break; case OP_EXACT: /* Fall through */ scode++; case OP_CHARS: /* Fall through */ scode++; case OP_PLUS: case OP_MINPLUS: if (c < 0) c = scode[1]; else if (c != scode[1]) return -1; break; } code += (code[1] << 8) + code[2]; } while (*code == OP_ALT); return c; } pcre * pcre_compile(const char *pattern, int options, const char **errorptr, int *erroroffset, const unsigned char *tables) { real_pcre *re; int length = 3; int runlength; int c, reqchar, countlits; int bracount = 0; int top_backref = 0; int branch_extra = 0; int branch_newextra; unsigned int brastackptr = 0; size_t size; uschar *code; const uschar *ptr; compile_data compile_block; int brastack[BRASTACK_SIZE]; uschar bralenstack[BRASTACK_SIZE]; #ifndef SUPPORT_UTF8 if ((options & PCRE_UTF8) != 0) { *errorptr = ERR32; return NULL; } #endif if (errorptr == NULL) return NULL; *errorptr = NULL; if (erroroffset == NULL) { *errorptr = ERR16; return NULL; } *erroroffset = 0; if ((options & ~PUBLIC_OPTIONS) != 0) { *errorptr = ERR17; return NULL; } if (tables == NULL) tables = pcre_default_tables; compile_block.lcc = tables + lcc_offset; compile_block.fcc = tables + fcc_offset; compile_block.cbits = tables + cbits_offset; compile_block.ctypes = tables + ctypes_offset; ptr = (const uschar *)(pattern - 1); while ((c = *(++ptr)) != 0) { int min, max; int class_charcount; if ((options & PCRE_EXTENDED) != 0) { if ((compile_block.ctypes[c] & ctype_space) != 0) continue; if (c == '#') { while ((c = *(++ptr)) != 0 && c != '\n') ; continue; } } switch(c) { case '\\': { const uschar *save_ptr = ptr; c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c >= 0) { ptr = save_ptr; c = '\\'; goto NORMAL_CHAR; } } length++; if (c <= -ESC_REF) { int refnum = -c - ESC_REF; if (refnum > top_backref) top_backref = refnum; length++; if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block)) { ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else length += 5; if (ptr[1] == '?') ptr++; } } continue; case '^': case '.': case '$': case '*': case '+': case '?': length++; continue; case '{': if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR; ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else { length--; if (min == 1) length++; else if (min > 0) length += 4; if (max > 0) length += 4; else length += 2; } if (ptr[1] == '?') ptr++; continue; case '|': length += 3 + branch_extra; continue; case '[': class_charcount = 0; if (*(++ptr) == '^') ptr++; do { if (*ptr == '\\') { int ch = check_escape(&ptr, errorptr, bracount, options, TRUE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (-ch == ESC_b) class_charcount++; else class_charcount = 10; } else class_charcount++; ptr++; } while (*ptr != 0 && *ptr != ']'); if (class_charcount == 1) length += 3; else { length += 33; if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block)) { ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if ((min == 0 && (max == 1 || max == -1)) || (min == 1 && max == -1)) length++; else length += 5; if (ptr[1] == '?') ptr++; } } continue; case '(': branch_newextra = 0; if (ptr[1] == '?') { int set, unset; int *optset; switch (c = ptr[2]) { case '#': ptr += 3; while (*ptr != 0 && *ptr != ')') ptr++; if (*ptr == 0) { *errorptr = ERR18; goto PCRE_ERROR_RETURN; } continue; case ':': case '=': case '!': case '>': ptr += 2; break; case 'R': if (ptr[3] != ')') { *errorptr = ERR29; goto PCRE_ERROR_RETURN; } ptr += 3; length += 1; break; case '<': if (ptr[3] == '=' || ptr[3] == '!') { ptr += 3; branch_newextra = 3; length += 3; break; } *errorptr = ERR24; goto PCRE_ERROR_RETURN; case '(': if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0) { ptr += 4; length += 2; while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++; if (*ptr != ')') { *errorptr = ERR26; goto PCRE_ERROR_RETURN; } } else { ptr++; if (ptr[2] != '?' || (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') ) { ptr += 2; *errorptr = ERR28; goto PCRE_ERROR_RETURN; } } break; default: set = unset = 0; optset = &set; ptr += 2; for (;; ptr++) { c = *ptr; switch (c) { case 'i': *optset |= PCRE_CASELESS; continue; case 'm': *optset |= PCRE_MULTILINE; continue; case 's': *optset |= PCRE_DOTALL; continue; case 'x': *optset |= PCRE_EXTENDED; continue; case 'X': *optset |= PCRE_EXTRA; continue; case 'U': *optset |= PCRE_UNGREEDY; continue; case '-': optset = &unset; continue; case ')': if (brastackptr == 0) { options = (options | set) & (~unset); set = unset = 0; } /* Fall through */ case ':': if (((set|unset) & PCRE_IMS) != 0) { length += 4; branch_newextra = 2; if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED; } goto END_OPTIONS; default: *errorptr = ERR12; goto PCRE_ERROR_RETURN; } } END_OPTIONS: if (c == ')') { if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3)) branch_extra += branch_newextra; continue; } } } else bracount++; if (brastackptr >= sizeof(brastack)/sizeof(int)) { *errorptr = ERR19; goto PCRE_ERROR_RETURN; } bralenstack[brastackptr] = branch_extra; branch_extra = branch_newextra; brastack[brastackptr++] = length; length += 3; continue; case ')': length += 3; { int minval = 1; int maxval = 1; int duplength; if (brastackptr > 0) { duplength = length - brastack[--brastackptr]; branch_extra = bralenstack[brastackptr]; } else duplength = 0; if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block)) { ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; } else if (c == '*') { minval = 0; maxval = -1; ptr++; } else if (c == '+') { maxval = -1; ptr++; } else if (c == '?') { minval = 0; ptr++; } if (minval == 0) { length++; if (maxval > 0) length += (maxval - 1) * (duplength + 7); } else { length += (minval - 1) * duplength; if (maxval > minval) length += (maxval - minval) * (duplength + 7) - 6; } } continue; NORMAL_CHAR: default: length += 2; runlength = 0; do { if ((options & PCRE_EXTENDED) != 0) { if ((compile_block.ctypes[c] & ctype_space) != 0) continue; if (c == '#') { while ((c = *(++ptr)) != 0 && c != '\n') ; continue; } } if (c == '\\') { const uschar *saveptr = ptr; c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block); if (*errorptr != NULL) goto PCRE_ERROR_RETURN; if (c < 0) { ptr = saveptr; break; } #ifdef SUPPORT_UTF8 if (c > 127 && (options & PCRE_UTF8) != 0) { int i; for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) if (c <= utf8_table1[i]) break; runlength += i; } #endif } runlength++; } while (runlength < MAXLIT && (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0); ptr--; length += runlength; continue; } } length += 4; if (length > 65539) { *errorptr = ERR20; return NULL; } size = length + offsetof(real_pcre, code[0]); re = (real_pcre *)(pcre_malloc)(size); if (re == NULL) { *errorptr = ERR21; return NULL; } re->magic_number = MAGIC_NUMBER; re->size = size; re->options = options; re->tables = tables; ptr = (const uschar *)pattern; code = re->code; *code = OP_BRA; bracount = 0; (void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, -1, &reqchar, &countlits, &compile_block); re->top_bracket = bracount; re->top_backref = top_backref; if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22; *code++ = OP_END; if (top_backref > re->top_bracket) *errorptr = ERR15; if (*errorptr != NULL) { (pcre_free)(re); PCRE_ERROR_RETURN: *erroroffset = ptr - (const uschar *)pattern; return NULL; } if ((options & PCRE_ANCHORED) == 0) { int temp_options = options; if (is_anchored(re->code, &temp_options)) re->options |= PCRE_ANCHORED; else { int ch = find_firstchar(re->code, &temp_options); if (ch >= 0) { re->first_char = ch; re->options |= PCRE_FIRSTSET; } else if (is_startline(re->code)) re->options |= PCRE_STARTLINE; } } if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0)) { re->req_char = reqchar; re->options |= PCRE_REQCHSET; } return (pcre *)re; } static BOOL match_ref(int offset, register const uschar *eptr, int length, match_data *md, unsigned long int ims) { const uschar *p = md->start_subject + md->offset_vector[offset]; if (length > md->end_subject - eptr) return FALSE; if ((ims & PCRE_CASELESS) != 0) { while (length-- > 0) if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; } else { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } return TRUE; } static BOOL match(register const uschar *eptr, register const uschar *ecode, int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, int flags) { unsigned long int original_ims = ims; /* Save for resetting on ')' */ eptrblock newptrb; if ((flags & match_isgroup) != 0) { newptrb.prev = eptrb; newptrb.saved_eptr = eptr; eptrb = &newptrb; } for (;;) { int op = (int)*ecode; int min, max, ctype; register int i; register int c; BOOL minimize = FALSE; if (op > OP_BRA) { int number = op - OP_BRA; int offset = number << 1; if (offset < md->offset_max) { int save_offset1 = md->offset_vector[offset]; int save_offset2 = md->offset_vector[offset+1]; int save_offset3 = md->offset_vector[md->offset_end - number]; md->offset_vector[md->offset_end - number] = eptr - md->start_subject; do { if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); md->offset_vector[offset] = save_offset1; md->offset_vector[offset+1] = save_offset2; md->offset_vector[md->offset_end - number] = save_offset3; return FALSE; } else op = OP_BRA; } switch(op) { case OP_BRA: do { if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); return FALSE; case OP_COND: if (ecode[3] == OP_CREF) { int offset = ecode[4] << 1; return match(eptr, ecode + ((offset < offset_top && md->offset_vector[offset] >= 0)? 5 : 3 + (ecode[1] << 8) + ecode[2]), offset_top, md, ims, eptrb, match_isgroup); } else { if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_condassert | match_isgroup)) { ecode += 3 + (ecode[4] << 8) + ecode[5]; while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2]; } else ecode += (ecode[1] << 8) + ecode[2]; return match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup); } case OP_CREF: ecode += 2; break; case OP_END: if (md->notempty && eptr == md->start_match) return FALSE; md->end_match_ptr = eptr; md->end_offset_top = offset_top; return TRUE; case OP_OPT: ims = ecode[1]; ecode += 2; break; case OP_ASSERT: case OP_ASSERTBACK: do { if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) break; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); if (*ecode == OP_KET) return FALSE; if ((flags & match_condassert) != 0) return TRUE; do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); ecode += 3; offset_top = md->end_offset_top; continue; case OP_ASSERT_NOT: case OP_ASSERTBACK_NOT: do { if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) return FALSE; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); if ((flags & match_condassert) != 0) return TRUE; ecode += 3; continue; case OP_REVERSE: #ifdef SUPPORT_UTF8 c = (ecode[1] << 8) + ecode[2]; for (i = 0; i < c; i++) { eptr--; BACKCHAR(eptr) } #else eptr -= (ecode[1] << 8) + ecode[2]; #endif if (eptr < md->start_subject) return FALSE; ecode += 3; break; case OP_RECURSE: { BOOL rc; int *save; int stacksave[15]; c = md->offset_max; if (c < 16) save = stacksave; else { save = (int *)(pcre_malloc)((c+1) * sizeof(int)); if (save == NULL) { save = stacksave; c = 15; } } for (i = 1; i <= c; i++) save[i] = md->offset_vector[md->offset_end - i]; rc = match(eptr, md->start_pattern, offset_top, md, ims, eptrb, match_isgroup); for (i = 1; i <= c; i++) md->offset_vector[md->offset_end - i] = save[i]; if (save != stacksave) (pcre_free)(save); if (!rc) return FALSE; offset_top = md->end_offset_top; eptr = md->end_match_ptr; ecode++; } break; case OP_ONCE: { const uschar *prev = ecode; const uschar *saved_eptr = eptr; do { if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) break; ecode += (ecode[1] << 8) + ecode[2]; } while (*ecode == OP_ALT); if (*ecode != OP_ONCE && *ecode != OP_ALT) return FALSE; do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); offset_top = md->end_offset_top; eptr = md->end_match_ptr; if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 3; break; } if (ecode[3] == OP_OPT) { ims = (ims & ~PCRE_IMS) | ecode[4]; } if (*ecode == OP_KETRMIN) { if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) || match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; } else { if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE; } } return FALSE; case OP_ALT: do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); break; case OP_BRAZERO: { const uschar *next = ecode+1; if (match(eptr, next, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); ecode = next + 3; } break; case OP_BRAMINZERO: { const uschar *next = ecode+1; do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); if (match(eptr, next+3, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; ecode++; } break; case OP_KET: case OP_KETRMIN: case OP_KETRMAX: { const uschar *prev = ecode - (ecode[1] << 8) - ecode[2]; const uschar *saved_eptr = eptrb->saved_eptr; eptrb = eptrb->prev; if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || *prev == OP_ONCE) { md->end_match_ptr = eptr; md->end_offset_top = offset_top; return TRUE; } if (*prev != OP_COND) { int number = *prev - OP_BRA; int offset = number << 1; if (number > 0) { if (offset >= md->offset_max) md->offset_overflow = TRUE; else { md->offset_vector[offset] = md->offset_vector[md->offset_end - number]; md->offset_vector[offset+1] = eptr - md->start_subject; if (offset_top <= offset) offset_top = offset + 2; } } } ims = original_ims; if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 3; break; } if (*ecode == OP_KETRMIN) { if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) || match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) return TRUE; } else { if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE; } } return FALSE; case OP_CIRC: if (md->notbol && eptr == md->start_subject) return FALSE; if ((ims & PCRE_MULTILINE) != 0) { if (eptr != md->start_subject && eptr[-1] != '\n') return FALSE; ecode++; break; } case OP_SOD: if (eptr != md->start_subject) return FALSE; ecode++; break; case OP_DOLL: if ((ims & PCRE_MULTILINE) != 0) { if (eptr < md->end_subject) { if (*eptr != '\n') return FALSE; } else { if (md->noteol) return FALSE; } ecode++; break; } else { if (md->noteol) return FALSE; if (!md->endonly) { if (eptr < md->end_subject - 1 || (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE; ecode++; break; } } case OP_EOD: if (eptr < md->end_subject) return FALSE; ecode++; break; case OP_EODN: if (eptr < md->end_subject - 1 || (eptr == md->end_subject - 1 && *eptr != '\n')) return FALSE; ecode++; break; case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: { BOOL prev_is_word = (eptr != md->start_subject) && ((md->ctypes[eptr[-1]] & ctype_word) != 0); BOOL cur_is_word = (eptr < md->end_subject) && ((md->ctypes[*eptr] & ctype_word) != 0); if ((*ecode++ == OP_WORD_BOUNDARY)? cur_is_word == prev_is_word : cur_is_word != prev_is_word) return FALSE; } break; case OP_ANY: if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == '\n') return FALSE; if (eptr++ >= md->end_subject) return FALSE; #ifdef SUPPORT_UTF8 if (md->utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; #endif ecode++; break; case OP_NOT_DIGIT: if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype_digit) != 0) return FALSE; ecode++; break; case OP_DIGIT: if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype_digit) == 0) return FALSE; ecode++; break; case OP_NOT_WHITESPACE: if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype_space) != 0) return FALSE; ecode++; break; case OP_WHITESPACE: if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype_space) == 0) return FALSE; ecode++; break; case OP_NOT_WORDCHAR: if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype_word) != 0) return FALSE; ecode++; break; case OP_WORDCHAR: if (eptr >= md->end_subject || (md->ctypes[*eptr++] & ctype_word) == 0) return FALSE; ecode++; break; case OP_REF: { int length; int offset = ecode[1] << 1; ecode += 2; length = (offset >= offset_top || md->offset_vector[offset] < 0)? md->end_subject - eptr + 1 : md->offset_vector[offset+1] - md->offset_vector[offset]; switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; max = rep_max[c]; if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = (ecode[1] << 8) + ecode[2]; max = (ecode[3] << 8) + ecode[4]; if (max == 0) max = INT_MAX; ecode += 5; break; default: if (!match_ref(offset, eptr, length, md, ims)) return FALSE; eptr += length; continue; } if (length == 0) continue; for (i = 1; i <= min; i++) { if (!match_ref(offset, eptr, length, md, ims)) return FALSE; eptr += length; } if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || !match_ref(offset, eptr, length, md, ims)) return FALSE; eptr += length; } } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (!match_ref(offset, eptr, length, md, ims)) break; eptr += length; } while (eptr >= pp) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; eptr -= length; } return FALSE; } } case OP_CLASS: { const uschar *data = ecode + 1; ecode += 33; switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; max = rep_max[c]; if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = (ecode[1] << 8) + ecode[2]; max = (ecode[3] << 8) + ecode[4]; if (max == 0) max = INT_MAX; ecode += 5; break; default: min = max = 1; break; } for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) return FALSE; GETCHARINC(c, eptr) #ifdef SUPPORT_UTF8 if (c > 255) return FALSE; #endif if ((data[c/8] & (1 << (c&7))) != 0) continue; return FALSE; } if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject) return FALSE; GETCHARINC(c, eptr) #ifdef SUPPORT_UTF8 if (c > 255) return FALSE; #endif if ((data[c/8] & (1 << (c&7))) != 0) continue; return FALSE; } } else { const uschar *pp = eptr; int len = 1; for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len) #ifdef SUPPORT_UTF8 if (c > 255) break; #endif if ((data[c/8] & (1 << (c&7))) == 0) break; eptr += len; } while (eptr >= pp) { if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; #ifdef SUPPORT_UTF8 BACKCHAR(eptr) #endif } return FALSE; } } case OP_CHARS: { register int length = ecode[1]; ecode += 2; if (length > md->end_subject - eptr) return FALSE; if ((ims & PCRE_CASELESS) != 0) { while (length-- > 0) if (md->lcc[*ecode++] != md->lcc[*eptr++]) return FALSE; } else { while (length-- > 0) if (*ecode++ != *eptr++) return FALSE; } } break; case OP_EXACT: min = max = (ecode[1] << 8) + ecode[2]; ecode += 3; goto REPEATCHAR; case OP_UPTO: case OP_MINUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; minimize = *ecode == OP_MINUPTO; ecode += 3; goto REPEATCHAR; case OP_STAR: case OP_MINSTAR: case OP_PLUS: case OP_MINPLUS: case OP_QUERY: case OP_MINQUERY: c = *ecode++ - OP_STAR; minimize = (c & 1) != 0; min = rep_min[c]; max = rep_max[c]; if (max == 0) max = INT_MAX; REPEATCHAR: if (min > md->end_subject - eptr) return FALSE; c = *ecode++; if ((ims & PCRE_CASELESS) != 0) { c = md->lcc[c]; for (i = 1; i <= min; i++) if (c != md->lcc[*eptr++]) return FALSE; if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c != md->lcc[*eptr++]) return FALSE; } } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c != md->lcc[*eptr]) break; eptr++; } while (eptr >= pp) if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } else { for (i = 1; i <= min; i++) if (c != *eptr++) return FALSE; if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE; } } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c != *eptr) break; eptr++; } while (eptr >= pp) if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } case OP_NOT: if (eptr >= md->end_subject) return FALSE; ecode++; if ((ims & PCRE_CASELESS) != 0) { if (md->lcc[*ecode++] == md->lcc[*eptr++]) return FALSE; } else { if (*ecode++ == *eptr++) return FALSE; } break; case OP_NOTEXACT: min = max = (ecode[1] << 8) + ecode[2]; ecode += 3; goto REPEATNOTCHAR; case OP_NOTUPTO: case OP_NOTMINUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; minimize = *ecode == OP_NOTMINUPTO; ecode += 3; goto REPEATNOTCHAR; case OP_NOTSTAR: case OP_NOTMINSTAR: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTQUERY: case OP_NOTMINQUERY: c = *ecode++ - OP_NOTSTAR; minimize = (c & 1) != 0; min = rep_min[c]; max = rep_max[c]; if (max == 0) max = INT_MAX; REPEATNOTCHAR: if (min > md->end_subject - eptr) return FALSE; c = *ecode++; if ((ims & PCRE_CASELESS) != 0) { c = md->lcc[c]; for (i = 1; i <= min; i++) if (c == md->lcc[*eptr++]) return FALSE; if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c == md->lcc[*eptr++]) return FALSE; } } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c == md->lcc[*eptr]) break; eptr++; } while (eptr >= pp) if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } else { for (i = 1; i <= min; i++) if (c == *eptr++) return FALSE; if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE; } } else { const uschar *pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || c == *eptr) break; eptr++; } while (eptr >= pp) if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; return FALSE; } } case OP_TYPEEXACT: min = max = (ecode[1] << 8) + ecode[2]; minimize = TRUE; ecode += 3; goto REPEATTYPE; case OP_TYPEUPTO: case OP_TYPEMINUPTO: min = 0; max = (ecode[1] << 8) + ecode[2]; minimize = *ecode == OP_TYPEMINUPTO; ecode += 3; goto REPEATTYPE; case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: c = *ecode++ - OP_TYPESTAR; minimize = (c & 1) != 0; min = rep_min[c]; max = rep_max[c]; if (max == 0) max = INT_MAX; REPEATTYPE: ctype = *ecode++; if (min > md->end_subject - eptr) return FALSE; if (min > 0) switch(ctype) { case OP_ANY: #ifdef SUPPORT_UTF8 if (md->utf8) { for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || (*eptr++ == '\n' && (ims & PCRE_DOTALL) == 0)) return FALSE; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } break; } #endif if ((ims & PCRE_DOTALL) == 0) { for (i = 1; i <= min; i++) if (*eptr++ == '\n') return FALSE; } else eptr += min; break; case OP_NOT_DIGIT: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_digit) != 0) return FALSE; break; case OP_DIGIT: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_digit) == 0) return FALSE; break; case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_space) != 0) return FALSE; break; case OP_WHITESPACE: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_space) == 0) return FALSE; break; case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_word) != 0) return FALSE; break; case OP_WORDCHAR: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_word) == 0) return FALSE; break; } if (min == max) continue; if (minimize) { for (i = min;; i++) { if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; if (i >= max || eptr >= md->end_subject) return FALSE; c = *eptr++; switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0 && c == '\n') return FALSE; #ifdef SUPPORT_UTF8 if (md->utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; #endif break; case OP_NOT_DIGIT: if ((md->ctypes[c] & ctype_digit) != 0) return FALSE; break; case OP_DIGIT: if ((md->ctypes[c] & ctype_digit) == 0) return FALSE; break; case OP_NOT_WHITESPACE: if ((md->ctypes[c] & ctype_space) != 0) return FALSE; break; case OP_WHITESPACE: if ((md->ctypes[c] & ctype_space) == 0) return FALSE; break; case OP_NOT_WORDCHAR: if ((md->ctypes[c] & ctype_word) != 0) return FALSE; break; case OP_WORDCHAR: if ((md->ctypes[c] & ctype_word) == 0) return FALSE; break; } } } else { const uschar *pp = eptr; switch(ctype) { case OP_ANY: #ifdef SUPPORT_UTF8 if (md->utf8 && max < INT_MAX) { if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || *eptr++ == '\n') break; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } else { for (i = min; i < max; i++) { eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } break; } #endif if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || *eptr == '\n') break; eptr++; } } else { c = max - min; if (c > md->end_subject - eptr) c = md->end_subject - eptr; eptr += c; } break; case OP_NOT_DIGIT: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) break; eptr++; } break; case OP_DIGIT: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) break; eptr++; } break; case OP_NOT_WHITESPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) break; eptr++; } break; case OP_WHITESPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) break; eptr++; } break; case OP_NOT_WORDCHAR: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) break; eptr++; } break; case OP_WORDCHAR: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) break; eptr++; } break; } while (eptr >= pp) { if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; #ifdef SUPPORT_UTF8 if (md->utf8) while (eptr > pp && (*eptr & 0xc0) == 0x80) eptr--; #endif } return FALSE; } default: md->errorcode = PCRE_ERROR_UNKNOWN_NODE; return FALSE; } } } int pcre_exec(const pcre *external_re, const pcre_extra *external_extra, const char *subject, int length, int start_offset, int options, int *offsets, int offsetcount) { int resetcount, ocount; int first_char = -1; int req_char = -1; int req_char2 = -1; unsigned long int ims = 0; match_data match_block; const uschar *start_bits = NULL; const uschar *start_match = (const uschar *)subject + start_offset; const uschar *end_subject; const uschar *req_char_ptr = start_match - 1; const real_pcre *re = (const real_pcre *)external_re; const real_pcre_extra *extra = (const real_pcre_extra *)external_extra; BOOL using_temporary_offsets = FALSE; BOOL anchored = ((re->options | options) & PCRE_ANCHORED) != 0; BOOL startline = (re->options & PCRE_STARTLINE) != 0; if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; match_block.start_pattern = re->code; match_block.start_subject = (const uschar *)subject; match_block.end_subject = match_block.start_subject + length; end_subject = match_block.end_subject; match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; match_block.utf8 = (re->options & PCRE_UTF8) != 0; match_block.notbol = (options & PCRE_NOTBOL) != 0; match_block.noteol = (options & PCRE_NOTEOL) != 0; match_block.notempty = (options & PCRE_NOTEMPTY) != 0; match_block.errorcode = PCRE_ERROR_NOMATCH; match_block.lcc = re->tables + lcc_offset; match_block.ctypes = re->tables + ctypes_offset; ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); ocount = offsetcount - (offsetcount % 3); if (re->top_backref > 0 && re->top_backref >= ocount/3) { ocount = re->top_backref * 3 + 3; match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY; using_temporary_offsets = TRUE; } else match_block.offset_vector = offsets; match_block.offset_end = ocount; match_block.offset_max = (2*ocount)/3; match_block.offset_overflow = FALSE; resetcount = 2 + re->top_bracket * 2; if (resetcount > offsetcount) resetcount = ocount; if (match_block.offset_vector != NULL) { register int *iptr = match_block.offset_vector + ocount; register int *iend = iptr - resetcount/2 + 1; while (--iptr >= iend) *iptr = -1; } if (!anchored) { if ((re->options & PCRE_FIRSTSET) != 0) { first_char = re->first_char; if ((ims & PCRE_CASELESS) != 0) first_char = match_block.lcc[first_char]; } else if (!startline && extra != NULL && (extra->options & PCRE_STUDY_MAPPED) != 0) start_bits = extra->start_bits; } if ((re->options & PCRE_REQCHSET) != 0) { req_char = re->req_char; req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0)? (re->tables + fcc_offset)[req_char] : req_char; } do { int rc; register int *iptr = match_block.offset_vector; register int *iend = iptr + resetcount; while (iptr < iend) *iptr++ = -1; if (first_char >= 0) { if ((ims & PCRE_CASELESS) != 0) while (start_match < end_subject && match_block.lcc[*start_match] != first_char) start_match++; else while (start_match < end_subject && *start_match != first_char) start_match++; } else if (startline) { if (start_match > match_block.start_subject + start_offset) { while (start_match < end_subject && start_match[-1] != '\n') start_match++; } } else if (start_bits != NULL) { while (start_match < end_subject) { register int c = *start_match; if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break; } } if (req_char >= 0) { register const uschar *p = start_match + ((first_char >= 0)? 1 : 0); if (p > req_char_ptr) { if (req_char == req_char2) { while (p < end_subject) { if (*p++ == req_char) { p--; break; } } } else { while (p < end_subject) { register int pp = *p++; if (pp == req_char || pp == req_char2) { p--; break; } } } if (p >= end_subject) break; req_char_ptr = p; } } match_block.start_match = start_match; if (!match(start_match, re->code, 2, &match_block, ims, NULL, match_isgroup)) continue; if (using_temporary_offsets) { if (offsetcount >= 4) { memcpy(offsets + 2, match_block.offset_vector + 2, (offsetcount - 2) * sizeof(int)); } if (match_block.end_offset_top > offsetcount) match_block.offset_overflow = TRUE; (pcre_free)(match_block.offset_vector); } rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2; if (match_block.offset_end < 2) rc = 0; else { offsets[0] = start_match - match_block.start_subject; offsets[1] = match_block.end_match_ptr - match_block.start_subject; } return rc; } while (!anchored && match_block.errorcode == PCRE_ERROR_NOMATCH && start_match++ < end_subject); if (using_temporary_offsets) { (pcre_free)(match_block.offset_vector); } return match_block.errorcode; } #endif /* HAVE_PCRE */ analog-6.0/src/pcre/pcre.h0000644000175000017500000000404010161303542015551 0ustar sret1sret100000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file contains code from Philip Hazel's PCRE library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details. */ /* Copyright (c) 1997-2000 University of Cambridge */ #ifdef HAVE_PCRE #include #else #ifndef _PCRE_H #define _PCRE_H #define PCRE_MAJOR 3 #define PCRE_MINOR 4 #define PCRE_DATE 22-Aug-2000 #define SUPPORT_UTF8 #include #ifdef __cplusplus extern "C" { #endif #define PCRE_CASELESS 0x0001 #define PCRE_MULTILINE 0x0002 #define PCRE_DOTALL 0x0004 #define PCRE_EXTENDED 0x0008 #define PCRE_ANCHORED 0x0010 #define PCRE_DOLLAR_ENDONLY 0x0020 #define PCRE_EXTRA 0x0040 #define PCRE_NOTBOL 0x0080 #define PCRE_NOTEOL 0x0100 #define PCRE_UNGREEDY 0x0200 #define PCRE_NOTEMPTY 0x0400 #define PCRE_UTF8 0x0800 #define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_UNKNOWN_NODE (-5) #define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOSUBSTRING (-7) #define PCRE_INFO_OPTIONS 0 #define PCRE_INFO_SIZE 1 #define PCRE_INFO_CAPTURECOUNT 2 #define PCRE_INFO_BACKREFMAX 3 #define PCRE_INFO_FIRSTCHAR 4 #define PCRE_INFO_FIRSTTABLE 5 #define PCRE_INFO_LASTLITERAL 6 typedef void pcre; typedef void pcre_extra; extern void *(*pcre_malloc)(size_t); extern void (*pcre_free)(void *); extern pcre *pcre_compile(const char *, int, const char **, int *, const unsigned char *); extern int pcre_exec(const pcre *, const pcre_extra *, const char *, int, int, int, int *, int); extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* _PCRE_H */ #endif /* HAVE_PCRE */ analog-6.0/src/pcre/pcrechar.h0000644000175000017500000001504010161303542016411 0ustar sret1sret100000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file contains code from Philip Hazel's PCRE library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details. */ /* Copyright (c) 1997-2000 University of Cambridge */ #ifndef HAVE_PCRE static unsigned char pcre_default_tables[] = { /* This table is a lower casing table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table is a case flipping table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table contains bit maps for various character classes. */ 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* This table identifies various classes of character by individual bits: 0x01 white space character 0x02 letter 0x04 decimal digit 0x08 hexadecimal digit 0x10 alphanumeric or '_' 0x80 regular expression metacharacter or binary zero */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ 0x12,0x12,0x12,0x80,0x00,0x00,0x80,0x10, /* X - _ */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ #endif /* HAVE_PCRE */ analog-6.0/src/pcre/pcreintl.h0000644000175000017500000001330510161303542016444 0ustar sret1sret100000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file contains code from Philip Hazel's PCRE library, heavily modified by Stephen Turner for use in analog. See the file LICENSE in this directory for details. */ /* Copyright (c) 1997-2000 University of Cambridge */ #ifndef HAVE_PCRE #include #include #include #include #include #include #include "pcre.h" #ifndef offsetof #define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) #endif #define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) #define PCRE_FIRSTSET 0x40000000 #define PCRE_REQCHSET 0x20000000 #define PCRE_STARTLINE 0x10000000 #define PCRE_INGROUP 0x08000000 #define PCRE_ICHANGED 0x04000000 #define PCRE_STUDY_MAPPED 0x01 #define PUBLIC_OPTIONS \ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8) #define PUBLIC_EXEC_OPTIONS \ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY) #define PUBLIC_STUDY_OPTIONS 0 #define MAGIC_NUMBER 0x50435245UL typedef int BOOL; #undef FALSE #define FALSE 0 #undef TRUE #define TRUE 1 enum { ESC_A = 1, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w, ESC_Z, ESC_z, ESC_REF }; enum { OP_END, OP_SOD, OP_NOT_WORD_BOUNDARY, OP_WORD_BOUNDARY, OP_NOT_DIGIT, OP_DIGIT, OP_NOT_WHITESPACE, OP_WHITESPACE, OP_NOT_WORDCHAR, OP_WORDCHAR, OP_EODN, OP_EOD, OP_OPT, OP_CIRC, OP_DOLL, OP_ANY, OP_CHARS, OP_NOT, OP_STAR, OP_MINSTAR, OP_PLUS, OP_MINPLUS, OP_QUERY, OP_MINQUERY, OP_UPTO, OP_MINUPTO, OP_EXACT, OP_NOTSTAR, OP_NOTMINSTAR, OP_NOTPLUS, OP_NOTMINPLUS, OP_NOTQUERY, OP_NOTMINQUERY, OP_NOTUPTO, OP_NOTMINUPTO, OP_NOTEXACT, OP_TYPESTAR, OP_TYPEMINSTAR, OP_TYPEPLUS, OP_TYPEMINPLUS, OP_TYPEQUERY, OP_TYPEMINQUERY, OP_TYPEUPTO, OP_TYPEMINUPTO, OP_TYPEEXACT, OP_CRSTAR, OP_CRMINSTAR, OP_CRPLUS, OP_CRMINPLUS, OP_CRQUERY, OP_CRMINQUERY, OP_CRRANGE, OP_CRMINRANGE, OP_CLASS, OP_REF, OP_RECURSE, OP_ALT, OP_KET, OP_KETRMAX, OP_KETRMIN, OP_ASSERT, OP_ASSERT_NOT, OP_ASSERTBACK, OP_ASSERTBACK_NOT, OP_REVERSE, OP_ONCE, OP_COND, OP_CREF, OP_BRAZERO, OP_BRAMINZERO, OP_BRA }; #define EXTRACT_MAX 99 #define ERR1 "\\ at end of pattern" #define ERR2 "\\c at end of pattern" #define ERR3 "unrecognized character follows \\" #define ERR4 "numbers out of order in {} quantifier" #define ERR5 "number too big in {} quantifier" #define ERR6 "missing terminating ] for character class" #define ERR7 "invalid escape sequence in character class" #define ERR8 "range out of order in character class" #define ERR9 "nothing to repeat" #define ERR10 "operand of unlimited repeat could match the empty string" #define ERR11 "internal error: unexpected repeat" #define ERR12 "unrecognized character after (?" #define ERR13 "too many capturing parenthesized sub-patterns" #define ERR14 "missing )" #define ERR15 "back reference to non-existent subpattern" #define ERR16 "erroffset passed as NULL" #define ERR17 "unknown option bit(s) set" #define ERR18 "missing ) after comment" #define ERR19 "too many sets of parentheses" #define ERR20 "regular expression too large" #define ERR21 "failed to get memory" #define ERR22 "unmatched parentheses" #define ERR23 "internal error: code overflow" #define ERR24 "unrecognized character after (?<" #define ERR25 "lookbehind assertion is not fixed length" #define ERR26 "malformed number after (?(" #define ERR27 "conditional group contains more than two branches" #define ERR28 "assertion expected after (?(" #define ERR29 "(?p must be followed by )" #define ERR30 "unknown POSIX class name" #define ERR31 "POSIX collating elements are not supported" #define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support" #define ERR33 "characters with values > 255 are not yet supported in classes" #define ERR34 "character value in \\x{...} sequence is too large" #define ERR35 "invalid condition (?(0)" typedef unsigned char uschar; typedef struct real_pcre { unsigned long int magic_number; size_t size; const unsigned char *tables; unsigned long int options; uschar top_bracket; uschar top_backref; uschar first_char; uschar req_char; uschar code[1]; } real_pcre; typedef struct real_pcre_extra { uschar options; uschar start_bits[32]; } real_pcre_extra; typedef struct compile_data { const uschar *lcc; const uschar *fcc; const uschar *cbits; const uschar *ctypes; } compile_data; typedef struct match_data { int errorcode; int *offset_vector; int offset_end; int offset_max; const uschar *lcc; const uschar *ctypes; BOOL offset_overflow; BOOL notbol; BOOL noteol; BOOL utf8; BOOL endonly; BOOL notempty; const uschar *start_pattern; const uschar *start_subject; const uschar *end_subject; const uschar *start_match; const uschar *end_match_ptr; int end_offset_top; } match_data; #define ctype_space 0x01 #define ctype_letter 0x02 #define ctype_digit 0x04 #define ctype_xdigit 0x08 #define ctype_word 0x10 #define ctype_meta 0x80 #define cbit_space 0 #define cbit_xdigit 32 #define cbit_digit 64 #define cbit_upper 96 #define cbit_lower 128 #define cbit_word 160 #define cbit_graph 192 #define cbit_print 224 #define cbit_punct 256 #define cbit_cntrl 288 #define cbit_length 320 #define lcc_offset 0 #define fcc_offset 256 #define cbits_offset 512 #define ctypes_offset (cbits_offset + cbit_length) #define tables_length (ctypes_offset + 256) #endif /* HAVE_PCRE */ analog-6.0/src/unzip/0000755000175000017500000000000010161303544014667 5ustar sret1sret100000000000000analog-6.0/src/unzip/LICENSE0000644000175000017500000000343310161303544015677 0ustar sret1sret100000000000000The files in this directory are from version 0.22c of Gilles Vollant's unzip library. The source files are unchanged except for changing the path in some #include's, but I haven't included the zip portion, example programs etc. You can get the full distribution from http://www.winimage.com/zLibDll/unzip.html , or included in the zlib library at http://www.zlib.org/ . Many thanks to the Gilles Vollant for his routines and generous licence. === AUTHOR'S COPYRIGHT AND LICENCE START HERE === Copyright (C) 1998-2003 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Encryption and multi volume ZipFile (span) are not supported. Old compressions used by old PKZip 1.x are not supported I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. analog-6.0/src/unzip/Makefile0000644000175000017500000000057010161303544016331 0ustar sret1sret100000000000000# Makefile for analog 6.0, unzip subdirectory # Please read docs/Readme.html, or http://www.analog.cx/ HEADERS = unzip.h ioapi.h ../zlib/zlib.h OBJS = ioapi.o unzip.o all: $(OBJS) ioapi.o: ioapi.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) $(INCDIRS) -c ioapi.c unzip.o: unzip.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -DNOUNCRYPT $(INCDIRS) -c unzip.c clean: rm -f *.o *~ analog-6.0/src/unzip/ioapi.c0000644000175000017500000000714210161303544016140 0ustar sret1sret100000000000000/* ioapi.c -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 0.22, May 19th, 2003 Copyright (C) 1998-2003 Gilles Vollant */ #include #include #include #include "../zlib/zlib.h" #include "ioapi.h" /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif voidpf ZCALLBACK fopen_file_func OF(( voidpf opaque, const char* filename, int mode)); uLong ZCALLBACK fread_file_func OF(( voidpf opaque, voidpf stream, void* buf, uLong size)); uLong ZCALLBACK fwrite_file_func OF(( voidpf opaque, voidpf stream, const void* buf, uLong size)); long ZCALLBACK ftell_file_func OF(( voidpf opaque, voidpf stream)); long ZCALLBACK fseek_file_func OF(( voidpf opaque, voidpf stream, uLong offset, int origin)); int ZCALLBACK fclose_file_func OF(( voidpf opaque, voidpf stream)); int ZCALLBACK ferror_file_func OF(( voidpf opaque, voidpf stream)); voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) voidpf opaque; const char* filename; int mode; { FILE* file = NULL; const char* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) mode_fopen = "r+b"; else if (mode & ZLIB_FILEFUNC_MODE_CREATE) mode_fopen = "wb"; if ((filename!=NULL) && (mode_fopen != NULL)) file = fopen(filename, mode_fopen); return file; } uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) voidpf opaque; voidpf stream; void* buf; uLong size; { uLong ret; ret = fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) voidpf opaque; voidpf stream; const void* buf; uLong size; { uLong ret; ret = fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } long ZCALLBACK ftell_file_func (opaque, stream) voidpf opaque; voidpf stream; { long ret; ret = ftell((FILE *)stream); return ret; } long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) voidpf opaque; voidpf stream; uLong offset; int origin; { int fseek_origin=0; long ret; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : fseek_origin = SEEK_CUR; break; case ZLIB_FILEFUNC_SEEK_END : fseek_origin = SEEK_END; break; case ZLIB_FILEFUNC_SEEK_SET : fseek_origin = SEEK_SET; break; default: return -1; } ret = 0; fseek((FILE *)stream, offset, fseek_origin); return ret; } int ZCALLBACK fclose_file_func (opaque, stream) voidpf opaque; voidpf stream; { int ret; ret = fclose((FILE *)stream); return ret; } int ZCALLBACK ferror_file_func (opaque, stream) voidpf opaque; voidpf stream; { int ret; ret = ferror((FILE *)stream); return ret; } void fill_fopen_filefunc (pzlib_filefunc_def) zlib_filefunc_def* pzlib_filefunc_def; { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->opaque = NULL; } analog-6.0/src/unzip/ioapi.h0000644000175000017500000000474110161303544016147 0ustar sret1sret100000000000000/* ioapi.h -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 0.22, May 19th, 2003 Copyright (C) 1998-2003 Gilles Vollant */ #ifndef _ZLIBIOAPI_H #define _ZLIBIOAPI_H #define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_CREATE (8) #ifndef ZCALLBACK #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #define ZCALLBACK CALLBACK #else #define ZCALLBACK #endif #endif #ifdef __cplusplus extern "C" { #endif typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef struct zlib_filefunc_def_s { open_file_func zopen_file; read_file_func zread_file; write_file_func zwrite_file; tell_file_func ztell_file; seek_file_func zseek_file; close_file_func zclose_file; testerror_file_func zerror_file; voidpf opaque; } zlib_filefunc_def; void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); #define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) #define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) #define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) #define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) #define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) #define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) #ifdef __cplusplus } #endif #endif analog-6.0/src/unzip/unzip.c0000644000175000017500000013515210161303544016207 0ustar sret1sret100000000000000/* unzip.c -- IO for uncompress .zip files using zlib Version 0.22, May 19th, 2003 Copyright (C) 1998-2003 Gilles Vollant Read unzip.h for more info */ /* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of compatibility with older software. The following is from the original crypt.c. Code woven in by Terry Thorsen 1/2003. */ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) */ /* This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). */ #include #include #include #include "../zlib/zlib.h" #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ !defined(CASESENSITIVITYDEFAULT_NO) #define CASESENSITIVITYDEFAULT_NO #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) const char unz_copyright[] = " unzip 0.22 Copyright 1998-2003 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ int encrypted; #ifndef NOUNCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const unsigned long* pcrc_32_tab; #endif } unz_s; #ifndef NOUNCRYPT #include "crypt.h" #endif /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unzlocal_getByte OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; int *pi; { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ZERROR(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; uLong *pX; { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; uLong *pX; { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal (fileName1,fileName2) const char* fileName1; const char* fileName2; { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) const char* fileName1; const char* fileName2; int iCaseSensitivity; { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) const zlib_filefunc_def* pzlib_filefunc_def; voidpf filestream; { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer "zlib/zlib114.zip". If the zipfile cannot be opened (file doesn't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) const char *path; zlib_filefunc_def* pzlib_filefunc_def; { unz_s us; unz_s *s; uLong central_pos,uL; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; if (pzlib_filefunc_def==NULL) fill_fopen_filefunc(&us.z_filefunc); else us.z_filefunc = *pzlib_filefunc_def; us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); if (us.filestream==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); if (central_pos==0) err=UNZ_ERRNO; if (ZSEEK(us.z_filefunc, us.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); ZCLOSE(s->z_filefunc, s->filestream); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) unzFile file; unz_global_info *pglobal_info; { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) uLong ulDosDate; tm_unz* ptm; { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal (file, pfile_info, pfile_info_internal, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; unz_file_info_internal *pfile_info_internal; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (ZSEEK(s->z_filefunc, s->filestream, s->pos_in_central_dir+s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo (file, pfile_info, szFileName, fileNameBufferSize, extraField, extraFieldBufferSize, szComment, commentBufferSize) unzFile file; unz_file_info *pfile_info; char *szFileName; uLong fileNameBufferSize; void *extraField; uLong extraFieldBufferSize; char *szComment; uLong commentBufferSize; { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (file) unzFile file; { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) unzFile file; const char *szFileName; int iCaseSensitivity; { unz_s* s; int err; /* We remember the 'current' position in the file so that we can jump * back there if we fail. */ unz_file_info cur_file_infoSaved; unz_file_info_internal cur_file_info_internalSaved; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; /* Save the current state */ num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; cur_file_infoSaved = s->cur_file_info; cur_file_info_internalSaved = s->cur_file_info_internal; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; err = unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (err == UNZ_OK) { if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } } /* We failed, so restore the state of the 'current file' to where we * were. */ s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; s->cur_file_info = cur_file_infoSaved; s->cur_file_info_internal = cur_file_info_internalSaved; return err; } /* /////////////////////////////////////////// // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) // I need random access // // Further optimization could be realized by adding an ability // to cache the directory in memory. The goal being a single // comprehensive file read to put the file I need in a memory. */ /* typedef struct unz_file_pos_s { uLong pos_in_zip_directory; // offset in file uLong num_of_file; // # of file } unz_file_pos; */ extern int ZEXPORT unzGetFilePos(file, file_pos) unzFile file; unz_file_pos* file_pos; { unz_s* s; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; file_pos->pos_in_zip_directory = s->pos_in_central_dir; file_pos->num_of_file = s->num_file; return UNZ_OK; } extern int ZEXPORT unzGoToFilePos(file, file_pos) unzFile file; unz_file_pos* file_pos; { unz_s* s; int err; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; /* jump to the right spot */ s->pos_in_central_dir = file_pos->pos_in_zip_directory; s->num_file = file_pos->num_of_file; /* set the current file */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); /* return results */ s->current_file_ok = (err == UNZ_OK); return err; } /* // Unzip Helper Functions - should be here? /////////////////////////////////////////// */ /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, poffset_local_extrafield, psize_local_extrafield) unz_s* s; uInt* piSizeVar; uLong *poffset_local_extrafield; uInt *psize_local_extrafield; { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) unzFile file; int* method; int* level; int raw; const char* password; { int err=UNZ_OK; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ #ifndef NOUNCRYPT char source[12]; #else if (password != NULL) return UNZ_PARAMERROR; #endif if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; pfile_in_zip_read_info->raw=raw; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if (method!=NULL) *method = (int)s->cur_file_info.compression_method; if (level!=NULL) { *level = 6; switch (s->cur_file_info.flag & 0x06) { case 6 : *level = 1; break; case 4 : *level = 2; break; case 2 : *level = 9; break; } } if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->filestream=s->filestream; pfile_in_zip_read_info->z_filefunc=s->z_filefunc; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; pfile_in_zip_read_info->stream.next_in = (voidpf)0; pfile_in_zip_read_info->stream.avail_in = 0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; else return err; /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; #ifndef NOUNCRYPT if (password != NULL) { int i; s->pcrc_32_tab = get_crc_table(); init_keys(password,s->keys,s->pcrc_32_tab); if (ZSEEK(s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET)!=0) return UNZ_INTERNALERROR; if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) return UNZ_INTERNALERROR; for (i = 0; i<12; i++) zdecode(s->keys,s->pcrc_32_tab,source[i]); s->pfile_in_zip_read->pos_in_zipfile+=12; s->encrypted=1; } #endif return UNZ_OK; } extern int ZEXPORT unzOpenCurrentFile (file) unzFile file; { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } extern int ZEXPORT unzOpenCurrentFilePassword (file, password) unzFile file; const char* password; { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) unzFile file; int* method; int* level; int raw; { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile (file, buf, len) unzFile file; voidp buf; unsigned len; { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->read_buffer == NULL)) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if (len>pfile_in_zip_read_info->rest_read_uncompressed) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis)!=uReadThis) return UNZ_ERRNO; #ifndef NOUNCRYPT if(s->encrypted) { uInt i; for(i=0;iread_buffer[i] = zdecode(s->keys,s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]); } #endif pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) { uInt uDoCopy,i ; if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) return (iRead==0) ? UNZ_EOF : iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (file) unzFile file; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) unzFile file; voidp buf; unsigned len; { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf,size_to_read)!=size_to_read) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (file) unzFile file; { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) unzFile file; char *szComment; uLong uSizeBuf; { int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } analog-6.0/src/unzip/unzip.h0000644000175000017500000003057310161303544016215 0ustar sret1sret100000000000000/* unzip.h -- IO for uncompress .zip files using zlib Version 0.22, May 19th, 2003 Copyright (C) 1998-2003 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Encryption and multi volume ZipFile (span) are not supported. Old compressions used by old PKZip 1.x are not supported I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/ PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "../zlib/zlib.h" #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def)); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ /* ****************************************** */ /* Ryan supplied functions */ /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_pos_s { uLong pos_in_zip_directory; /* offset in zip file directory */ uLong num_of_file; /* # of file */ } unz_file_pos; extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos); extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos); /* ****************************************** */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ #ifdef __cplusplus } #endif #endif /* _unz_H */ analog-6.0/src/zlib/0000755000175000017500000000000010161303544014462 5ustar sret1sret100000000000000analog-6.0/src/zlib/LICENSE0000644000175000017500000000416410161303544015474 0ustar sret1sret100000000000000The files in this directory are from version 1.1.4 of Jean-loup Gailly and Mark Adler's zlib library. The source files are unchanged except for being wrapped in my own #ifdef's, but the documentation, example programs etc. have been removed. You can get the full distribution of zlib from http://www.zlib.org/ . Many thanks to the authors for their excellent routines and generous licence. === AUTHORS' COPYRIGHT AND LICENCE START HERE === Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2002 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. analog-6.0/src/zlib/Makefile0000644000175000017500000000263510161303544016130 0ustar sret1sret100000000000000# Makefile for analog 6.0, zlib subdirectory # Please read docs/Readme.html, or http://www.analog.cx/ HEADERS = deflate.h infblock.h infcodes.h inffast.h inffixed.h inftrees.h \ infutil.h trees.h zconf.h zlib.h zutil.h OBJS = adler32.o compress.o crc32.o deflate.o gzio.o infblock.o infcodes.o \ inffast.o inflate.o inftrees.o infutil.o trees.o uncompr.o zutil.o all: $(OBJS) adler32.o: adler32.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c adler32.c compress.o: compress.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c compress.c crc32.o: crc32.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c crc32.c deflate.o: deflate.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c deflate.c gzio.o: gzio.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c gzio.c infblock.o: infblock.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c infblock.c infcodes.o: infcodes.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c infcodes.c inffast.o: inffast.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c inffast.c inflate.o: inflate.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c inflate.c inftrees.o: inftrees.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c inftrees.c infutil.o: infutil.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c infutil.c trees.o: trees.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c trees.c uncompr.o: uncompr.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c uncompr.c zutil.o: zutil.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c zutil.c clean: rm -f *.o *~ analog-6.0/src/zlib/adler32.c0000644000175000017500000000236610161303544016071 0ustar sret1sret100000000000000/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zlib.h" #define BASE 65521L /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {s1 += buf[i]; s2 += s1;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long s1 = adler & 0xffff; unsigned long s2 = (adler >> 16) & 0xffff; int k; if (buf == Z_NULL) return 1L; while (len > 0) { k = len < NMAX ? len : NMAX; len -= k; while (k >= 16) { DO16(buf); buf += 16; k -= 16; } if (k != 0) do { s1 += *buf++; s2 += s1; } while (--k); s1 %= BASE; s2 %= BASE; } return (s2 << 16) | s1; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/compress.c0000644000175000017500000000416110161303544016463 0ustar sret1sret100000000000000/* compress.c -- compress a memory buffer * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/crc32.c0000644000175000017500000001552710161303544015554 0ustar sret1sret100000000000000/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zlib.h" #define local static #ifdef DYNAMIC_CRC_TABLE local int crc_table_empty = 1; local uLongf crc_table[256]; local void make_crc_table OF((void)); /* Generate a table for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRC's on data a byte at a time for all combinations of CRC register values and incoming bytes. */ local void make_crc_table() { uLong c; int n, k; uLong poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* make exclusive-or pattern from polynomial (0xedb88320L) */ poly = 0L; for (n = 0; n < sizeof(p)/sizeof(Byte); n++) poly |= 1L << (31 - p[n]); for (n = 0; n < 256; n++) { c = (uLong)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[n] = c; } crc_table_empty = 0; } #else /* ======================================================================== * Table of CRC-32's of all single-byte values (made by make_crc_table) */ local const uLongf crc_table[256] = { 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL }; #endif /* ========================================================================= * This function can be used by asm versions of crc32() */ const uLongf * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif return (const uLongf *)crc_table; } /* ========================================================================= */ #define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8); #define DO2(buf) DO1(buf); DO1(buf); #define DO4(buf) DO2(buf); DO2(buf); #define DO8(buf) DO4(buf); DO4(buf); /* ========================================================================= */ uLong ZEXPORT crc32(crc, buf, len) uLong crc; const Bytef *buf; uInt len; { if (buf == Z_NULL) return 0L; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif crc = crc ^ 0xffffffffL; while (len >= 8) { DO8(buf); len -= 8; } if (len) do { DO1(buf); } while (--len); return crc ^ 0xffffffffL; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/deflate.c0000644000175000017500000013756010161303544016246 0ustar sret1sret100000000000000/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in ftp://ds.internic.net/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ #ifndef HAVE_ZLIB #include "deflate.h" const char deflate_copyright[] = " deflate 1.1.4 Copyright 1995-2002 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); local block_state deflate_slow OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */ /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int noheader = 0; static const char* my_version = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == Z_NULL) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == Z_NULL) strm->zfree = zcfree; if (level == Z_DEFAULT_COMPRESSION) level = 6; #ifdef FASTEST level = 1; #endif if (windowBits < 0) { /* undocumented feature: suppress zlib header */ noheader = 1; windowBits = -windowBits; } if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { return Z_STREAM_ERROR; } s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->noheader = noheader; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->status != INIT_STATE) return Z_STREAM_ERROR; s = strm->state; strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); #ifndef USE_DICT_HEAD dictionary += dictLength - length; /* use the tail of the dictionary */ #endif } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR; strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->noheader < 0) { s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */ } s->status = s->noheader ? BUSY_STATE : INIT_STATE; strm->adler = 1; s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; if (level == Z_DEFAULT_COMPRESSION) { level = 6; } if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the zlib header */ if (s->status == INIT_STATE) { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags = (s->level-1) >> 1; if (level_flags > 3) level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = 1L; } /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUFF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->noheader) return Z_STREAM_END; /* Write the zlib trailer (adler32) */ putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ s->noheader = -1; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; *dest = *source; ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; *ds = *ss; ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (!strm->state->noheader) { strm->adler = adler32(strm->adler, strm->next_in, len); } zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifdef ASMV match_init(); /* initialize the asm code */ #endif } /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ #ifndef FASTEST local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2: */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #else /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 only */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return len <= s->lookahead ? len : s->lookahead; } #endif /* FASTEST */ #endif /* ASMV */ #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if strstart == 0 * and lookahead == 1 (input done one byte at time) */ more--; /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ } else if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy != Z_HUFFMAN_ONLY) { s->match_length = longest_match (s, hash_head); } /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in hash table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy != Z_HUFFMAN_ONLY) { s->match_length = longest_match (s, hash_head); } /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR))) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/deflate.h0000644000175000017500000002650610161303544016250 0ustar sret1sret100000000000000/* deflate.h -- internal compression state * Copyright (C) 1995-2002 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef _DEFLATE_H #define _DEFLATE_H #include "zutil.h" /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ int pending; /* nb of bytes in the pending buffer */ int noheader; /* suppress zlib header and adler32 */ Byte data_type; /* UNKNOWN, BINARY or ASCII */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ int last_eob_len; /* bit length of EOB code for last block */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ /* in trees.c */ void _tr_init OF((deflate_state *s)); int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); void _tr_align OF((deflate_state *s)); void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch _length_code[]; extern uch _dist_code[]; #else extern const uch _length_code[]; extern const uch _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif analog-6.0/src/zlib/gzio.c0000644000175000017500000006224610161303544015610 0ustar sret1sret100000000000000/* gzio.c -- IO on .gz files * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_DEFLATE to avoid the compression code. */ #ifndef HAVE_ZLIB #include #include "zutil.h" struct internal_state {int dummy;}; /* for buggy compilers */ #ifndef Z_BUFSIZE # ifdef MAXSEG_64K # define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ # else # define Z_BUFSIZE 16384 # endif #endif #ifndef Z_PRINTF_BUFSIZE # define Z_PRINTF_BUFSIZE 4096 #endif #define ALLOC(size) malloc(size) #define TRYFREE(p) {if (p) free(p);} static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ typedef struct gz_stream { z_stream stream; int z_err; /* error code for last stream operation */ int z_eof; /* set if end of input file */ FILE *file; /* .gz file */ Byte *inbuf; /* input buffer */ Byte *outbuf; /* output buffer */ uLong crc; /* crc32 of uncompressed data */ char *msg; /* error message */ char *path; /* path name for debugging only */ int transparent; /* 1 if input file is not a .gz file */ char mode; /* 'w' or 'r' */ long startpos; /* start of compressed data in file (header skipped) */ } gz_stream; local gzFile gz_open OF((const char *path, const char *mode, int fd)); local int do_flush OF((gzFile file, int flush)); local int get_byte OF((gz_stream *s)); local void check_header OF((gz_stream *s)); local int destroy OF((gz_stream *s)); local void putLong OF((FILE *file, uLong x)); local uLong getLong OF((gz_stream *s)); /* =========================================================================== Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb"). The file is given either by file descriptor or path name (if fd == -1). gz_open return NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ local gzFile gz_open (path, mode, fd) const char *path; const char *mode; int fd; { int err; int level = Z_DEFAULT_COMPRESSION; /* compression level */ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ char *p = (char*)mode; gz_stream *s; char fmode[80]; /* copy of mode, without the compression level */ char *m = fmode; if (!path || !mode) return Z_NULL; s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; s->stream.zalloc = (alloc_func)0; s->stream.zfree = (free_func)0; s->stream.opaque = (voidpf)0; s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; s->file = NULL; s->z_err = Z_OK; s->z_eof = 0; s->crc = crc32(0L, Z_NULL, 0); s->msg = NULL; s->transparent = 0; s->path = (char*)ALLOC(strlen(path)+1); if (s->path == NULL) { return destroy(s), (gzFile)Z_NULL; } strcpy(s->path, path); /* do this early for debugging */ s->mode = '\0'; do { if (*p == 'r') s->mode = 'r'; if (*p == 'w' || *p == 'a') s->mode = 'w'; if (*p >= '0' && *p <= '9') { level = *p - '0'; } else if (*p == 'f') { strategy = Z_FILTERED; } else if (*p == 'h') { strategy = Z_HUFFMAN_ONLY; } else { *m++ = *p; /* copy the mode */ } } while (*p++ && m != fmode + sizeof(fmode)); if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; if (s->mode == 'w') { #ifdef NO_DEFLATE err = Z_STREAM_ERROR; #else err = deflateInit2(&(s->stream), level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); /* windowBits is passed < 0 to suppress zlib header */ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); #endif if (err != Z_OK || s->outbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } else { s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); err = inflateInit2(&(s->stream), -MAX_WBITS); /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are * present after the compressed stream. */ if (err != Z_OK || s->inbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } s->stream.avail_out = Z_BUFSIZE; errno = 0; s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); if (s->file == NULL) { return destroy(s), (gzFile)Z_NULL; } if (s->mode == 'w') { /* Write a very simple .gz header: */ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); s->startpos = 10L; /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * startpos anyway in write mode, so this initialization is not * necessary. */ } else { check_header(s); /* skip the .gz header */ s->startpos = (ftell(s->file) - s->stream.avail_in); } return (gzFile)s; } /* =========================================================================== Opens a gzip (.gz) file for reading or writing. */ gzFile ZEXPORT gzopen (path, mode) const char *path; const char *mode; { return gz_open (path, mode, -1); } /* =========================================================================== Associate a gzFile with the file descriptor fd. fd is not dup'ed here to mimic the behavio(u)r of fdopen. */ gzFile ZEXPORT gzdopen (fd, mode) int fd; const char *mode; { char name[20]; if (fd < 0) return (gzFile)Z_NULL; sprintf(name, "", fd); /* for debugging */ return gz_open (name, mode, fd); } /* =========================================================================== * Update the compression level and strategy */ int ZEXPORT gzsetparams (file, level, strategy) gzFile file; int level; int strategy; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; /* Make room to allow flushing */ if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; } s->stream.avail_out = Z_BUFSIZE; } return deflateParams (&(s->stream), level, strategy); } /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte(s) gz_stream *s; { if (s->z_eof) return EOF; if (s->stream.avail_in == 0) { errno = 0; s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) s->z_err = Z_ERRNO; return EOF; } s->stream.next_in = s->inbuf; } s->stream.avail_in--; return *(s->stream.next_in)++; } /* =========================================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ local void check_header(s) gz_stream *s; { int method; /* method byte */ int flags; /* flags byte */ uInt len; int c; /* Check the gzip magic header */ for (len = 0; len < 2; len++) { c = get_byte(s); if (c != gz_magic[len]) { if (len != 0) s->stream.avail_in++, s->stream.next_in--; if (c != EOF) { s->stream.avail_in++, s->stream.next_in--; s->transparent = 1; } s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END; return; } } method = get_byte(s); flags = get_byte(s); if (method != Z_DEFLATED || (flags & RESERVED) != 0) { s->z_err = Z_DATA_ERROR; return; } /* Discard time, xflags and OS code: */ for (len = 0; len < 6; len++) (void)get_byte(s); if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ len = (uInt)get_byte(s); len += ((uInt)get_byte(s))<<8; /* len is garbage if EOF but the loop below will quit anyway */ while (len-- != 0 && get_byte(s) != EOF) ; } if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; } /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. */ local int destroy (s) gz_stream *s; { int err = Z_OK; if (!s) return Z_STREAM_ERROR; TRYFREE(s->msg); if (s->stream.state != NULL) { if (s->mode == 'w') { #ifdef NO_DEFLATE err = Z_STREAM_ERROR; #else err = deflateEnd(&(s->stream)); #endif } else if (s->mode == 'r') { err = inflateEnd(&(s->stream)); } } if (s->file != NULL && fclose(s->file)) { #ifdef ESPIPE if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ #endif err = Z_ERRNO; } if (s->z_err < 0) err = s->z_err; TRYFREE(s->inbuf); TRYFREE(s->outbuf); TRYFREE(s->path); TRYFREE(s); return err; } /* =========================================================================== Reads the given number of uncompressed bytes from the compressed file. gzread returns the number of bytes actually read (0 for end of file). */ int ZEXPORT gzread (file, buf, len) gzFile file; voidp buf; unsigned len; { gz_stream *s = (gz_stream*)file; Bytef *start = (Bytef*)buf; /* starting point for crc computation */ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_STREAM_END) return 0; /* EOF */ next_out = (Byte*)buf; s->stream.next_out = (Bytef*)buf; s->stream.avail_out = len; while (s->stream.avail_out != 0) { if (s->transparent) { /* Copy first the lookahead bytes: */ uInt n = s->stream.avail_in; if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > 0) { zmemcpy(s->stream.next_out, s->stream.next_in, n); next_out += n; s->stream.next_out = next_out; s->stream.next_in += n; s->stream.avail_out -= n; s->stream.avail_in -= n; } if (s->stream.avail_out > 0) { s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out, s->file); } len -= s->stream.avail_out; s->stream.total_in += (uLong)len; s->stream.total_out += (uLong)len; if (len == 0) s->z_eof = 1; return (int)len; } if (s->stream.avail_in == 0 && !s->z_eof) { errno = 0; s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) { s->z_err = Z_ERRNO; break; } } s->stream.next_in = s->inbuf; } s->z_err = inflate(&(s->stream), Z_NO_FLUSH); if (s->z_err == Z_STREAM_END) { /* Check CRC and original size */ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); start = s->stream.next_out; if (getLong(s) != s->crc) { s->z_err = Z_DATA_ERROR; } else { (void)getLong(s); /* The uncompressed length returned by above getlong() may * be different from s->stream.total_out) in case of * concatenated .gz files. Check for such files: */ check_header(s); if (s->z_err == Z_OK) { uLong total_in = s->stream.total_in; uLong total_out = s->stream.total_out; inflateReset(&(s->stream)); s->stream.total_in = total_in; s->stream.total_out = total_out; s->crc = crc32(0L, Z_NULL, 0); } } } if (s->z_err != Z_OK || s->z_eof) break; } s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); return (int)(len - s->stream.avail_out); } /* =========================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ int ZEXPORT gzgetc(file) gzFile file; { unsigned char c; return gzread(file, &c, 1) == 1 ? c : -1; } /* =========================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { char *b = buf; if (buf == Z_NULL || len <= 0) return Z_NULL; while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; *buf = '\0'; return b == buf && len > 0 ? Z_NULL : b; } #ifndef NO_DEFLATE /* =========================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of bytes actually written (0 in case of error). */ int ZEXPORT gzwrite (file, buf, len) gzFile file; const voidp buf; unsigned len; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.next_in = (Bytef*)buf; s->stream.avail_in = len; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; break; } s->stream.avail_out = Z_BUFSIZE; } s->z_err = deflate(&(s->stream), Z_NO_FLUSH); if (s->z_err != Z_OK) break; } s->crc = crc32(s->crc, (const Bytef *)buf, len); return (int)(len - s->stream.avail_in); } /* =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ #ifdef STDC #include int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) { char buf[Z_PRINTF_BUFSIZE]; va_list va; int len; va_start(va, format); #ifdef HAS_vsnprintf (void)vsnprintf(buf, sizeof(buf), format, va); #else (void)vsprintf(buf, format, va); #endif va_end(va); len = strlen(buf); /* some *sprintf don't return the nb of bytes written */ if (len <= 0) return 0; return gzwrite(file, buf, (unsigned)len); } #else /* not ANSI C */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { char buf[Z_PRINTF_BUFSIZE]; int len; #ifdef HAS_snprintf snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); #else sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); #endif len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */ if (len <= 0) return 0; return gzwrite(file, buf, len); } #endif /* =========================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned char cc = (unsigned char) c; /* required for big endian systems */ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; } /* =========================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ int ZEXPORT gzputs(file, s) gzFile file; const char *s; { return gzwrite(file, (char*)s, (unsigned)strlen(s)); } /* =========================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. */ local int do_flush (file, flush) gzFile file; int flush; { uInt len; int done = 0; gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.avail_in = 0; /* should be zero already anyway */ for (;;) { len = Z_BUFSIZE - s->stream.avail_out; if (len != 0) { if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { s->z_err = Z_ERRNO; return Z_ERRNO; } s->stream.next_out = s->outbuf; s->stream.avail_out = Z_BUFSIZE; } if (done) break; s->z_err = deflate(&(s->stream), flush); /* Ignore the second of two consecutive flushes: */ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; } return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } int ZEXPORT gzflush (file, flush) gzFile file; int flush; { gz_stream *s = (gz_stream*)file; int err = do_flush (file, flush); if (err) return err; fflush(s->file); return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } #endif /* NO_DEFLATE */ /* =========================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. */ z_off_t ZEXPORT gzseek (file, offset, whence) gzFile file; z_off_t offset; int whence; { gz_stream *s = (gz_stream*)file; if (s == NULL || whence == SEEK_END || s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { return -1L; } if (s->mode == 'w') { #ifdef NO_DEFLATE return -1L; #else if (whence == SEEK_SET) { offset -= s->stream.total_in; } if (offset < 0) return -1L; /* At this point, offset is the number of zero bytes to write. */ if (s->inbuf == Z_NULL) { s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ zmemzero(s->inbuf, Z_BUFSIZE); } while (offset > 0) { uInt size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (uInt)offset; size = gzwrite(file, s->inbuf, size); if (size == 0) return -1L; offset -= size; } return (z_off_t)s->stream.total_in; #endif } /* Rest of function is for reading only */ /* compute absolute position */ if (whence == SEEK_CUR) { offset += s->stream.total_out; } if (offset < 0) return -1L; if (s->transparent) { /* map to fseek */ s->stream.avail_in = 0; s->stream.next_in = s->inbuf; if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; s->stream.total_in = s->stream.total_out = (uLong)offset; return offset; } /* For a negative seek, rewind and use positive seek */ if ((uLong)offset >= s->stream.total_out) { offset -= s->stream.total_out; } else if (gzrewind(file) < 0) { return -1L; } /* offset is now the number of bytes to skip. */ if (offset != 0 && s->outbuf == Z_NULL) { s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); } while (offset > 0) { int size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (int)offset; size = gzread(file, s->outbuf, (uInt)size); if (size <= 0) return -1L; offset -= size; } return (z_off_t)s->stream.total_out; } /* =========================================================================== Rewinds input file. */ int ZEXPORT gzrewind (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return -1; s->z_err = Z_OK; s->z_eof = 0; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; s->crc = crc32(0L, Z_NULL, 0); if (s->startpos == 0) { /* not a compressed file */ rewind(s->file); return 0; } (void) inflateReset(&s->stream); return fseek(s->file, s->startpos, SEEK_SET); } /* =========================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. */ z_off_t ZEXPORT gztell (file) gzFile file; { return gzseek(file, 0L, SEEK_CUR); } /* =========================================================================== Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ int ZEXPORT gzeof (file) gzFile file; { gz_stream *s = (gz_stream*)file; return (s == NULL || s->mode != 'r') ? 0 : s->z_eof; } /* =========================================================================== Outputs a long in LSB order to the given file */ local void putLong (file, x) FILE *file; uLong x; { int n; for (n = 0; n < 4; n++) { fputc((int)(x & 0xff), file); x >>= 8; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets z_err in case of error. */ local uLong getLong (s) gz_stream *s; { uLong x = (uLong)get_byte(s); int c; x += ((uLong)get_byte(s))<<8; x += ((uLong)get_byte(s))<<16; c = get_byte(s); if (c == EOF) s->z_err = Z_DATA_ERROR; x += ((uLong)c)<<24; return x; } /* =========================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. */ int ZEXPORT gzclose (file) gzFile file; { int err; gz_stream *s = (gz_stream*)file; if (s == NULL) return Z_STREAM_ERROR; if (s->mode == 'w') { #ifdef NO_DEFLATE return Z_STREAM_ERROR; #else err = do_flush (file, Z_FINISH); if (err != Z_OK) return destroy((gz_stream*)file); putLong (s->file, s->crc); putLong (s->file, s->stream.total_in); #endif } return destroy((gz_stream*)file); } /* =========================================================================== Returns the error message for the last error which occured on the given compressed file. errnum is set to zlib error number. If an error occured in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ const char* ZEXPORT gzerror (file, errnum) gzFile file; int *errnum; { char *m; gz_stream *s = (gz_stream*)file; if (s == NULL) { *errnum = Z_STREAM_ERROR; return (const char*)ERR_MSG(Z_STREAM_ERROR); } *errnum = s->z_err; if (*errnum == Z_OK) return (const char*)""; m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); TRYFREE(s->msg); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); strcpy(s->msg, s->path); strcat(s->msg, ": "); strcat(s->msg, m); return (const char*)s->msg; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/infblock.c0000644000175000017500000003030010161303544016411 0ustar sret1sret100000000000000/* infblock.c -- interpret and process block types to last block * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" #include "infblock.h" #include "inftrees.h" #include "infcodes.h" #include "infutil.h" struct inflate_codes_state {int dummy;}; /* for buggy compilers */ /* simplify the use of the inflate_huft type with some defines */ #define exop word.what.Exop #define bits word.what.Bits /* Table for deflate from PKZIP's appnote.txt. */ local const uInt border[] = { /* Order of the bit length code lengths */ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Notes beyond the 1.93a appnote.txt: 1. Distance pointers never point before the beginning of the output stream. 2. Distance pointers can point back across blocks, up to 32k away. 3. There is an implied maximum of 7 bits for the bit length table and 15 bits for the actual data. 4. If only one code exists, then it is encoded using one bit. (Zero would be more efficient, but perhaps a little confusing.) If two codes exist, they are coded using one bit each (0 and 1). 5. There is no way of sending zero distance codes--a dummy must be sent if there are none. (History: a pre 2.0 version of PKZIP would store blocks with no distance codes, but this was discovered to be too harsh a criterion.) Valid only for 1.93a. 2.04c does allow zero distance codes, which is sent as one code of zero bits in length. 6. There are up to 286 literal/length codes. Code 256 represents the end-of-block. Note however that the static length tree defines 288 codes just to fill out the Huffman codes. Codes 286 and 287 cannot be used though, since there is no length base or extra bits defined for them. Similarily, there are up to 30 distance codes. However, static trees define 32 codes (all 5 bits) to fill out the Huffman codes, but the last two had better not show up in the data. 7. Unzip can check dynamic Huffman blocks for complete code sets. The exception is that a single code would not be complete (see #4). 8. The five bits following the block type is really the number of literal codes sent minus 257. 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits (1+6+6). Therefore, to output three times the length, you output three codes (1+1+1), whereas to output four times the same length, you only need two codes (1+3). Hmm. 10. In the tree reconstruction algorithm, Code = Code + Increment only if BitLength(i) is not zero. (Pretty obvious.) 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19) 12. Note: length code 284 can represent 227-258, but length code 285 really is 258. The last length deserves its own, short code since it gets used a lot in very redundant files. The length 258 is special since 258 - 3 (the min match length) is 255. 13. The literal/length and distance code bit lengths are read as a single stream of lengths. It is possible (and advantageous) for a repeat code (16, 17, or 18) to go across the boundary between the two sets of lengths. */ void inflate_blocks_reset(s, z, c) inflate_blocks_statef *s; z_streamp z; uLongf *c; { if (c != Z_NULL) *c = s->check; if (s->mode == BTREE || s->mode == DTREE) ZFREE(z, s->sub.trees.blens); if (s->mode == CODES) inflate_codes_free(s->sub.decode.codes, z); s->mode = TYPE; s->bitk = 0; s->bitb = 0; s->read = s->write = s->window; if (s->checkfn != Z_NULL) z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0); Tracev((stderr, "inflate: blocks reset\n")); } inflate_blocks_statef *inflate_blocks_new(z, c, w) z_streamp z; check_func c; uInt w; { inflate_blocks_statef *s; if ((s = (inflate_blocks_statef *)ZALLOC (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL) return s; if ((s->hufts = (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL) { ZFREE(z, s); return Z_NULL; } if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL) { ZFREE(z, s->hufts); ZFREE(z, s); return Z_NULL; } s->end = s->window + w; s->checkfn = c; s->mode = TYPE; Tracev((stderr, "inflate: blocks allocated\n")); inflate_blocks_reset(s, z, Z_NULL); return s; } int inflate_blocks(s, z, r) inflate_blocks_statef *s; z_streamp z; int r; { uInt t; /* temporary storage */ uLong b; /* bit buffer */ uInt k; /* bits in bit buffer */ Bytef *p; /* input data pointer */ uInt n; /* bytes available there */ Bytef *q; /* output window write pointer */ uInt m; /* bytes to end of window or read pointer */ /* copy input/output information to locals (UPDATE macro restores) */ LOAD /* process input based on current state */ while (1) switch (s->mode) { case TYPE: NEEDBITS(3) t = (uInt)b & 7; s->last = t & 1; switch (t >> 1) { case 0: /* stored */ Tracev((stderr, "inflate: stored block%s\n", s->last ? " (last)" : "")); DUMPBITS(3) t = k & 7; /* go to byte boundary */ DUMPBITS(t) s->mode = LENS; /* get length of stored block */ break; case 1: /* fixed */ Tracev((stderr, "inflate: fixed codes block%s\n", s->last ? " (last)" : "")); { uInt bl, bd; inflate_huft *tl, *td; inflate_trees_fixed(&bl, &bd, &tl, &td, z); s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z); if (s->sub.decode.codes == Z_NULL) { r = Z_MEM_ERROR; LEAVE } } DUMPBITS(3) s->mode = CODES; break; case 2: /* dynamic */ Tracev((stderr, "inflate: dynamic codes block%s\n", s->last ? " (last)" : "")); DUMPBITS(3) s->mode = TABLE; break; case 3: /* illegal */ DUMPBITS(3) s->mode = BAD; z->msg = (char*)"invalid block type"; r = Z_DATA_ERROR; LEAVE } break; case LENS: NEEDBITS(32) if ((((~b) >> 16) & 0xffff) != (b & 0xffff)) { s->mode = BAD; z->msg = (char*)"invalid stored block lengths"; r = Z_DATA_ERROR; LEAVE } s->sub.left = (uInt)b & 0xffff; b = k = 0; /* dump bits */ Tracev((stderr, "inflate: stored length %u\n", s->sub.left)); s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE); break; case STORED: if (n == 0) LEAVE NEEDOUT t = s->sub.left; if (t > n) t = n; if (t > m) t = m; zmemcpy(q, p, t); p += t; n -= t; q += t; m -= t; if ((s->sub.left -= t) != 0) break; Tracev((stderr, "inflate: stored end, %lu total out\n", z->total_out + (q >= s->read ? q - s->read : (s->end - s->read) + (q - s->window)))); s->mode = s->last ? DRY : TYPE; break; case TABLE: NEEDBITS(14) s->sub.trees.table = t = (uInt)b & 0x3fff; #ifndef PKZIP_BUG_WORKAROUND if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) { s->mode = BAD; z->msg = (char*)"too many length or distance symbols"; r = Z_DATA_ERROR; LEAVE } #endif t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL) { r = Z_MEM_ERROR; LEAVE } DUMPBITS(14) s->sub.trees.index = 0; Tracev((stderr, "inflate: table sizes ok\n")); s->mode = BTREE; case BTREE: while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10)) { NEEDBITS(3) s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7; DUMPBITS(3) } while (s->sub.trees.index < 19) s->sub.trees.blens[border[s->sub.trees.index++]] = 0; s->sub.trees.bb = 7; t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb, &s->sub.trees.tb, s->hufts, z); if (t != Z_OK) { r = t; if (r == Z_DATA_ERROR) { ZFREE(z, s->sub.trees.blens); s->mode = BAD; } LEAVE } s->sub.trees.index = 0; Tracev((stderr, "inflate: bits tree ok\n")); s->mode = DTREE; case DTREE: while (t = s->sub.trees.table, s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f)) { inflate_huft *h; uInt i, j, c; t = s->sub.trees.bb; NEEDBITS(t) h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]); t = h->bits; c = h->base; if (c < 16) { DUMPBITS(t) s->sub.trees.blens[s->sub.trees.index++] = c; } else /* c == 16..18 */ { i = c == 18 ? 7 : c - 14; j = c == 18 ? 11 : 3; NEEDBITS(t + i) DUMPBITS(t) j += (uInt)b & inflate_mask[i]; DUMPBITS(i) i = s->sub.trees.index; t = s->sub.trees.table; if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) { ZFREE(z, s->sub.trees.blens); s->mode = BAD; z->msg = (char*)"invalid bit length repeat"; r = Z_DATA_ERROR; LEAVE } c = c == 16 ? s->sub.trees.blens[i - 1] : 0; do { s->sub.trees.blens[i++] = c; } while (--j); s->sub.trees.index = i; } } s->sub.trees.tb = Z_NULL; { uInt bl, bd; inflate_huft *tl, *td; inflate_codes_statef *c; bl = 9; /* must be <= 9 for lookahead assumptions */ bd = 6; /* must be <= 9 for lookahead assumptions */ t = s->sub.trees.table; t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), s->sub.trees.blens, &bl, &bd, &tl, &td, s->hufts, z); if (t != Z_OK) { if (t == (uInt)Z_DATA_ERROR) { ZFREE(z, s->sub.trees.blens); s->mode = BAD; } r = t; LEAVE } Tracev((stderr, "inflate: trees ok\n")); if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL) { r = Z_MEM_ERROR; LEAVE } s->sub.decode.codes = c; } ZFREE(z, s->sub.trees.blens); s->mode = CODES; case CODES: UPDATE if ((r = inflate_codes(s, z, r)) != Z_STREAM_END) return inflate_flush(s, z, r); r = Z_OK; inflate_codes_free(s->sub.decode.codes, z); LOAD Tracev((stderr, "inflate: codes end, %lu total out\n", z->total_out + (q >= s->read ? q - s->read : (s->end - s->read) + (q - s->window)))); if (!s->last) { s->mode = TYPE; break; } s->mode = DRY; case DRY: FLUSH if (s->read != s->write) LEAVE s->mode = DONE; case DONE: r = Z_STREAM_END; LEAVE case BAD: r = Z_DATA_ERROR; LEAVE default: r = Z_STREAM_ERROR; LEAVE } } int inflate_blocks_free(s, z) inflate_blocks_statef *s; z_streamp z; { inflate_blocks_reset(s, z, Z_NULL); ZFREE(z, s->window); ZFREE(z, s->hufts); ZFREE(z, s); Tracev((stderr, "inflate: blocks freed\n")); return Z_OK; } void inflate_set_dictionary(s, d, n) inflate_blocks_statef *s; const Bytef *d; uInt n; { zmemcpy(s->window, d, n); s->read = s->write = s->window + n; } /* Returns true if inflate is currently at the end of a block generated * by Z_SYNC_FLUSH or Z_FULL_FLUSH. * IN assertion: s != Z_NULL */ int inflate_blocks_sync_point(s) inflate_blocks_statef *s; { return s->mode == LENS; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/infblock.h0000644000175000017500000000227610161303544016431 0ustar sret1sret100000000000000/* infblock.h -- header to use infblock.c * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ struct inflate_blocks_state; typedef struct inflate_blocks_state FAR inflate_blocks_statef; extern inflate_blocks_statef * inflate_blocks_new OF(( z_streamp z, check_func c, /* check function */ uInt w)); /* window size */ extern int inflate_blocks OF(( inflate_blocks_statef *, z_streamp , int)); /* initial return code */ extern void inflate_blocks_reset OF(( inflate_blocks_statef *, z_streamp , uLongf *)); /* check value on output */ extern int inflate_blocks_free OF(( inflate_blocks_statef *, z_streamp)); extern void inflate_set_dictionary OF(( inflate_blocks_statef *s, const Bytef *d, /* dictionary */ uInt n)); /* dictionary length */ extern int inflate_blocks_sync_point OF(( inflate_blocks_statef *s)); analog-6.0/src/zlib/infcodes.c0000644000175000017500000001675710161303544016440 0ustar sret1sret100000000000000/* infcodes.c -- process literals and length/distance pairs * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" #include "inftrees.h" #include "infblock.h" #include "infcodes.h" #include "infutil.h" #include "inffast.h" /* simplify the use of the inflate_huft type with some defines */ #define exop word.what.Exop #define bits word.what.Bits typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ START, /* x: set up for LEN */ LEN, /* i: get length/literal/eob next */ LENEXT, /* i: getting length extra (have base) */ DIST, /* i: get distance next */ DISTEXT, /* i: getting distance extra */ COPY, /* o: copying bytes in window, waiting for space */ LIT, /* o: got literal, waiting for output space */ WASH, /* o: got eob, possibly still output waiting */ END, /* x: got eob and all data flushed */ BADCODE} /* x: got error */ inflate_codes_mode; /* inflate codes private state */ struct inflate_codes_state { /* mode */ inflate_codes_mode mode; /* current inflate_codes mode */ /* mode dependent information */ uInt len; union { struct { inflate_huft *tree; /* pointer into tree */ uInt need; /* bits needed */ } code; /* if LEN or DIST, where in tree */ uInt lit; /* if LIT, literal */ struct { uInt get; /* bits to get for extra */ uInt dist; /* distance back to copy from */ } copy; /* if EXT or COPY, where and how much */ } sub; /* submode */ /* mode independent information */ Byte lbits; /* ltree bits decoded per branch */ Byte dbits; /* dtree bits decoder per branch */ inflate_huft *ltree; /* literal/length/eob tree */ inflate_huft *dtree; /* distance tree */ }; inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z) uInt bl, bd; inflate_huft *tl; inflate_huft *td; /* need separate declaration for Borland C++ */ z_streamp z; { inflate_codes_statef *c; if ((c = (inflate_codes_statef *) ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL) { c->mode = START; c->lbits = (Byte)bl; c->dbits = (Byte)bd; c->ltree = tl; c->dtree = td; Tracev((stderr, "inflate: codes new\n")); } return c; } int inflate_codes(s, z, r) inflate_blocks_statef *s; z_streamp z; int r; { uInt j; /* temporary storage */ inflate_huft *t; /* temporary pointer */ uInt e; /* extra bits or operation */ uLong b; /* bit buffer */ uInt k; /* bits in bit buffer */ Bytef *p; /* input data pointer */ uInt n; /* bytes available there */ Bytef *q; /* output window write pointer */ uInt m; /* bytes to end of window or read pointer */ Bytef *f; /* pointer to copy strings from */ inflate_codes_statef *c = s->sub.decode.codes; /* codes state */ /* copy input/output information to locals (UPDATE macro restores) */ LOAD /* process input and output based on current state */ while (1) switch (c->mode) { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */ case START: /* x: set up for LEN */ #ifndef SLOW if (m >= 258 && n >= 10) { UPDATE r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z); LOAD if (r != Z_OK) { c->mode = r == Z_STREAM_END ? WASH : BADCODE; break; } } #endif /* !SLOW */ c->sub.code.need = c->lbits; c->sub.code.tree = c->ltree; c->mode = LEN; case LEN: /* i: get length/literal/eob next */ j = c->sub.code.need; NEEDBITS(j) t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); DUMPBITS(t->bits) e = (uInt)(t->exop); if (e == 0) /* literal */ { c->sub.lit = t->base; Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", t->base)); c->mode = LIT; break; } if (e & 16) /* length */ { c->sub.copy.get = e & 15; c->len = t->base; c->mode = LENEXT; break; } if ((e & 64) == 0) /* next table */ { c->sub.code.need = e; c->sub.code.tree = t + t->base; break; } if (e & 32) /* end of block */ { Tracevv((stderr, "inflate: end of block\n")); c->mode = WASH; break; } c->mode = BADCODE; /* invalid code */ z->msg = (char*)"invalid literal/length code"; r = Z_DATA_ERROR; LEAVE case LENEXT: /* i: getting length extra (have base) */ j = c->sub.copy.get; NEEDBITS(j) c->len += (uInt)b & inflate_mask[j]; DUMPBITS(j) c->sub.code.need = c->dbits; c->sub.code.tree = c->dtree; Tracevv((stderr, "inflate: length %u\n", c->len)); c->mode = DIST; case DIST: /* i: get distance next */ j = c->sub.code.need; NEEDBITS(j) t = c->sub.code.tree + ((uInt)b & inflate_mask[j]); DUMPBITS(t->bits) e = (uInt)(t->exop); if (e & 16) /* distance */ { c->sub.copy.get = e & 15; c->sub.copy.dist = t->base; c->mode = DISTEXT; break; } if ((e & 64) == 0) /* next table */ { c->sub.code.need = e; c->sub.code.tree = t + t->base; break; } c->mode = BADCODE; /* invalid code */ z->msg = (char*)"invalid distance code"; r = Z_DATA_ERROR; LEAVE case DISTEXT: /* i: getting distance extra */ j = c->sub.copy.get; NEEDBITS(j) c->sub.copy.dist += (uInt)b & inflate_mask[j]; DUMPBITS(j) Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist)); c->mode = COPY; case COPY: /* o: copying bytes in window, waiting for space */ f = q - c->sub.copy.dist; while (f < s->window) /* modulo window size-"while" instead */ f += s->end - s->window; /* of "if" handles invalid distances */ while (c->len) { NEEDOUT OUTBYTE(*f++) if (f == s->end) f = s->window; c->len--; } c->mode = START; break; case LIT: /* o: got literal, waiting for output space */ NEEDOUT OUTBYTE(c->sub.lit) c->mode = START; break; case WASH: /* o: got eob, possibly more output */ if (k > 7) /* return unused byte, if any */ { Assert(k < 16, "inflate_codes grabbed too many bytes") k -= 8; n++; p--; /* can always return one */ } FLUSH if (s->read != s->write) LEAVE c->mode = END; case END: r = Z_STREAM_END; LEAVE case BADCODE: /* x: got error */ r = Z_DATA_ERROR; LEAVE default: r = Z_STREAM_ERROR; LEAVE } #ifdef NEED_DUMMY_RETURN return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ #endif } void inflate_codes_free(c, z) inflate_codes_statef *c; z_streamp z; { ZFREE(z, c); Tracev((stderr, "inflate: codes free\n")); } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/infcodes.h0000644000175000017500000000134110161303544016424 0ustar sret1sret100000000000000/* infcodes.h -- header to use infcodes.c * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ struct inflate_codes_state; typedef struct inflate_codes_state FAR inflate_codes_statef; extern inflate_codes_statef *inflate_codes_new OF(( uInt, uInt, inflate_huft *, inflate_huft *, z_streamp )); extern int inflate_codes OF(( inflate_blocks_statef *, z_streamp , int)); extern void inflate_codes_free OF(( inflate_codes_statef *, z_streamp )); analog-6.0/src/zlib/inffast.c0000644000175000017500000001327110161303544016264 0ustar sret1sret100000000000000/* inffast.c -- process literals and length/distance pairs fast * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" #include "inftrees.h" #include "infblock.h" #include "infcodes.h" #include "infutil.h" #include "inffast.h" struct inflate_codes_state {int dummy;}; /* for buggy compilers */ /* simplify the use of the inflate_huft type with some defines */ #define exop word.what.Exop #define bits word.what.Bits /* macros for bit input with no checking and for returning unused bytes */ #define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<avail_in-n;c=(k>>3)>3:c;n+=c;p-=c;k-=c<<3;} /* Called with number of bytes left to write in window at least 258 (the maximum string length) and number of input bytes available at least ten. The ten bytes are six bytes for the longest length/ distance pair plus four bytes for overloading the bit buffer. */ int inflate_fast(bl, bd, tl, td, s, z) uInt bl, bd; inflate_huft *tl; inflate_huft *td; /* need separate declaration for Borland C++ */ inflate_blocks_statef *s; z_streamp z; { inflate_huft *t; /* temporary pointer */ uInt e; /* extra bits or operation */ uLong b; /* bit buffer */ uInt k; /* bits in bit buffer */ Bytef *p; /* input data pointer */ uInt n; /* bytes available there */ Bytef *q; /* output window write pointer */ uInt m; /* bytes to end of window or read pointer */ uInt ml; /* mask for literal/length tree */ uInt md; /* mask for distance tree */ uInt c; /* bytes to copy */ uInt d; /* distance back to copy from */ Bytef *r; /* copy source pointer */ /* load input, output, bit values */ LOAD /* initialize masks */ ml = inflate_mask[bl]; md = inflate_mask[bd]; /* do until not enough input or output space for fast loop */ do { /* assume called with m >= 258 && n >= 10 */ /* get literal/length code */ GRABBITS(20) /* max bits for literal/length code */ if ((e = (t = tl + ((uInt)b & ml))->exop) == 0) { DUMPBITS(t->bits) Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? "inflate: * literal '%c'\n" : "inflate: * literal 0x%02x\n", t->base)); *q++ = (Byte)t->base; m--; continue; } do { DUMPBITS(t->bits) if (e & 16) { /* get extra bits for length */ e &= 15; c = t->base + ((uInt)b & inflate_mask[e]); DUMPBITS(e) Tracevv((stderr, "inflate: * length %u\n", c)); /* decode distance base of block to copy */ GRABBITS(15); /* max bits for distance code */ e = (t = td + ((uInt)b & md))->exop; do { DUMPBITS(t->bits) if (e & 16) { /* get extra bits to add to distance base */ e &= 15; GRABBITS(e) /* get extra bits (up to 13) */ d = t->base + ((uInt)b & inflate_mask[e]); DUMPBITS(e) Tracevv((stderr, "inflate: * distance %u\n", d)); /* do the copy */ m -= c; r = q - d; if (r < s->window) /* wrap if needed */ { do { r += s->end - s->window; /* force pointer in window */ } while (r < s->window); /* covers invalid distances */ e = s->end - r; if (c > e) { c -= e; /* wrapped copy */ do { *q++ = *r++; } while (--e); r = s->window; do { *q++ = *r++; } while (--c); } else /* normal copy */ { *q++ = *r++; c--; *q++ = *r++; c--; do { *q++ = *r++; } while (--c); } } else /* normal copy */ { *q++ = *r++; c--; *q++ = *r++; c--; do { *q++ = *r++; } while (--c); } break; } else if ((e & 64) == 0) { t += t->base; e = (t += ((uInt)b & inflate_mask[e]))->exop; } else { z->msg = (char*)"invalid distance code"; UNGRAB UPDATE return Z_DATA_ERROR; } } while (1); break; } if ((e & 64) == 0) { t += t->base; if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0) { DUMPBITS(t->bits) Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ? "inflate: * literal '%c'\n" : "inflate: * literal 0x%02x\n", t->base)); *q++ = (Byte)t->base; m--; break; } } else if (e & 32) { Tracevv((stderr, "inflate: * end of block\n")); UNGRAB UPDATE return Z_STREAM_END; } else { z->msg = (char*)"invalid literal/length code"; UNGRAB UPDATE return Z_DATA_ERROR; } } while (1); } while (m >= 258 && n >= 10); /* not enough input or output--restore pointers and return */ UNGRAB UPDATE return Z_OK; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/inffast.h0000644000175000017500000000075010161303544016267 0ustar sret1sret100000000000000/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ extern int inflate_fast OF(( uInt, uInt, inflate_huft *, inflate_huft *, inflate_blocks_statef *, z_streamp )); analog-6.0/src/zlib/inffixed.h0000644000175000017500000002134010161303544016427 0ustar sret1sret100000000000000/* inffixed.h -- table for decoding fixed codes * Generated automatically by the maketree.c program */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ local uInt fixed_bl = 9; local uInt fixed_bd = 5; local inflate_huft fixed_tl[] = { {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192}, {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160}, {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224}, {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144}, {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208}, {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176}, {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240}, {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200}, {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168}, {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232}, {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152}, {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216}, {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184}, {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248}, {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196}, {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164}, {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228}, {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148}, {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212}, {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180}, {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244}, {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204}, {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172}, {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236}, {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156}, {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220}, {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188}, {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252}, {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194}, {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162}, {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226}, {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146}, {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210}, {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178}, {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242}, {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202}, {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170}, {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234}, {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154}, {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218}, {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186}, {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250}, {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198}, {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166}, {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230}, {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150}, {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214}, {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182}, {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246}, {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206}, {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174}, {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238}, {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158}, {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222}, {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190}, {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254}, {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115}, {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193}, {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161}, {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225}, {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145}, {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209}, {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177}, {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241}, {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227}, {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201}, {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169}, {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233}, {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153}, {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217}, {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185}, {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249}, {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163}, {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197}, {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165}, {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229}, {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149}, {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213}, {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181}, {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245}, {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0}, {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205}, {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173}, {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237}, {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157}, {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221}, {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189}, {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253}, {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131}, {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195}, {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163}, {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227}, {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147}, {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211}, {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179}, {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243}, {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258}, {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203}, {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171}, {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235}, {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155}, {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219}, {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187}, {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251}, {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195}, {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199}, {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167}, {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231}, {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151}, {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215}, {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183}, {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247}, {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0}, {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207}, {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175}, {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239}, {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159}, {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223}, {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191}, {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255} }; local inflate_huft fixed_td[] = { {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097}, {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385}, {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193}, {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577}, {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145}, {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577}, {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289}, {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577} }; analog-6.0/src/zlib/inflate.c0000644000175000017500000002274210161303544016257 0ustar sret1sret100000000000000/* inflate.c -- zlib interface to inflate modules * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" #include "infblock.h" struct inflate_blocks_state {int dummy;}; /* for buggy compilers */ typedef enum { METHOD, /* waiting for method byte */ FLAG, /* waiting for flag byte */ DICT4, /* four dictionary check bytes to go */ DICT3, /* three dictionary check bytes to go */ DICT2, /* two dictionary check bytes to go */ DICT1, /* one dictionary check byte to go */ DICT0, /* waiting for inflateSetDictionary */ BLOCKS, /* decompressing blocks */ CHECK4, /* four check bytes to go */ CHECK3, /* three check bytes to go */ CHECK2, /* two check bytes to go */ CHECK1, /* one check byte to go */ DONE, /* finished check, done */ BAD} /* got an error--stay here */ inflate_mode; /* inflate private state */ struct internal_state { /* mode */ inflate_mode mode; /* current inflate mode */ /* mode dependent information */ union { uInt method; /* if FLAGS, method byte */ struct { uLong was; /* computed check value */ uLong need; /* stream check value */ } check; /* if CHECK, check values to compare */ uInt marker; /* if BAD, inflateSync's marker bytes count */ } sub; /* submode */ /* mode independent information */ int nowrap; /* flag for no wrapper */ uInt wbits; /* log2(window size) (8..15, defaults to 15) */ inflate_blocks_statef *blocks; /* current inflate_blocks state */ }; int ZEXPORT inflateReset(z) z_streamp z; { if (z == Z_NULL || z->state == Z_NULL) return Z_STREAM_ERROR; z->total_in = z->total_out = 0; z->msg = Z_NULL; z->state->mode = z->state->nowrap ? BLOCKS : METHOD; inflate_blocks_reset(z->state->blocks, z, Z_NULL); Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflateEnd(z) z_streamp z; { if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL) return Z_STREAM_ERROR; if (z->state->blocks != Z_NULL) inflate_blocks_free(z->state->blocks, z); ZFREE(z, z->state); z->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateInit2_(z, w, version, stream_size) z_streamp z; int w; const char *version; int stream_size; { if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != sizeof(z_stream)) return Z_VERSION_ERROR; /* initialize state */ if (z == Z_NULL) return Z_STREAM_ERROR; z->msg = Z_NULL; if (z->zalloc == Z_NULL) { z->zalloc = zcalloc; z->opaque = (voidpf)0; } if (z->zfree == Z_NULL) z->zfree = zcfree; if ((z->state = (struct internal_state FAR *) ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL) return Z_MEM_ERROR; z->state->blocks = Z_NULL; /* handle undocumented nowrap option (no zlib header or check) */ z->state->nowrap = 0; if (w < 0) { w = - w; z->state->nowrap = 1; } /* set window size */ if (w < 8 || w > 15) { inflateEnd(z); return Z_STREAM_ERROR; } z->state->wbits = (uInt)w; /* create inflate_blocks state */ if ((z->state->blocks = inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w)) == Z_NULL) { inflateEnd(z); return Z_MEM_ERROR; } Tracev((stderr, "inflate: allocated\n")); /* reset state */ inflateReset(z); return Z_OK; } int ZEXPORT inflateInit_(z, version, stream_size) z_streamp z; const char *version; int stream_size; { return inflateInit2_(z, DEF_WBITS, version, stream_size); } #define NEEDBYTE {if(z->avail_in==0)return r;r=f;} #define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++) int ZEXPORT inflate(z, f) z_streamp z; int f; { int r; uInt b; if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL) return Z_STREAM_ERROR; f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK; r = Z_BUF_ERROR; while (1) switch (z->state->mode) { case METHOD: NEEDBYTE if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED) { z->state->mode = BAD; z->msg = (char*)"unknown compression method"; z->state->sub.marker = 5; /* can't try inflateSync */ break; } if ((z->state->sub.method >> 4) + 8 > z->state->wbits) { z->state->mode = BAD; z->msg = (char*)"invalid window size"; z->state->sub.marker = 5; /* can't try inflateSync */ break; } z->state->mode = FLAG; case FLAG: NEEDBYTE b = NEXTBYTE; if (((z->state->sub.method << 8) + b) % 31) { z->state->mode = BAD; z->msg = (char*)"incorrect header check"; z->state->sub.marker = 5; /* can't try inflateSync */ break; } Tracev((stderr, "inflate: zlib header ok\n")); if (!(b & PRESET_DICT)) { z->state->mode = BLOCKS; break; } z->state->mode = DICT4; case DICT4: NEEDBYTE z->state->sub.check.need = (uLong)NEXTBYTE << 24; z->state->mode = DICT3; case DICT3: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 16; z->state->mode = DICT2; case DICT2: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 8; z->state->mode = DICT1; case DICT1: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE; z->adler = z->state->sub.check.need; z->state->mode = DICT0; return Z_NEED_DICT; case DICT0: z->state->mode = BAD; z->msg = (char*)"need dictionary"; z->state->sub.marker = 0; /* can try inflateSync */ return Z_STREAM_ERROR; case BLOCKS: r = inflate_blocks(z->state->blocks, z, r); if (r == Z_DATA_ERROR) { z->state->mode = BAD; z->state->sub.marker = 0; /* can try inflateSync */ break; } if (r == Z_OK) r = f; if (r != Z_STREAM_END) return r; r = f; inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was); if (z->state->nowrap) { z->state->mode = DONE; break; } z->state->mode = CHECK4; case CHECK4: NEEDBYTE z->state->sub.check.need = (uLong)NEXTBYTE << 24; z->state->mode = CHECK3; case CHECK3: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 16; z->state->mode = CHECK2; case CHECK2: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE << 8; z->state->mode = CHECK1; case CHECK1: NEEDBYTE z->state->sub.check.need += (uLong)NEXTBYTE; if (z->state->sub.check.was != z->state->sub.check.need) { z->state->mode = BAD; z->msg = (char*)"incorrect data check"; z->state->sub.marker = 5; /* can't try inflateSync */ break; } Tracev((stderr, "inflate: zlib check ok\n")); z->state->mode = DONE; case DONE: return Z_STREAM_END; case BAD: return Z_DATA_ERROR; default: return Z_STREAM_ERROR; } #ifdef NEED_DUMMY_RETURN return Z_STREAM_ERROR; /* Some dumb compilers complain without this */ #endif } int ZEXPORT inflateSetDictionary(z, dictionary, dictLength) z_streamp z; const Bytef *dictionary; uInt dictLength; { uInt length = dictLength; if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0) return Z_STREAM_ERROR; if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR; z->adler = 1L; if (length >= ((uInt)1<state->wbits)) { length = (1<state->wbits)-1; dictionary += dictLength - length; } inflate_set_dictionary(z->state->blocks, dictionary, length); z->state->mode = BLOCKS; return Z_OK; } int ZEXPORT inflateSync(z) z_streamp z; { uInt n; /* number of bytes to look at */ Bytef *p; /* pointer to bytes */ uInt m; /* number of marker bytes found in a row */ uLong r, w; /* temporaries to save total_in and total_out */ /* set up */ if (z == Z_NULL || z->state == Z_NULL) return Z_STREAM_ERROR; if (z->state->mode != BAD) { z->state->mode = BAD; z->state->sub.marker = 0; } if ((n = z->avail_in) == 0) return Z_BUF_ERROR; p = z->next_in; m = z->state->sub.marker; /* search */ while (n && m < 4) { static const Byte mark[4] = {0, 0, 0xff, 0xff}; if (*p == mark[m]) m++; else if (*p) m = 0; else m = 4 - m; p++, n--; } /* restore */ z->total_in += p - z->next_in; z->next_in = p; z->avail_in = n; z->state->sub.marker = m; /* return no joy or set up to restart on a new block */ if (m != 4) return Z_DATA_ERROR; r = z->total_in; w = z->total_out; inflateReset(z); z->total_in = r; z->total_out = w; z->state->mode = BLOCKS; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH * but removes the length bytes of the resulting empty stored block. When * decompressing, PPP checks that at the end of input packet, inflate is * waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(z) z_streamp z; { if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL) return Z_STREAM_ERROR; return inflate_blocks_sync_point(z->state->blocks); } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/inftrees.c0000644000175000017500000003725210161303544016456 0ustar sret1sret100000000000000/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" #include "inftrees.h" #if !defined(BUILDFIXED) && !defined(STDC) # define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */ #endif const char inflate_copyright[] = " inflate 1.1.4 Copyright 1995-2002 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ struct internal_state {int dummy;}; /* for buggy compilers */ /* simplify the use of the inflate_huft type with some defines */ #define exop word.what.Exop #define bits word.what.Bits local int huft_build OF(( uIntf *, /* code lengths in bits */ uInt, /* number of codes */ uInt, /* number of "simple" codes */ const uIntf *, /* list of base values for non-simple codes */ const uIntf *, /* list of extra bits for non-simple codes */ inflate_huft * FAR*,/* result: starting table */ uIntf *, /* maximum lookup bits (returns actual) */ inflate_huft *, /* space for trees */ uInt *, /* hufts used in space */ uIntf * )); /* space for values */ /* Tables for deflate from PKZIP's appnote.txt. */ local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; /* see note #13 above about 258 */ local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */ local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; local const uInt cpdext[30] = { /* Extra bits for distance codes */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; /* Huffman code decoding is performed using a multi-level table lookup. The fastest way to decode is to simply build a lookup table whose size is determined by the longest code. However, the time it takes to build this table can also be a factor if the data being decoded is not very long. The most common codes are necessarily the shortest codes, so those codes dominate the decoding time, and hence the speed. The idea is you can have a shorter table that decodes the shorter, more probable codes, and then point to subsidiary tables for the longer codes. The time it costs to decode the longer codes is then traded against the time it takes to make longer tables. This results of this trade are in the variables lbits and dbits below. lbits is the number of bits the first level table for literal/ length codes can decode in one step, and dbits is the same thing for the distance codes. Subsequent tables are also less than or equal to those sizes. These values may be adjusted either when all of the codes are shorter than that, in which case the longest code length in bits is used, or when the shortest code is *longer* than the requested table size, in which case the length of the shortest code in bits is used. There are two different values for the two tables, since they code a different number of possibilities each. The literal/length table codes 286 possible values, or in a flat code, a little over eight bits. The distance table codes 30 possible values, or a little less than five bits, flat. The optimum values for speed end up being about one bit more than those, so lbits is 8+1 and dbits is 5+1. The optimum values may differ though from machine to machine, and possibly even between compilers. Your mileage may vary. */ /* If BMAX needs to be larger than 16, then h and x[] should be uLong. */ #define BMAX 15 /* maximum bit length of any code */ local int huft_build(b, n, s, d, e, t, m, hp, hn, v) uIntf *b; /* code lengths in bits (all assumed <= BMAX) */ uInt n; /* number of codes (assumed <= 288) */ uInt s; /* number of simple-valued codes (0..s-1) */ const uIntf *d; /* list of base values for non-simple codes */ const uIntf *e; /* list of extra bits for non-simple codes */ inflate_huft * FAR *t; /* result: starting table */ uIntf *m; /* maximum lookup bits, returns actual */ inflate_huft *hp; /* space for trees */ uInt *hn; /* hufts used in space */ uIntf *v; /* working area: values in order of bit length */ /* Given a list of code lengths and a maximum table size, make a set of tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR if the given code set is incomplete (the tables are still built in this case), or Z_DATA_ERROR if the input is invalid. */ { uInt a; /* counter for codes of length k */ uInt c[BMAX+1]; /* bit length count table */ uInt f; /* i repeats in table every f entries */ int g; /* maximum code length */ int h; /* table level */ register uInt i; /* counter, current code */ register uInt j; /* counter */ register int k; /* number of bits in current code */ int l; /* bits per table (returned in m) */ uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */ register uIntf *p; /* pointer into c[], b[], or v[] */ inflate_huft *q; /* points to current table */ struct inflate_huft_s r; /* table entry for structure assignment */ inflate_huft *u[BMAX]; /* table stack */ register int w; /* bits before this table == (l * h) */ uInt x[BMAX+1]; /* bit offsets, then code stack */ uIntf *xp; /* pointer into x */ int y; /* number of dummy codes added */ uInt z; /* number of entries in current table */ /* Generate counts for each bit length */ p = c; #define C0 *p++ = 0; #define C2 C0 C0 C0 C0 #define C4 C2 C2 C2 C2 C4 /* clear c[]--assume BMAX+1 is 16 */ p = b; i = n; do { c[*p++]++; /* assume all entries <= BMAX */ } while (--i); if (c[0] == n) /* null input--all zero length codes */ { *t = (inflate_huft *)Z_NULL; *m = 0; return Z_OK; } /* Find minimum and maximum length, bound *m by those */ l = *m; for (j = 1; j <= BMAX; j++) if (c[j]) break; k = j; /* minimum code length */ if ((uInt)l < j) l = j; for (i = BMAX; i; i--) if (c[i]) break; g = i; /* maximum code length */ if ((uInt)l > i) l = i; *m = l; /* Adjust last length count to fill out codes, if needed */ for (y = 1 << j; j < i; j++, y <<= 1) if ((y -= c[j]) < 0) return Z_DATA_ERROR; if ((y -= c[i]) < 0) return Z_DATA_ERROR; c[i] += y; /* Generate starting offsets into the value table for each length */ x[1] = j = 0; p = c + 1; xp = x + 2; while (--i) { /* note that i == g from above */ *xp++ = (j += *p++); } /* Make a table of values in order of bit lengths */ p = b; i = 0; do { if ((j = *p++) != 0) v[x[j]++] = i; } while (++i < n); n = x[g]; /* set n to length of v */ /* Generate the Huffman codes and for each, make the table entries */ x[0] = i = 0; /* first Huffman code is zero */ p = v; /* grab values in bit order */ h = -1; /* no tables yet--level -1 */ w = -l; /* bits decoded == (l * h) */ u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */ q = (inflate_huft *)Z_NULL; /* ditto */ z = 0; /* ditto */ /* go through the bit lengths (k already is bits in shortest code) */ for (; k <= g; k++) { a = c[k]; while (a--) { /* here i is the Huffman code of length k bits for value *p */ /* make tables up to required level */ while (k > w + l) { h++; w += l; /* previous table always l bits */ /* compute minimum size table less than or equal to l bits */ z = g - w; z = z > (uInt)l ? l : z; /* table size upper limit */ if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */ { /* too few codes for k-w bit table */ f -= a + 1; /* deduct codes from patterns left */ xp = c + k; if (j < z) while (++j < z) /* try smaller tables up to z bits */ { if ((f <<= 1) <= *++xp) break; /* enough codes to use up j bits */ f -= *xp; /* else deduct codes from patterns */ } } z = 1 << j; /* table entries for j-bit table */ /* allocate new table */ if (*hn + z > MANY) /* (note: doesn't matter for fixed) */ return Z_DATA_ERROR; /* overflow of MANY */ u[h] = q = hp + *hn; *hn += z; /* connect to last table, if there is one */ if (h) { x[h] = i; /* save pattern for backing up */ r.bits = (Byte)l; /* bits to dump before this table */ r.exop = (Byte)j; /* bits in this table */ j = i >> (w - l); r.base = (uInt)(q - u[h-1] - j); /* offset to this table */ u[h-1][j] = r; /* connect to last table */ } else *t = q; /* first table is returned result */ } /* set up table entry in r */ r.bits = (Byte)(k - w); if (p >= v + n) r.exop = 128 + 64; /* out of values--invalid code */ else if (*p < s) { r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */ r.base = *p++; /* simple code is just the value */ } else { r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */ r.base = d[*p++ - s]; } /* fill code-like entries with r */ f = 1 << (k - w); for (j = i >> w; j < z; j += f) q[j] = r; /* backwards increment the k-bit code i */ for (j = 1 << (k - 1); i & j; j >>= 1) i ^= j; i ^= j; /* backup over finished tables */ mask = (1 << w) - 1; /* needed on HP, cc -O bug */ while ((i & mask) != x[h]) { h--; /* don't need to update q */ w -= l; mask = (1 << w) - 1; } } } /* Return Z_BUF_ERROR if we were given an incomplete table */ return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK; } int inflate_trees_bits(c, bb, tb, hp, z) uIntf *c; /* 19 code lengths */ uIntf *bb; /* bits tree desired/actual depth */ inflate_huft * FAR *tb; /* bits tree result */ inflate_huft *hp; /* space for trees */ z_streamp z; /* for messages */ { int r; uInt hn = 0; /* hufts used in space */ uIntf *v; /* work area for huft_build */ if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL) return Z_MEM_ERROR; r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL, tb, bb, hp, &hn, v); if (r == Z_DATA_ERROR) z->msg = (char*)"oversubscribed dynamic bit lengths tree"; else if (r == Z_BUF_ERROR || *bb == 0) { z->msg = (char*)"incomplete dynamic bit lengths tree"; r = Z_DATA_ERROR; } ZFREE(z, v); return r; } int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z) uInt nl; /* number of literal/length codes */ uInt nd; /* number of distance codes */ uIntf *c; /* that many (total) code lengths */ uIntf *bl; /* literal desired/actual bit depth */ uIntf *bd; /* distance desired/actual bit depth */ inflate_huft * FAR *tl; /* literal/length tree result */ inflate_huft * FAR *td; /* distance tree result */ inflate_huft *hp; /* space for trees */ z_streamp z; /* for messages */ { int r; uInt hn = 0; /* hufts used in space */ uIntf *v; /* work area for huft_build */ /* allocate work area */ if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) return Z_MEM_ERROR; /* build literal/length tree */ r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v); if (r != Z_OK || *bl == 0) { if (r == Z_DATA_ERROR) z->msg = (char*)"oversubscribed literal/length tree"; else if (r != Z_MEM_ERROR) { z->msg = (char*)"incomplete literal/length tree"; r = Z_DATA_ERROR; } ZFREE(z, v); return r; } /* build distance tree */ r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v); if (r != Z_OK || (*bd == 0 && nl > 257)) { if (r == Z_DATA_ERROR) z->msg = (char*)"oversubscribed distance tree"; else if (r == Z_BUF_ERROR) { #ifdef PKZIP_BUG_WORKAROUND r = Z_OK; } #else z->msg = (char*)"incomplete distance tree"; r = Z_DATA_ERROR; } else if (r != Z_MEM_ERROR) { z->msg = (char*)"empty distance tree with lengths"; r = Z_DATA_ERROR; } ZFREE(z, v); return r; #endif } /* done */ ZFREE(z, v); return Z_OK; } /* build fixed tables only once--keep them here */ #ifdef BUILDFIXED local int fixed_built = 0; #define FIXEDH 544 /* number of hufts used by fixed tables */ local inflate_huft fixed_mem[FIXEDH]; local uInt fixed_bl; local uInt fixed_bd; local inflate_huft *fixed_tl; local inflate_huft *fixed_td; #else #include "inffixed.h" #endif int inflate_trees_fixed(bl, bd, tl, td, z) uIntf *bl; /* literal desired/actual bit depth */ uIntf *bd; /* distance desired/actual bit depth */ inflate_huft * FAR *tl; /* literal/length tree result */ inflate_huft * FAR *td; /* distance tree result */ z_streamp z; /* for memory allocation */ { #ifdef BUILDFIXED /* build fixed tables if not already */ if (!fixed_built) { int k; /* temporary variable */ uInt f = 0; /* number of hufts used in fixed_mem */ uIntf *c; /* length list for huft_build */ uIntf *v; /* work area for huft_build */ /* allocate memory */ if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) return Z_MEM_ERROR; if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL) { ZFREE(z, c); return Z_MEM_ERROR; } /* literal table */ for (k = 0; k < 144; k++) c[k] = 8; for (; k < 256; k++) c[k] = 9; for (; k < 280; k++) c[k] = 7; for (; k < 288; k++) c[k] = 8; fixed_bl = 9; huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl, fixed_mem, &f, v); /* distance table */ for (k = 0; k < 30; k++) c[k] = 5; fixed_bd = 5; huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd, fixed_mem, &f, v); /* done */ ZFREE(z, v); ZFREE(z, c); fixed_built = 1; } #endif *bl = fixed_bl; *bd = fixed_bd; *tl = fixed_tl; *td = fixed_td; return Z_OK; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/inftrees.h0000644000175000017500000000507010161303544016454 0ustar sret1sret100000000000000/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Huffman code lookup table entry--this entry is four bytes for machines that have 16-bit pointers (e.g. PC's in the small or medium model). */ typedef struct inflate_huft_s FAR inflate_huft; struct inflate_huft_s { union { struct { Byte Exop; /* number of extra bits or operation */ Byte Bits; /* number of bits in this code or subcode */ } what; uInt pad; /* pad structure to a power of 2 (4 bytes for */ } word; /* 16-bit, 8 bytes for 32-bit int's) */ uInt base; /* literal, length base, distance base, or table offset */ }; /* Maximum size of dynamic tree. The maximum found in a long but non- exhaustive search was 1004 huft structures (850 for length/literals and 154 for distances, the latter actually the result of an exhaustive search). The actual maximum is not known, but the value below is more than safe. */ #define MANY 1440 extern int inflate_trees_bits OF(( uIntf *, /* 19 code lengths */ uIntf *, /* bits tree desired/actual depth */ inflate_huft * FAR *, /* bits tree result */ inflate_huft *, /* space for trees */ z_streamp)); /* for messages */ extern int inflate_trees_dynamic OF(( uInt, /* number of literal/length codes */ uInt, /* number of distance codes */ uIntf *, /* that many (total) code lengths */ uIntf *, /* literal desired/actual bit depth */ uIntf *, /* distance desired/actual bit depth */ inflate_huft * FAR *, /* literal/length tree result */ inflate_huft * FAR *, /* distance tree result */ inflate_huft *, /* space for trees */ z_streamp)); /* for messages */ extern int inflate_trees_fixed OF(( uIntf *, /* literal desired/actual bit depth */ uIntf *, /* distance desired/actual bit depth */ inflate_huft * FAR *, /* literal/length tree result */ inflate_huft * FAR *, /* distance tree result */ z_streamp)); /* for memory allocation */ analog-6.0/src/zlib/infutil.c0000644000175000017500000000377110161303544016310 0ustar sret1sret100000000000000/* inflate_util.c -- data and routines common to blocks and codes * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" #include "infblock.h" #include "inftrees.h" #include "infcodes.h" #include "infutil.h" struct inflate_codes_state {int dummy;}; /* for buggy compilers */ /* And'ing with mask[n] masks the lower n bits */ uInt inflate_mask[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff }; /* copy as much as possible from the sliding window to the output area */ int inflate_flush(s, z, r) inflate_blocks_statef *s; z_streamp z; int r; { uInt n; Bytef *p; Bytef *q; /* local copies of source and destination pointers */ p = z->next_out; q = s->read; /* compute number of bytes to copy as far as end of window */ n = (uInt)((q <= s->write ? s->write : s->end) - q); if (n > z->avail_out) n = z->avail_out; if (n && r == Z_BUF_ERROR) r = Z_OK; /* update counters */ z->avail_out -= n; z->total_out += n; /* update check information */ if (s->checkfn != Z_NULL) z->adler = s->check = (*s->checkfn)(s->check, q, n); /* copy as far as end of window */ zmemcpy(p, q, n); p += n; q += n; /* see if more to copy at beginning of window */ if (q == s->end) { /* wrap pointers */ q = s->window; if (s->write == s->end) s->write = s->window; /* compute bytes to copy */ n = (uInt)(s->write - q); if (n > z->avail_out) n = z->avail_out; if (n && r == Z_BUF_ERROR) r = Z_OK; /* update counters */ z->avail_out -= n; z->total_out += n; /* update check information */ if (s->checkfn != Z_NULL) z->adler = s->check = (*s->checkfn)(s->check, q, n); /* copy */ zmemcpy(p, q, n); p += n; q += n; } /* update pointers */ z->next_out = p; s->read = q; /* done */ return r; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/infutil.h0000644000175000017500000000713710161303544016315 0ustar sret1sret100000000000000/* infutil.h -- types and macros common to blocks and codes * Copyright (C) 1995-2002 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef _INFUTIL_H #define _INFUTIL_H typedef enum { TYPE, /* get type bits (3, including end bit) */ LENS, /* get lengths for stored */ STORED, /* processing stored block */ TABLE, /* get table lengths */ BTREE, /* get bit lengths tree for a dynamic block */ DTREE, /* get length, distance trees for a dynamic block */ CODES, /* processing fixed or dynamic block */ DRY, /* output remaining window bytes */ DONE, /* finished last block, done */ BAD} /* got a data error--stuck here */ inflate_block_mode; /* inflate blocks semi-private state */ struct inflate_blocks_state { /* mode */ inflate_block_mode mode; /* current inflate_block mode */ /* mode dependent information */ union { uInt left; /* if STORED, bytes left to copy */ struct { uInt table; /* table lengths (14 bits) */ uInt index; /* index into blens (or border) */ uIntf *blens; /* bit lengths of codes */ uInt bb; /* bit length tree depth */ inflate_huft *tb; /* bit length decoding tree */ } trees; /* if DTREE, decoding info for trees */ struct { inflate_codes_statef *codes; } decode; /* if CODES, current state */ } sub; /* submode */ uInt last; /* true if this block is the last block */ /* mode independent information */ uInt bitk; /* bits in bit buffer */ uLong bitb; /* bit buffer */ inflate_huft *hufts; /* single malloc for tree space */ Bytef *window; /* sliding window */ Bytef *end; /* one byte after sliding window */ Bytef *read; /* window read pointer */ Bytef *write; /* window write pointer */ check_func checkfn; /* check function */ uLong check; /* check on output */ }; /* defines for inflate input/output */ /* update pointers and return */ #define UPDBITS {s->bitb=b;s->bitk=k;} #define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;} #define UPDOUT {s->write=q;} #define UPDATE {UPDBITS UPDIN UPDOUT} #define LEAVE {UPDATE return inflate_flush(s,z,r);} /* get bytes and bits */ #define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;} #define NEEDBYTE {if(n)r=Z_OK;else LEAVE} #define NEXTBYTE (n--,*p++) #define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<>=(j);k-=(j);} /* output bytes */ #define WAVAIL (uInt)(qread?s->read-q-1:s->end-q) #define LOADOUT {q=s->write;m=(uInt)WAVAIL;} #define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}} #define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT} #define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;} #define OUTBYTE(a) {*q++=(Byte)(a);m--;} /* load local pointers */ #define LOAD {LOADIN LOADOUT} /* masks for lower bits (size given to avoid silly warnings with Visual C++) */ extern uInt inflate_mask[17]; /* copy as much as possible from the sliding window to the output area */ extern int inflate_flush OF(( inflate_blocks_statef *, z_streamp , int)); struct internal_state {int dummy;}; /* for buggy compilers */ #endif analog-6.0/src/zlib/trees.c0000644000175000017500000012526110161303544015757 0ustar sret1sret100000000000000/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2002 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* #define GEN_TREES_H */ #ifndef HAVE_ZLIB #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ #define Buf_size (8 * 2*sizeof(char)) /* Number of bits used within bi_buf. (bi_buf might be implemented on * more than 16 bits on some systems.) */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local void set_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (value << s->bi_valid); put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (val << s->bi_valid);\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ #define MAX(a,b) (a >= b ? a : b) /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if (tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void _tr_stored_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. * The current inflate code requires 9 bits of lookahead. If the * last two codes for the previous block (real code plus EOB) were coded * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode * the last real code. In this case we send two empty static blocks instead * of one. (There are no problems if the previous block is stored or fixed.) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ void _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); /* Of the 10 bits for the empty block, we have already sent * (10 - bi_valid) bits. The lookahead for the last real code (before * the EOB of the previous block) was thus at least one plus the length * of the EOB plus what we have just sent of the empty static block. */ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; #endif bi_flush(s); } s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void _tr_flush_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is ascii or binary */ if (s->data_type == Z_UNKNOWN) set_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute first the block length in bytes*/ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, eof); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+eof, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+eof, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (eof) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*eof)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; ct_data *ltree; /* literal tree */ ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Set the data type to ASCII or BINARY, using a crude approximation: * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. * IN assertion: the fields freq of dyn_ltree are set and the total of all * frequencies does not exceed 64K (to fit in an int on 16 bit machines). */ local void set_data_type(s) deflate_state *s; { int n = 0; unsigned ascii_freq = 0; unsigned bin_freq = 0; while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/trees.h0000644000175000017500000002037410161303544015763 0ustar sret1sret100000000000000/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; analog-6.0/src/zlib/uncompr.c0000644000175000017500000000372610161303544016321 0ustar sret1sret100000000000000/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/zconf.h0000644000175000017500000001716110161303544015760 0ustar sret1sret100000000000000/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef _ZCONF_H #define _ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflateParams z_deflateParams # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateReset z_inflateReset # define compress z_compress # define compress2 z_compress2 # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 #endif #if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386) # ifndef __32BIT__ # define __32BIT__ # endif #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #if defined(MSDOS) && !defined(__32BIT__) # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC) # define STDC #endif #if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__) # ifndef STDC # define STDC # endif #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__) # define NO_DUMMY_DECL #endif /* Old Borland C incorrectly complains about missing returns: */ #if defined(__BORLANDC__) && (__BORLANDC__ < 0x500) # define NEED_DUMMY_RETURN #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif #endif #if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__)) # ifndef __32BIT__ # define SMALL_MEDIUM # define FAR _far # endif #endif /* Compile with -DZLIB_DLL for Windows DLL support */ #if defined(ZLIB_DLL) # if defined(_WINDOWS) || defined(WINDOWS) # ifdef FAR # undef FAR # endif # include # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR _cdecl _export # endif # endif # if defined (__BORLANDC__) # if (__BORLANDC__ >= 0x0500) && defined (WIN32) # include # define ZEXPORT __declspec(dllexport) WINAPI # define ZEXPORTRVA __declspec(dllexport) WINAPIV # else # if defined (_Windows) && defined (__DLL__) # define ZEXPORT _export # define ZEXPORTVA _export # endif # endif # endif #endif #if defined (__BEOS__) # if defined (ZLIB_DLL) # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef FAR # define FAR #endif #if !defined(MACOS) && !defined(TARGET_OS_MAC) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #ifdef HAVE_UNISTD_H # include /* for off_t */ # include /* for SEEK_* and off_t */ # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(inflate_blocks,"INBL") # pragma map(inflate_blocks_new,"INBLNE") # pragma map(inflate_blocks_free,"INBLFR") # pragma map(inflate_blocks_reset,"INBLRE") # pragma map(inflate_codes_free,"INCOFR") # pragma map(inflate_codes,"INCO") # pragma map(inflate_fast,"INFA") # pragma map(inflate_flush,"INFLU") # pragma map(inflate_mask,"INMA") # pragma map(inflate_set_dictionary,"INSEDI2") # pragma map(inflate_copyright,"INCOPY") # pragma map(inflate_trees_bits,"INTRBI") # pragma map(inflate_trees_dynamic,"INTRDY") # pragma map(inflate_trees_fixed,"INTRFI") # pragma map(inflate_trees_free,"INTRFR") #endif #endif /* _ZCONF_H */ analog-6.0/src/zlib/zlib.h0000644000175000017500000012000610161303544015572 0ustar sret1sret100000000000000/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.1.4, March 11th, 2002 Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifdef HAVE_ZLIB #include #else #ifndef _ZLIB_H #define _ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.1.4" /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: ascii or binary */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 /* Allowed flush values; see deflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_ASCII 1 #define Z_UNKNOWN 2 /* Possible values of the data_type field */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade the compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least 0.1% larger than avail_in plus 12 bytes. If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update data_type if it can make a good guess about the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may some introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much output as possible to the output buffer. The flushing behavior of inflate is not specified for values of the flush parameter other than Z_SYNC_FLUSH and Z_FINISH, but the current implementation actually flushes as much output as possible anyway. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster routine may be used for the single inflate() call. If a preset dictionary is needed at this point (see inflateSetDictionary below), inflate sets strm-adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR case, the application may then call inflateSync to look for a good compression block. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no string match). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. Upon return of this function, strm->adler is set to the Adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The Adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative memLevel). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate if this call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the Adler32 value returned by this call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect Adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, const voidp buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running crc with the bytes buf[0..len-1] and return the updated crc. If buf is NULL, this function returns the required initial value for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int err)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* _ZLIB_H */ #endif /* ! HAVE_ZLIB */ analog-6.0/src/zlib/zutil.c0000644000175000017500000001221110161303544015772 0ustar sret1sret100000000000000/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ #ifndef HAVE_ZLIB #include "zutil.h" struct internal_state {int dummy;}; /* for buggy compilers */ #ifndef STDC extern void exit OF((int)); #endif const char *z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int z_verbose = verbose; void z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #ifndef HAVE_MEMCPY void zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef __TURBOC__ #if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) /* Small and medium model in Turbo C are for now limited to near allocation * with reduced MAX_WBITS and MAX_MEM_LEVEL */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif #endif /* __TURBOC__ */ #if defined(M_I86) && !defined(__32BIT__) /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* MSC */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return (voidpf)calloc(items, size); } void zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ #endif /* HAVE_ZLIB */ analog-6.0/src/zlib/zutil.h0000644000175000017500000001264710161303544016014 0ustar sret1sret100000000000000/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ #ifndef _Z_UTIL_H #define _Z_UTIL_H #include "zlib.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = (char*)ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #ifdef MSDOS # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) # if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif #endif #ifdef OS2 # define OS_CODE 0x06 #endif #ifdef WIN32 /* Window 95 & Windows NT */ # define OS_CODE 0x0b #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0F #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) # define fdopen(fd,type) _fdopen(fd,type) #endif /* Common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #ifdef HAVE_STRERROR extern char *strerror OF((int)); # define zstrerror(errnum) strerror(errnum) #else # define zstrerror(errnum) "" #endif #if defined(pyr) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int z_verbose; extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf, uInt len)); voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} #endif /* _Z_UTIL_H */ analog-6.0/src/Makefile0000644000175000017500000002277610161303542015176 0ustar sret1sret100000000000000# Makefile for analog 6.0 # Please read docs/Readme.html, or http://www.analog.cx/ # This is a general Unix-like Makefile: Makefiles for other OS's can be found # in the "build" directory. CC = gcc # which compiler to use: eg cc, acc, gcc. NB Different # compilers need different CFLAGS, e.g., -O instead of -O2. MAKE = make # which "make" to use CFLAGS = -O2 # options, e.g. for optimisation or ANSI compilation. # Some OS's need -D_FILE_OFFSET_BITS=64 to support files > 2MB. # HP/UX cc needs CFLAGS = -Aa (HP/UX 9) or -Ae (HP/UX 10) # BeOS needs CFLAGS = -O2 -Wl,-L/boot/home/config/lib # BS2000/OSD needs CFLAGS = -XLLML -XLLMK # NeXTSTEP needs CFLAGS = -O2 -pipe -no-precomp DEFS = # any combination of -DNOPIPES -DNODNS -DNODIRENT -DNOGLOB ... # ... -DNOOPEN -DNOFOLLOW -DNOALARM -DNOGRAPHICS -DNOGMTIME ... # ... -DEBCDIC -DUSE_PLAIN_SETJMP ... # ... -DHAVE_GD -DHAVE_ZLIB -DHAVE_BZLIB -DHAVE_PCRE ... # ... -DNEED_STRCMP -DNEED_MEMMOVE -DNEED_STRTOUL ... # ... -DNEED_DIFFTIME -DHAVE_ADDR_T -DNEED_FLOATINGPOINT_H # All the options are explained at the bottom of this file. # # Solaris 2 (SunOS 5+) might need DEFS = -DNEED_STRCMP # SunOS 4 usually needs... # DEFS = -DNEED_MEMMOVE -DNEED_STRTOUL -DNEED_DIFFTIME -DNEED_FLOATINGPOINT_H # 64-bit Solaris and Tru64 version 5+ need DEFS = -DHAVE_ADDR_T # SCO OpenServer 5 needs DEFS = -DPATH_MAX=2048 # BeOS 5.0.3 or below needs DEFS = -DNODNS # DYNIX/ptx needs DEFS = -D_SOCKET_VERSION=11 # MPE/iX needs DEFS = -D_POSIX_SOURCE -D_SOCKET_SOURCE # OS = UNIX # Operating system: UNIX, DOS, WIN32, MAC, OS2, OSX, VMS # RISCOS, BEOS, NEXTSTEP, MPEIX, BS2000, AS400, OS390 LIBS = -lm # extra libraries needed; most platforms (but not OS X or BeOS) # need -lm LAST # if you defined HAVE_GD above you also need -lgd -lpng -ljpeg -lz # if you defined HAVE_ZLIB above you also need -lz # if you defined HAVE_BZLIB above you also need -lbz2 # if you defined HAVE_PCRE above you also need -lpcre # Also Solaris 2 (SunOS 5+) needs LIBS = -lnsl -lm # SCO Unix needs LIBS = -lsocket -lm # IRIX needs LIBS = -lc -lm # Windows compilers probably need LIBS = -lwsock32 -lm # BeOS 5.0.3 or below needs LIBS = -lnet -lglob; 5.0.4 or above # needs LIBS = -lbind -lglob; and install libglob from BeBits.com # OS/2 with EMX needs LIBS = -lsocket -lm # BS2000/OSD needs LIBS = -lsocket -lm # MPE/iX needs LIBS = -lsocket -lm # SVR4 needs LIBS = -lsocket -lnsl -lm # DYNIX/ptx needs LIBS = -L/usr/lib/bsd-socket -lsocket -lnsl -lm PROGRAM = analog TARGET = ../analog OBJS = alias.o analog.o cache.o dates.o globals.o hash.o init.o init2.o \ input.o macinput.o macstuff.o output.o output2.o outcro.o outhtml.o \ outlatex.o outplain.o outxhtml.o outxml.o process.o settings.o sort.o \ tree.o utils.o win32.o SUBDIRS = bzip2 libgd libpng pcre unzip zlib SUBDIROBJS = libgd/gd.o libgd/gd_io.o libgd/gd_io_file.o libgd/gd_png.o \ libgd/gdfontf.o libgd/gdfonts.o libgd/gdtables.o \ libpng/png.o libpng/pngerror.o libpng/pngmem.o libpng/pngset.o \ libpng/pngtrans.o libpng/pngwio.o libpng/pngwrite.o \ libpng/pngwtran.o libpng/pngwutil.o pcre/pcre.o \ zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o \ zlib/gzio.o zlib/infblock.o zlib/infcodes.o zlib/inffast.o \ zlib/inflate.o zlib/inftrees.o zlib/infutil.o zlib/trees.o \ zlib/uncompr.o zlib/zutil.o unzip/ioapi.o unzip/unzip.o \ bzip2/bzlib.o bzip2/blocksort.o bzip2/compress.o bzip2/crctable.o \ bzip2/decompress.o bzip2/huffman.o bzip2/randtable.o HEADERS = anlghead.h anlghea2.h anlghea3.h anlghea4.h macdir.h \ pcre/pcre.h libgd/gd.h libgd/gdfontf.h libgd/gdfonts.h unzip/unzip.h \ zlib/zlib.h bzip2/bzlib.h ALLCFLAGS = $(CFLAGS) $(DEFS) -D$(OS) ALLOBJS = $(OBJS) $(SUBDIROBJS) $(PROGRAM): $(OBJS) $(SUBDIRS) $(HEADERS) Makefile $(CC) $(CFLAGS) -o $(TARGET) $(ALLOBJS) $(LIBS) # There doesn't seem to be a good way to write all these rules in a generic # form that works for all "make" programs bzip2: ALWAYS cd bzip2 && $(MAKE) 'CC=$(CC)' 'ALLCFLAGS=$(ALLCFLAGS)' libgd: ALWAYS cd libgd && $(MAKE) 'CC=$(CC)' 'ALLCFLAGS=$(ALLCFLAGS)' libpng: ALWAYS cd libpng && $(MAKE) 'CC=$(CC)' 'ALLCFLAGS=$(ALLCFLAGS)' pcre: ALWAYS cd pcre && $(MAKE) 'CC=$(CC)' 'ALLCFLAGS=$(ALLCFLAGS)' unzip: ALWAYS cd unzip && $(MAKE) 'CC=$(CC)' 'ALLCFLAGS=$(ALLCFLAGS)' zlib: ALWAYS cd zlib && $(MAKE) 'CC=$(CC)' 'ALLCFLAGS=$(ALLCFLAGS)' alias.o: alias.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c alias.c analog.o: analog.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c analog.c cache.o: cache.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c cache.c dates.o: dates.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c dates.c globals.o: globals.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c globals.c hash.o: hash.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c hash.c init.o: init.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c init.c init2.o: init2.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c init2.c input.o: input.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c input.c macinput.o: macinput.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c macinput.c macstuff.o: macstuff.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c macstuff.c output.o: output.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c output.c output2.o: output2.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c output2.c outcro.o: outcro.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c outcro.c outhtml.o: outhtml.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c outhtml.c outlatex.o: outlatex.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c outlatex.c outplain.o: outplain.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c outplain.c outxhtml.o: outxhtml.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c outxhtml.c outxml.o: outxml.c outxml.h $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c outxml.c process.o: process.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c process.c settings.o: settings.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c settings.c sort.o: sort.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c sort.c tree.o: tree.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c tree.c utils.o: utils.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c utils.c win32.o: win32.c $(HEADERS) Makefile $(CC) $(ALLCFLAGS) -c win32.c force: rm -f $(ALLOBJS) make $(PROGRAM) 'CFLAGS=$(CFLAGS)' 'LIBS=$(LIBS)' \ 'DEFS=$(DEFS)' 'CC=$(CC)' clean: rm -f $(ALLOBJS) $(TARGET) *~ */*~ ALWAYS: # OK, here's the details on all the DEFS options, in case anyone needs to know. # NOPIPES excludes non-ANSI functions popen() and pclose(). You will lose the # UNCOMPRESS command. # NODNS excludes all the DNS lookup code. This is platform-dependent, but # typically involves header files and functions like inet_addr() # and gethostbyaddr(). # NODIRENT stops you using wildcards in logfile names. This code is also # platform-dependent. But under Unix, the header file and function # glob() from POSIX.2 are used; _unless_ NOGLOB is defined, in which case # the header file and functions stat(), opendir(), readdir() and # closedir() are used instead. In this latter case, you can't use wildcards # in directory names. # NOOPEN excludes non-ANSI functions open() and fdopen(). This results in an # alternative, less safe locking mechanism for DNS files and cache files. # NOFOLLOW omits code including the functions realpath(), access() and stat() # and the header file and possibly . Analog won't # then follow symbolic links when guessing path names. # NOALARM omits code including the function alarm() and the header file # . You will lose the ability to set a DNS timeout. # # ** If all of the above are defined only features defined in ANSI C are used. # # NOGRAPHICS omits the code for generating pie charts, including all of libgd # and libpng. # HAVE_GD means you already have libgd (at least version 1.8), libpng, libjpeg # and zlib, and you want to use your version of these libraries not # mine. This is likely to reduce the size of the binary. Also you will gain # the JPEGCHARTS command. You will also need to include # "-lgd -lpng -ljpeg -lz" in the LIBS above. # HAVE_ZLIB means you already have zlib, and you want to use your version not # mine. This is likely to reduce the size of the binary. You will also need # to include "-lz" in the LIBS above. # HAVE_BZLIB means you already have bzlib, and you want to use your version not # mine. This is likely to reduce the size of the binary. You will also need # to include "-lbz2" in the LIBS above. # HAVE_PCRE means you already have libpcre, and you want to use your version # not mine. This is likely to reduce the size of the binary. # You will also need to include "-lpcre" in the LIBS. # EBCDIC is needed if your server uses the EBCDIC character set, not ASCII. # USE_PLAIN_SETJMP uses ANSI setjmp() instead of POSIX sigsetjmp(). # NEED_STRCMP, NEED_MEMMOVE, NEED_STRTOUL and NEED_DIFFTIME provide # replacements for standard functions missing on some systems. # NOGMTIME doesn't use the gmtime() function. # NEED_FLOATINGPOINT_H includes a header file called . # HAVE_ADDR_T is needed if inet_addr() returns in_addr_t which is not the # same as unsigned long. analog-6.0/src/alias.c0000644000175000017500000006437210161303542014771 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** alias.c; functions to cope with aliasing. ***/ #include "anlghea3.h" /* Throughout this file, to avoid a buffer overflow, we must be careful when we do any operation which can increase the length of the name. Such operations are thankfully rare, except for user aliases in wildalias(). * To ensure this, most functions assume that char *name can hold an aliased name of length at least BLOCKSIZE - 1. (In practice we always copy the name into workspace and call the aliasing function with argument workspace.) */ choice do_alias(char *name, Memman *mp, Alias *aliashead, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte, choice type) { /* return ERR for corrupt/unwanted, else whether any alias done */ extern char *workspace; logical rc = TRUE; size_t len; strcpy(workspace, name); if (type == ITEM_FILE) rc = do_aliasr(workspace, dirsuffix, dirsufflength); else if (type == ITEM_HOST) rc = do_aliasS(workspace); else if (type == ITEM_REFERRER) rc = do_aliasf(workspace); else if (type == ITEM_BROWSER) rc = do_aliasB(workspace); else if (type == ITEM_VHOST) rc = do_aliasv(workspace); else if (type == ITEM_USER) rc = do_aliasu(workspace, usercase_insensitive); else if (type == REP_SEARCHREP || type == REP_INTSEARCHREP) /* nasty mix of ITEM_ & REP_, but it works because they are all distinct */ rc = do_aliasN(workspace, convfloor, multibyte); else if (type == REP_SEARCHSUM || type == REP_INTSEARCHSUM) rc = do_aliasn(workspace, convfloor, multibyte); else if (type == REP_BROWSUM) rc = do_aliasb(workspace); if (rc == FALSE) return(ERR); (void)do_aliasx(workspace, aliashead); if (!STREQ(workspace, name)) { len = strlen(workspace); memcpy((void *)submalloc(mp, len + 1), (void *)workspace, len); *((char *)(mp->curr_pos) + len) = '\0'; return(TRUE); } else return(FALSE); } /* User-specified aliases. * * Name is changed if necessary. Name MUST be at least BLOCKSIZE long. * * The function returns whether any alias matched. */ logical do_aliasx(char *name, Alias *aliashead) { int pmatch[PMATCH_SIZE]; Alias *ap; logical done; for (ap = aliashead, done = FALSE; ap != NULL && !done; TO_NEXT(ap)) { if (matchq(name, (ap->isregex)?((void *)(ap->pattern)):((void *)(ap->from)), ap->isregex, pmatch)) { done = TRUE; wildalias(name, ap->to, pmatch); } } return(done); } logical do_aliasr(char *name, char *dirsuffix, unsigned int dirsufflength) { #ifdef EBCDIC extern unsigned char os_toebcdic[]; #endif extern logical convertchar[256]; char *c, *d, *e1, *e2; unsigned int tempint = 0; /* NB Case insensitivity has been done (if necessary) in prealias() */ /* Zerothly, strip off #'s. These shouldn't get in the request, but do for some broken agents (particularly spiders). */ if ((c = strchr(name, '#')) != NULL) *c = '\0'; /* Halfthly, strip from semicolon to the end of the URL stem. (e.g. jsessionid). */ if ((c = strchr(name, ';')) != NULL) { d = strchr(name, '?'); if (d == NULL) d = strchr(c + 1, '\0'); if (c < d) memmove(c, d, strlen(d) + 1); } /* First, change %7E to ~, etc. */ c = name; while((c = strchr(c, '%')) != NULL) { sscanf(c + 1, "%2x", &tempint); if (tempint <= 0xFF && convertchar[tempint]) { /* could have been %-1 */ #ifdef EBCDIC tempint = os_toebcdic[tempint]; #endif *c = (char)tempint; memmove((void *)(c + 1), (void *)(c + 3), strlen(c + 3) + 1); } c++; } /* Secondly, if it begins with a colon, assume it's a Mac file and convert colons to slashes. */ c = name; if (*c == ':') { for ( ; *c != '\0'; c++) { if (*c == ':') *c = '/'; } } /* Otherwise, change backslashes to forward slashes. This is not strictly correct, but it's usually the right thing to do (to make the Directory Report correct). */ for ( ; *c != '\0' && *c != '?'; c++) { if (*c == '\\') *c = '/'; } /* Thirdly, if it ends with DIRSUFFIX (typically index.html), strip it */ e1 = strchr(name, '\0'); if ((e2 = strchr(name, '?')) != NULL) *e2 = '\0'; else e2 = e1; if (dirsufflength > 0 && dirsufflength < (unsigned int)(e2 - name) && *(e2 - dirsufflength - 1) == '/' && STREQ(e2 - dirsufflength, dirsuffix)) { memcpy((void *)(e2 - dirsufflength), (void *)e2, (size_t)(e1 - e2) + 1); if (e2 != e1) e2 -= dirsufflength; } if (e2 != e1) *e2 = '?'; /* Fourthly, // -> / ; /./ -> / ; /spam/../ -> / */ /* Used to use 3 strstr()s. More intuitive but MUCH slower. */ c = name; while ((c = strchr(c, '/')) != NULL && c < e2) { if (*(c + 1) == '/') { if (c != name && *(c - 1) == ':') c++; /* Don't translate http:// ; just skip to next / */ else memmove((void *)(c + 1), (void *)(c + 2), strlen(c + 2) + 1); } else if (*(c + 1) == '.') { if (*(c + 2) == '/') memmove((void *)(c + 1), (void *)(c + 3), strlen(c + 3) + 1); else if (*(c + 2) == '.' && *(c + 3) == '/') { d = c + 4; /* go back to prev slash (but not past // or start of name) */ if (c != name && *(c - 1) != '/') { while (*(--c) != '/' && c != name) ; } memmove((void *)(c + 1), (void *)d, strlen(d) + 1); if (c == name) *c = '/'; } else c++; } else c++; } return(TRUE); } logical do_aliasS(char *name) { #ifndef NODNS extern choice dnslevel; #endif char *c; int len; len = (int)strlen(name) - 1; /* NB offset by 1 */ /* DNS lookup */ #ifndef NODNS if (dnslevel != DNS_NONE && ISDIGIT(name[len])) { do_dns(name, NULL, dnslevel); len = (int)strlen(name) - 1; } #endif /* remove trailing dot */ if (name[len] == '.') name[len] = '\0'; /* convert to lower case */ for (c = name + len; c >= name; c--) *c = TOLOWER(*c); return(TRUE); } logical do_aliasf(char *name) { /* name must be at least BLOCKSIZE long */ #ifdef EBCDIC extern unsigned char os_toebcdic[]; #endif extern logical convertchar[256]; int defaultport = UNSET; char *c, *d; unsigned int tempint = 0; /* First, strip off #'s */ if ((c = strchr(name, '#')) != NULL) *c = '\0'; /* Strip from semicolon to the end of the URL stem. (e.g. jsessionid). */ if ((c = strchr(name, ';')) != NULL) { d = strchr(name, '?'); if (d == NULL) d = strchr(c + 1, '\0'); if (c < d) memmove(c, d, strlen(d) + 1); } /* Next, change %7E to ~, etc. */ c = name; while((c = strchr(c, '%')) != NULL) { sscanf(c + 1, "%2x", &tempint); if (tempint <= 0xFF && convertchar[tempint]) { #ifdef EBCDIC tempint = os_toebcdic[tempint]; #endif *c = (char)tempint; memmove((void *)(c + 1), (void *)(c + 3), strlen(c + 3) + 1); } c++; } /* Coerce method to lower case */ for (c = name; *c != ':' && *c != '\0'; c++) *c = TOLOWER(*c); if (*c != ':') return(FALSE); /* find out what sort of URL it is */ *c = '\0'; /* *c was already set to the first colon */ if (STREQ(name, "http")) defaultport = 80; else if (STREQ(name, "ftp")) defaultport = 21; else if (STREQ(name, "file")) return(FALSE); /* don't count file: URL's */ else if (STREQ(name, "https")) defaultport = 443; else if (STREQ(name, "news")) defaultport = 0; /* The rest probably never happen but they don't slow it down either because execution almost never gets to them. */ else if (STREQ(name, "gopher")) defaultport = 70; else if (STREQ(name, "telnet")) defaultport = 23; else if (STREQ(name, "wais")) defaultport = 210; else if (STREQ(name, "nntp")) defaultport = 119; else if (STREQ(name, "prospero")) defaultport = 1525; else if (STREQ(name, "mailto")) defaultport = 0; *c = ':'; /* Change backslash -> slash for the reason given in do_aliasr() */ c++; for (d = c; *d != '\0' && *d != '?'; d++) { if (*d == '\\') *d = '/'; } /* If "news:" or "mailto:" or unknown, that's all we do. Otherwise, check it has the // next and coerce hostname to lower case */ if (defaultport > 0) { if (*c != '/' || *(c + 1) != '/') return(FALSE); else for (c += 2; *c != '/' && *c != ':' && *c != '\0' && *c != '?'; c++) *c = TOLOWER(*c); /* strip trailing .'s from hostname */ for (d = c - 1; *d == '.'; d--) ; /* run back to before any dots */ if (d != c - 1) { memmove((void *)(d + 1), (void *)c, strlen(c) + 1); c = d + 1; } /* strip leading 0s from port numbers and cross out default port numbers */ if (*c == ':') { for (d = c + 1; *d == '0'; d++) ; /* run forward to after any 0's */ if (d != c + 1) memmove((void *)(c + 1), (void *)d, strlen(d) + 1); if (defaultport == atoi(c + 1)) { /* run forward to after all digits */ for (d = c + 2; ISDIGIT(*d); d++) ; memmove((void *)c, (void *)d, strlen(d) + 1); } } /* We don't want to change /./ -> / etc. even in http protocol, because we don't want to make assumptions about other people's file systems. */ /* So finally, trailing slash if no directory name given */ for ( ; *c != '/' && *c != '\0' && *c != '?'; c++) ; /* run to next slash or end of string */ if (*c != '/' && strlen(name) <= BLOCKSIZE - 2) { memmove((void *)(c + 1), (void *)c, strlen(c) + 1); *c = '/'; } } return(TRUE); } logical do_aliasB(char *name) { /* NB aliasB is at parse time, aliasb for compiling browsum */ char *c; /* cut (illegal) "via"s (e.g., via certain proxy or cache) */ if ((c = strstr(name, " via ")) != NULL) *c = '\0'; /* cut trailing spaces */ for (c = name + strlen(name) - 1; *c == ' ' && c > name; c--) *c = '\0'; if (c == name) return(FALSE); return(TRUE); } logical do_aliasu(char *name, logical case_insensitive) { if (case_insensitive) { for ( ; *name != '\0'; name++) { /* Some usernames have backslashes in which need to change to slashes */ if (*name == '\\') *name = '/'; else /* convert to lower case */ *name = TOLOWER(*name); } } else for ( ; *name != '\0'; name++) { /* separate loop for speed */ if (*name == '\\') *name = '/'; } return(TRUE); } logical do_aliasv(char *name) { /* just convert to lower case */ for ( ; *name != '\0'; name++) *name = TOLOWER(*name); return(TRUE); } logical do_aliasN(char *name, unsigned char convfloor, logical multibyte) { char *c, *d; /* lower case and convert %nm's by calling do_aliasn() */ do_aliasn(name, convfloor, multibyte); /* change unwanted characters to spaces */ /* 'unwanted' should be coordinated with nnextname() */ for (c = name; *c != '\0'; c++) { if (*c == '-') { /* remove except at beginning of word */ if ((c != name && *(c - 1) != ' ') || *(c + 1) == '+' || *(c + 1) == '-' || *(c + 1) == '"' || *(c + 1) == ',' || *(c + 1) == '(' || *(c + 1) == ')' || *(c + 1) == '.' || *(c + 1) == '\0' || ISSPACE(*(c + 1))) *c = ' '; } else if (*c == '.') { /* remove except between letters/numbers */ if (c == name || !ISALNUM(*(c - 1)) || !ISALNUM(*(c + 1))) *c = ' '; } else if (*c == '+' || *c == '"' || *c == ',' || *c == '(' || *c == ')' || ISSPACE(*c)) *c = ' '; } /* remove initial spaces */ if (ISSPACE(*name)) { for (c = name + 1; ISSPACE(*c); c++) ; memmove(name, c, strlen(c) + 1); } /* remove trailing spaces */ if (*name == '\0') return(FALSE); for (c = strchr(name, '\0') - 1; ISSPACE(*c); c--) ; *(c + 1) = '\0'; /* concatenate spaces */ c = name; for (c = strstr(c, " "); c != NULL; c = strstr(c + 1, " ")) { for (d = c + 2; *d == ' '; d++) ; /* run past contiguous spaces */ memmove(c + 1, d, strlen(d) + 1); } return(TRUE); } logical do_aliasn(char *name, unsigned char convfloor, logical multibyte) { /* NB Most of the filtering has already been done by nnextname() */ /* NB2 do_aliasN() calls this function, so if it's extended, we need to think about whether we want do_aliasN() to include the new stuff too. */ #ifdef EBCDIC extern unsigned char os_toebcdic[]; #endif unsigned int tempint = 0; char *c; /* lower case */ if (!multibyte) { for (c = name; *c != '\0'; c++) *c = TOLOWER(*c); } /* If required, change %nm's from the top half of character set */ /* NB convfloor is ASCII value, applied before conversion to EBCDIC */ /* Also change %25, %26, %3D and %3F here: see convertchar[] in globals.c */ c = name; while((c = strchr(c, '%')) != NULL) { sscanf(c + 1, "%2x", &tempint); if (tempint <= 0xFF && ((convfloor > 0 && tempint >= convfloor) || tempint == 0x25 || tempint == 0x26 || tempint == 0x3D || tempint == 0x3F)) { #ifdef EBCDIC tempint = os_toebcdic[tempint]; #endif *c = (char)tempint; memmove((void *)(c + 1), (void *)(c + 3), strlen(c + 3) + 1); } c++; } return(TRUE); } logical do_aliasb(char *name) { /* NB aliasB is at parse time, aliasb for compiling Browser Summary. */ /* See Bnextname() for the role of this function. */ char *s, *t; logical done = FALSE; if (headmatch(name, "Mozilla")) { if (*(name + 7) == '/' && *(name + 8) == '5') { /* Mozilla/5 is messy. The real version number should be written at the end of the brackets. Furthermore, there are (so far) three different version number formats, "m18", "0.8" and "rv:0.9.1+". To add to the confusion, we should spot those which are Netscape 6+ branded, which have the normal Mozilla version number but also the brand name on the end. We've filtered out Mozilla/5.0 (compatible) in Bnextname() so these should all be genuine Mozilla. But if we can't find a version number we'll just leave it as Mozilla, not Mozilla/5.0, to avoid confusing the two different numbering schemes. */ if ((t = strstr(name, ") Gecko/")) != NULL) { /* There should only be one ')', but let's be cautious. */ /* First try pulling off Netscape version number. There are two cases: Netscape/7.x, or Netscape6/6.x which should be translated to just Netscape/6.x. */ if (headmatch(t + 17 /* after "Gecko/YYYYMMDD" */, "Netscape")) { memmove(name, t + 17, 8); if (*(t + 25) == '6' && *(t + 26) == '/') memmove(name + 8, t + 26, strlen(t + 26) + 1); else memmove(name + 8, t + 25, strlen(t + 25) + 1); done = TRUE; } /* Otherwise look for normal Mozilla version number */ else { for (s = t - 1; *s != ' ' && s != name; s--) ; /* run back to space before last element inside brackets */ if (s != name && *(s - 1) == ';') { s++; if (headmatch(s, "rv:")) s += 3; if (ISDIGIT(*s) || (*s == 'm' && ISDIGIT(*(s + 1)))) {/* Found it*/ if (*s == 'm') *s = 'M'; memcpy(name + 8, s, t - s); *(name + 8 + (t - s)) = '\0'; done = TRUE; } } } } if (!done) *(name + 7) = '\0'; return(TRUE); } /* All other Mozilla's are reckoned to be Netscape */ memmove(name + 8, name + 7, strlen(name + 7) + 1); strncpy(name, "Netscape", 8); } /* Convert "Galeon; n.m" to "Galeon/n.m"; n a digit tested in Bnextname() */ else if (headmatch(name, "Galeon; ")) { *(name + 6) = '/'; memmove(name + 7, name + 8, strlen(name + 8) + 1); return(TRUE); } /* In general, convert "Name n.m" to "Name/n.m" if n a digit */ for (s = name; ISALNUM(*s); s++) ; if (*s == ' ' && ISDIGIT(*(s + 1))) *s = '/'; return(TRUE); } #ifndef NODNS logical dnsresolve(char *name, choice level) { /* name must be at least BLOCKSIZE long */ #ifndef NOALARM extern unsigned int dnstimeout; extern JMP_BUF jumpbuf; #endif volatile logical done = FALSE; #ifndef MAC IN_ADDR_T addr; #ifdef VMS char *addrp; #else #ifdef AS400 unsigned char *addrp; #else const char *addrp; #endif #endif struct hostent *tempp; #endif if (level < DNS_LOOKUP) return(FALSE); debug('D', "Looking up %s:", name); #ifdef MAC done = IpAddr2Name(name); /* Doesn't currently include code to use SIGALRM */ #else addr = inet_addr(name); if (addr != INET_ADDR_ERR) { addrp = (char *) &addr; #ifndef NOALARM if (SETJMP(jumpbuf)) signal(SIGALRM, SIG_DFL); /* reset to default handling in case SIGALRM is raised exogenously */ else { signal(SIGALRM, sighandler); alarm(dnstimeout); #endif tempp = gethostbyaddr(addrp, sizeof(IN_ADDR_T), AF_INET); #ifndef NOALARM alarm(0); signal(SIGALRM, SIG_DFL); #endif if (tempp != NULL && tempp->h_name != NULL && tempp->h_name[0] != '\0') { /* hostnames shouldn't be 32,000 characters long, but... */ strncpy(name, tempp->h_name, BLOCKSIZE - 1); name[BLOCKSIZE - 1] = '\0'; done = TRUE; } #ifndef NOALARM } #endif } #endif /* not MAC */ if (done) debug('D', " resolved to %s", name); else debug('D', " can't resolve"); return(done); } void do_dns(char *name, char *alias, choice level) { /* This is simplified from hashfind(). It is called in two situations: @ During reading of DNS file. In this case alias != NULL. @ During do_aliasS(). Then alias == NULL, and name can be changed. In this case, dnsresolve() assumes that name is BLOCKSIZE long. */ extern Hashtable *dnstable; extern timecode_t starttimeuxc; extern FILE *dnsfilep; extern Memman *xmemman; Hashindex *lp, *lastlp; unsigned long magic; logical done = FALSE; if (TOO_FULL(dnstable->n, dnstable->size)) dnstable = rehash(dnstable, NEW_SIZE(dnstable->size), NULL); MAGICNO(magic, name, dnstable->size); lp = dnstable->head[magic]; lastlp = NULL; while (!done) { if (lp == NULL) { /* need a new index entry */ lp = (Hashindex *)submalloc(xmemman, sizeof(Hashindex)); if (lastlp == NULL) dnstable->head[magic] = lp; else lastlp->next = lp; lp->name = (char *)submalloc(xmemman, strlen(name) + 1); strcpy(lp->name, name); /* NB don't use lp->own */ if (alias != NULL) { /* initial build */ if (STREQ(alias, "*")) lp->other = NULL; else { lp->other = submalloc(xmemman, strlen(alias) + 1); strcpy((char *)(lp->other), alias); } } else if (dnsresolve(name, level)) { /* potentially changes name */ lp->other = submalloc(xmemman, strlen(name) + 1); strcpy((char *)(lp->other), name); if (dnsfilep != NULL) { if (strchr(lp->name, ' ') == NULL && strchr(name, ' ') == NULL && strlen(lp->name) + strlen(name) < 240) { /* otherwise will be corrupt at read time */ fprintf(dnsfilep, "%ld %s %s\n", starttimeuxc, lp->name, name); fflush(dnsfilep); } } } else { lp->other = NULL; if (dnsfilep != NULL) { if (strchr(lp->name, ' ') == NULL && strlen(lp->name) < 240) { /* otherwise will be corrupt at read time */ fprintf(dnsfilep, "%ld %s *\n", starttimeuxc, lp->name); fflush(dnsfilep); } } } lp->next = NULL; (dnstable->n)++; done = TRUE; } else if (STREQ(lp->name, name)) { if (alias != NULL) { /* initial build: overwrite */ if (STREQ(alias, "*")) lp->other = NULL; else { lp->other = submalloc(xmemman, strlen(alias) + 1); strcpy((char *)(lp->other), alias); } } else if (lp->other != NULL) strcpy(name, (char *)(lp->other)); done = TRUE; } else { lastlp = lp; TO_NEXT(lp); } } } #endif /* Change name to its alias. Matching has already been checked. name MUST have length >= BLOCKSIZE. */ void wildalias(char *name, AliasTo *to, int pmatch[]) { char *s, *ans; int *pm; size_t len, tolen; len = strlen(name); ans = name + len; /* The aliased name is built AFTER the orig name. */ for (s = ans; to != NULL; TO_NEXT(to)) { pm = &(pmatch[to->after]); tolen = strlen(to->string); len += tolen; if (to->after >= 0 && pm[0] >= 0) len += (size_t)(pm[1] - pm[0]); if (len >= BLOCKSIZE - 1) { ans[0] = '\0'; /* so we just return unaliased name */ return; } strcpy(s, to->string); s += tolen; if (to->after >= 0 && pm[0] >= 0) { memcpy((void *)s, (void *)(name + pm[0]), (size_t)(pm[1] - pm[0])); s += pm[1] - pm[0]; } } *s = '\0'; memmove((void *)name, (void *)ans, strlen(ans) + 1); } /* Now preliminary file/referrer aliasing, to add prefix & query string */ choice prealias(Memman *mm, Memman *mmv, Hashentry *vhost, Memman *mmq, logical case_insensitive, char *prefix, size_t prefixlen, int pvpos, Include *argshead) { extern Hashentry *blank_entry; size_t len, len2 = 0; char *curr, *next, *mmqstart, *c; /* First, fold to lower case */ if (case_insensitive) { for (c = mm->curr_pos; *c != '\0' && *c != '?'; c++) *c = TOLOWER(*c); } /* Then add prefix */ if (prefix != NULL) { len = prefixlen; if (pvpos >= 0) { if (ENTRY_BLANK(vhost)) return(-1); /* %v in prefix but no vhost => corrupt */ else { len2 = strlen((char *)(mmv->curr_pos)); len += len2 - 2; /* NB vhost may be marked for deletion (next_pos == curr_pos), but has not yet overwritten. */ } } curr = (char *)(mm->curr_pos); next = (char *)(mm->next_pos); if ((char *)(mm->block_end) - (char *)(mm->next_pos) < (ptrdiff_t)len) { c = (char *)submalloc(mm, len); mm->next_pos = (void *)((char *)(mm->curr_pos) + (next - curr)); if ((char *)(mm->block_end) - (char *)(mm->next_pos) < (ptrdiff_t)len) return(-2); /* filename + prefix too long => corrupt */ } memmove((void *)((char *)(mm->curr_pos) + len), (void *)curr, (size_t)(next - curr)); if (pvpos < 0) memmove(mm->curr_pos, (void *)prefix, prefixlen); else { memmove(mm->curr_pos, (void *)prefix, (size_t)pvpos); memmove((void *)((char *)(mm->curr_pos) + pvpos), mmv->curr_pos, len2); memmove((void *)((char *)(mm->curr_pos) + pvpos + len2), (void *)(prefix + pvpos + 2), prefixlen - (size_t)pvpos - 2); } mm->next_pos = (void *)((char *)(mm->next_pos) + len); } /* end prefix != NULL */ /* Finally, add or delete query string */ if ((char *)(mmq->next_pos) - (char *)(mmq->curr_pos) > 1 && (((char *)(mmq->curr_pos))[0] != '-' || ((char *)(mmq->curr_pos))[1] != '\0')) { /* length >= 1 and not just "-" (no need to call STREQ/strcmp) */ if (included(mm->curr_pos, FALSE, argshead) && strchr(mm->curr_pos, '?') == NULL) { mmqstart = (char *)(mmq->curr_pos); if (*mmqstart == '?') /* assume initial ? included in %q, Apache-style */ mmqstart++; len = (size_t)((char *)(mmq->next_pos) - mmqstart); if ((char *)(mm->block_end) - (char *)(mm->next_pos) < (ptrdiff_t)len) { curr = (char *)(mm->curr_pos); next = (char *)(mm->next_pos); memmove(submalloc(mm, len), (void *)curr, (size_t)(next - curr)); mm->next_pos = (void *)((char *)(mm->curr_pos) + (next - curr)); if ((char *)(mm->block_end) - (char *)(mm->next_pos) < (ptrdiff_t)len) return(-2); /* filename + query string too long => corrupt */ } *((char *)(mm->next_pos) - 1) = '?'; memmove(mm->next_pos, (void *)mmqstart, len); mm->next_pos = (void *)((char *)(mm->next_pos) + len); } } else if ((c = strchr((char *)(mm->curr_pos) + 1, '?')) != NULL) { *c = '\0'; if (included(mm->curr_pos, FALSE, argshead)) *c = '?'; else mm->next_pos = c + 1; } mmq->next_pos = mmq->curr_pos; /* always reset mmq */ return(OK); } void prealiasS(Memman *mm, Memman *mms) { /* Choose between %S and %s tokens */ size_t len; if ((char *)(mms->next_pos) - (char *)(mms->curr_pos) > 1 && (((char *)(mms->curr_pos))[0] != '-' || ((char *)(mms->curr_pos))[1] != '\0')) { /* length >= 1 and not just "-", i.e. mms exists */ if ((char *)(mm->next_pos) - (char *)(mm->curr_pos) <= 1 || (((char *)(mm->curr_pos))[0] == '-' && ((char *)(mm->curr_pos))[1] == '\0')) { /* mm has the opposite property: so copy mms into mm */ len = strlen((char *)(mms->curr_pos)); mm->next_pos = mm->curr_pos; memcpy(submalloc(mm, len + 1), mms->curr_pos, len + 1); } } mms->next_pos = mms->curr_pos; /* in any case, reset mms */ return; } void reverseonename(Hashindex *p) { extern Memman *xmemman; static char *s = NULL; static size_t len = 0; char *t1, *t2, *t3; size_t l, m = 0; logical done; /* reversing done in own space, so pull off const char * cases first */ if (STREQ(p->name, LNGSTR_NODOMAIN) || STREQ(p->name, LNGSTR_UNKDOMAIN)) return; l = strlen(p->name); /* numerical host */ if (ISDIGIT(*(p->name + l - 1)) && ISDIGIT(*(p->name))) { t1 = p->name; t2 = t1; t3 = t1; while (*t3 == '0') t3++; for (done = FALSE; !done; t2++) { if (*t2 == '.') { ENSURE_LEN(s, len, m + (t2 - t1) + 3); for (l = t2 - t1; l < 3; l++) *(s + (m++)) = '0'; memcpy((void *)(s + m), (void *)t3, (size_t)(t2 - t3 + 1)); m += t2 - t3 + 1; t2++; t1 = t2; t3 = t2; while (*t3 == '0') t3++; } else if (*t2 == '\0') { ENSURE_LEN(s, len, m + (t2 - t1) + 3); for (l = t2 - t1; l < 3; l++) *(s + (m++)) = '0'; memcpy((void *)(s + m), (void *)t3, (size_t)(t2 - t3 + 1)); m += t2 - t3 + 1; if (strlen(p->name) < (l = strlen(s))) p->name = (char *)submalloc(xmemman, l + 1); memcpy((void *)(p->name), (void *)s, m); done = TRUE; } } } else { ENSURE_LEN(s, len, l + 1); for (t1 = p->name + l, t2 = t1, done = FALSE; !done; t1--) { if (*t1 == '.') { memcpy((void *)(s + m), (void *)(t1 + 1), (size_t)(t2 - t1 - 1)); m += t2 - t1; /* including the dot below */ t2 = t1; *(s + m - 1) = '.'; } if (t1 == p->name) { memcpy((void *)(s + m), (void *)t1, (size_t)(t2 - t1)); m += t2 - t1 + 1; *(s + m - 1) = '\0'; memcpy((void *)(p->name), (void *)s, m); done = TRUE; } } } } void reversenames(Hashindex *ans) { Hashindex *p; for (p = ans; p != NULL; TO_NEXT(p)) reverseonename(p); } analog-6.0/src/analog.c0000644000175000017500000001223110161303542015124 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** analog.c; the main function ***/ #include "anlghea3.h" int main(int argc, char *argv[]) { extern char *pos, *record_start, *commandname; extern unsigned long progressfreq; extern Inputformatlist *logformat; extern logical vblesonly; extern FILE *errfile; #ifndef NODNS extern char *dnsfile, *dnslockfile; extern FILE *dnsfilep, *dnslock; #endif Logfile *logfilep; Options *op; Inputformatlist *fmt; unsigned long linesread = 0, nextreport; ptrdiff_t corrupt_pos; time_t progfreqtime; struct tm *pflt; choice rc; op = (Options *)xmalloc(sizeof(Options)); initialise(argc, argv, op); if (vblesonly) { report_vbles(op); my_exit(EXIT_SUCCESS); } nextreport = progressfreq; for (logfilep = op->miscopts.logfile[1]; logfilep != NULL; TO_NEXT(logfilep)) { if (my_lfopen(logfilep, "cache file")) { readcache(logfilep, op->hash, op->no_cols, op->datacols, op->data2cols, op->arraydata, op->wanthead, op->ispagehead, &(op->dman), op->outopts.tree, op->outopts.derv, op->outopts.alltrees, op->outopts.alldervs, op->miscopts.lowmem, op->miscopts.dirsuffix, op->miscopts.dirsufflength, op->miscopts.usercase_insensitive, op->outopts.convfloor, op->outopts.multibyte, op->miscopts.granularity); } my_lfclose(logfilep, op->miscopts.logfile[1], NULL, "cache file", &(op->dman), op->miscopts.data, &(op->miscopts.bytes), &(op->miscopts.bytes7)); } for (logfilep = op->miscopts.logfile[0]; logfilep != NULL; TO_NEXT(logfilep)) { if (logfile_init(logfilep)) { rc = FALSE; while (rc != EOF) { corrupt_pos = -1; record_start = pos; for (fmt = logfilep->format, rc = FALSE; rc == FALSE && fmt != NULL; TO_NEXT(fmt)) { rc = parsenextrecord(logfilep, fmt->form); if (rc == TRUE) { process_data(logfilep, op->hash, op->arraydata, fmt->count, op->code2type, op->datacols, op->data2cols, op->no_cols, op->wanthead, op->ispagehead, op->aliashead, op->argshead, op->refargshead, &(op->dman), op->outopts.tree, op->outopts.derv, op->outopts.alltrees, op->outopts.alldervs, op->miscopts.lowmem, op->miscopts.case_insensitive, op->miscopts.usercase_insensitive, op->outopts.convfloor, op->outopts.multibyte, op->miscopts.dirsuffix, op->miscopts.dirsufflength, op->miscopts.granularity); } else if (rc == FALSE) corrupt_pos = MAX(pos - record_start, corrupt_pos); else if (rc == NEWLOGFMT) { logfilep->format = logformat; if (correctlogfmt(logfilep, op->wanthead, op->code2type, &(op->dman)) == NULL) { debug('F', "Ignoring logfile %s, which contains no items " "being analysed", logfilep->name); rc = EOF; } } else if (rc == BADLOGFMT) { warn('F', TRUE, "Can't auto-detect format of logfile %s: ignoring it", logfilep->name); rc = EOF; } } /* end for(fmt) */ if (rc == FALSE) corrupt_line(logfilep, "", corrupt_pos); if ((++linesread) == nextreport) { time(&progfreqtime); pflt = localtime(&progfreqtime); fprintf(errfile, "%s: [%02d:%02d:%02d] %lu lines read\n", commandname, pflt->tm_hour, pflt->tm_min, pflt->tm_sec, linesread); if (errfile != stderr) fprintf(stderr, "%s: [%02d:%02d:%02d] %lu lines read\n", commandname, pflt->tm_hour, pflt->tm_min, pflt->tm_sec, linesread); nextreport += progressfreq; } #ifdef MAC_EVENTS if ((linesread % MAC_IDLE_FREQ) == 0) MacIdle(); #endif } /* end while (rc != EOF) */ } /* if (logfile_init(logfilep)) */ my_lfclose(logfilep, op->miscopts.logfile[1], op->miscopts.logfile[0], "logfile", &(op->dman), op->miscopts.data, &(op->miscopts.bytes), &(op->miscopts.bytes7)); } /* for (logfilep) */ #ifndef NODNS if (dnsfilep != NULL) { fclose(dnsfilep); debug('F', "Closing DNS output file %s", dnsfile); } if (dnslock != NULL) { fclose(dnslock); dnslock = NULL; if (remove(dnslockfile) != 0) warn('F', TRUE, "Trouble deleting DNS lock file %s", dnslockfile); else debug('F', "Deleting DNS lock file %s", dnslockfile); } #endif unhashall(op->hash, &(op->gooditems), &(op->baditems)); if (!STREQ(op->outopts.cacheoutfile, "none")) outputcache(op->outopts.cacheoutfile, op->gooditems, &(op->dman), op->arraydata, op->miscopts.data, op->miscopts.bytes, op->data2cols); if (op->outopts.outstyle != OUT_NONE) output(&(op->outopts), op->gooditems, op->baditems, &(op->dman), op->arraydata, op->miscopts.data, op->miscopts.bytes, op->miscopts.bytes7, op->datacols, op->data2cols, op->no_cols, op->miscopts.granularity); my_exit(EXIT_SUCCESS); return(EXIT_SUCCESS); /* just to stop compiler complaining */ } analog-6.0/src/anlghea2.h0000644000175000017500000003703210161303542015357 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** anlghea2.h: second header file ***/ /*** This file is a convenient place to store defaults for various options. *** You can redefine them if you want, but you probably don't want to because *** they have sensible defaults and it's easier to change them at run-time. *** See anlghead.h for the options you are likely to want to change. ***/ #ifndef ANLGHEA2_H #define ANLGHEA2_H #ifndef ANLGHEAD #include "anlghead.h" #endif /*** The first few options are compiled into the program. They can't be changed without re-compiling the program. ***/ #define BLOCKSIZE (32768) /* Analog allocates memory in blocks of this many bytes. Also any logfile lines this long or longer will be rejected. */ #define MAX_CONFIGS (50) /* The maximum number of configuration files that are allowed. */ #define MAXPAGEWIDTH (240) /* the maximum allowed value of the PAGEWIDTH variable */ #ifndef ALIGNSIZE #define ALIGNSIZE (8) /* All objects can align on boundaries that are multiples of this. This is system-dependent, but I expect 8 to be big enough for almost everyone. */ #endif /*** The rest of the options can be overridden when the program is run. ***/ #ifndef CACHEOUTFILE #define CACHEOUTFILE "none" /* The default file for cache output. Use "none" for no cache file. */ #endif #ifndef CACHEFILE #define CACHEFILE "none" /* The file for cache input. Again, can be "none". */ #endif #ifndef NODNS #define DNSFILE "dnscache" /* where to store resolved addresses so we don't have to look them up next time */ #define DNSLOCKFILE "dnslock" /* A lock file to stop two processes trying to write the DNSFILE at once */ #define DNS (DNS_NONE) /* level of DNS activity. Can be DNS_NONE, DNS_READ, DNS_LOOKUP or DNS_WRITE. */ #define DNSGOODHOURS (100000) /* How many hours lookups stay fresh for before we have to look them up again. 100000 = 11.4 years! */ #define DNSBADHOURS (336) /* After how many hours to retry failed lookups. 336 = two weeks. */ #define DNSTIMEOUT (0) /* How many seconds to wait for the DNS server to reply before giving up. This is only used on some platforms. It is set to 0 by default, which means off, because it breaks DNS lookups on many platforms. */ #endif #define DIRSUFFIX "index.html" /* the default filename tried if a directory is requested. The program combines statistics from /dir/ and /dir/DIRSUFFIX. If you don't wish this combining to occur, define DIRSUFFIX to be "". The usual value is "index.html". */ #define CASE_INSENSITIVE (TRUE) #ifdef UNIX #undef CASE_INSENSITIVE #define CASE_INSENSITIVE (FALSE) #endif #ifdef OSX #undef CASE_INSENSITIVE #define CASE_INSENSITIVE (FALSE) #endif #ifdef BEOS #undef CASE_INSENSITIVE #define CASE_INSENSITIVE (FALSE) #endif #ifdef NEXTSTEP #undef CASE_INSENSITIVE #define CASE_INSENSITIVE (FALSE) #endif /* Do you have a case sensitive or case insensitive file system? */ #define USERCASE_INSENSITIVE (TRUE) /* The same for user names */ #define SEARCHCHARCONVERT (UNSET) /* Whether to convert %nm's from the top half of the character set in the search reports. UNSET means yes for single-byte character sets, no for multibyte character sets. */ #define REPORTORDER "x1QmWDdHwh4657oZSlLujJkKfsNnBbpvRMcPztiEIYyr" /* A string like "x1QmWDdHwh4657oZSlLujJkKfsNnBbpvRMcPztiEIYyr" giving the order in which the reports will be output. You should include each of the above letters exactly once. See docs/output.html for which report has which code letter.*/ /* Whether we want each of the reports by default */ #define GENERAL (TRUE) /* General Summary */ #define YEARLY (FALSE) /* Yearly Report */ #define QUARTERLY (FALSE) /* Quarterly Report */ #define MONTHLY (TRUE) /* Monthly Report */ #define DAILYSUM (TRUE) /* Daily Summary */ #define DAILYREP (FALSE) /* Daily Report */ #define WEEKLY (FALSE) /* Weekly Report */ #define HOURLYSUM (TRUE) /* Hourly Summary */ #define WEEKHOUR (FALSE) /* Hour of the Week Summary */ #define HOURLYREP (FALSE) /* Hourly Report */ #define QUARTERREP (FALSE) /* Quarter-Hour Report */ #define QUARTERSUM (FALSE) /* Quarter-Hour Summary */ #define FIVEREP (FALSE) /* Five-Minute Report */ #define FIVESUM (FALSE) /* Five-Minute Summary */ #define DOMAINREP (TRUE) /* Domain Report */ /* Not called DOMAIN because would clash with on some systems */ #define ORGANISATION (TRUE) /* Organisation Report */ #define DIRECTORY (TRUE) /* Directory Report */ #define FILETYPE (TRUE) /* File Type Report */ #define REQUEST (TRUE) /* Request Report */ #define REDIRREP (FALSE) /* Redirection Report */ #define FAILREP (FALSE) /* Failure Report */ #define SIZEREP (TRUE) /* File Size Report */ #define PROCTIME (FALSE) /* Processing Time Report */ #define HOST (FALSE) /* Host Report */ #define REDIRHOST (FALSE) /* Host Report */ #define FAILHOST (FALSE) /* Host Report */ #define REFERRER (FALSE) /* Referrer Report */ #define REFSITE (FALSE) /* Referring Site Report */ #define REDIRREF (FALSE) /* Redirected Referrer Report */ #define FAILREF (FALSE) /* Failed Referrer Report */ #define VHOST (FALSE) /* Virtual Host Report */ #define REDIRVHOST (FALSE) /* Virtual Host Redirection Report */ #define FAILVHOST (FALSE) /* Virtual Host Failure Report */ #define USER (FALSE) /* User Report */ #define REDIRUSER (FALSE) /* User Report */ #define FAILUSER (FALSE) /* Failed User Report */ #define SEARCHQUERY (FALSE) /* Search Query Report */ #define SEARCHWORD (TRUE) /* Search Word Report */ #define INTSEARCHQUERY (FALSE) /* Internal Search Query Report */ #define INTSEARCHWORD (FALSE) /* Internal Search Word Report */ #define BROWSERSUM (FALSE) /* Browser Summary */ #define BROWSERREP (FALSE) /* Browser Report */ #define OSREP (TRUE) /* Operating System Report */ #define STATUS (TRUE) /* Status Code Report */ #define GOTOS (TRUE) /* "Go To" lines: TRUE, FALSE or FEW */ #define RUNTIME (TRUE) /* "Running time" line: TRUE or FALSE */ #define DESCRIPTIONS (TRUE) /* Report descriptions: TRUE or FALSE */ #define REPORTSPAN (FALSE) /* Announce time period which each report spans. This is FALSE by default because it uses a lot of memory to calculate. */ #define REPORTSPANTHRESHOLD (60) /* Only announce an individual report span if it differs from the overall span of the whole report by at least this many minutes at one end. So set to 0 to list each individual one regardless. */ #define DOMCOLS "Rb" /* Which columns we want to appear in the domain report, and in which order. The string can contain any of the following letters: R Number of requests from each domain r Percentage of the requests from each domain P Number of requests for pages from each domain p Percentage of the requests for pages from each domain B Total number of bytes transferred to each domain b The percentage of traffic to each domain d Date of last access from each domain D Date and time of last access c Date of first access C Date and time of first access N Number in list */ /* And the same for the other reports */ #define ORGCOLS "Rb" #define HOSTCOLS "Rb" #define REDIRHOSTCOLS "R" #define FAILHOSTCOLS "R" #define DIRCOLS "Rb" #define TYPECOLS "Rb" #define REQCOLS "RbD" #define REDIRCOLS "R" #define FAILCOLS "R" #define YEARCOLS "RP" #define QUARTERLYCOLS "RP" #define MONTHCOLS "RP" #define DAYSUMCOLS "RP" #define DAYREPCOLS "RP" #define WEEKCOLS "RP" #define HOURSUMCOLS "RP" #define WEEKHOURCOLS "RP" #define HOURREPCOLS "RP" #define QUARTERSUMCOLS "RP" #define QUARTERREPCOLS "RP" #define FIVESUMCOLS "RP" #define FIVEREPCOLS "RP" #define REFCOLS "R" #define REFSITECOLS "R" #define REDIRREFCOLS "R" #define FAILREFCOLS "R" #define BROWSUMCOLS "NRP" #define BROWREPCOLS "RP" #define OSCOLS "NRP" #define SIZECOLS "Rb" #define PROCTIMECOLS "R" #define VHOSTCOLS "Rb" #define REDIRVHOSTCOLS "R" #define FAILVHOSTCOLS "R" #define USERCOLS "Rb" #define REDIRUSERCOLS "R" #define FAILUSERCOLS "R" #define SEARCHQUERYCOLS "R" #define SEARCHWORDCOLS "R" #define INTSEARCHQUERYCOLS "R" #define INTSEARCHWORDCOLS "R" #define STATUSCOLS "R" /* Should the time graphs be calculated by requests 'R', bytes 'B' or pages 'P': or use 'r', 'b', 'p' for graphic-free barcharts. */ #define YEARGRAPH 'P' #define QUARTERLYGRAPH 'P' #define MONTHGRAPH 'P' #define DAYSUMGRAPH 'P' #define DAYREPGRAPH 'P' #define HOURSUMGRAPH 'P' #define WEEKHOURGRAPH 'P' #define HOURREPGRAPH 'P' #define WEEKGRAPH 'P' #define QUARTERSUMGRAPH 'P' #define QUARTERREPGRAPH 'P' #define FIVESUMGRAPH 'P' #define FIVEREPGRAPH 'P' /* Should they go forwards (oldest entries at top) or backwards? */ #define YEARBACK (FALSE) #define QUARTERLYBACK (FALSE) #define MONTHBACK (FALSE) #define DAYBACK (FALSE) #define HOURBACK (FALSE) #define WEEKBACK (FALSE) #define QUARTERBACK (FALSE) #define FIVEBACK (FALSE) /* The maximum number of rows in each (0 for "show all time") */ #define YEARROWS (0) #define QUARTERLYROWS (0) #define MONTHROWS (0) #define WEEKROWS (0) #define DAYROWS (42) #define HOURROWS (72) #define QUARTERROWS (96) #define FIVEROWS (288) /* The "floor" for each report. See docs/othreps.html for the possible formats for these strings. */ #define REQFLOOR "20r" #define REQARGSFLOOR "10r" #define REDIRFLOOR "-30r" #define REDIRARGSFLOOR "10r" #define FAILFLOOR "-30r" #define FAILARGSFLOOR "10r" #define DOMFLOOR "0b" #define SUBDOMFLOOR "0.5%b" #define ORGFLOOR "-20r" #define SUBORGFLOOR "0.5%r" #define DIRFLOOR "0.01%b" #define SUBDIRFLOOR "0.01%b" #define TYPEFLOOR "0.1%b" #define SUBTYPEFLOOR "0.1%b" #define HOSTFLOOR "-50r" #define REDIRHOSTFLOOR "-20r" #define FAILHOSTFLOOR "-20r" #define REFFLOOR "20r" #define REFARGSFLOOR "10r" #define REFSITEFLOOR "-30r" #define REFDIRFLOOR "50r" #define REDIRREFFLOOR "-30r" #define REDIRREFARGSFLOOR "10r" #define FAILREFFLOOR "-30r" #define FAILREFARGSFLOOR "10r" #define BROWSUMFLOOR "-20p" #define SUBBROWFLOOR "-10p" #define BROWREPFLOOR "-40p" #define OSFLOOR "0p" #define SUBOSFLOOR "0p" #define VHOSTFLOOR "-20b" #define REDIRVHOSTFLOOR "-20r" #define FAILVHOSTFLOOR "-20r" #define USERFLOOR "-50r" #define REDIRUSERFLOOR "-20r" #define FAILUSERFLOOR "-20r" #define SEARCHQUERYFLOOR "-30r" #define SEARCHWORDFLOOR "-30r" #define INTSEARCHQUERYFLOOR "-30r" #define INTSEARCHWORDFLOOR "-30r" #define STATUSFLOOR "0r" /* How to sort each report: REQUESTS, REQUESTS7, PAGES, PAGES7, BYTES, BYTES7, ALPHABETICAL, DATESORT, FIRSTDATE or RANDOM */ #define REQSORTBY (REQUESTS) #define REDIRSORTBY (REQUESTS) #define FAILSORTBY (REQUESTS) #define DOMSORTBY (BYTES) #define ORGSORTBY (REQUESTS) #define DIRSORTBY (BYTES) #define TYPESORTBY (BYTES) #define HOSTSORTBY (ALPHABETICAL) #define REDIRHOSTSORTBY (REQUESTS) #define FAILHOSTSORTBY (REQUESTS) #define REFSORTBY (REQUESTS) #define REFSITESORTBY (REQUESTS) #define REDIRREFSORTBY (REQUESTS) #define FAILREFSORTBY (REQUESTS) #define BROWSUMSORTBY (PAGES) #define BROWREPSORTBY (PAGES) #define OSSORTBY (PAGES) #define VHOSTSORTBY (BYTES) #define REDIRVHOSTSORTBY (REQUESTS) #define FAILVHOSTSORTBY (REQUESTS) #define USERSORTBY (REQUESTS) #define REDIRUSERSORTBY (REQUESTS) #define FAILUSERSORTBY (REQUESTS) #define SEARCHQUERYSORTBY (REQUESTS) #define SEARCHWORDSORTBY (REQUESTS) #define INTSEARCHQUERYSORTBY (REQUESTS) #define INTSEARCHWORDSORTBY (REQUESTS) #define STATUSSORTBY (ALPHABETICAL) /* The variable to use to plot pie charts for each report. REQUESTS, REQUESTS7, PAGES, PAGES7, BYTES, BYTES7, CHART_SORTBY (meaning, the same as the SORTBY above) or CHART_NONE (no pie chart). */ #define REQCHART (CHART_SORTBY) #define REDIRCHART (CHART_SORTBY) #define FAILCHART (CHART_SORTBY) #define TYPECHART (CHART_SORTBY) #define SIZECHART (CHART_SORTBY) #define PROCTIMECHART (CHART_SORTBY) #define DIRCHART (CHART_SORTBY) #define HOSTCHART (CHART_SORTBY) #define REDIRHOSTCHART (CHART_SORTBY) #define FAILHOSTCHART (CHART_SORTBY) #define DOMCHART (CHART_SORTBY) #define ORGCHART (CHART_SORTBY) #define REFCHART (CHART_SORTBY) #define REFSITECHART (CHART_SORTBY) #define REDIRREFCHART (CHART_SORTBY) #define FAILREFCHART (CHART_SORTBY) #define BROWREPCHART (CHART_SORTBY) #define BROWSUMCHART (CHART_SORTBY) #define OSCHART (CHART_SORTBY) #define VHOSTCHART (CHART_SORTBY) #define REDIRVHOSTCHART (CHART_SORTBY) #define FAILVHOSTCHART (CHART_SORTBY) #define USERCHART (CHART_SORTBY) #define REDIRUSERCHART (CHART_SORTBY) #define FAILUSERCHART (CHART_SORTBY) #define SEARCHQUERYCHART (CHART_SORTBY) #define SEARCHWORDCHART (CHART_SORTBY) #define INTSEARCHQUERYCHART (CHART_SORTBY) #define INTSEARCHWORDCHART (CHART_SORTBY) #define STATUSCHART (CHART_SORTBY) #define WEEKBEGINSON (SUNDAY) /* The 1st day of the week. I think it's SUNDAY, but you can choose any day. */ #define LASTSEVEN (TRUE) /* Whether to include statistics for the last seven days */ #define COMPSEP "\t" /* A separator string between fields in "computer" output style */ #define RAWBYTES (FALSE) /* Whether bytes should be quoted in full (e.g., 1,021,453 bytes) as opposed to in kilobytes, megabytes etc. (e.g., 997.5 kilobytes). */ #define BYTESDP (2) /* If RAWBYTES is off, how many decimal places to display in the number of bytes. */ #define NOROBOTS (TRUE) /* Exclude SOME robots from indexing the output page or following its links. */ #define HEADERFILE "none" /* an extra file (with HTML markup if desired) placed between the page title and the start of the statistics. Use "none" for none. */ #define FOOTERFILE "none" /* And one placed at the bottom of the page. */ #define OUTPUT (XHTML) /* Default output type: HTML, XHTML, PLAIN, ASCII, LATEX, COMPUTER or OUT_NONE. */ #ifndef LANGUAGE #define LANGUAGE (ENGLISH) /* Default language for the output page: ARMENIAN, BASQUE, BULGARIAN, BULGARIAN_MIK, CATALAN, SIMP_CHINESE (GB2312), TRAD_CHINESE (Big5), CZECH, CZECH_1250, DANISH, DUTCH, ENGLISH, US_ENGLISH, FINNISH, FRENCH, GERMAN, HUNGARIAN, INDONESIAN, ITALIAN, JAPANESE_EUC, JAPANESE_JIS, JAPANESE_SJIS, JAPANESE_UTF, KOREAN, LATVIAN, NORWEGIAN (Bokmal), NYNORSK, POLISH, PORTUGUESE, BR_PORTUGUESE, RUSSIAN, RUSSIAN_1251, SERBIAN, SLOVAK, SLOVAK_1250, SLOVENE, SLOVENE_1250, SPANISH, SWEDISH, SWEDISH_ALT, TURKISH or UKRAINIAN. * The following languages were available for previous versions of analog, but have not yet been translated for version 5. As they are translated, they will be added to the analog home page: BOSNIAN, CROATIAN, GREEK, ICELANDIC, LITHUANIAN, ROMANIAN and SLOVAK. */ #endif #define MARKCHAR '+' /* a character for the graphical displays */ #define BARSTYLE 'b' /* The default bar style for the displays -- 'a' to 'h' */ #define PNGIMAGES (TRUE) /* Whether the graphics should be png's (TRUE) or gif's (FALSE). */ #define HTMLPAGEWIDTH (65) #define PLAINPAGEWIDTH (76) #define LATEXPAGEWIDTH (65) /* The width of the output for HTML, ASCII/PLAIN, and LaTeX */ #define MINGRAPHWIDTH (15) /* bar charts must be at least this many characters wide */ #define CSSPREFIX "" /* A prefix to put in front of all CSS class names in XHTML mode. Use "" for no prefix. */ #define ERRLINELENGTH (78) #define STDERRWIDTH (ERRLINELENGTH) /* the maximum width for error and warning messages */ #endif /* ANLGHEA2_H */ analog-6.0/src/anlghea3.h0000644000175000017500000011702310161303542015357 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** anlghea3.h: third header file ***/ /*** The things in this file are not user-definable; user-definable options *** can be found in anlghead.h ***/ #ifndef ANLGHEA3_H #define ANLGHEA3_H /*** OS specific things ***/ #define VNUMBER "6.0" /* the version number of this program */ #undef VERSION /* If no OS set, compilation will fail by not knowing VERSION */ #ifdef __MWERKS__ #undef MAC #define MAC /* So MWERKS compiler automatically switches to Mac */ #endif #ifdef __BEOS__ #undef MAC #undef BEOS #define BEOS #endif #ifdef _WIN32 #ifndef UNIX /* So as to signal CYGWIN */ #undef WIN32 #define WIN32 #endif #endif #ifdef MAC #define MAC_EVENTS #define NOPIPES /* #define MACDIRENT */ /* No longer needed and POSIX dirent is better */ #define NOGLOB #define NOFOLLOW #define NOOPEN #define NOALARM #define LINE_PARSER #define USE_ZLIB #if !TARGET_API_MAC_CARBON #include #endif #include #include #define PATHSEPS ":" #define DIRSEP ':' #define EXTSEP '.' #define VERSION VNUMBER"/Mac" #endif #ifdef DOS #define NODNS #define NOALARM #define NODIRENT #define NOFOLLOW #define PATHSEPS ":\\/" #define DIRSEP '\\' #define EXTSEP '.' #define VERSION VNUMBER"/DOS" #endif #ifdef VMS #define NOPIPES #define NOALARM #define VMSDIRENT #define NOFOLLOW #ifdef __VMS_VER #if (__VMS_VER < 70000000) #define NOGMTIME #endif #endif #define PATHSEPS ":>#]/" /* first four are real VMS, last for Unix emulation */ #define DIRSEP '/' #define EXTSEP '.' #include /* old DEC C (v4.x?) was missing these two defines */ #ifndef S_IWUSR #define S_IWUSR 0000200 /* write permission, owner */ #endif #ifndef S_IRUSR #define S_IRUSR 0000400 /* read permission, owner */ #endif #define cma$tis_errno_get_addr CMA$TIS_ERRNO_GET_ADDR #define FOPENR(s) fopen(s, "r", "shr=upd") #define VERSION VNUMBER"/OpenVMS" #endif #ifdef BEOS #define NOALARM #define NOFOLLOW #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define VERSION VNUMBER"/BeOS" #endif #ifdef OSX #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define VERSION VNUMBER"/OS X" #endif #ifdef UNIX #ifndef OSX #ifndef BEOS #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define VERSION VNUMBER"/Unix" #endif #endif #endif #ifdef WIN32 #define popen _popen #define pclose _pclose extern void Win32Init(void); extern void Win32Cleanup(void); #define WIN32DIRENT /* can comment out if POSIX dirent present, eg Borland */ #define NOFOLLOW #define NOALARM #define FOPENR_BINARY #define POPENR_BINARY #define PATHSEPS ":\\/" #define DIRSEP '\\' #define EXTSEP '.' #define VERSION VNUMBER"/Win32" #endif #ifdef OS2 #define NOFOLLOW #define NOALARM #define PATHSEPS "\\/" #define DIRSEP '\\' #define EXTSEP '.' #define VERSION VNUMBER"/OS2" #endif #ifdef RISCOS #define NOOPEN #define NOPIPES #define RISCOSDIRENT #define NOFOLLOW #define NOALARM #define PATHSEPS "." #define DIRSEP '.' #define EXTSEP '/' #define VERSION VNUMBER MINORVERSION"/RISCOS" #include #endif #ifdef NEXTSTEP #define NOFOLLOW #define NOALARM #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #ifndef S_IWUSR #define S_IWUSR 0000200 /* write permission, owner */ #endif #ifndef S_IRUSR #define S_IRUSR 0000400 /* read permission, owner */ #endif #define VERSION VNUMBER"/NeXTSTEP" #endif #ifdef MPEIX #define NOFOLLOW #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define VERSION VNUMBER"/iX" #endif #ifdef BS2000 #define EBCDIC #define NOALARM #define NOFOLLOW #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define VERSION VNUMBER"/BS2000/OSD" #endif #ifdef OS390 #define EBCDIC #define NOALARM #define NOFOLLOW #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define VERSION VNUMBER"/OS390" #endif #ifdef AS400 #define EBCDIC #define PATHSEPS "/" #define DIRSEP '/' #define EXTSEP '.' #define ALIGNSIZE (16) #define NOPIPES #define NOALARM #define NOFOLLOW #define FOPENR(s) fopen(s, "r,ccsid=37") #define FOPENW(s) fopen(s, "w,ccsid=37") #define FOPENWB(s) fopen(s, "wb,ccsid=37") #define FOPENA(s) fopen(s, "a,ccsid=37") #define VERSION VNUMBER"/AS400" #endif #if defined(EBCDIC) && !defined(OS390) && !defined(AS400) && !defined(BS2000) /* Seems to be a not-yet-supported platform. */ #error Unsupported EBCDIC platform. Please port Analog and contribute your changes back to ! /* You might also want to have a look at: * - globals.c (system dependent EBCDIC translation tables) * - settings.c (identification string for your OS) * - Makefile (extra Define) */ #endif /*** ANSI header files ***/ #include #include #include #include #include #include #include #include #include #include #include #ifndef NOGRAPHICS #include #endif #ifndef NOALARM #include #endif /*** system dependent header files ***/ #ifndef LINE_PARSER #include "zlib/zlib.h" #include "unzip/unzip.h" #include "bzip2/bzlib.h" #endif #include "pcre/pcre.h" #include "libgd/gd.h" #include "libgd/gdfontf.h" #include "libgd/gdfonts.h" #ifndef NOFOLLOW #include #ifndef PATH_MAX #include #define PATH_MAX MAXPATHLEN #endif #endif #ifdef WIN32 #include #endif #ifdef MAC #ifdef LINE_PARSER #ifndef REAL_STDIO #define fopen(name,mode) mac_fopen((name),(mode)) #define fread(ptr,siz,num,file) mac_fread(ptr,siz,num,file) #undef getc #define getc(file) mac_getc(file) #define fclose(file) mac_fclose((file)) #undef feof #define feof(file) mac_feof(file) #endif extern FILE *mac_fopen(const char *name,const char *mode); extern size_t mac_fread(void *ptr, size_t size, size_t num, FILE *file); extern int mac_getc(FILE *file); extern int mac_fclose(FILE *file); extern int mac_feof(FILE *file); #endif #ifndef REAL_ALLOC #define malloc(size) mac_malloc((size)) #define calloc(num,size) mac_calloc((num),(size)) #define realloc(ptr,size) mac_realloc((ptr),(size)) #define free(ptr) mac_free((ptr)) #endif extern void *mac_malloc(size_t size); extern void *mac_calloc(size_t num, size_t size); extern void *mac_realloc(void *ptr, size_t size); extern void mac_free(void *ptr); #endif #ifdef NEED_FLOATINGPOINT_H #include #endif #ifndef NOOPEN #include #include #include #ifdef WIN32 #include #define OPEN_MODE (S_IREAD | S_IWRITE) #else #define OPEN_MODE (S_IRUSR | S_IWUSR) /* Most systems will accept the above too, but this is POSIXly correct. */ #endif #endif /* I assume the header files are well enough behaved that we can include them twice without harm, so that we can just do !NOSTAT and !NODIRENT indep. */ /* See init2.c for an explanation of the DIRENT #define logic */ #ifndef NODIRENT #ifndef VMSDIRENT #ifndef MACDIRENT #ifndef WIN32DIRENT #ifndef RISCOSDIRENT #ifndef NOGLOB #include /* POSIX.2 glob */ #else #ifdef MAC #include /* Mac POSIX dirent */ #include #else #include /* Normal POSIX dirent */ #include #include #endif /* MAC */ #endif /* NOGLOB */ #endif /* RISCOSDIRENT */ #else #include /* Win32 dirent */ #include #include #endif /* WIN3DIRENT */ #else #include "macdir.h" /* Old Mac dirent (no longer used) */ #define NOGLOB #endif /* MACDIRENT */ #else #define VMS_FSPEC_MAX 256 /* VMS dirent */ #include #endif /* VMSDIRENT */ #endif /* NODIRENT */ #ifndef NODNS #ifdef MAC #if !TARGET_API_MAC_CARBON #include /* Mac DNS */ #include #include #include #include #endif #else /* Win32 and normal DNS */ #ifdef HAVE_ADDR_T /* define in Makefile if in_addr_t != unsigned long */ #define IN_ADDR_T in_addr_t #else typedef unsigned long IN_ADDR_T; #endif #ifdef WIN32 /* Win32 DNS: NB windows.h above includes winsock.h */ #define INET_ADDR_ERR ((IN_ADDR_T)(INADDR_NONE)) #else #ifdef RISCOS #include #endif #include /* Normal DNS */ #include #include #ifndef BEOS #include #else #ifdef BONE_VERSION #include #endif #endif /* BEOS */ #define INET_ADDR_ERR ((IN_ADDR_T)(-1)) #endif /* !WIN32 */ #endif /* !MAC */ #ifndef NOALARM /* All DNS */ #include #endif #ifndef SIGALRM #define NOALARM #endif #endif /* !NODNS */ #ifdef NODNS #define NOALARM #endif #ifndef SIGALRM #define NOALARM #endif #ifndef NOALARM #ifdef USE_PLAIN_SETJMP #define SETJMP setjmp #define LONGJMP longjmp #define JMP_BUF jmp_buf #else #define SETJMP(b) sigsetjmp((b), 1) #define LONGJMP siglongjmp #define JMP_BUF sigjmp_buf #endif #endif /*** User-definable header file ***/ #include "anlghead.h" /*** definitions ***/ #undef TRUE #define TRUE (1) #undef FALSE #define FALSE (0) #undef OK #define OK (0) #undef ERR #define ERR (-1) #undef UNSET #define UNSET (-1) #ifndef EXIT_SUCCESS #define EXIT_SUCCESS (0) /* ANSI, but some broken implementations lack it. */ #endif #ifndef EXIT_FAILURE #define EXIT_FAILURE (1) #endif #define EXIT_SIGNAL ((EXIT_FAILURE) + 1) #ifdef WIN32 #define ERRBUFMODE (_IONBF) /* on Windows, _IOLBF causes full buffering */ #else #define ERRBUFMODE (_IOLBF) #endif #define FEW (2) /* used for GOTOS and REPORTSPAN */ #define EXCLUDED (2) /* in my_sort() */ #define NEWLOGFMT (2) #define BADLOGFMT (3) #define CONTINUATION (-1) /* used in warn() in utils.c */ #define IPADDR_INC (3) /* next six used in (struct include).type */ #define REGEX_INC (2) /* see also IS_REGEXT(), IS_IPADDRT(), IS_INC() below */ #define NORMAL_INC (1) #define NORMAL_EXC (-1) #define REGEX_EXC (-2) #define IPADDR_EXC (-3) #define BLOCK_EPSILON (30) #define MIN_SC (100) /* see parsescode() in input.c */ #define SC_NUMBER (600) #define IGNORE_CODE (1000) #define EPSILON (1e-8) #define MINS_IN_WEEK (10080) #define HASHSIZE (8) /* initial size of hash table; a power of 2 */ #define TREEHASHSIZE (3) /* a power of 2 plus 1 */ #define SIZEBINS (11) /* in sizescore() */ #define ENGMONTHLEN (3) /* length of longest of engmonths in globals.c */ #define ENGSHORTDAYLEN (3)/* length of longest of engshortdays in globals.c */ #define ITEMFNS_NUMBER ((ITEM_NUMBER) + 2) /* in inpfns[] in globals.c */ #define ANALOGURL "http://www.analog.cx/" #define FIRST_TIME (0) #define LAST_TIME (ULONG_MAX) #define LAST_DATE ((ULONG_MAX) / 1440) #define WHITESPACE ((char)(-1)) #define DOMLEVEL_NUMBER (677) /* 26^2 + 1 */ #define PMATCH_SIZE (30) /* This allows PCRE to capture 9 subexpressions */ /* Amount of stuff recorded by cache files: see cache_records in globals.c */ #define V34_DATA_NUMBER (7) #define V5_DATA_NUMBER (10) #ifdef MAC_EVENTS #define MAC_IDLE_FREQ (200) #endif /* Special codes for certain reports. We collect them here just to avoid changing several instances if they change (although see Pnenxtname() too). * It would be nice to let the user use localised versions of these in e.g. *EXCLUDE commands, but that doesn't scale to the case of reports in two languages in one pass, because not all trees are built as late as output time. */ #define LNGSTR_UNRESOLVED "[unresolved numerical addresses]" #define LNGSTR_NODOMAIN "[domain not given]" #define LNGSTR_UNKDOMAIN "[unknown domain]" #define LNGSTR_ROOTDIR "[root directory]" #define LNGSTR_NODIR "[no directory]" #define LNGSTR_NOEXT "[no extension]" #define LNGSTR_BRKDIRS "[directories]" #define LNGSTR_UNKWIN "Unknown Windows" #define LNGSTR_UNKUX "Other Unix" #define LNGSTR_ROBOTS "Robots" #define LNGSTR_UNKOS "OS unknown" /*** logfile line types ***/ #define LOG_COMMON1 "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%j%w%r%wHTTP%j\" %c %b" #define LOG_COMMON2 "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%j%w%r\" %c %b" #define LOG_COMMON3 "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%r\" %c %b" #define LOG_MS_COMMON1 "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%j%w%r%w\"HTTP%j\" %c %b" #define LOG_COMBINED1 \ "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%j%w%r%wHTTP%j\" %c %b \"%f\" \"%B\"" #define LOG_COMBINED2 \ "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%j%w%r\" %c %b \"%f\" \"%B\"" #define LOG_COMBINED3 \ "%S %j %u [%d/%M/%Y:%h:%n:%j] \"%r\" %c %b \"%f\" \"%B\"" #define LOG_MS_INT1 "%S, %u, %d/%m/%Z, %h:%n:%j, W3SVC%j, %j, %v, %T, %j, %b, %c, %j, %j, %r, %q," #define LOG_MS_INT2 "%*S, %*u, %d/%m/%Z, %h:%n:%j, %j" #define LOG_MS_NA1 "%S, %u, %m/%d/%Z, %h:%n:%j, W3SVC%j, %j, %v, %T, %j, %b, %c, %j, %j, %r, %q," #define LOG_MS_NA2 "%*S, %*u, %m/%d/%Z, %h:%n:%j, %j" #define LOG_WEBSTAR1 "!!LOG_FORMAT%x2" #define LOG_WEBSTAR2 "!!%j" #define LOG_EXTENDED1 "#Fields:%x3" #define LOG_EXTENDED2 "#%j" #define LOG_MS_EXTENDED1 "#Fields:%x5" #define LOG_WEBSTAR_EXTENDED1 "#Fields:%x6" #define LOG_WEBSITE_NA \ "%m/%d/%y %h:%n:%j\t%S\t%v\t%j\t%u\t%j\t%r\t%f\t%j\t%B\t%c\t%b\t%T" #define LOG_WEBSITE_INT \ "%d/%m/%y %h:%n:%j\t%S\t%v\t%j\t%u\t%j\t%r\t%f\t%j\t%B\t%c\t%b\t%T" #define LOG_MACHTTP "%m/%d/%y\t%h:%n:%j \t%C%w%S\t%r\t%b" #define LOG_NETSCAPE "format=%x4" #define LOG_REFERRER1 "[%d/%M/%Y:%h:%n:%j] %F -> %*r" #define LOG_REFERRER2 "%F -> %*r" #define LOG_BROWSER "[%d/%M/%Y:%h:%n:%j] %B" /*** enums ***/ /* Types of item and other inputs: must have ITEMs in process_data() order: code, bytes, proctime, unixtime, am, date in some order (these are INPUT_NUMBER, not to be confused with INP_NUMBER): then rest in some order. NB I don't know if changing process_data() order would have side-effects. */ /* See also item_type in globals.c */ enum {ITEM_VHOST, ITEM_FILE, ITEM_USER, ITEM_REFERRER, ITEM_BROWSER, ITEM_HOST, INP_CODE, INP_BYTES, INP_PROCTIME, INP_UNIXTIME, INP_AM, INP_DATE, INP_YEAR, INP_MONTH, INP_HOUR, INP_MIN, INP_QUERY, INP_IP, INP_NUMBER}; #define ITEM_NUMBER (INP_CODE) #define INPUT_NUMBER (INP_YEAR) /* NB There is INP_NUMBER and INPUT_NUMBER */ /* Types of report. They must be in the following order: date Reports; date Summaries; GENSUM; general reports; dervreps; arrayreps. (The order is insignificant within each section.) */ /* See also repcodes, anchorname and repname in globals.c */ /* Also report descriptions files have these entries in this order */ enum {REP_YEAR, REP_QUARTERLY, REP_MONTH, REP_WEEK, REP_DAYREP, REP_HOURREP, REP_QUARTERREP, REP_FIVEREP, REP_DAYSUM, REP_HOURSUM, REP_WEEKHOUR, REP_QUARTERSUM, REP_FIVESUM, REP_GENSUM, REP_REQ, REP_REDIR, REP_FAIL, REP_TYPE, REP_DIR, REP_HOST, REP_REDIRHOST, REP_FAILHOST, REP_DOM, REP_REF, REP_REFSITE, REP_REDIRREF, REP_FAILREF, REP_BROWREP, REP_VHOST, REP_REDIRVHOST, REP_FAILVHOST, REP_USER, REP_REDIRUSER, REP_FAILUSER, REP_ORG, REP_SEARCHREP, REP_SEARCHSUM, REP_INTSEARCHREP, REP_INTSEARCHSUM, REP_BROWSUM, REP_OS, REP_SIZE, REP_CODE, REP_PROCTIME, REP_NUMBER}; #define DATEREPORTS_NUMBER (REP_DAYSUM) /* just the eight "Reports" */ #define DATEREP_NUMBER (REP_GENSUM) /* including the five "Summaries" too */ #define FIRST_GENREP (REP_GENSUM + 1) #define GENREP_NUMBER (REP_NUMBER - FIRST_GENREP) #define FIRST_DERVREP (REP_SEARCHREP) #define DERVREP_NUMBER (6) #define FIRST_ARRAYREP (REP_SIZE) #define ARRAYREP_NUMBER (3) #define LAST_NORMALREP (REP_OS) /* Types of logfile line. Order insignificant. */ enum {SUCCESS, FAILURE, REDIRECT, INFO, UNWANTED}; #define OUTCOME_NUMBER (INFO) /* only first 3 needed for datacols[] */ /* Counts then dates collected about each item, and then other floor/sort criteria: order otherwise insignificant. See also methodname in globals.c and cache_records in cache.c. */ enum {REQUESTS, REQUESTS7, PAGES, PAGES7, REDIR, REDIR7, FAIL, FAIL7, SUCCDATE, REDIRDATE, FAILDATE, SUCCFIRSTD, REDIRFIRSTD, FAILFIRSTD, BYTES, BYTES7, ALPHABETICAL, RANDOM, METHOD_NUMBER}; #define COUNT_NUMBER (SUCCDATE) #define DATESORT (SUCCDATE) #define FIRSTDATE (SUCCFIRSTD) #define DATA_NUMBER (BYTES) #define CHART_NONE (SUCCDATE) #define CHART_SORTBY (CHART_NONE + 1) /* abbreviated version ignoring HTTP status code */ enum {REQUESTS2, REQUESTS72, PAGES2, PAGES72, DATE2, FIRSTD2, DATA2_NUMBER, DATACOLS_NUMBER}; /* Type of logfile by compression */ enum {LF_NOTOPENED, LF_NORMAL, LF_PIPE, LF_GZIP, LF_ZIP, LF_ZIPMEMBER, LF_BZ2}; /* Data collected about total requests etc. in each logfile */ enum {LOGDATA_UNWANTED, LOGDATA_UNKNOWN, LOGDATA_UNKNOWN7, LOGDATA_INFO, LOGDATA_INFO7, LOGDATA_SUCC, LOGDATA_SUCC7, LOGDATA_PAGES, LOGDATA_PAGES7, LOGDATA_REDIR, LOGDATA_REDIR7, LOGDATA_FAIL, LOGDATA_FAIL7, LOGDATA_CORRUPT, LOGDATA_NUMBER}; /* Poss. columns: COL_TITLE must be first; see also colcodes[] in globals.c */ enum {COL_TITLE, COL_REQS, COL_REQS7, COL_PAGES, COL_PAGES7, COL_BYTES, COL_BYTES7, COL_PREQS, COL_PREQS7, COL_PPAGES, COL_PPAGES7, COL_PBYTES, COL_PBYTES7, COL_DATE, COL_TIME, COL_FIRSTD, COL_FIRSTT, COL_INDEX, COL_NUMBER}; /* Levels of DNS lookup. Keep in order. */ enum {DNS_NONE, DNS_READ, DNS_LOOKUP, DNS_WRITE}; /* Output types: start with XHTML then PLAIN */ enum {XHTML, PLAIN, ASCII, HTML, LATEX, COMPUTER, XML, OUT_NONE}; /* days of the week */ enum {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; /* languages; see also country in globals.c */ enum {ARMENIAN, BASQUE, /*BOSNIAN,*/ BULGARIAN, BULGARIAN_MIK, CATALAN, SIMP_CHINESE, TRAD_CHINESE, /*CROATIAN,*/ CZECH, CZECH_1250, DANISH, DUTCH, ENGLISH, US_ENGLISH, FINNISH, FRENCH, GERMAN, /*GREEK,*/ HUNGARIAN, /*ICELANDIC,*/ INDONESIAN, ITALIAN, JAPANESE_EUC, JAPANESE_JIS, JAPANESE_SJIS, JAPANESE_UTF, KOREAN, LATVIAN, /*LITHUANIAN,*/ NORWEGIAN, NYNORSK, POLISH, PORTUGUESE, BR_PORTUGUESE, /*ROMANIAN,*/ RUSSIAN, RUSSIAN_1251, SERBIAN, SLOVAK, SLOVAK_1250, SLOVENE, SLOVENE_1250, SPANISH, SWEDISH, SWEDISH_ALT, TURKISH, UKRAINIAN}; #define OLDLANG (-2) /* source of data passed to htmlputs(): see comments there. These represent roughly increasing levels of security. */ enum {AS_IS, TRUSTED, FROM_CFG, UNTRUSTED, IN_HREF}; /* lngstrs; charset_ must be first */ enum {charset_, weekbeg_, year_, quarteryr_, month_, day_, days_, hr_, minute_, minutes_, second_, seconds_, byte_, bytes_, xbytes_, request_, requests_, date_, datetime_, time_, firstdate_, firsttime_, lastdate_, lasttime_, file_, files_, host_, hosts_, vhost_, vhosts_, dir_, dirs_, dom_, doms_, org_, orgs_, ext_, exts_, url_, urls_, browser_, browsers_, os_, oss_, size_, search_, searches_, site_, sites_, user_, users_, code_, codes_, webstatsfor_, kilo_, mega_, giga_, tera_, peta_, exa_, zeta_, yotta_, kiloabbr_, megaabbr_, gigaabbr_, teraabbr_, petaabbr_, exaabbr_, zetaabbr_, yottaabbr_, filesize0_, filesize1_, filesize2_, filesize3_, filesize4_, filesize5_, filesize6_, filesize7_, filesize8_, filesize9_, filesize10_, gensum_, yearrep_, busyyear_, quarterlyrep_, busyquarteryr_, monthrep_, busymonth_, weekrep_, busyweek_, daysum_, dayrep_, busyday_, hourrep_, hoursum_, weekhoursum_, busyhour_, quarterrep_, quartersum_, busyquarterhr_, fiverep_, fivesum_, busyfive_, hostrep_, hostgs_, hostgp_, hostgen_, redirhostrep_, redirhostgs_, redirhostgp_, redirhostgen_, failhostrep_, failhostgs_, failhostgp_, failhostgen_, dirrep_, dirgs_, dirgp_, dirgen_, typerep_, extgs_, extgp_, extgen_, reqrep_, filegs_, filegp_, filegen_, redirrep_, redirgs_, redirgp_, redirgen_, failrep_, failgs_, failgp_, failgen_, refrep_, refgs_, refgp_, refgen_, refsiterep_, refsitegs_, refsitegp_, refsitegen_, redirrefrep_, redirrefgs_, redirrefgp_, redirrefgen_, failrefrep_, failrefgs_, failrefgp_, failrefgen_, searchrep_, searchrepgs_, searchrepgp_, searchrepgen_, searchsum_, searchsumgs_, searchsumgp_, searchsumgen_, intsearchrep_, intsearchrepgs_, intsearchrepgp_, intsearchrepgen_, intsearchsum_, intsearchsumgs_, intsearchsumgp_, intsearchsumgen_, vhostrep_, vhostgs_, vhostgp_, vhostgen_, redirvhostrep_, redirvhostgs_, redirvhostgp_, redirvhostgen_, failvhostrep_, failvhostgs_, failvhostgp_, failvhostgen_, userrep_, usergs_, usergp_, usergen_, rediruserrep_, redirusergs_, redirusergp_, redirusergen_, failuserrep_, failusergs_, failusergp_, failusergen_, browsum_, browgs_, browgp_, browgen_, browrep_, browrepgs_, browrepgp_, browrepgen_, osrep_, osgs_, osgp_, osgen_, domrep_, domgs_, domgp_, domgen_, orgrep_, orggs_, orggp_, orggen_, statrep_, codegs_, codegp_, codegen_, proctimerep_, sizerep_, credit_, runtime_, lessone_, eachunit_, represents_, partof_, pagereq_, pagereqs_, notlistedm_, notlistedf_, notlistedn_, otherm_, otherf_, othern_, progstart_, reqstart_, to_, succreqs_, avereqs_, totpages_, avepages_, totunknown_, totfails_, totredirs_, inforeqs_, distfiles_, disthosts_, corrupt_, unwanted_, totdata_, avedata_, brackets_, sevendaysto_, lastsevendays_, goto_, top_, unresolved_, nodomain_, unkdomain_, rootdir_, nodir_, noext_, brkdirs_, unkwin_, unkux_, robots_, unkos_, nreqs_, nreqs7_, preqs_, preqs7_, npgs_, npgs7_, ppgs_, ppgs7_, nbytes_, nxbytes_, nbytes7_, nxbytes7_, pbytes_, pbytes7_, index_, firstsm_, firstsf_, firstsn_, firstdsm_, firstdsf_, firstdsn_, allsm_, allsf_, allsn_, floorby_, atleast_, request7_, requests7_, pagereq7_, pagereqs7_, redirreq_, redirreqs_, redirreq7_, redirreqs7_, failreq_, failreqs_, failreq7_, failreqs7_, ptraffic_, ptraffic7_, pmtraffic_, pmtraffic7_, bytetraffic_, bytestraffic_, xbytestraffic_, bytetraffic7_, bytestraffic7_, xbytestraffic7_, sincedate_, sinceredirdate_, sincefaildate_, sincefirstd_, sinceredirfirstd_, sincefailfirstd_, sortedm_, sortedf_, sortedn_, repspan_, chartby_, traffic_, traffic7_, prequests_, prequests7_, pmrequests_, pmrequests7_, nrequests_, nrequests7_, ppages_, ppages7_, pmpages_, pmpages7_, npages_, npages7_, predirs_, predirs7_, pmredirs_, pmredirs7_, nredirs_, nredirs7_, pfails_, pfails7_, pmfails_, pmfails7_, nfails_, nfails7_, succdate_, redirdate_, faildate_, succfirstd_, redirfirstd_, failfirstd_, alphasortm_, alphasortf_, alphasortn_, numsortm_, numsortf_, numsortn_, unsortedm_, unsortedf_, unsortedn_, sepchar_, decpoint_, colon_, am_, pm_, datefmt1_, datefmt2_, dayrepfmt_, daysumfmt_, hourrepfmt_, hoursumfmt_, weekhoursumfmt_, quarterrepfmt_, quartersumfmt_, weekfmt_, monthfmt_, quarterlyfmt_, yearfmt_, genrepdate_, genreptime_, whatincfmt_, code100_, code101_, code199_, code200_, code201_, code202_, code203_, code204_, code205_, code206_, code299_, code300_, code301_, code302_, code303_, code304_, code_305, code306_, code307_, code399_, code400_, code401_, code402_, code403_, code404_, code405_, code406_, code407_, code408_, code409_, code410_, code411_, code412_, code413_, code414_, code415_, code416_, code417_, code499_, code500_, code501_, code502_, code503_, code504_, code505_, code506_, code599_, code999_, LNGSTR_NUMBER}; #define byteprefix_ (kilo_ - 1) #define byteprefixabbr_ (kiloabbr_ - 1) /* return codes from strtoinfmt() */ /* see also configlogfmt() in init2.c */ enum {FMT_OK, FMT_NOPC, FMT_DUP, FMT_BADCHAR, FMT_NOTERM, FMT_BADBUILTIN, FMT_BADPC, FMT_PARTTIME, FMT_QBUTNOR}; /*** typedefs ***/ typedef unsigned char logical; typedef signed char choice; typedef unsigned int datecode_t; typedef unsigned long timecode_t; /*** typedef function pointers ***/ struct hashindex; struct logfile; typedef void (*cutfnp)(char **, char **, char *, logical); typedef void (*dcutfnp)(char **, char **, char *, void *); typedef struct hashindex *(*mergefnp)(struct hashindex *, struct hashindex *, unsigned long, unsigned long, choice); typedef void (*conffnp)(void *, char *, char *, char *, int); typedef choice (*inputfnp)(struct logfile *lf, void *, char); /*** structs */ typedef struct { double bytes, bytes7; unsigned long *data; /* some are really timecode_t */ logical reused; /* for reused, see newtreedata() in tree.c */ choice ispage; } Hashentry; typedef struct hashindex { char *name; Hashentry *own; void *other; struct hashindex *next; } Hashindex; typedef struct aliasto { char *string; choice after; struct aliasto *next; } AliasTo; /* The target of an alias alternates a "string" and possibly a part of the original name indexed by "after" (else after == -1) (see printalias()). */ typedef struct alias { char *from; pcre *pattern; AliasTo *to; logical isregex; struct alias *next; } Alias; /* For a normal pattern, nmatch is no. of *'s. For a regular expression, it's -3 * (no. of capturing subexpressions): this is what pcre_exec needs. */ typedef struct strpairlist { char *name, *data; struct strpairlist *next; } Strpairlist; typedef struct { char *name; conffnp fn; void *opt; } Configfns; typedef struct { char *name; choice arg; } Choices; typedef struct { char code; choice type; inputfnp fn; void *opt; } Inputfns; typedef struct inputformat { Inputfns *inpfns; char sep; struct inputformat *next; } Inputformat; typedef struct inputformatlist { Inputformat *form; choice count[INPUT_NUMBER]; /* 0 = not present, 1 = starred, 2 = unstarred */ logical used; struct inputformatlist *next; } Inputformatlist; typedef struct logfile { char *name; void *file; void *file2; /* bzip2 needs the (FILE *) and the (BZFILE *) */ choice type; Inputformatlist *format; timecode_t from, to; unsigned long data[LOGDATA_NUMBER]; double bytes, bytes7; char *prefix; size_t prefixlen; int pvpos, tz; struct logfile *next; } Logfile; typedef struct mmlist { void *pos; struct mmlist *next; } Mmlist; typedef struct { void *block_end, *curr_pos, *next_pos; Mmlist *first, *last; unsigned short alignment; } Memman; typedef struct daysdata { unsigned long *reqs, *pages; double *bytes; struct daysdata *prev, *next; } Daysdata; typedef struct { char *fromstr, *tostr; timecode_t from, to, last7from, last7to, firsttime, lasttime; datecode_t firstdate, lastdate, currdate; /* perhaps bad name: currdate is date of current logfile entry */ Daysdata *firstdp, *lastdp, *currdp; } Dateman; typedef struct timerep { unsigned long reqs, pages; double bytes; datecode_t date; unsigned int time; struct timerep *prev, *next; } Timerep; typedef struct { double threshold; unsigned long reqs, reqs7, pages, pages7; double bytes, bytes7; timecode_t firstdate, lastdate; } Arraydata; typedef struct { Hashindex **head; unsigned long size; unsigned long n; } Hashtable; typedef struct { Hashtable *tree; cutfnp cutfn; Memman *space; } Tree; typedef struct { Hashtable *table; dcutfnp cutfn; Memman *space; void *arg; } Derv; typedef struct strlist { char *name; struct strlist *next; } Strlist; typedef struct { char *name; double angle; } Wedge; typedef struct include { char *name; pcre *pattern; unsigned long minaddr, maxaddr; choice type; struct include *next; } Include; typedef struct { double min; char qual; choice floorby; } Floor; typedef struct { choice code; char *file; } Lang; struct outchoices; /* The actual outputters are defined in globals.c */ typedef struct { unsigned int (*pagewidth)(struct outchoices *); void (*cgihead)(FILE *, struct outchoices *); void (*stylehead)(FILE *, struct outchoices *); void (*pagetitle)(FILE *, struct outchoices *); void (*timings)(FILE *, struct outchoices *, Dateman *); void (*closehead)(FILE *, struct outchoices *); void (*pagebotstart)(FILE *, struct outchoices *); void (*credit)(FILE *, struct outchoices *); void (*runtime)(FILE *, struct outchoices *, long); void (*pagefoot)(FILE *, struct outchoices *); void (*stylefoot)(FILE *, struct outchoices *); void (*reporttitle)(FILE *, struct outchoices *, choice); void (*reportfooter)(FILE *, struct outchoices *, choice); void (*reportdesc)(FILE *, struct outchoices *, choice); void (*reportspan)(FILE *, struct outchoices *, choice, timecode_t, timecode_t); void (*gensumhead)(FILE *, struct outchoices *); void (*gensumfoot)(FILE *, struct outchoices *); void (*gensumline)(FILE *, struct outchoices *, int, unsigned long, unsigned long, logical); void (*gensumlineb)(FILE *, struct outchoices *, int, double, double, logical); void (*lastseven)(FILE *, struct outchoices *, timecode_t); void (*prestart)(FILE *, struct outchoices *); void (*preend)(FILE *, struct outchoices *); void (*hrule)(FILE *, struct outchoices *); char *(*endash)(void); void (*putch)(FILE *, char); size_t (*strlength)(const char *); logical (*allowmonth)(void); void (*calcwidths)(struct outchoices *, choice, unsigned int [], unsigned int *, unsigned int *, double *, unsigned long, unsigned long, unsigned long, unsigned long, double, double, unsigned long); void (*declareunit)(FILE *, struct outchoices *, char, double, unsigned int); void (*colheadstart)(FILE *, struct outchoices *, choice); void (*colheadcol)(FILE *, struct outchoices *, choice, choice, unsigned int, char *, logical); void (*colheadend)(FILE *, struct outchoices *, choice); void (*colheadustart)(FILE *, struct outchoices *, choice); void (*colheadunderline)(FILE *, struct outchoices *, choice, choice, unsigned int, char *); void (*colheaduend)(FILE *, struct outchoices *, choice); void (*rowstart)(FILE *, struct outchoices *, choice, choice *, int, char *, char *, char *); void (*levelcell)(FILE *, struct outchoices *, choice, int); void (*namecell)(FILE *, struct outchoices *, choice, char *, choice, unsigned int, logical, logical, logical, Alias *, Include *, logical, unsigned int, char *); void (*ulcell)(FILE *, struct outchoices *, choice, choice, unsigned long, unsigned int); void (*strcell)(FILE *, struct outchoices *, choice, choice, char *, unsigned int); void (*bytescell)(FILE *, struct outchoices *, choice, choice, double, double, unsigned int); void (*pccell)(FILE *, struct outchoices *, choice, choice, double, double, unsigned int); void (*indexcell)(FILE *, struct outchoices *, choice, choice, long, unsigned int); void (*rowend)(FILE *, struct outchoices *, choice); void (*blankline)(FILE *, struct outchoices *, choice *); void (*barchart)(FILE *, struct outchoices *, int, char); void (*busyprintf)(FILE *, struct outchoices *, choice, char *, unsigned long, unsigned long, double, datecode_t, unsigned int, unsigned int, datecode_t, unsigned int, unsigned int, char); void (*notlistedstr)(FILE *, struct outchoices *, choice, unsigned long); void (*whatincluded)(FILE *, struct outchoices *, choice, unsigned long, Dateman *); void (*whatinchead)(FILE *, struct outchoices *); void (*whatincfoot)(FILE *, struct outchoices *); void (*whatincprintstr)(FILE *, struct outchoices *, char *); void (*printdouble)(FILE *, struct outchoices *, double); void (*includefile)(FILE *, struct outchoices *, char *, char); unsigned int (*riscosfiletype)(void); } Outputter; typedef struct outchoices { Outputter *outputter; char *outfile, *cacheoutfile; char *domainsfile, *descfile, *headerfile, *footerfile; choice outstyle, gotos; logical descriptions, multibyte, html, repspan, pdflatex; unsigned int rsthresh; choice reporder[REP_NUMBER + 1]; logical repq[REP_NUMBER], last7, runtime; choice cols[REP_NUMBER][COL_NUMBER]; unsigned int rows[DATEREPORTS_NUMBER]; char graph[DATEREP_NUMBER]; logical back[DATEREPORTS_NUMBER]; choice chartby[GENREP_NUMBER]; logical jpegcharts, pngimages; choice sortby[GENREP_NUMBER], subsortby[GENREP_NUMBER]; Floor floor[GENREP_NUMBER], subfloor[GENREP_NUMBER]; Lang lang; char *dayname[7], *monthname[12], **lngstr, *descstr[REP_NUMBER]; size_t daylen, plaindaylen, monthlen, plainmonthlen, ampmlen, plainampmlen; char *hostname, *hosturl, *logo, *logourl, *imagedir; char *stylesheet,*cssprefix, *chartdir, *localchartdir; char markchar; logical norobots; logical rawbytes; unsigned int bytesdp; choice weekbeginson; unsigned int plainpagewidth, htmlpagewidth, latexpagewidth; unsigned int mingraphwidth; char sepchar, repsepchar, decpt, barstyle; char *compsep, *gensumlines; Tree *tree[GENREP_NUMBER]; Strlist *suborgs; Derv *derv[DERVREP_NUMBER]; choice *alltrees, *alldervs; Include *wanthead[GENREP_NUMBER]; Alias *aliashead[GENREP_NUMBER]; Include *link[GENREP_NUMBER]; Strlist *expandhead[GENREP_NUMBER]; char *baseurl; choice searchconv; unsigned char convfloor; } Outchoices; typedef struct { Logfile *logfile[2]; /* [0] are logfiles, [1] are cache files */ unsigned long data[LOGDATA_NUMBER]; double bytes, bytes7; char *dirsuffix; unsigned int dirsufflength; choice lowmem[ITEM_NUMBER]; logical case_insensitive, usercase_insensitive; unsigned int granularity; } Miscoptions; typedef struct { Hashtable *hash[ITEM_NUMBER]; Arraydata *arraydata[ARRAYREP_NUMBER]; choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2]; /* given item type i, outcome j, the kth thing to do is to store data of data2-type dc[i][j][k][1] in structure's column index dc[i][j][k][0]. */ choice data2cols[ITEM_NUMBER][DATA_NUMBER]; /* item type i, data type j, is stored in this column (or -1 if unwanted) */ unsigned int no_cols[ITEM_NUMBER]; Hashindex **gooditems, **baditems; Include *wanthead[ITEM_NUMBER], *ispagehead, *argshead, *refargshead; choice code2type[SC_NUMBER]; logical succ304; Alias *aliashead[ITEM_NUMBER]; Strpairlist *searchengines, *intsearchengines; Include *robots; Dateman dman; Outchoices outopts; Miscoptions miscopts; Strlist *conffilelist; } Options; /*** macros ***/ #undef MAX #define MAX(a, b) (((a) > (b))?(a):(b)) #undef MIN #define MIN(a, b) (((a) < (b))?(a):(b)) /* a whole set of macros to cope with to...() and is...() commands if char is unsigned. */ #define ISALNUM(c) isalnum((unsigned char)(c)) #define ISALPHA(c) isalpha((unsigned char)(c)) #define ISDIGIT(c) isdigit((unsigned char)(c)) #define ISLOWER(c) islower((unsigned char)(c)) #define ISSPACE(c) isspace((unsigned char)(c)) #define ISUPPER(c) isupper((unsigned char)(c)) #define TOLOWER(c) ((char)tolower((unsigned char)(c))) #define TOUPPER(c) ((char)toupper((unsigned char)(c))) #ifdef NEED_STRCMP #define strcmp my_strcmp #endif #ifdef NEED_DIFFTIME #define difftime(t, s) ((double)((t) - (s))) #endif #ifdef NEED_STRTOUL #define strtoul(a, b, c) ((unsigned long)(strtol(a, b, c))) /* This is not quite right because of the different ranges of long and unsigned long, but it's probably OK for our purposes */ #endif #define STREQ(s, t) (strcmp(s, t) == 0) #define MATCHES(s, p) (matchq(s, (void *)p, FALSE, NULL)) /* Date conversion functions. See dates.c on the representation of dates. */ #define FEB (1) #define DEC (11) #define IS_LEAPYEAR(y) ((y) % 4 == 0) /* This is not Year 2100 compatible but is Year 2000 compatible! */ #define DATE2CODE(y, m, d) (((y) - 1970) * 365 + ((y) - 1968) / 4 + \ daysbefore[m] + (d) - (IS_LEAPYEAR(y) && (m) <= FEB)) #define TIMECODE(datecode, hr, min) ((timecode_t)((datecode) * 1440 + (datecode_t)((hr) * 60 + (min)))) #define UXTIME2CODE(t) ((timecode_t)(((t) / 60) + 1440)) #define DAYOFWEEK(d) ((choice)(((d) + 10) % 7)) #define IS_EMPTY_STRING(s) ((s)[0] == '\0') #define IS_STDIN(s) (STREQ((s), "-") || strcaseeq((s), "stdin")) #define IS_STDOUT(s) (STREQ((s), "-") || strcaseeq((s), "stdout")) #define TO_NEXT(x) (x) = (x)->next #ifndef FOPENR #ifdef FOPENR_BINARY #define FOPENR(s) fopen(s, "rb") #else #define FOPENR(s) fopen(s, "r") #endif #endif #ifndef FOPENW #define FOPENW(s) fopen(s, "w") #endif #ifndef FOPENWB #define FOPENWB(s) fopen(s, "wb") #endif #ifndef FOPENA #define FOPENA(s) fopen(s, "a") #endif #ifndef POPENR #ifdef POPENR_BINARY #define POPENR(s) popen(s, "rb") #else #define POPENR(s) popen(s, "r") #endif #endif #define ENTRY_WANTED(e) ((e) != unwanted_entry) #define ENTRY_BLANK(e) ((e) == blank_entry) #define LEN3(n, c) ((unsigned int)((c == '\0')?(n):((n) + (((n) - 1) / 3)))) /* The length of an n digit number with seps; e.g. 56789 [5] -> 56,789 [6] */ #define COPYSTR(s, n) {char *z = n; s = (char *)xmalloc(strlen(z) + 1); \ strcpy(s, z);} /* z needed so n only evaluated once */ /* Note memory leak in COPYSTR, so only used in initialisation */ #define TOO_FULL(n, z) ((n) > (z)) /* defn for hash table too full */ #define TOO_FULL_TREE TOO_FULL #define NEW_SIZE(z) (2 * (z)) /* new size of the hash table */ #define NEW_SIZE_TREE(z) (2 * (z) - 1) /* Next three: see IPADDR_INC etc. above */ #define IS_IPADDRT(type) ((type) == 3 || (type) == -3) /* for includes */ #define IS_REGEXT(type) ((type) == 2 || (type) == -2) /* for includes */ #define IS_INC(type) ((type) > 0) /* for includes */ /* static char *s = NULL; static size_t len = 0; ENSURE_LEN(s, len, req_len) */ #define ENSURE_LEN(s, l, n) if ((n) > (l)) { \ s = (char *)xrealloc((void *)s, n); \ l = n;} /* These PUT's are used in datesprintf() etc.: quicker than using sprintf() */ #define PUT02d(s, d) {*((s)++) = ((d) / 10) + '0'; \ *((s)++) = ((d) % 10) + '0'; } #define PUT04d(s, d) {*((s)++) = ((d) / 1000) + '0'; \ *((s)++) = ((d) / 100) % 10 + '0'; \ *((s)++) = ((d) / 10) % 10 + '0'; \ *((s)++) = ((d) % 10) + '0'; } #define PUT2d(s, d) {*((s)++) = ((d) < 10)?' ':(((d) / 10) + '0'); \ *((s)++) = ((d) % 10) + '0'; } #define PUT1d(s, d) {*((s)++) = (d) + '0'; } #define PUTc(s, c) {*((s)++) = (c); } #define PUTs(s, t, n) {int z; size_t l = strlen(t); \ memcpy((void *)s, (void *)t, l); s += l; \ for (z = n; z > 0; z--) *((s)++) = ' '; } /* Some simple command line processing parts implemented as macros */ #define CLSHORTWARN(arg) warn('C', TRUE, "No argument specified after %s command line option (or space wrongly left before argument)", arg) #define CLLONGWARN(arg) warn('C', TRUE, "Command line argument %s too long: ignoring end of it", arg) #define CLSHORTCHECK(command) if (argv[i][2] == '\0') CLSHORTWARN(argv[i]); \ else command #define CLLONGCHECK(command) if (argv[i][2] != '\0') CLLONGWARN(argv[i]); \ command #define CLTOGGLE(f) CLLONGCHECK(f = (argv[i][0] == '+')?TRUE:FALSE) #define CLREPTOGGLE(n) CLTOGGLE(op->outopts.repq[n]) #define CLOUTSTYLE CLTOGGLE #define CLGOTOS CLTOGGLE /* these work because PLAIN == TRUE == ON and XHTML == FALSE == OFF */ /* an abbreviation for arrays with size GENREP_NUMBER */ #define G(r) ((r) - FIRST_GENREP) /* magicno as macro not fn. for speed: x is unsigned long to contain answer, s is (char *) to be magicked, b is unsigned long base (no. of hash bins); power of 2 in practice. Formula is (\sum_i 9^i c_i) [mod (ULONG_MAX + 1)] mod b */ #define MAGICNO(x, s, b) {register unsigned char *r; \ for(x = 0, r = (unsigned char *)(s); *r != '\0'; r++) { \ x = (x << 3) + x + (long)(*r); } \ x %= b; } /* for tree magic number, t is end of string, bins are power of 2 plus 1, and formula has 33 in place of 9 */ #define MAGICNOTREE(x, s, t, b) {register unsigned char *r; \ for(x = 0, r = (unsigned char *)(s); \ r < (unsigned char *)(t); r++) { \ x = (x << 5) + x + (long)(*r); } \ x %= (b - 1); x++; } #include "anlghea4.h" /* import function declarations */ #endif /* ANLGHEA3_H */ analog-6.0/src/anlghea4.h0000644000175000017500000016353610161303542015372 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** anlghea4.h: fourth header file ***/ /*** Just function declarations: these are not user-definable; user-definable *** options can be found in anlghead.h ***/ #ifndef ANLGHEA4_H #define ANLGHEA4_H /* in alias.c */ extern choice do_alias(char *name, Memman *mp, Alias *aliashead, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte, choice type); extern logical do_aliasx(char *name, Alias *aliashead); extern logical do_aliasr(char *name, char *dirsuffix, unsigned int dirsufflength); extern logical do_aliasS(char *name); extern logical do_aliasf(char *name); extern logical do_aliasB(char *name); extern logical do_aliasu(char *name, logical case_insensitive); extern logical do_aliasv(char *name); extern logical do_aliasN(char *name, unsigned char convfloor, logical multibyte); extern logical do_aliasn(char *name, unsigned char convfloor, logical multibyte); extern logical do_aliasb(char *name); #ifndef NODNS extern logical dnsresolve(char *name, choice level); extern void do_dns(char *name, char *alias, choice level); #endif extern void printalias(char *name, AliasTo *to, int pmatch[]); extern void wildalias(char *name, AliasTo *to, int pmatch[]); extern choice prealias(Memman *mm, Memman *mmv, Hashentry *vhost, Memman *mmq, logical case_insensitive, char *prefix, size_t prefixlen, int pvpos, Include *argshead); extern void prealiasS(Memman *mm, Memman *mms); extern void reverseonename(Hashindex *p); extern void reversenames(Hashindex *ans); /* in analog.c -- only main() */ /* in cache.c */ extern void outputcache(char *outfile, Hashindex **gooditems, Dateman *dman, Arraydata **arraydata, unsigned long *data, double bys, choice data2cols[ITEM_NUMBER][DATA_NUMBER]); extern void hashbuild(choice code, unsigned long *data, double bys, Memman *mm, Hashtable **hash, unsigned int data_number, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice data2cols[], Include *wanthead, Include *ispagehead, Tree **tree, Derv **derv, choice *alltrees, choice *alldervs, choice lowmem, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte); extern void corruptcacheline(char *line, choice *rc, choice type); extern logical parsecacheline(char *linestart, char *parsestart, unsigned int *code, unsigned int maxcode, int no_items, unsigned long *data, double *bys, Memman *mm); extern void readoldcache(Logfile *cachefilep, Dateman *dman, choice type, unsigned int granularity); extern void readcache(Logfile *cachefilep, Hashtable **hash, unsigned int *no_cols, choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice data2cols[ITEM_NUMBER][DATA_NUMBER], Arraydata **arraydata, Include **wanthead, Include *ispagehead, Dateman *dman, Tree **tree, Derv **derv, choice *alltrees, choice *alldervs, choice *lowmem, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte, unsigned int granularity); /* in dates.c */ extern void code2date(datecode_t code, unsigned int *date, unsigned int *month, unsigned int *year); extern time_t shifttime(time_t timer, int diff); extern choice parsedate(time_t starttime, char *s, timecode_t *date, logical from, logical unixtime); extern choice wantdate(timecode_t *timecode, Dateman *dman, unsigned int hr, unsigned int min, unsigned int date, unsigned int month, unsigned int year, int tz); extern choice wantunixtime(timecode_t *timecode, Dateman *dman, unsigned long unixtime, int tz); extern Daysdata *newday(unsigned int granularity); extern void dmaninit(Dateman *dman, datecode_t datecode, unsigned int granularity); extern void datehash(timecode_t timecode, Dateman *dman, unsigned long reqs, unsigned long pages, double bytes, unsigned int granularity); /* in globals.c */ extern void globals(char *comnane); extern void defaults(Options *op); /* in hash.c */ extern Hashtable *rehash(Hashtable *old, unsigned long size, Memman *treespace); extern Hashindex *hashfind(Memman *mp, Hashtable **table, unsigned int data_number, Include *wanthead, choice ispage, Include *ispagehead, Alias *aliashead, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte, choice type, logical aliased); extern Hashentry *newhashentry(unsigned int data_number, logical ispage); extern void hashscore(Hashentry *ep, unsigned long data[DATA2_NUMBER], choice datacols[DATACOLS_NUMBER][2], choice outcome, double bytes); extern void unhash(Hashtable *hash, Hashindex **gooditems, Hashindex **baditems); extern void unhashall(Hashtable **hash, Hashindex ***gooditems, Hashindex ***baditems); /* in init.c */ extern void initialise(int argc, char *argv[], Options *op); extern void confline(Options *op, char *cmd, char *arg1, char *arg2, int rc); extern choice config(char *filename, Options *op, logical fromcommandline); extern void settings(Options *op, int argc, char *argv[]); extern Inputformatlist *correctlogfmt(Logfile *lp, Include **wanthead, choice *code2type, Dateman *dman); extern void correct(Options *op); extern void finalinit(Options *op); extern choice strtoinfmt(Inputformat **ans, char *s, choice *count); extern char *apachelogfmt(char *fmt); extern void clconfline(Options *op, char *s); extern void clgenrep(Options *op, choice rep, char *arg); extern void cldebug(char **s, char *arg); extern void clargs(Options *op, int argc, char *argv[]); /* in init2.c */ extern void shortwarn(char *cmd, char *arg1, int rc); extern void longwarn(char *cmd, char *arg1, char *arg2, int rc); extern void badwarn(char *cmd, choice domess, char *arg1, char *arg2, int rc); extern void unknownwarn(char *cmd, char *arg1, char *arg2); extern void configcall(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configcols(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configallcols(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configchoice(void *opt, char *cmd, char *arg1, char *arg2, int rc); #ifndef NOGRAPHICS extern void configallchart(void *opt, char *cmd, char *arg1, char *arg2, int rc); #endif extern void configdebug(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configall(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configallback(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configlang(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void selectlang(char *country, Outchoices *op); extern void configlogfmt(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configapachelogfmt(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configrepord(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configstr(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configstrlist(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configerrfile(void *opt, char *cmd, char *arg1, char *arg2, int rc); #ifndef NODIRENT extern Logfile *clonelogs(Logfile *from, char *name); extern Logfile *expandwildlogs(Logfile *lp, Logfile **pter); #endif extern void configlogfile(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configcachefile(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configoutfile(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configchar(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configbarstyle(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configgraph(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configallgraph(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configfloor(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configtree(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configulong(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configuint(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configoffset(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configlowmem(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern int aliastocount(char *s); extern AliasTo *configaliasto(char *s, logical is_regex); extern void configalias(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configstrpair(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configstrpairlist(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configstrpair2list(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configdomlevel(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configinex(void *opt, char *cmd, char *arg1, char *arg2, int rc, logical in, logical omitinitdot, logical omittrailslash); extern void configinc(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configexc(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configincd(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configexcd(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configincs(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configexcs(void *opt, char *cmd, char *arg1, char *arg2, int rc); logical parseiprange(char *arg1, unsigned long *minaddr, unsigned long *maxaddr); extern void confighostinex(void *opt, char *cmd, char *arg1, char *arg2, int rc, logical in); extern void confighostinc(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void confighostexc(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configscinex(void *opt, char *cmd, char *arg1, char *arg2, int rc, logical in); extern void configscinc(void *opt, char *cmd, char *arg1, char *arg2, int rc); extern void configscexc(void *opt, char *cmd, char *arg1, char *arg2, int rc); /* in input.c */ extern logical my_lfopen(Logfile *lf, char *logtype); extern FILE *my_fopen(char *name, char *logtype); extern void my_lfclose(Logfile *p, Logfile *allc, Logfile *allp, char *filetype, Dateman *dman, unsigned long *totdata, double *bys, double *bys7); extern int my_fclose(FILE *f, char *name, char *filetype); extern logical logfile_init(Logfile *lf); extern void duplogfile(Logfile *lf); extern choice getmoredata(Logfile *lf, char *start, size_t length); extern choice getnextline(FILE *f, char *start, size_t used); extern void shunt_data(Logfile *lf); extern int strtomonth(char *month); extern choice parsemonth(Logfile *lf, void *arg, char c); extern choice parseuint2(Logfile *lf, void *arg, char c); extern choice parsenmonth(Logfile *lf, void *arg, char c); extern choice parseulong(Logfile *lf, void *arg, char c); extern choice parseunixtime(Logfile *lf, void *arg, char c); extern choice parseproctime(Logfile *lf, void *arg, char c); extern choice parseproctimeu(Logfile *lf, void *arg, char c); extern choice parseuint2strict(Logfile *lf, void *arg, char c); extern choice parsescode(Logfile *lf, void *arg, char c); extern choice parseuint4strict(Logfile *lf, void *arg, char c); extern choice parseudint(Logfile *lf, void *arg, char c); extern choice parseyear2(Logfile *lf, void *arg, char c); extern choice parseyear2or4(Logfile *lf, void *arg, char c); extern choice parseam(Logfile *lf, void *arg, char c); extern choice parsecode(Logfile *lf, void *arg, char c); extern choice parsejunk(Logfile *lf, void *arg, char c); extern choice parsespace(Logfile *lf, void *arg, char c); extern choice parseoptspace(Logfile *lf, void *arg, char c); extern choice parsenewline(Logfile *lf, void *arg, char c); extern void parsenonnewline(Logfile *lf); extern choice parsestring(Logfile *lf, void *arg, char c); extern choice parsemsbrow(Logfile *lf, void *arg, char c); extern choice parseref(Logfile *lf, void *arg, char c); extern choice checkchar(Logfile *lf, void *arg, char c); extern void resolveconflicts(unsigned int n, char *delims, ...); extern choice parselogfmt(Logfile *lf, void *arg, char c); extern choice parsenextrecord(Logfile *lf, Inputformat *format); extern int parseconfline(char *s, char **cmd, char **arg1, char **arg2); extern int nextconfline(FILE *f, char **cmd, char **arg1, char **arg2); extern char *nextlngstr(FILE *f, char *name, logical want); extern choice nextdnsline(FILE *f, timecode_t *timec, char **name, char **alias); extern void process_domainsfile(FILE *f, Options *op); extern void process_descfile(FILE *f, char *name, Options *op); /* in macstuff.c (See also macdir.h) */ #ifdef MAC_EVENTS extern void MacInit(int *argc, char **argv[]); extern void MacFini(void); extern void MacIdle(void); #endif #ifdef MACDIRENT extern void CToPCpy(unsigned char *pstr, const char *cstr); #endif #ifdef MAC #ifndef NODNS extern long OpenNetwork(void); extern int IpAddr2Name(char *hostname); extern void ResolverCleanup(void); extern pascal void SvcNotifyProc(void *dataPtr, OTEventCode code, OTResult result, void *cookie); extern pascal void MacTCPDNRResultProc(struct hostInfo *hInfoPtr, char *userDataPtr); #endif #endif /* in output.c */ extern void pagetop(FILE *outf, Outchoices *od, Dateman *dman); extern void pagebot(FILE *outf, Outchoices *od); extern void gensum(FILE *outf, Outchoices *od, unsigned long *data, double bys, double bys7, Hashindex **gooditems, Hashindex **baditems, Dateman *dman, choice data2cols[ITEM_NUMBER][DATA_NUMBER]); extern void timerep(FILE *outf, Outchoices *od, choice rep, Dateman *dman, unsigned int granularity); extern void timesum(FILE *outf, Outchoices *od, choice rep, Dateman *dman, unsigned int granularity); extern void printtree(FILE *outf, Outchoices *od, choice rep, Hashtable *tree, choice requests, choice requests7, choice pages, choice pages7, choice date, choice firstd, unsigned int level, Strlist *partname, unsigned long totr, unsigned long totr7, unsigned long totp, unsigned long totp7, double totb, double totb7, unsigned int width[], logical possrightalign, unsigned int bmult, unsigned int bmult7, double unit); extern void genrep(FILE *outf, Outchoices *od, choice rep, Hashindex **gooditems, Hashindex **baditems, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice *data2cols, unsigned int data_number, Dateman *dman); extern void dervrep(FILE *outf, Outchoices *od, choice rep, Hashindex *gooditems, Hashindex *baditems, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice *data2cols, unsigned int data_number, Dateman *dman); extern void arrayrep(FILE *outf, Outchoices *od, choice rep, Arraydata *array, Dateman *dman); extern void output(Outchoices *od, Hashindex **gooditems, Hashindex **baditems, Dateman *dman, Arraydata **arraydata, unsigned long *sumdata, double totbytes, double totbytes7, choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice data2cols[ITEM_NUMBER][DATA_NUMBER], unsigned int *no_cols, unsigned int granularity); /* in output2.c */ extern void report_title(FILE *outf, Outchoices *od, choice rep); extern void report_footer(FILE *outf, Outchoices *od, choice rep); extern void reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind, Dateman *dman); extern void matchlength(FILE *outf, Outchoices *od, char *s, char c); extern void matchlengthn(FILE *outf, Outchoices *od, int width, char c); extern size_t datefmtlen(Outchoices *od, char *fmt); extern char *datesprintf(Outchoices *od, char *fmt, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, logical running, choice allowmonth); extern char *timesprintf(Outchoices *od, char *fmt, timecode_t t, choice allowmonth); extern int f3printf(FILE *outf, Outchoices *od, double x, unsigned int width, char sepchar); extern void printbytes(FILE *outf, Outchoices *od, double bytes, unsigned int bmult, unsigned int width, char sepchar); extern void doublemprintf(FILE *outf, choice outstyle, unsigned int pagewidth, double x, char decpt); extern double findunit(Outchoices *od, double n, unsigned int width[], choice *cols); extern void calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern unsigned int alphatreewidth(Outchoices *od, choice rep, Hashtable *tree, unsigned int level, Strlist *partname); extern void declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void barchart(FILE *outf, Outchoices *od, char graphby, unsigned long reqs, unsigned long pages, double bys, double unit); extern void colheads(FILE *outf, Outchoices *od, choice rep, unsigned int width[], unsigned int bmult, unsigned int bmult7, logical name1st); extern void printcols(FILE *outf, Outchoices *od, choice rep, unsigned long reqs, unsigned long reqs7, unsigned long pages, unsigned long pages7, double bys, double bys7, long index, int level, unsigned long totr, unsigned long totr7, unsigned long totp, unsigned long totp7, double totb, double totb7, unsigned int width[], unsigned int bmult, unsigned int bmult7, double unit, logical name1st, logical rightalign, char *name, logical ispage, unsigned int spaces, Include *linkhead, char *baseurl, char *datefmt, char *timefmt, datecode_t date, unsigned int hr, unsigned int min, datecode_t date2, unsigned int hr2, unsigned int min2); extern void distcount(Hashindex *gooditems, Hashindex *baditems, choice requests, choice requests7, unsigned long *tot, unsigned long *tot7); extern void gensumline(FILE *outf, Outchoices *od, char codeletter, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void gensumlineb(FILE *outf, Outchoices *od, char codeletter, int namecode, double x, double x7, logical isaverage); extern logical checkonerep(Outchoices *od, Hashindex *gp, choice rep, choice requests, cutfnp cutfn, dcutfnp dcutfn, void *darg); extern logical checktreerep(Outchoices *od, Hashtable *tp, choice rep, choice requests, cutfnp cutfn); extern logical checkarrayrep(Arraydata *array); extern void checkreps(Outchoices *od, Dateman *dman, Hashindex **gooditems, Arraydata **arraydata, choice data2cols[ITEM_NUMBER][DATA_NUMBER]); /* in outcro.c */ extern unsigned int cro_pagewidth(Outchoices *od); extern void cro_cgihead(FILE *outf, Outchoices *od); extern void cro_stylehead(FILE *outf, Outchoices *od); extern void cro_pagetitle(FILE *outf, Outchoices *od); extern void cro_timings(FILE *outf, Outchoices *od, Dateman *dman); extern void cro_closehead(FILE *outf, Outchoices *od); extern void cro_pagebotstart(FILE *outf, Outchoices *od); extern void cro_credit(FILE *outf, Outchoices *od); extern void cro_runtime(FILE *outf, Outchoices *od, long secs); extern void cro_pagefoot(FILE *outf, Outchoices *od); extern void cro_stylefoot(FILE *outf, Outchoices *od); extern void cro_reporttitle(FILE *outf, Outchoices *od, choice rep); extern void cro_reportfooter(FILE *outf, Outchoices *od, choice rep); extern void cro_reportdesc(FILE *outf, Outchoices *od, choice rep); extern void cro_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind); extern void cro_gensumhead(FILE *outf, Outchoices *od); extern void cro_gensumfoot(FILE *outf, Outchoices *od); extern void cro_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void cro_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage); extern void cro_lastseven(FILE *outf, Outchoices *od, timecode_t last7to); extern void cro_prestart(FILE *outf, Outchoices *od); extern void cro_preend(FILE *outf, Outchoices *od); extern void cro_hrule(FILE *outf, Outchoices *od); extern char *cro_endash(void); extern void cro_putch(FILE *outf, char c); extern size_t cro_strlength(const char *s); extern logical cro_allowmonth(void); extern void cro_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern void cro_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void cro_colheadstart(FILE *outf, Outchoices *od, choice rep); extern void cro_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated); extern void cro_colheadend(FILE *outf, Outchoices *od, choice rep); extern void cro_colheadustart(FILE *outf, Outchoices *od, choice rep); extern void cro_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name); extern void cro_colheaduend(FILE *outf, Outchoices *od, choice rep); extern void cro_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt); extern void cro_levelcell(FILE *outf, Outchoices *od, choice rep, int level); extern void cro_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl); extern void cro_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width); extern void cro_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width); extern void cro_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width); extern void cro_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width); extern void cro_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width); extern void cro_rowend(FILE *outf, Outchoices *od, choice rep); extern void cro_blankline(FILE *outf, Outchoices *od, choice *cols); extern void cro_barchart(FILE *outf, Outchoices *od, int y, char graphby); extern void cro_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby); extern void cro_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn); extern void cro_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void cro_includefile(FILE *outf, Outchoices *od, char *name, char type); extern unsigned int cro_riscosfiletype(void); /* in outhtml.c */ extern unsigned int html_pagewidth(Outchoices *od); extern void html_cgihead(FILE *outf, Outchoices *od); extern void html_stylehead(FILE *outf, Outchoices *od); extern void html_pagetitle(FILE *outf, Outchoices *od); extern void html_timings(FILE *outf, Outchoices *od, Dateman *dman); extern void html_closehead(FILE *outf, Outchoices *od); extern void html_pagebotstart(FILE *outf, Outchoices *od); extern void html_credit(FILE *outf, Outchoices *od); extern void html_runtime(FILE *outf, Outchoices *od, long secs); extern void html_pagefoot(FILE *outf, Outchoices *od); extern void html_stylefoot(FILE *outf, Outchoices *od); extern void html_reporttitle(FILE *outf, Outchoices *od, choice rep); extern void html_reportfooter(FILE *outf, Outchoices *od, choice rep); extern void html_reportdesc(FILE *outf, Outchoices *od, choice rep); extern void html_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind); extern void html_gensumhead(FILE *outf, Outchoices *od); extern void html_gensumfoot(FILE *outf, Outchoices *od); extern void html_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void html_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage); extern void html_lastseven(FILE *outf, Outchoices *od, timecode_t last7to); extern void html_prestart(FILE *outf, Outchoices *od); extern void html_preend(FILE *outf, Outchoices *od); extern void html_hrule(FILE *outf, Outchoices *od); extern char *html_endash(void); extern void html_putch(FILE *outf, char c); extern size_t html_strlength(const char *s); extern size_t html_strlength_utf8(const char *s); extern size_t html_strlength_jis(const char *s); extern logical html_allowmonth(void); extern void html_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern void html_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void html_colheadstart(FILE *outf, Outchoices *od, choice rep); extern void html_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated); extern void html_colheadend(FILE *outf, Outchoices *od, choice rep); extern void html_colheadustart(FILE *outf, Outchoices *od, choice rep); extern void html_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name); extern void html_colheaduend(FILE *outf, Outchoices *od, choice rep); extern void html_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt); extern void html_levelcell(FILE *outf, Outchoices *od, choice rep, int level); extern void html_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl); extern void html_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width); extern void html_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width); extern void html_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width); extern void html_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width); extern void html_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width); extern void html_rowend(FILE *outf, Outchoices *od, choice rep); extern void html_blankline(FILE *outf, Outchoices *od, choice *cols); extern void html_barchart(FILE *outf, Outchoices *od, int y, char graphby); extern void html_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby); extern void html_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn); extern void html_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void html_whatinchead(FILE *outf, Outchoices *od); extern void html_whatincfoot(FILE *outf, Outchoices *od); extern void html_whatincprintstr(FILE *outf, Outchoices *od, char *s); extern void html_printdouble(FILE *outf, Outchoices *od, double x); extern void html_includefile(FILE *outf, Outchoices *od, char *name, char type); extern unsigned int html_riscosfiletype(void); extern void html_gotos(FILE *outf, Outchoices *od, choice rep); extern void html_escfprintf(FILE *outf, char *name); extern void htmlputs(FILE *outf, Outchoices *od, char *s, choice source); #ifndef NOGRAPHICS extern FILE *piechart_init(char *filename); extern void findwedges(Wedge wedge[], choice rep, Hashindex *items, choice chartby, Strlist *expandlist, unsigned int level, Strlist *partname, unsigned long tot, double totb, double totb7); extern void piechart_caption(FILE *outf, choice rep, choice chartby, char **lngstr); extern int piechart_wedge(FILE *outf, Outchoices *od, double angle, char *s); extern void piechart_key(FILE *outf, Outchoices *od, int col, char *name, char *extension, Alias *aliashead); extern void piechart_write(FILE *pieoutf, char *filename, logical jpegcharts); extern void piechart_cleanup(Wedge wedge[]); extern void piechart(FILE *outf, Outchoices *od, choice rep, Hashindex *items, choice requests, choice requests7, choice pages, choice pages7, unsigned long totr, unsigned long totr7, unsigned long totp, unsigned long totp7, double totb, double totb7); #endif /* in outlatex.c */ extern unsigned int latex_pagewidth(Outchoices *od); extern void latex_cgihead(FILE *outf, Outchoices *od); extern void latex_stylehead(FILE *outf, Outchoices *od); extern void latex_pagetitle(FILE *outf, Outchoices *od); extern void latex_timings(FILE *outf, Outchoices *od, Dateman *dman); extern void latex_closehead(FILE *outf, Outchoices *od); extern void latex_pagebotstart(FILE *outf, Outchoices *od); extern void latex_credit(FILE *outf, Outchoices *od); extern void latex_runtime(FILE *outf, Outchoices *od, long secs); extern void latex_pagefoot(FILE *outf, Outchoices *od); extern void latex_stylefoot(FILE *outf, Outchoices *od); extern void latex_reporttitle(FILE *outf, Outchoices *od, choice rep); extern void latex_reportfooter(FILE *outf, Outchoices *od, choice rep); extern void latex_reportdesc(FILE *outf, Outchoices *od, choice rep); extern void latex_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind); extern void latex_gensumhead(FILE *outf, Outchoices *od); extern void latex_gensumfoot(FILE *outf, Outchoices *od); extern void latex_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void latex_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage); extern void latex_lastseven(FILE *outf, Outchoices *od, timecode_t last7to); extern void latex_prestart(FILE *outf, Outchoices *od); extern void latex_preend(FILE *outf, Outchoices *od); extern void latex_hrule(FILE *outf, Outchoices *od); extern char *latex_endash(void); extern void latex_putch(FILE *outf, char c); extern size_t latex_strlength(const char *s); extern logical latex_allowmonth(void); extern void latex_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern void latex_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void latex_colheadstart(FILE *outf, Outchoices *od, choice rep); extern void latex_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated); extern void latex_colheadend(FILE *outf, Outchoices *od, choice rep); extern void latex_colheadustart(FILE *outf, Outchoices *od, choice rep); extern void latex_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name); extern void latex_colheaduend(FILE *outf, Outchoices *od, choice rep); extern void latex_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt); extern void latex_levelcell(FILE *outf, Outchoices *od, choice rep, int level); extern void latex_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl); extern void latex_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width); extern void latex_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width); extern void latex_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width); extern void latex_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width); extern void latex_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width); extern void latex_rowend(FILE *outf, Outchoices *od, choice rep); extern void latex_blankline(FILE *outf, Outchoices *od, choice *cols); extern void latex_barchart(FILE *outf, Outchoices *od, int y, char graphby); extern void latex_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby); extern void latex_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn); extern void latex_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void latex_whatinchead(FILE *outf, Outchoices *od); extern void latex_whatincfoot(FILE *outf, Outchoices *od); extern void latex_whatincprintstr(FILE *outf, Outchoices *od, char *s); extern void latex_printdouble(FILE *outf, Outchoices *od, double x); extern void latex_includefile(FILE *outf, Outchoices *od, char *name, char type); extern unsigned int latex_riscosfiletype(void); extern void latexputs(FILE *outf, char *s); /* in outplain.c */ extern unsigned int plain_pagewidth(Outchoices *od); extern void plain_cgihead(FILE *outf, Outchoices *od); extern void plain_stylehead(FILE *outf, Outchoices *od); extern void plain_pagetitle(FILE *outf, Outchoices *od); extern void plain_timings(FILE *outf, Outchoices *od, Dateman *dman); extern void plain_closehead(FILE *outf, Outchoices *od); extern void plain_pagebotstart(FILE *outf, Outchoices *od); extern void plain_credit(FILE *outf, Outchoices *od); extern void plain_runtime(FILE *outf, Outchoices *od, long secs); extern void plain_pagefoot(FILE *outf, Outchoices *od); extern void plain_stylefoot(FILE *outf, Outchoices *od); extern void plain_reporttitle(FILE *outf, Outchoices *od, choice rep); extern void plain_reportfooter(FILE *outf, Outchoices *od, choice rep); extern void plain_reportdesc(FILE *outf, Outchoices *od, choice rep); extern void plain_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind); extern void plain_gensumhead(FILE *outf, Outchoices *od); extern void plain_gensumfoot(FILE *outf, Outchoices *od); extern void plain_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void plain_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage); extern void plain_lastseven(FILE *outf, Outchoices *od, timecode_t last7to); extern void plain_prestart(FILE *outf, Outchoices *od); extern void plain_preend(FILE *outf, Outchoices *od); extern void plain_hrule(FILE *outf, Outchoices *od); extern char *plain_endash(void); extern void plain_putch(FILE *outf, char c); extern size_t plain_strlength(const char *s); extern logical plain_allowmonth(void); extern void plain_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern void plain_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void plain_colheadstart(FILE *outf, Outchoices *od, choice rep); extern void plain_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated); extern void plain_colheadend(FILE *outf, Outchoices *od, choice rep); extern void plain_colheadustart(FILE *outf, Outchoices *od, choice rep); extern void plain_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name); extern void plain_colheaduend(FILE *outf, Outchoices *od, choice rep); extern void plain_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt); extern void plain_levelcell(FILE *outf, Outchoices *od, choice rep, int level); extern void plain_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl); extern void plain_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width); extern void plain_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width); extern void plain_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width); extern void plain_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width); extern void plain_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width); extern void plain_rowend(FILE *outf, Outchoices *od, choice rep); extern void plain_blankline(FILE *outf, Outchoices *od, choice *cols); extern void plain_barchart(FILE *outf, Outchoices *od, int y, char graphby); extern void plain_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby); extern void plain_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn); extern void plain_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void plain_whatinchead(FILE *outf, Outchoices *od); extern void plain_whatincfoot(FILE *outf, Outchoices *od); extern void plain_whatincprintstr(FILE *outf, Outchoices *od, char *s); extern void plain_printdouble(FILE *outf, Outchoices *od, double x); extern void plain_includefile(FILE *outf, Outchoices *od, char *name, char type); extern unsigned int plain_riscosfiletype(void); /* in outxhtml.c */ extern unsigned int xhtml_pagewidth(Outchoices *od); extern void xhtml_cgihead(FILE *outf, Outchoices *od); extern void xhtml_stylehead(FILE *outf, Outchoices *od); extern void xhtml_pagetitle(FILE *outf, Outchoices *od); extern void xhtml_timings(FILE *outf, Outchoices *od, Dateman *dman); extern void xhtml_closehead(FILE *outf, Outchoices *od); extern void xhtml_pagebotstart(FILE *outf, Outchoices *od); extern void xhtml_credit(FILE *outf, Outchoices *od); extern void xhtml_runtime(FILE *outf, Outchoices *od, long secs); extern void xhtml_pagefoot(FILE *outf, Outchoices *od); extern void xhtml_stylefoot(FILE *outf, Outchoices *od); extern void xhtml_reporttitle(FILE *outf, Outchoices *od, choice rep); extern void xhtml_reportfooter(FILE *outf, Outchoices *od, choice rep); extern void xhtml_reportdesc(FILE *outf, Outchoices *od, choice rep); extern void xhtml_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind); extern void xhtml_gensumhead(FILE *outf, Outchoices *od); extern void xhtml_gensumfoot(FILE *outf, Outchoices *od); extern void xhtml_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void xhtml_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage); extern void xhtml_lastseven(FILE *outf, Outchoices *od, timecode_t last7to); extern void xhtml_prestart(FILE *outf, Outchoices *od); extern void xhtml_preend(FILE *outf, Outchoices *od); extern void xhtml_hrule(FILE *outf, Outchoices *od); extern char *xhtml_endash(void); extern void xhtml_putch(FILE *outf, char c); extern size_t xhtml_strlength(const char *s); extern logical xhtml_allowmonth(void); extern void xhtml_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern void xhtml_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void xhtml_colheadstart(FILE *outf, Outchoices *od, choice rep); extern void xhtml_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated); extern void xhtml_colheadend(FILE *outf, Outchoices *od, choice rep); extern void xhtml_colheadustart(FILE *outf, Outchoices *od, choice rep); extern void xhtml_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name); extern void xhtml_colheaduend(FILE *outf, Outchoices *od, choice rep); extern void xhtml_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt); extern void xhtml_levelcell(FILE *outf, Outchoices *od, choice rep, int level); extern void xhtml_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl); extern void xhtml_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width); extern void xhtml_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width); extern void xhtml_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width); extern void xhtml_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width); extern void xhtml_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width); extern void xhtml_rowend(FILE *outf, Outchoices *od, choice rep); extern void xhtml_blankline(FILE *outf, Outchoices *od, choice *cols); extern void xhtml_barchart(FILE *outf, Outchoices *od, int y, char graphby); extern void xhtml_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby); extern void xhtml_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn); extern void xhtml_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void xhtml_whatinchead(FILE *outf, Outchoices *od); extern void xhtml_whatincfoot(FILE *outf, Outchoices *od); extern void xhtml_whatincprintstr(FILE *outf, Outchoices *od, char *s); extern void xhtml_printdouble(FILE *outf, Outchoices *od, double x); extern void xhtml_includefile(FILE *outf, Outchoices *od, char *name, char type); extern unsigned int xhtml_riscosfiletype(void); extern void xhtml_gotos(FILE *outf, Outchoices *od, choice rep); extern void xhtml_escfprintf(FILE *outf, char *name); extern void xhtmlputs(FILE *outf, Outchoices *od, char *s, choice source); /* in outxml.c */ extern unsigned int xml_pagewidth(Outchoices *od); extern void xml_cgihead(FILE *outf, Outchoices *od); extern void xml_stylehead(FILE *outf, Outchoices *od); extern void xml_pagetitle(FILE *outf, Outchoices *od); extern void xml_timings(FILE *outf, Outchoices *od, Dateman *dman); extern void xml_closehead(FILE *outf, Outchoices *od); extern void xml_pagebotstart(FILE *outf, Outchoices *od); extern void xml_credit(FILE *outf, Outchoices *od); extern void xml_runtime(FILE *outf, Outchoices *od, long secs); extern void xml_pagefoot(FILE *outf, Outchoices *od); extern void xml_stylefoot(FILE *outf, Outchoices *od); extern void xml_reporttitle(FILE *outf, Outchoices *od, choice rep); extern void xml_reportfooter(FILE *outf, Outchoices *od, choice rep); extern void xml_reportdesc(FILE *outf, Outchoices *od, choice rep); extern void xml_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind); extern void xml_gensumhead(FILE *outf, Outchoices *od); extern void xml_gensumfoot(FILE *outf, Outchoices *od); extern void xml_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage); extern void xml_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage); extern void xml_lastseven(FILE *outf, Outchoices *od, timecode_t last7to); extern void xml_prestart(FILE *outf, Outchoices *od); extern void xml_preend(FILE *outf, Outchoices *od); extern void xml_hrule(FILE *outf, Outchoices *od); extern char *xml_endash(void); extern void xml_putch(FILE *outf, char c); extern size_t xml_strlength(const char *s); extern logical xml_allowmonth(void); extern void xml_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany); extern void xml_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult); extern void xml_colheadstart(FILE *outf, Outchoices *od, choice rep); extern void xml_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated); extern void xml_colheadend(FILE *outf, Outchoices *od, choice rep); extern void xml_colheadustart(FILE *outf, Outchoices *od, choice rep); extern void xml_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name); extern void xml_colheaduend(FILE *outf, Outchoices *od, choice rep); extern void xml_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt); extern void xml_levelcell(FILE *outf, Outchoices *od, choice rep, int level); extern void xml_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl); extern void xml_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width); extern void xml_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width); extern void xml_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width); extern void xml_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width); extern void xml_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width); extern void xml_rowend(FILE *outf, Outchoices *od, choice rep); extern void xml_blankline(FILE *outf, Outchoices *od, choice *cols); extern void xml_barchart(FILE *outf, Outchoices *od, int y, char graphby); extern void xml_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby); extern void xml_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn); extern void xml_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman); extern void xml_whatinchead(FILE *outf, Outchoices *od); extern void xml_whatincfoot(FILE *outf, Outchoices *od); extern void xml_whatincprintstr(FILE *outf, Outchoices *od, char *s); extern void xml_printdouble(FILE *outf, Outchoices *od, double x); extern void xml_includefile(FILE *outf, Outchoices *od, char *name, char type); extern unsigned int xml_riscosfiletype(void); /* in process.c */ extern void process_data(Logfile *logfilep, Hashtable **hash, Arraydata **arraydata, choice *count, choice *code2type, choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice data2cols[ITEM_NUMBER][DATA_NUMBER], unsigned int *no_cols, Include **wanthead, Include *ispagehead, Alias **aliashead, Include *argshead, Include *refargshead, Dateman *dman, Tree **tree, Derv **derv, choice *alltrees, choice *alldervs, choice *lowmem, logical case_insensitive, logical usercase_insensitive, unsigned char convfloor, logical multibyte, char *dirsuffix, unsigned int dirsufflength, unsigned int granularity); extern void corrupt_line(Logfile *logfilep, char *message, ptrdiff_t n); extern void arrayscore(Arraydata *array, double amount, unsigned long reqs, unsigned long reqs7, unsigned long pages, unsigned long pages7, double bytes, double bytes7, timecode_t timecode); /* in settings.c */ extern void report_vbles(Options *op); extern void report_compile(void); extern void report_debug(char *type, char *arg, char *fullset); extern void report_conffiles(Strlist *list); extern void report_logfiles(Logfile *logfile, logical cache); extern void report_logformat(FILE *outf, Inputformatlist *format, logical inwarn); extern void report_fromto(Dateman *dman); extern void report_want(Include *wanthead, char *type, char *indent); extern void report_scwant(choice *code2type); extern void report_alias(Alias *aliashead, char *type, char *indent); extern void report_strpairlist(Strpairlist *head, char *type, char *connector); extern void report_lowmem(choice lowmem[]); #ifndef NODNS extern void report_dns(void); #endif extern void report_outopts(Outchoices *od); extern void report_sep(char c, char *type); extern void report_daterep(Outchoices *od, choice j); extern void report_genrep(Outchoices *od, choice j); extern void report_cols(choice *cols); extern void report_sortby(choice sortby, logical sub); extern void report_floor(Floor *floor, logical sub); #ifndef NOGRAPHICS extern void report_chart(choice chartby); #endif extern void check_file(char *name); /* in sort.c */ extern void calctotmax(Hashindex **gooditems, Hashindex **baditems, Strlist *partname, Strlist **newpn, Strlist *space, size_t need, choice rep, Include *wanthead, choice requests, choice requests7, choice pages, choice pages7, choice date, choice firstd, unsigned long *totr, unsigned long *totr7, unsigned long *totp, unsigned long *totp7, double *totb, double *totb7, unsigned long *maxr, unsigned long *maxr7, unsigned long *maxp, unsigned long *maxp7, double *maxb, double *maxb7, timecode_t *maxd, timecode_t *mind, logical donetots, logical nosort, Hashindex **ans3); extern void calcfloor(unsigned long *min, double *dmin, choice *filterby, Floor *floor, choice requests, choice requests7, choice pages, choice pages7, choice date, choice firstd, unsigned long totr, unsigned long totr7, unsigned long totp, unsigned long totp7, double totb, double totb7, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7); extern void makebadpn(Hashentry **badp, unsigned long *badn, Hashindex *ans2, choice requests, choice requests7, choice pages, choice pages7, choice date, choice firstd, unsigned long *maxr, unsigned long *maxr7, unsigned long *maxp, unsigned long *maxp7, double *maxb, double *maxb7, logical donetots); extern void my_sort(Hashindex **gooditems, Hashindex **baditems, Strlist *partname, Strlist **newpn, Strlist *space, size_t need, choice rep, Floor *floor, choice sortby, logical alphaback, Include *wanthead, choice requests, choice requests7, choice pages, choice pages7, choice date, choice firstd, unsigned long *totr, unsigned long *totr7, unsigned long *totp, unsigned long *totp7, double *totb, double *totb7, unsigned long *maxr, unsigned long *maxr7, unsigned long *maxp, unsigned long *maxp7, double *maxb, double *maxb7, timecode_t *maxd, timecode_t *mind, logical donetots, Hashentry **badp, unsigned long *badn, logical nosort); extern Hashindex *my_mergesort(Hashindex *list, unsigned long length, choice sortby, mergefnp mergefn); extern Hashindex *merge(Hashindex *list1, Hashindex *list2, unsigned long length1, unsigned long length2, choice sortby); extern Hashindex *mergea(Hashindex *list1, Hashindex *list2, unsigned long length1, unsigned long length2, choice sortby); extern Hashindex *mergeb(Hashindex *list1, Hashindex *list2, unsigned long length1, unsigned long length2, choice sortby); extern Hashindex *mergeb7(Hashindex *list1, Hashindex *list2, unsigned long length1, unsigned long length2, choice sortby); /* in tree.c */ extern Hashindex *treefind(char *name, char *nameend, Hashtable **tree, Hashindex *item, cutfnp cutfn, logical build, logical transient, logical reuse, Memman *space, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], unsigned int data_number); extern void graft(Hashtable **new, Hashtable *old, Memman *space, unsigned int data_number); extern void allgraft(Hashtable *t, Memman *space, unsigned int data_number); extern Hashindex *newtreeentry(char *name, char *nameend, Hashindex *item, logical transient, logical reuse, Memman *space, unsigned int data_number); extern Hashentry *newtreedata(Hashentry *from, Memman *space, unsigned int data_number); extern void treescore(Hashentry *to, Hashentry *from, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2]); extern Hashindex *sorttree(Outchoices *od, Hashtable *tree, choice rep, Floor *floor, choice sortby, Floor *subfloor, choice subsortby, logical alphaback, unsigned int level, Strlist *partname, Alias *notcorrupt, choice requests, choice requests7, choice pages, choice pages7, choice date, choice firstd, unsigned long *totr, unsigned long *totr7, unsigned long *totp, unsigned long *totp7, double *totb, double *totb7, unsigned long *maxr, unsigned long *maxr7, unsigned long *maxp, unsigned long *maxp7, double *maxb, double *maxb7, timecode_t *maxd, timecode_t *mind, Hashentry **badp, unsigned long *badn, Memman *space, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2]); extern void maketree(Tree *treex, Hashindex *gooditems, Hashindex *baditems, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], unsigned int data_number); extern void makederived(Derv *derv, Hashindex *gooditems, Hashindex *baditems, unsigned char convfloor, logical multibyte, choice rep, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], unsigned int data_number); extern char *maketreename(Strlist *pn, Hashindex *p, Strlist **newpn, Strlist *space, size_t need, choice rep, logical delims); extern logical genstreq(char *a, char *b, char *t); extern void rnextname(char **name, char **nameend, char *whole, logical build); extern void inextname(char **name, char **nameend, char *whole, logical build); extern void onextname(char **name, char **nameend, char *whole, logical build); extern void tnextname(char **name, char **nameend, char *whole, logical build); extern void snextname(char **name, char **nameend, char *whole, logical build); extern void Znextname(char **name, char **nameend, char *whole, logical build); extern void bnextname(char **name, char **nameend, char *whole, logical build); extern void pnextname(char **name, char **nameend, char *whole, logical build); extern void Bnextname(char **name, char **nameend, char *whole, void *arg); extern void Pnextname(char **name, char **nameend, char *whole, void *arg); extern void Nnextname(char **name, char **nameend, char *whole, void *arg); extern void nnextname(char **name, char **nameend, char *whole, void *arg); /* in utils.c */ extern void my_exit(int status); extern void sighandler(int sig); extern logical substrcaseeq(char *s, char *t); extern char *strtoupper(char *n); extern void strtolowerx(char *n); extern void toloweralias(Alias *ap, logical both); extern void tolowerinc(Include *ip); extern void tolowerse(Strpairlist *sp); extern void reversealias(Alias **head); extern void reversestrpairlist(Strpairlist **head); extern logical strcaseeq(char *s, char *t); extern char *strrpbrk(char *s, char *t); #ifdef EBCDIC extern char *strtoascii(char *s); #endif extern char *buildfilename(char *old, char *sub, char *name); #ifdef NEED_STRCMP extern int my_strcmp(char *s, char *t); #endif extern unsigned int chrn(char *s, char c); extern unsigned int chrdistn(char *s, char c); extern unsigned int log10i(unsigned long i); extern unsigned int log10x(double d); extern unsigned int findbmult(double d, unsigned int dp); extern int atoi255(const char *s); extern unsigned long arraymaxl(unsigned long *x, unsigned int size); extern double arraymaxd(double *x, unsigned int size); extern size_t arraymaxlen(char **s, unsigned int size, Outchoices *od); extern void prettyprintf(FILE *outf, unsigned int pagewidth, char *fmt, va_list ap); extern void mprintf(FILE *outf, unsigned int pagewidth, char *fmt, ...); extern void print_progversion(FILE *f); extern void warn(char c, choice domess, char *s, ...); extern void error(char *s, ...); extern void debug(char c, char *s, ...); extern char *delimit(char *s); extern void *xmalloc(size_t size); extern void *xrealloc(void *ptr, size_t size); extern void *submalloc(Memman *m, size_t size); extern void freemm(Memman *m); #ifdef NEED_MEMMOVE extern void *memmove(void *dst0, const void *src0, size_t length); #endif extern logical wildmatch(char *s, char *p, char *whole, int nmatch, int *pmatch); extern logical matchq(char *s, void *p, logical is_regex, int *pmatch); extern logical genwildmatch(char *s, char *s2, char *p); extern logical headmatch(char *s, char *p); extern logical headcasematch(char *s, char *p); extern logical matchiprange(char *s, unsigned long minaddr, unsigned long maxaddr); extern logical included(char *name, logical ispage, Include *listhead); extern logical incstrlist(char *name, Strlist *listhead); extern logical pageq(char *name, Include *ispagehead, choice type); /* in win32.c */ #ifdef WIN32 extern void Win32Init(void); extern void Win32Cleanup(void); #endif /* WIN32 */ #endif /* ANLGHEA4_H */ analog-6.0/src/anlghead.h0000644000175000017500000001060210161303542015433 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** anlghead.h: first header file ***/ /*** This file contains the user-definable options which you are most likely to *** want to change. Edit any of the #define lines according to your desires. *** However, all of them except MANDATORYCONFIGFILE can be changed at run *** time as well. ***/ /*** These settings are overridden by any in your configuration file. ***/ /*** DON'T REMOVE THE #'S -- THEY'RE NOT COMMENTS! ***/ #ifndef ANLGHEAD_H #define ANLGHEAD_H #ifndef HOSTNAME #define HOSTNAME "[my organisation]" /* The name of your organisation or web server. This is used for printing at the top of the output. */ #endif #ifndef HOSTURL #define HOSTURL "none" /* The URL of your host's home page, for linking to at the top of the output; use "none" for no linking. */ #endif #ifndef LOGFILE #define LOGFILE "logfile.log" /* The name of the default logfile. Can be a list, separated by commas (but no spaces), and can include wild cards. */ #endif #ifndef OUTFILE #define OUTFILE "stdout" /* The default file for output. Use "stdout" for stdout. */ #endif #ifndef IMAGEDIR #define IMAGEDIR "images/" /* URL of the directory where the images for the graphical reports live. The URL can be absolute, or relative to the output page: e.g., just the empty string "" for the same directory as the output page. */ #endif #ifndef LOGO #define LOGO "analogo" /* the file where the analog logo lives: within the IMAGEDIR unless it starts with / or contains :// . You can put another logo in here (your organisation's logo, for example -- but if you do, change the LOGOURL below too). Use "none" for no logo. */ #endif #ifndef LOGOURL #define LOGOURL "http://www.analog.cx/" /* Where the logo links to, in XHTML output. */ #endif #ifndef STYLESHEET #define STYLESHEET "none" /* The URL of your style sheet. Use "none" for no style sheet. */ #endif #ifndef DEFAULTCONFIGFILE #define DEFAULTCONFIGFILE "analog.cfg" /* The name of the default configuration file. */ #endif #ifndef MANDATORYCONFIGFILE #define MANDATORYCONFIGFILE "none" /* A mandatory configuration file; read after all other arguments so overrides everything. Program exits if it is not found. Use "none" for none. */ #endif /* Finally, some directories where particularly files are looked for (you MUST include the trailing slash in the directory name!). You can also use "" to mean "the current working directory at the time you run the program". * If any of these directories is defined to be NULL, analog will attempt to deduce the directory of the analog binary from the command name you used, and use that directory; or the current directory if it couldn't deduce a directory. This may or may not work, so it's better to specify a location explicitly here if you know where the files will be kept. */ #ifndef LANGDIR #define LANGDIR NULL #endif /* Directory where the language files live. Actually, if this one is defined to be NULL, they will be looked for inside the "lang" subdirectory of the directory containing the analog binary. */ #ifndef CONFIGDIR #define CONFIGDIR NULL #endif /* Directory containing configuration files. */ #ifndef LOGSDIR #define LOGSDIR NULL #endif /* Directory containing logfiles. */ #ifndef CACHEDIR #define CACHEDIR NULL #endif /* Directory containing cache files. */ #ifndef OUTDIR #define OUTDIR NULL #endif /* Directory for writing output files: must already exist. */ #ifndef HEADERDIR #define HEADERDIR NULL #endif /* Directory containing header and footer files. */ #ifndef DNSDIR #define DNSDIR NULL #endif /* Directory containing DNS files. */ #ifndef LOCKDIR #define LOCKDIR NULL #endif /* Directory containing the DNS lock file. */ #ifndef ERRDIR #define ERRDIR NULL #endif /* Directory containing the ERRFILE. */ #include "anlghea2.h" /* You can edit anlghea2.h as well. But the options in there are ones which you're unlikely to want to change now. */ #endif /* ANLGHEAD_H */ analog-6.0/src/cache.c0000644000175000017500000005116410161303542014736 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** cache.c; reading and writing cache files ***/ #include "anlghea3.h" void outputcache(char *outfile, Hashindex **gooditems, Dateman *dman, Arraydata **arraydata, unsigned long *data, double bys, choice data2cols[ITEM_NUMBER][DATA_NUMBER]) { extern choice cache_records[]; FILE *outf = NULL; Daysdata *dp; Hashindex *p; int i, j; datecode_t k; logical done; /* first open output file as in output.c */ if (IS_STDOUT(outfile)) { outf = stdout; debug('F', "Opening stdout as cache output file"); } else { #ifdef NOOPEN /* The ANSI, but less preferred, option. There is a race problem. Also if we somehow have got overwrite access but not read, it will go wrong. */ if ((outf = FOPENR(outfile)) != NULL) { fclose(outf); error("cache output file %s already exists: won't overwrite", outfile); } else if ((outf = FOPENW(outfile)) == NULL) error("failed to open cache output file %s for writing", outfile); else debug('F', "Opening %s as cache output file", outfile); #else /* NFS is broken, so actually even this version can contain a race if the file is mounted over NFS. */ if ((i = open(outfile, O_WRONLY | O_CREAT | O_EXCL, OPEN_MODE)) < 0) { if (errno == EEXIST) error("cache output file %s already exists: won't overwrite", outfile); else error("failed to open cache output file %s for writing", outfile); } else if ((outf = fdopen(i, "w")) == NULL) /* can this happen? */ error("failed to open cache output file %s for writing", outfile); else debug('F', "Opening %s as cache output file", outfile); #endif } fprintf(outf, "CACHE type 5 produced by analog %s. Do not modify or delete!\n", VERSION); /* output the summary data */ fprintf(outf, "T\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%.0f\n", data[LOGDATA_UNKNOWN], data[LOGDATA_INFO], data[LOGDATA_SUCC], data[LOGDATA_PAGES], data[LOGDATA_REDIR], data[LOGDATA_FAIL], bys); /* output the date info */ if (dman->firsttime == LAST_TIME && dman->lasttime == FIRST_TIME) fprintf(outf, "D\t%lu\t%lu\n", dman->lasttime, dman->firsttime); else fprintf(outf, "D\t%lu\t%lu\n", dman->firsttime, dman->lasttime); for (k = dman->firstdate, dp = dman->firstdp; dp != NULL; k++, TO_NEXT(dp)) { /* dp != NULL iff k <= dman->lastdate */ for (i = 0; i < 288; i++) { if (dp->reqs[i] != 0) fprintf(outf, "%u\t%d\t%lu\t%lu\t%.0f\n", k, i, dp->reqs[i], dp->pages[i], dp->bytes[i]); } } /* output the items */ for (i = 0; i < ITEM_NUMBER; i++) { for (p = gooditems[i]; p != NULL; TO_NEXT(p)) { if (p->own != NULL && (p->own->data[data2cols[i][REQUESTS]] != 0 || p->own->data[data2cols[i][FAIL]] != 0 || p->own->data[data2cols[i][REDIR]] != 0)) { fprintf(outf, "%d\t", i); for (j = 0; j < V5_DATA_NUMBER; j++) fprintf(outf, "%lu\t", p->own->data[data2cols[i][cache_records[j]]]); fprintf(outf, "%.0f\t%s\n", p->own->bytes, p->name); } } } /* output the arraydata. For historical reasons, these all differ slightly */ /* the sizes */ for (i = 0, done = FALSE; !done; i++) { if (arraydata[REP_SIZE - FIRST_ARRAYREP][i].reqs > 0) fprintf(outf, "z\t%d\t%lu\t%lu\t%lu\t%.0f\n", i, arraydata[REP_SIZE - FIRST_ARRAYREP][i].reqs, arraydata[REP_SIZE - FIRST_ARRAYREP][i].pages, arraydata[REP_SIZE - FIRST_ARRAYREP][i].lastdate, arraydata[REP_SIZE - FIRST_ARRAYREP][i].bytes); if (arraydata[REP_SIZE - FIRST_ARRAYREP][i].threshold < -0.5) done = TRUE; } /* the status codes */ for (i = 0, done = FALSE; !done; i++) { if (arraydata[REP_CODE - FIRST_ARRAYREP][i].reqs > 0) fprintf(outf, "c\t%u\t%lu\t%lu\n", (unsigned int)(arraydata[REP_CODE - FIRST_ARRAYREP][i].threshold), arraydata[REP_CODE - FIRST_ARRAYREP][i].reqs, arraydata[REP_CODE - FIRST_ARRAYREP][i].lastdate); if (arraydata[REP_CODE - FIRST_ARRAYREP][i].threshold < -0.5) done = TRUE; } /* the processing times */ for (i = 0, done = FALSE; !done; i++) { if (arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].reqs > 0) fprintf(outf, "P\t%lu\t%lu\t%lu\t%lu\t%.0f\n", (arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].threshold < -0.5)? ((unsigned long)(arraydata[REP_PROCTIME - FIRST_ARRAYREP][i - 1].threshold) + 1): ((unsigned long)(arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].threshold)), arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].reqs, arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].pages, arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].lastdate, arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].bytes); if (arraydata[REP_PROCTIME - FIRST_ARRAYREP][i].threshold < -0.5) done = TRUE; } if (!IS_STDOUT(outfile)) { debug('F', "Closing %s", outfile); fclose(outf); } } void hashbuild(choice code, unsigned long *data, double bys, Memman *mm, Hashtable **hash, unsigned int data_number, choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice data2cols[], Include *wanthead, Include *ispagehead, Tree **tree, Derv **derv, choice *alltrees, choice *alldervs, choice lowmem, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte) { /* very simplified version of process_data(): don't do any more aliases */ extern Hashentry *unwanted_entry; extern Hashindex *dummy_item; extern choice *rep2type; unsigned long data2[DATA2_NUMBER]; Hashentry *item; char *namestart, *nameend; logical ispage, buildtree = FALSE; int i, k; if (lowmem <= 1) item = hashfind(mm, hash, data_number, wanthead, UNSET, ispagehead, NULL, dirsuffix, dirsufflength, usercase_insensitive, 0, FALSE, code, TRUE)->own; else { ispage = pageq(mm->curr_pos, ispagehead, code); if (included(mm->curr_pos, ispage, wanthead)) { if (lowmem == 2) item = hashfind(mm, hash, data_number, wanthead, ispage, ispagehead, NULL, dirsuffix, dirsufflength, usercase_insensitive, 0, FALSE, code, TRUE)->own; else { item = unwanted_entry; buildtree = TRUE; } } else { item = unwanted_entry; mm->next_pos = mm->curr_pos; } } if (ENTRY_WANTED(item)) { data2[REQUESTS2] = data[REQUESTS]; data2[PAGES2] = data[PAGES]; data2[DATE2] = data[SUCCDATE]; data2[FIRSTD2] = data[SUCCFIRSTD]; hashscore(item, data2, datacols[SUCCESS], SUCCESS, bys); data2[REQUESTS2] = data[REDIR]; data2[DATE2] = data[REDIRDATE]; data2[FIRSTD2] = data[REDIRFIRSTD]; hashscore(item, data2, datacols[REDIRECT], REDIRECT, 0.0); data2[REQUESTS2] = data[FAIL]; data2[DATE2] = data[FAILDATE]; data2[FIRSTD2] = data[FAILFIRSTD]; hashscore(item, data2, datacols[FAILURE], FAILURE, 0.0); } else if (buildtree) { /* as in process.c, run through trees then dervs */ for (k = 0; k <= 1; k++) { for (i = 0; (k?(alldervs[i]):(alltrees[i])) != REP_NUMBER; i++) { if (rep2type[k?(alldervs[i]):(alltrees[i])] == code) { dummy_item->name = mm->curr_pos; dummy_item->own->data[data2cols[REQUESTS]] = data[REQUESTS]; if (data2cols[PAGES] >= 0) dummy_item->own->data[data2cols[PAGES]] = data[PAGES]; if (data2cols[SUCCDATE] >= 0) dummy_item->own->data[data2cols[SUCCDATE]] = data[SUCCDATE]; if (data2cols[SUCCFIRSTD] >= 0) dummy_item->own->data[data2cols[SUCCFIRSTD]] = data[SUCCFIRSTD]; dummy_item->own->bytes = bys; if (k) makederived(derv[alldervs[i] - FIRST_DERVREP], dummy_item, NULL, convfloor, multibyte, alldervs[i], datacols, data_number); else { namestart = NULL; tree[G(alltrees[i])]->cutfn(&namestart, &nameend, dummy_item->name, FALSE); (void)treefind(namestart, nameend, &(tree[G(alltrees[i])]->tree), dummy_item, tree[G(alltrees[i])]->cutfn, FALSE, TRUE, FALSE, tree[G(alltrees[i])]->space, datacols, data_number); } } } } } } void corruptcacheline(char *line, choice *rc, choice type) { extern char *pos; char *p; for (p = line; p < pos - 2 && p - line < 76; p++) { if (*p == '\0') *p = (type == 0 || type == 3)?'\t':':'; } /* new style : old style */ if (pos - line > 76) *(line + 76) = '\0'; if (type == 3) warn('F', TRUE, "Ignoring line in cache file with out-of-range dates looking like\n%s", line); else if (type == 2) warn('F', TRUE, "Incomplete line in cache file looking like\n%s", line); else /* type == 1 or 0 */ warn('F', TRUE, "Ignoring corrupt line in cache file looking like\n%s", line); *rc = FALSE; } logical parsecacheline(char *linestart, char *parsestart, unsigned int *code, unsigned int maxcode, int no_items, unsigned long *data, double *bys, Memman *mm) { choice rc = TRUE; char *temps, *temps2; int i; /* Note that maxcode is greater than the greatest possible code */ if (!ISDIGIT(*parsestart) || (*code = (unsigned int)atoi(parsestart)) >= maxcode || (temps2 = strchr(parsestart, '\t')) == NULL) corruptcacheline(linestart, &rc, 0); else { temps = strtok(temps2 + 1, "\t"); for (i = 0; i < no_items; i++) { if (rc == TRUE) { if (temps == NULL || !ISDIGIT(*temps)) corruptcacheline(linestart, &rc, 0); else { data[i] = strtoul(temps, (char **)NULL, 10); temps = strtok((char *)NULL, "\t"); } } } if (rc == TRUE && bys != NULL) { if (temps == NULL || !ISDIGIT(*temps)) corruptcacheline(linestart, &rc, 0); else { *bys = strtod(temps, (char **)NULL); temps = strtok((char *)NULL, "\t"); } } if (rc == TRUE && mm != NULL) { if (temps == NULL) corruptcacheline(linestart, &rc, 0); else { temps2 = strchr(temps, '\0'); memcpy(submalloc(mm, (size_t)(temps2 - temps) + 1), (void *)temps, (size_t)(temps2 - temps) + 1); temps = strtok((char *)NULL, "\t"); } } if (rc == TRUE && temps != NULL) corruptcacheline(linestart, &rc, 0); } return((logical)rc); } void readoldcache(Logfile *cachefilep, Dateman *dman, choice type, unsigned int granularity) { /* These very old caches only contained data over time */ extern char *block_start, *block_end, *record_start, *pos; unsigned int y, m, d, h; unsigned long reqs = 0, pages = 0; double bys = 0.0; timecode_t timecode; choice rc = TRUE; char *temps; char tempc; int i; while (rc != EOF) { rc = TRUE; if (pos >= block_end) { if ((rc = getmoredata(cachefilep, block_start, BLOCKSIZE)) == OK) rc = TRUE; pos = block_start; record_start = pos; } if (rc == TRUE) { (void)parsenewline(cachefilep, NULL, '\0'); record_start = pos; parsenonnewline(cachefilep); if (pos == record_start) rc = EOF; *(pos++) = '\0'; if (rc == TRUE) { if (sscanf(record_start, "%4u%2u%2u%2u%c", &y, &m, &d, &h, &tempc) != 5 || tempc != ':' || wantdate(&timecode, dman, h, 0, d, m - 1, y, 0) == ERR) corruptcacheline(record_start, &rc, 1); else { strtok(record_start, ":"); for ( ; h < 24 && rc == TRUE; h++) { if ((temps = strtok((char *)NULL, ":")) == NULL || !ISDIGIT(*temps)) { if (*temps == '*') rc = EOF; else corruptcacheline(record_start, &rc, 2); } else { reqs = strtoul(temps, (char **)NULL, 10); if ((temps = strtok((char *)NULL, ":")) == NULL || !ISDIGIT(*temps)) corruptcacheline(record_start, &rc, 2); else if (type == 2) { pages = strtoul(temps, (char **)NULL, 10); if ((temps = strtok((char *)NULL, ":")) == NULL || !ISDIGIT(*temps)) corruptcacheline(record_start, &rc, 2); else bys = strtod(temps, (char **)NULL); } else bys = strtod(temps, (char **)NULL); for (i = 0; i < 12; i++) { if (wantdate(&timecode, dman, h, (unsigned int)(5 * i), d, m - 1, y, 0)) datehash(timecode, dman, ((i + 1) * reqs) / 12 - (i * reqs) / 12, (type == 2)?\ (((i + 1) * pages) / 12 - (i * pages) / 12):0, ((i + 1) * bys) / 12 - (i * bys) / 12, granularity); /* maybe shouldn't datehash unless rc == TRUE (cf readcache()) but I no longer understand it well enough to mess with it */ cachefilep->from = MIN(cachefilep->from, timecode); cachefilep->to = MAX(cachefilep->to, timecode); } cachefilep->data[LOGDATA_SUCC] += reqs; if (type == 2) cachefilep->data[LOGDATA_PAGES] += pages; cachefilep->bytes += bys; if (timecode > dman->last7from && timecode <= dman->last7to) { cachefilep->data[LOGDATA_SUCC7] += reqs; if (type == 2) cachefilep->data[LOGDATA_PAGES7] += pages; cachefilep->bytes7 += bys; } } } } } } } } void readcache(Logfile *cachefilep, Hashtable **hash, unsigned int *no_cols, choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2], choice data2cols[ITEM_NUMBER][DATA_NUMBER], Arraydata **arraydata, Include **wanthead, Include *ispagehead, Dateman *dman, Tree **tree, Derv **derv, choice *alltrees, choice *alldervs, choice *lowmem, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte, unsigned int granularity) { /* compare with nextdnsline etc. in input.c */ extern Memman mmq; /* use mmq for another purpose here */ extern choice cache_records[]; extern char *block_start, *block_end, *record_start, *pos; extern unsigned int *rep2gran; unsigned long data[V5_DATA_NUMBER]; unsigned long data2[DATA_NUMBER]; int data_number; double bys; datecode_t datecode; timecode_t timecode, firsttime, lasttime; unsigned int code; choice rc = TRUE; logical rc2; char *temps; char type, tempc; int i; rc = getmoredata(cachefilep, block_start, BLOCKSIZE); pos = block_start; record_start = block_start; if (sscanf(pos, "CACHE type %c produced by analo%c", &type, &tempc) != 2 || type < '1' || tempc != 'g') { warn('F', TRUE, "%s is not an analog cache file: ignoring it", cachefilep->name); return; } else if (type > '5') { warn('F', TRUE, "Can't understand cache file %s written by a later version of analog: ignoring it", cachefilep->name); return; } parsenonnewline(cachefilep); if (type < '3') readoldcache(cachefilep, dman, (choice)(type - '0'), granularity); else { /* types 3 onwards are similar enough the same to use the same code */ if (type <= '4') data_number = V34_DATA_NUMBER; else data_number = V5_DATA_NUMBER; (void)parsenewline(cachefilep, NULL, '\0'); record_start = pos; parsenonnewline(cachefilep); if (sscanf(record_start, "T\t%lu\t%lu\t%lu\t%lu\t%lu\t%lu\t%lf%c", &(data[0]), &(data[1]), &(data[2]), &(data[3]), &(data[4]), &(data[5]), &bys, &tempc) != 8 || (tempc != '\r' && tempc != '\n')) { warn('F', TRUE, "Cache file %s is corrupt: ignoring it", cachefilep->name); return; } if (type <= '4') { for (i = 0, rc2 = FALSE; i < ITEM_NUMBER && !rc2; i++) { if (data2cols[i][SUCCFIRSTD] != -1 || data2cols[i][FAILFIRSTD] != -1 || data2cols[i][REDIRFIRSTD] != -1) { warn('M', TRUE, "Old-style cache file %s doesn't contain data on " "first-request times of items; so these may be overestimated", cachefilep->name); rc2 = TRUE; } } } if (type == '3') { firsttime = FIRST_TIME; lasttime = LAST_TIME; } else { (void)parsenewline(cachefilep, NULL, '\0'); record_start = pos; parsenonnewline(cachefilep); if (sscanf(record_start, "D\t%lu\t%lu%c", &firsttime, &lasttime, &tempc) != 3 || (tempc != '\r' && tempc != '\n') || firsttime > lasttime) { warn('F', TRUE, "Cache file %s is corrupt: ignoring it", cachefilep->name); return; } } if (lasttime > dman->last7from && lasttime != LAST_TIME) warn('M', TRUE, "Cache file %s doesn't contain last-seven-day " "statistics; so these may be underestimated", cachefilep->name); cachefilep->data[LOGDATA_UNKNOWN] += data[0]; cachefilep->data[LOGDATA_INFO] += data[1]; cachefilep->data[LOGDATA_SUCC] += data[2]; cachefilep->data[LOGDATA_PAGES] += data[3]; cachefilep->data[LOGDATA_REDIR] += data[4]; cachefilep->data[LOGDATA_FAIL] += data[5]; cachefilep->bytes += bys; while (rc != EOF) { rc = TRUE; if (pos >= block_end) { if ((rc = getmoredata(cachefilep, block_start, BLOCKSIZE)) == OK) rc = TRUE; pos = block_start; record_start = pos; } if (rc == TRUE) { (void)parsenewline(cachefilep, NULL, '\0'); record_start = pos; parsenonnewline(cachefilep); if (pos - record_start >= 2048) { *(record_start + 70) = '\0'; warn('F', TRUE, "Ignoring long line in cache file starting\n%s", record_start); rc = FALSE; } if (pos == record_start) rc = EOF; } if (rc == TRUE) { *(pos++) = '\0'; if (ISDIGIT(*record_start)) { if (ISDIGIT(*(record_start + 1))) { temps = strchr(record_start, '\t'); if (temps == NULL) corruptcacheline(record_start, &rc, 0); else { datecode = (unsigned int)atoi(record_start); if (parsecacheline(record_start, ++temps, &code, rep2gran[REP_FIVEREP], 2, data, &bys, NULL)) { timecode = (timecode_t)datecode * 1440 + (timecode_t)code * 5; /* time rounded down to nearest 5 minutes, so... */ if (timecode < firsttime) { if (firsttime - timecode <= 4) timecode = firsttime; else corruptcacheline(record_start, &rc, 3); } else if (timecode > lasttime) corruptcacheline(record_start, &rc, 3); else if (lasttime - timecode <= 4) timecode = lasttime; /* This doesn't cover the case where the first and last entries in the cache file are in the same five-minute period, but that's so unlikely that I can't be bothered to write special code for it. Anyway, it's not the only remaining problem with using only five-minute resolution in the cache file. */ if (rc == TRUE && timecode >= dman->from && timecode <= dman->to) { datehash(timecode, dman, data[0], data[1], bys, granularity); cachefilep->from = MIN(cachefilep->from, timecode); cachefilep->to = MAX(cachefilep->to, timecode); if (timecode > dman->last7from && timecode <= dman->last7to) { cachefilep->data[LOGDATA_SUCC7] += data[0]; cachefilep->data[LOGDATA_PAGES7] += data[1]; cachefilep->bytes7 += bys; } } } } } else if (*(record_start + 1) == '\t') { rc2 = parsecacheline(record_start, record_start, &code, ITEM_NUMBER, data_number, data, &bys, &mmq); if (rc2) { /* Map fields which are recorded into full data structure. */ for (i = 0; i < DATA_NUMBER; i++) data2[i] = 0; for (i = 0; i < V5_DATA_NUMBER; i++) data2[cache_records[i]] = data[i]; if (type <= '4') { /* In this case, firstd terms weren't recorded; use the obvious bound on them. */ data2[SUCCFIRSTD] = data2[SUCCDATE]; data2[REDIRFIRSTD] = data2[REDIRDATE]; data2[FAILFIRSTD] = data2[FAILDATE]; } hashbuild((choice)code, data2, bys, &mmq, &(hash[code]), no_cols[code], datacols[code], data2cols[code], wanthead[code], ispagehead, tree, derv, alltrees, alldervs, lowmem[code], dirsuffix, dirsufflength, usercase_insensitive, convfloor, multibyte); } } else corruptcacheline(record_start, &rc, 0); } else if (*record_start == 'z' && *(record_start + 1) == '\t') { if (parsecacheline(record_start, record_start + 2, &code, SIZEBINS, 3, data, &bys, NULL)) { arrayscore(arraydata[REP_SIZE - FIRST_ARRAYREP], arraydata[REP_SIZE - FIRST_ARRAYREP][code].threshold, data[0], 0, data[1], 0, bys, 0., data[2]); } } else if (*record_start == 'c' && *(record_start + 1) == '\t') { if (parsecacheline(record_start, record_start + 2, &code, 600, 2, data, NULL, NULL)) arrayscore(arraydata[REP_CODE - FIRST_ARRAYREP], code, data[0], 0, 0, 0, 0., 0., data[1]); } else if (*record_start == 'P' && *(record_start + 1) == '\t') { if (parsecacheline(record_start, record_start + 2, &code, 600002, 3, data, &bys, NULL)) arrayscore(arraydata[REP_PROCTIME - FIRST_ARRAYREP], code, data[0], 0, data[1], 0, bys, 0., data[2]); } else corruptcacheline(record_start, &rc, 0); } } } } analog-6.0/src/dates.c0000644000175000017500000002220110161303542014761 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** dates.c; anything to do with dates. ***/ #include "anlghea3.h" /* Analog stores times internally in minutes since midnight 30-31/12/1969. (Not in "Unix time" because it works better if all valid times are > 0). Note also that months are numbered Jan = 0 to Dec = 11 internally. */ unsigned int daysbefore[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; /* in non-leap year */ unsigned int monthlength[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; void code2date(datecode_t code, unsigned int *date, unsigned int *month, unsigned int *year) { /* not most efficient possible, but only used in output so doesn't need to be super-fast. NB DATE2CODE() is in anlghea3.h. */ code += 364; /* so 0 -> 1/1/69 */ *year = 1969 + 4 * (code / 1461); code %= 1461; *year += MIN(code / 365, 3); /* no leap days for a while after 1/1/69! */ if (code == 1460) { *month = DEC; *date = 31; } else { code %= 365; /* so 0 -> 1/Jan, any year */ for (*month = DEC; daysbefore[*month] + (IS_LEAPYEAR(*year) && *month > FEB) > code; (*month)--) ; /* run to right month */ *date = code - daysbefore[*month] + 1 - (IS_LEAPYEAR(*year) && *month > FEB); } } time_t shifttime(time_t timer, int diff) { /* Surprisingly, there is no ANSI C function to do this */ struct tm *lt = localtime(&timer); lt->tm_min += diff; timer = mktime(lt); return(timer); } choice parsedate(time_t starttime, char *s, timecode_t *date, logical from, logical unixtime) { struct tm *st; int y, m, d, h, n; char *p; #ifndef NOGMTIME if (unixtime) st = gmtime(&starttime); else #endif st = localtime(&starttime); if (ISDIGIT(*s) && ISDIGIT(*(s + 1))) { y = 10 * (*s - '0') + (*(s + 1) - '0'); s += 2; y += 1900; if (y < 1970) y += 100; } else if (*s == '+' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { y = st->tm_year + 1900 + 10 * (*(s + 1) - '0') + (*(s + 2) - '0'); s += 3; } else if (*s == '-' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { y = st->tm_year + 1900 - 10 * (*(s + 1) - '0') - (*(s + 2) - '0'); s += 3; } else return(ERR); if (ISDIGIT(*s) && ISDIGIT(*(s + 1))) { m = 10 * (*s - '0') + (*(s + 1) - '0') - 1; if (m > 11 || m < 0) return(ERR); s += 2; } else if (*s == '+' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { m = st->tm_mon + 10 * (*(s + 1) - '0') + (*(s + 2) - '0'); s += 3; } else if (*s == '-' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { m = st->tm_mon - 10 * (*(s + 1) - '0') - (*(s + 2) - '0'); s += 3; } else return(ERR); while (m < 0) { /* need to do this now because about to use monthlength */ m += 12; y--; } while (m > 11) { m -= 12; y++; } if (ISDIGIT(*s) && ISDIGIT(*(s + 1))) { d = (int)strtol(s, &p, 10); if (d > 31 || d <= 0) return(ERR); else if (d > (int)(monthlength[m]) + (m == FEB && IS_LEAPYEAR(y))) d = monthlength[m] + (m == FEB && IS_LEAPYEAR(y)); } /* relative dates must be >= 2 digits but can be more */ else if (*s == '+' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) d = st->tm_mday + (int)strtol(s + 1, &p, 10); else if (*s == '-' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) d = st->tm_mday - (int)strtol(s + 1, &p, 10); else return(ERR); if (*p == ':') { /* parse hour & minute */ s = p + 1; if (ISDIGIT(*s) && ISDIGIT(*(s + 1))) { h = 10 * (*s - '0') + (*(s + 1) - '0'); if (h > 23) return(ERR); s += 2; } else if (*s == '+' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { h = st->tm_hour + 10 * (*(s + 1) - '0') + (*(s + 2) - '0'); s += 3; } else if (*s == '-' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { h = st->tm_hour - 10 * (*(s + 1) - '0') - (*(s + 2) - '0'); s += 3; } else return(ERR); if (ISDIGIT(*s) && ISDIGIT(*(s + 1))) { n = 10 * (*s - '0') + (*(s + 1) - '0'); if (n > 59) return(ERR); s += 2; } else if (*s == '+' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { n = st->tm_min + 10 * (*(s + 1) - '0') + (*(s + 2) - '0'); s += 3; } else if (*s == '-' && ISDIGIT(*(s + 1)) && ISDIGIT(*(s + 2))) { n = st->tm_min - 10 * (*(s + 1) - '0') - (*(s + 2) - '0'); s += 3; } else return(ERR); if (*s != '\0') return(ERR); } /* end *p == ':' */ else if (*p == '\0' || *p == 'd' || *p == 'D' || *p == 'e' || *p == 'E') { /* d, e can come from FLOOR */ if (from) { h = 0; n = 0; } else { h = 23; n = 59; } } else return(ERR); while (n < 0) { n += 60; h--; } while (n > 59) { n -= 60; h++; } while (h < 0) { h += 24; d--; } while (h > 23) { h -= 24; d++; } while (d < 0) { m--; if (m < 0) { /* NB already adjusted m once above */ m += 12; y--; } d += monthlength[m] + (m == FEB && IS_LEAPYEAR(y)); } while (d > (int)(monthlength[m]) + (m == FEB && IS_LEAPYEAR(y))) { d -= monthlength[m] + (m == FEB && IS_LEAPYEAR(y)); m++; if (m > 11) { m -= 12; y++; } } *date = TIMECODE(DATE2CODE(y, m, d), h, n); #ifndef NOGMTIME if (unixtime) *date -= 1440; /* Unix time is one day different from analog time */ #endif return(OK); } choice wantdate(timecode_t *timecode, Dateman *dman, unsigned int hour, unsigned int minute, unsigned int date, unsigned int month, unsigned int year, int tz) { static unsigned int oldy = 0, oldm = 0, oldd = 0, oldh = 25; static timecode_t oldtime = 0; /* first check integrity of date */ if (month > 11 || hour > 23 || minute > 59 || date == 0 || date > monthlength[month] + (month == FEB && IS_LEAPYEAR(year)) || year < 1970 || year > 2069) return(ERR); if (hour != oldh || date != oldd || month != oldm || year != oldy) { oldtime = TIMECODE(DATE2CODE(year, month, date), hour, 0); oldh = hour; /* only calculate once an hour */ oldd = date; oldm = month; oldy = year; } *timecode = oldtime + minute + tz; if (*timecode < dman->from || *timecode > dman->to) return(FALSE); return(TRUE); } choice wantunixtime(timecode_t *timecode, Dateman *dman, unsigned long unixtime, int tz) { /* no need to check range because parseunixtime() catches it */ *timecode = UXTIME2CODE(unixtime) + tz; if (*timecode < dman->from || *timecode > dman->to) return(FALSE); return(TRUE); } Daysdata *newday(unsigned int granularity) { extern Memman *xmemman; Daysdata *dp; unsigned int i; dp = (Daysdata *)submalloc(xmemman, sizeof(Daysdata)); dp->reqs = (unsigned long *)submalloc(xmemman, granularity * sizeof(unsigned long)); dp->pages = (unsigned long *)submalloc(xmemman, granularity * sizeof(unsigned long)); dp->bytes = (double *)submalloc(xmemman, granularity * sizeof(double)); for (i = 0; i < granularity; i++) { dp->reqs[i] = 0; dp->pages[i] = 0; dp->bytes[i] = 0.0; } dp->prev = NULL; dp->next = NULL; return(dp); } void dmaninit(Dateman *dman, datecode_t datecode, unsigned int granularity) { dman->firstdate = datecode; dman->lastdate = datecode; dman->currdate = datecode; dman->firstdp = newday(granularity); dman->lastdp = dman->firstdp; dman->currdp = dman->firstdp; } void datehash(timecode_t timecode, Dateman *dman, unsigned long reqs, unsigned long pages, double bytes, unsigned int granularity) { int i; Daysdata *dp; datecode_t datecode = (datecode_t)(timecode/1440); if (dman->currdp == NULL) dmaninit(dman, datecode, granularity); if (datecode >= dman->lastdate) { for (i = datecode - dman->lastdate; i > 0; i--) { dp = newday(granularity); dman->lastdp->next = dp; dp->prev = dman->lastdp; dman->lastdp = dp; dman->lastdate = datecode; } dman->currdp = dman->lastdp; } else if (datecode >= dman->currdate) { for (i = datecode - dman->currdate; i > 0; i--) dman->currdp = dman->currdp->next; } else if (datecode <= dman->firstdate) { for (i = dman->firstdate - datecode; i > 0; i--) { dp = newday(granularity); dman->firstdp->prev = dp; dp->next = dman->firstdp; dman->firstdp = dp; dman->firstdate = datecode; } dman->currdp = dman->firstdp; } else { dman->currdp = dman->firstdp; for (i = datecode - dman->firstdate; i > 0; i--) { dman->currdp = dman->currdp->next; } } dman->currdate = datecode; i = ((timecode % 1440) * granularity) / 1440; dman->currdp->reqs[i] += reqs; dman->currdp->pages[i] += pages; dman->currdp->bytes[i] += bytes; } analog-6.0/src/globals.c0000644000175000017500000031207210161303542015314 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** globals.c; declaration and initialisation of globals, and defaults ***/ /* See also init.c and init2.c */ #include "anlghea3.h" /* Program time */ time_t origstarttime, starttime; timecode_t starttimec, starttimeuxc; char *starttimestr; /* NB starttime and starttimec are displaced by TIMEOFFSET in correct(), but starttimestr (used in warnings) and starttimeuxc (used in DNS) are not. */ /* What to read from input lines */ unsigned int year, month, date, hour, minute, code; unsigned long unixtime, proctime; double bytes; char am; /* Input processing */ char *block_start, *block_end, *block_bell, *record_start, *pos; logical termchar[256]; /* Memory allocation */ Memman *xmemman, *amemman, mm[ITEM_NUMBER], mmq, mms; char *workspace; /* scratch space for aliasing: see note at top of alias.c */ /* NB Be careful not to nest two usages of workspace. */ /* Are we running from form? */ logical cgi = FALSE; /* DNS lookups: externs so that no worries about whether to pass them around */ #ifndef NODNS choice dnslevel; char *dnsfile, *dnslockfile; FILE *dnsfilep = NULL, *dnslock = NULL; Hashtable *dnstable; unsigned int dnsgoodhrs, dnsbadhrs; #ifndef NOALARM unsigned int dnstimeout; JMP_BUF jumpbuf; #endif #endif /* Signal entries for unwanted hash entries (NULL is already used for unset) */ Hashentry *unwanted_entry, *blank_entry; Hashindex *dummy_item; /* Translating reports to other arrays */ choice *rep2type, *rep2reqs, *rep2reqs7, *rep2date, *rep2firstd; unsigned int *rep2gran, *rep2lng, *rep2datefmt, *rep2colhead, *rep2busystr; unsigned int *col2colhead, *method2sing, *method2pl, *method2date; unsigned int *method2pc, *method2relpc, *method2sort; logical *repistree; char *byteprefix = " kMGTPEZY"; /* Room for growth :) Note initial space */ /* NB Output versions of the byte prefixes are in the language files */ /* Domain levels; making this global is messy but easiest */ Strpairlist **domlevels; /* Log formats */ Inputformatlist *logformat = NULL, *deflogformat; logical newloglist = TRUE, iscache = FALSE; int tz = 0, stz = 0; choice wantitem[INPUT_NUMBER]; #ifndef NOPIPES Strpairlist *uncompresshead = NULL; #endif /* Debugging, warnings, pretty printing */ FILE *errfile; char *commandname = NULL, *commandpath = NULL; char *debug_args = NULL, *warn_args = NULL; logical anywarns = FALSE, errmess = FALSE, vblesonly = FALSE; unsigned int errwidth = ERRLINELENGTH; unsigned long progressfreq = 0; unsigned int ppcol = 0; /* What's recorded by cache files. Array size V5_DATA_NUMBER in anlghea3.h. */ /* don't record "last 7" stuff because it won't be correct at read time */ choice cache_records[V5_DATA_NUMBER] = {REQUESTS, PAGES, REDIR, FAIL, SUCCDATE, REDIRDATE, FAILDATE, SUCCFIRSTD, REDIRFIRSTD, FAILFIRSTD}; /* Date names for unlocalised text. See also ENGMONTHLEN etc. in anlghea3.h. */ char *engmonths[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char *englongdays[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; char *engshortdays[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; /* Names for things, always in order of enums in anlghea3.h */ char *item_type[] = {"virtual hosts", "files", "users", "referrers", "browsers", "hosts"}; /* In methodname, we don't need them all, because some only occur internally */ char *methodname[] = {"requests","7-day requests", "pages", "7-day pages", "", "", "", "", "last date", "", "", "first date", "", "", "bytes", "7-day bytes", "alphabetical", "random"}; /* Filenames for each language, in order of enum in anlghea3.h */ char *country[] = {"am", "baq", /*"ba",*/ "bg", "bgm", "cat", "cn", "tw", /*"hr",*/ "cz", "cz1", "dk", "nl", "uk", "us", "fi", "fr", "de", /*"gr",*/ "hu", /*"is",*/ "id", "it", "jpe", "jpj", "jps", "jpu", "kr", "lv", /*"lt",*/ "no", "no2", "pl", "pt", "br", /*"ro",*/ "ru", "ru1", "yu", "sk", "sk1", "si", "si1", "es", "se", "se2", "tr", "ua"}; /* Report code letters in order of enum in anlghea3.h */ /* Any new ones must also be added to reportorder in anlghea2.h */ char repcodes[] = "1QmWDH45dhw67xrEItiSlLofskKBvRMujJZNnYybpzcP"; /* Column code letters in order of enum in anlghea3.h */ char colcodes[] = "xRSPQBCrspqbcdDeEN"; /* Names for the anchors within the report, in the same order */ /* At most eight letters, because we use them as filenames too. (This limit is assumed in piechart()). */ char *anchorname[] = {"year", "quartly", "month", "week", "dayrep", "hourrep", "quartrep", "fiverep", "daysum", "hoursum", "weekhour", "quartsum", "fivesum", "gensum", "req", "redir", "fail", "type", "dir", "host", "redihost", "failhost", "dom", "ref", "refsite", "redirref", "failref", "browrep", "vhost", "redirvh", "failvh", "user", "rediuser", "failuser", "org", "searchq", "searchw", "isearchq", "isearchw", "browsum", "os", "size", "code", "proctime"}; /* These report names are in English, so not the same as in langfile */ /* Again in order of enum in anlghea3.h */ char *repname[] = {"Yearly Report", "Quarterly Report", "Monthly Report", "Weekly Report", "Daily Report", "Hourly Report", "Quarter-Hour Report", "Five-Minute Report", "Daily Summary", "Hourly Summary", "Hour of the Week Summary", "Quarter-Hour Summary", "Five-Minute Summary", "General Summary", "Request Report", "Redirection Report", "Failure Report", "File Type Report", "Directory Report", "Host Report", "Host Redirection Report", "Host Failure Report", "Domain Report", "Referrer Report", "Referring Site Report", "Redirected Referrer Report", "Failed Referrer Report", "Browser Report", "Virtual Host Report", "Virtual Host Redirection Report", "Virtual Host Failure Report", "User Report", "User Redirection Report", "User Failure Report", "Organisation Report", "Search Query Report", "Search Word Report", "Internal Search Query Report", "Internal Search Word Report", "Browser Summary", "Operating System Report", "File Size Report", "Status Code Report", "Processing Time Report"}; #ifdef EBCDIC /* EBCDIC-to-ASCII tables: These tables are bijective - there are no ambigous or duplicate characters. */ const unsigned char os_toascii[256] = { #ifdef _OSD_POSIX /* Fujitsu-Siemens' EDF04 character set on BS2000: */ /*00*/ 0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f, 0x87, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /*................*/ /*10*/ 0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97, 0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f, /*................*/ /*20*/ 0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, /*................*/ /*30*/ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, /*................*/ /*40*/ 0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, 0xe7, 0xf1, 0x60, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /* .........`.<(+|*/ /*50*/ 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x9f, /*&.........!$*);.*/ /*60*/ 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, 0xc7, 0xd1, 0x5e, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /*-/........^,%_>?*/ /*70*/ 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, 0xcc, 0xa8, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /*..........:#@'="*/ /*80*/ 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /*.abcdefghi......*/ /*90*/ 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /*.jklmnopqr......*/ /*a0*/ 0xb5, 0xaf, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0xdd, 0xde, 0xae, /*..stuvwxyz......*/ /*b0*/ 0xa2, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, 0xbd, 0xbe, 0xac, 0x5b, 0x5c, 0x5d, 0xb4, 0xd7, /*...........[\]..*/ /*c0*/ 0xf9, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /*.ABCDEFGHI......*/ /*d0*/ 0xa6, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xdb, 0xfa, 0xff, /*.JKLMNOPQR......*/ /*e0*/ 0xd9, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /*..STUVWXYZ......*/ /*f0*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0xb3, 0x7b, 0xdc, 0x7d, 0xda, 0x7e /*0123456789.{.}.~*/ #elif defined(OS390) || defined(AS400) || defined(TPF) /* IBM's OS/390 and TPF systems: */ /* Bijective EBCDIC (character set IBM-1047) to US-ASCII table: */ 0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f, /* 00-0f: */ 0x87, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* ................ */ 0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97, /* 10-1f: */ 0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f, /* ................ */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b, /* 20-2f: */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, /* ................ */ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30-3f: */ 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, /* ................ */ 0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, /* 40-4f: */ 0xe7, 0xf1, 0xa2, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /* ...........<(+| */ 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, /* 50-5f: */ 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, /* &.........!$*);^ */ 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, /* 60-6f: */ 0xc7, 0xd1, 0xa6, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /* -/.........,%_>? */ 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, /* 70-7f: */ 0xcc, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /* .........`:#@'=" */ 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80-8f: */ 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /* .abcdefghi...... */ 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, /* 90-9f: */ 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /* .jklmnopqr...... */ 0xb5, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* a0-af: */ 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0x5b, 0xde, 0xae, /* .~stuvwxyz...[.. */ 0xac, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, /* b0-bf: */ 0xbd, 0xbe, 0xdd, 0xa8, 0xaf, 0x5d, 0xb4, 0xd7, /* .............].. */ 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* c0-cf: */ 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /* {ABCDEFGHI...... */ 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* d0-df: */ 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xf9, 0xfa, 0xff, /* }JKLMNOPQR...... */ 0x5c, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* e0-ef: */ 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /* \.STUVWXYZ...... */ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* f0-ff: */ 0x38, 0x39, 0xb3, 0xdb, 0xdc, 0xd9, 0xda, 0x9f /* 0123456789...... */ #else #error Unimplemented EBCDIC platform. Please send information about your system to ! #endif }; /* Bijective ascii-to-ebcdic table: */ const unsigned char os_toebcdic[256] = { #ifdef _OSD_POSIX /* Fujitsu-Siemens' EDF04 character set on BS2000: */ /*00*/ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x15, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /*................*/ /*10*/ 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, /*................*/ /*20*/ 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, /* !"#$%&'()*+,-./ */ /*30*/ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, /*0123456789:;<=>?*/ /*40*/ 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, /*@ABCDEFGHIJKLMNO*/ /*50*/ 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xbb, 0xbc, 0xbd, 0x6a, 0x6d, /*PQRSTUVWXYZ[\]^_*/ /*60*/ 0x4a, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /*`abcdefghijklmno*/ /*70*/ 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xfb, 0x4f, 0xfd, 0xff, 0x07, /*pqrstuvwxyz{|}~.*/ /*80*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x04, 0x06, 0x08, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x14, /*................*/ /*90*/ 0x30, 0x31, 0x25, 0x33, 0x34, 0x35, 0x36, 0x17, 0x38, 0x39, 0x3a, 0x3b, 0x1a, 0x1b, 0x3e, 0x5f, /*................*/ /*a0*/ 0x41, 0xaa, 0xb0, 0xb1, 0x9f, 0xb2, 0xd0, 0xb5, 0x79, 0xb4, 0x9a, 0x8a, 0xba, 0xca, 0xaf, 0xa1, /*................*/ /*b0*/ 0x90, 0x8f, 0xea, 0xfa, 0xbe, 0xa0, 0xb6, 0xb3, 0x9d, 0xda, 0x9b, 0x8b, 0xb7, 0xb8, 0xb9, 0xab, /*................*/ /*c0*/ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9e, 0x68, 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /*................*/ /*d0*/ 0xac, 0x69, 0xed, 0xee, 0xeb, 0xef, 0xec, 0xbf, 0x80, 0xe0, 0xfe, 0xdd, 0xfc, 0xad, 0xae, 0x59, /*................*/ /*e0*/ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9c, 0x48, 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /*................*/ /*f0*/ 0x8c, 0x49, 0xcd, 0xce, 0xcb, 0xcf, 0xcc, 0xe1, 0x70, 0xc0, 0xde, 0xdb, 0xdc, 0x8d, 0x8e, 0xdf /*................*/ #elif defined(OS390) || defined(AS400) || defined(TPF) /* IBM's OS/390 and TPF systems: */ /* The US-ASCII to EBCDIC (character set IBM-1047) table: This table is bijective (no ambiguous or duplicate characters) */ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, /* 00-0f: */ 0x16, 0x05, 0x15, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* ................ */ 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, /* 10-1f: */ 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, /* ................ */ 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, /* 20-2f: */ 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, /* !"#$%&'()*+,-./ */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 30-3f: */ 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, /* 0123456789:;<=>? */ 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 40-4f: */ 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, /* @ABCDEFGHIJKLMNO */ 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, /* 50-5f: */ 0xe7, 0xe8, 0xe9, 0xad, 0xe0, 0xbd, 0x5f, 0x6d, /* PQRSTUVWXYZ[\]^_ */ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 60-6f: */ 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* `abcdefghijklmno */ 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, /* 70-7f: */ 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0xa1, 0x07, /* pqrstuvwxyz{|}~. */ 0x20, 0x21, 0x22, 0x23, 0x24, 0x04, 0x06, 0x08, /* 80-8f: */ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x14, /* ................ */ 0x30, 0x31, 0x25, 0x33, 0x34, 0x35, 0x36, 0x17, /* 90-9f: */ 0x38, 0x39, 0x3a, 0x3b, 0x1a, 0x1b, 0x3e, 0xff, /* ................ */ 0x41, 0xaa, 0x4a, 0xb1, 0x9f, 0xb2, 0x6a, 0xb5, /* a0-af: */ 0xbb, 0xb4, 0x9a, 0x8a, 0xb0, 0xca, 0xaf, 0xbc, /* ................ */ 0x90, 0x8f, 0xea, 0xfa, 0xbe, 0xa0, 0xb6, 0xb3, /* b0-bf: */ 0x9d, 0xda, 0x9b, 0x8b, 0xb7, 0xb8, 0xb9, 0xab, /* ................ */ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9e, 0x68, /* c0-cf: */ 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /* ................ */ 0xac, 0x69, 0xed, 0xee, 0xeb, 0xef, 0xec, 0xbf, /* d0-df: */ 0x80, 0xfd, 0xfe, 0xfb, 0xfc, 0xba, 0xae, 0x59, /* ................ */ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9c, 0x48, /* e0-ef: */ 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /* ................ */ 0x8c, 0x49, 0xcd, 0xce, 0xcb, 0xcf, 0xcc, 0xe1, /* f0-ff: */ 0x70, 0xdd, 0xde, 0xdb, 0xdc, 0x8d, 0x8e, 0xdf /* ................ */ #else #error Unimplemented EBCDIC platform. Please send information about your system to ! #endif }; #endif logical convertchar[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 00 - 0F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 - 1F */ 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 - 2F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, /* 30 - 3F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 - 4F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 - 5F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 60 - 6F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* 70 - 7F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 80 - 8F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 90 - 9F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A0 - AF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* B0 - BF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* C0 - CF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* D0 - DF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* E0 - EF */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; /* F0 - FF */ /* %nm escapes to convert in do_alias(r|f). We convert all ASCII printable characters (0x20 - 0x7E) with the exception of % (0x25) [to distinguish %25ab from %ab]; and ? (0x3f), & (0x26), ; (0x3b) and = (0x3d) [to split query strings up correctly]. Could argue for + (0x2b) in query strings, but messes search reports up if we do this. */ logical unprintable[256]; /* Unprintable chars for the reports. This is charset dependent. But NB not the same as isctrl() or !isprint() even for ASCII range. */ /* The outputters */ Outputter cro_outputter = {cro_pagewidth, cro_cgihead, cro_stylehead, cro_pagetitle, cro_timings, cro_closehead, cro_pagebotstart, cro_credit, cro_runtime, cro_pagefoot, cro_stylefoot, cro_reporttitle, cro_reportfooter, cro_reportdesc, cro_reportspan, cro_gensumhead, cro_gensumfoot, cro_gensumline, cro_gensumlineb, cro_lastseven, cro_prestart, cro_preend, cro_hrule, cro_endash, cro_putch, cro_strlength, cro_allowmonth, cro_calcwidths, cro_declareunit, cro_colheadstart, cro_colheadcol, cro_colheadend, cro_colheadustart, cro_colheadunderline, cro_colheaduend, cro_rowstart, cro_levelcell, cro_namecell, cro_ulcell, cro_strcell, cro_bytescell, cro_pccell, cro_indexcell, cro_rowend, cro_blankline, cro_barchart, cro_busyprintf, cro_notlistedstr, cro_whatincluded, NULL, NULL, NULL, NULL, cro_includefile, cro_riscosfiletype}; Outputter html_outputter = {html_pagewidth, html_cgihead, html_stylehead, html_pagetitle, html_timings, html_closehead, html_pagebotstart, html_credit, html_runtime, html_pagefoot, html_stylefoot, html_reporttitle, html_reportfooter, html_reportdesc, html_reportspan, html_gensumhead, html_gensumfoot, html_gensumline, html_gensumlineb, html_lastseven, html_prestart, html_preend, html_hrule, html_endash, html_putch, html_strlength, html_allowmonth, html_calcwidths, html_declareunit, html_colheadstart, html_colheadcol, html_colheadend, html_colheadustart, html_colheadunderline, html_colheaduend, html_rowstart, html_levelcell, html_namecell, html_ulcell, html_strcell, html_bytescell, html_pccell, html_indexcell, html_rowend, html_blankline, html_barchart, html_busyprintf, html_notlistedstr, html_whatincluded, html_whatinchead, html_whatincfoot, html_whatincprintstr, html_printdouble, html_includefile, html_riscosfiletype}; Outputter latex_outputter = {latex_pagewidth, latex_cgihead, latex_stylehead, latex_pagetitle, latex_timings, latex_closehead, latex_pagebotstart, latex_credit, latex_runtime, latex_pagefoot, latex_stylefoot, latex_reporttitle, latex_reportfooter, latex_reportdesc, latex_reportspan, latex_gensumhead, latex_gensumfoot, latex_gensumline, latex_gensumlineb, latex_lastseven, latex_prestart, latex_preend, latex_hrule, latex_endash, latex_putch, latex_strlength, latex_allowmonth, latex_calcwidths, latex_declareunit, latex_colheadstart, latex_colheadcol, latex_colheadend, latex_colheadustart, latex_colheadunderline, latex_colheaduend, latex_rowstart, latex_levelcell, latex_namecell, latex_ulcell, latex_strcell, latex_bytescell, latex_pccell, latex_indexcell, latex_rowend, latex_blankline, latex_barchart, latex_busyprintf, latex_notlistedstr, latex_whatincluded, latex_whatinchead, latex_whatincfoot, latex_whatincprintstr, latex_printdouble, latex_includefile, latex_riscosfiletype}; Outputter plain_outputter = {plain_pagewidth, plain_cgihead, plain_stylehead, plain_pagetitle, plain_timings, plain_closehead, plain_pagebotstart, plain_credit, plain_runtime, plain_pagefoot, plain_stylefoot, plain_reporttitle, plain_reportfooter, plain_reportdesc, plain_reportspan, plain_gensumhead, plain_gensumfoot, plain_gensumline, plain_gensumlineb, plain_lastseven, plain_prestart, plain_preend, plain_hrule, plain_endash, plain_putch, plain_strlength, plain_allowmonth, plain_calcwidths, plain_declareunit, plain_colheadstart, plain_colheadcol, plain_colheadend, plain_colheadustart, plain_colheadunderline, plain_colheaduend, plain_rowstart, plain_levelcell, plain_namecell, plain_ulcell, plain_strcell, plain_bytescell, plain_pccell, plain_indexcell, plain_rowend, plain_blankline, plain_barchart, plain_busyprintf, plain_notlistedstr, plain_whatincluded, plain_whatinchead, plain_whatincfoot, plain_whatincprintstr, plain_printdouble, plain_includefile, plain_riscosfiletype}; Outputter xhtml_outputter = {xhtml_pagewidth, xhtml_cgihead, xhtml_stylehead, xhtml_pagetitle, xhtml_timings, xhtml_closehead, xhtml_pagebotstart, xhtml_credit, xhtml_runtime, xhtml_pagefoot, xhtml_stylefoot, xhtml_reporttitle, xhtml_reportfooter, xhtml_reportdesc, xhtml_reportspan, xhtml_gensumhead, xhtml_gensumfoot, xhtml_gensumline, xhtml_gensumlineb, xhtml_lastseven, xhtml_prestart, xhtml_preend, xhtml_hrule, xhtml_endash, xhtml_putch, xhtml_strlength, xhtml_allowmonth, xhtml_calcwidths, xhtml_declareunit, xhtml_colheadstart, xhtml_colheadcol, xhtml_colheadend, xhtml_colheadustart, xhtml_colheadunderline, xhtml_colheaduend, xhtml_rowstart, xhtml_levelcell, xhtml_namecell, xhtml_ulcell, xhtml_strcell, xhtml_bytescell, xhtml_pccell, xhtml_indexcell, xhtml_rowend, xhtml_blankline, xhtml_barchart, xhtml_busyprintf, xhtml_notlistedstr, xhtml_whatincluded, xhtml_whatinchead, xhtml_whatincfoot, xhtml_whatincprintstr, xhtml_printdouble, xhtml_includefile, xhtml_riscosfiletype}; Outputter xml_outputter = {xml_pagewidth, xml_cgihead, xml_stylehead, xml_pagetitle, xml_timings, xml_closehead, xml_pagebotstart, xml_credit, xml_runtime, xml_pagefoot, xml_stylefoot, xml_reporttitle, xml_reportfooter, xml_reportdesc, xml_reportspan, xml_gensumhead, xml_gensumfoot, xml_gensumline, xml_gensumlineb, xml_lastseven, xml_prestart, xml_preend, xml_hrule, xml_endash, xml_putch, xml_strlength, xml_allowmonth, xml_calcwidths, xml_declareunit, xml_colheadstart, xml_colheadcol, xml_colheadend, xml_colheadustart, xml_colheadunderline, xml_colheaduend, xml_rowstart, xml_levelcell, xml_namecell, xml_ulcell, xml_strcell, xml_bytescell, xml_pccell, xml_indexcell, xml_rowend, xml_blankline, xml_barchart, xml_busyprintf, xml_notlistedstr, xml_whatincluded, xml_whatinchead, xml_whatincfoot, xml_whatincprintstr, xml_printdouble, xml_includefile, xml_riscosfiletype}; Inputfns inpfns[] = { /* first the ITEM fns in any order */ /* See also ITEMFNS_NUMBER in anlghea3.c */ /* Also, some letters, namely those with &parsestring and other codes that take following separators (see list in strtoinfmt() in init.c), need to be included in the list in report_logfmt() in settings.c. */ {'v', ITEM_VHOST, &parsestring, &mm[ITEM_VHOST]}, {'r', ITEM_FILE, &parsestring, &mm[ITEM_FILE]}, {'u', ITEM_USER, &parsestring, &mm[ITEM_USER]}, {'f', ITEM_REFERRER, &parsestring, &mm[ITEM_REFERRER]}, {'B', ITEM_BROWSER, &parsestring, &mm[ITEM_BROWSER]}, {'S', ITEM_HOST, &parsestring, &mm[ITEM_HOST]}, {'F', ITEM_REFERRER, &parseref, &mm[ITEM_REFERRER]}, {'A', ITEM_BROWSER, &parsemsbrow, &mm[ITEM_BROWSER]}, {'q', INP_QUERY, &parsestring, &mmq}, {'s', INP_IP, &parsestring, &mms}, {'n', INP_MIN, &parseuint2strict, (void *)&minute}, {'h', INP_HOUR, &parseuint2, (void *)&hour}, {'a', INP_AM, &parseam, (void *)&am}, {'d', INP_DATE, &parseuint2, (void *)&date}, {'m', INP_MONTH, &parsenmonth, (void *)&month}, {'M', INP_MONTH, &parsemonth, (void *)&month}, {'y', INP_YEAR, &parseyear2, (void *)&year}, {'Y', INP_YEAR, &parseuint4strict, (void *)&year}, {'Z', INP_YEAR, &parseyear2or4, (void *)&year}, {'U', INP_UNIXTIME, &parseunixtime, (void *)&unixtime}, {'T', INP_PROCTIME, &parseunixtime, (void *)&proctime}, {'t', INP_PROCTIME, &parseproctime, (void *)&proctime}, {'D', INP_PROCTIME, &parseproctimeu, (void *)&proctime}, {'c', INP_CODE, &parsescode, (void *)&code}, {'C', INP_CODE, &parsecode, (void *)&code}, {'b', INP_BYTES, &parseudint, (void *)&bytes}, {'w', UNSET, &parsespace, NULL}, {'W', UNSET, &parseoptspace, NULL}, {'j', UNSET, &parsejunk, NULL}, {'x', UNSET, &parselogfmt, NULL}, {'\0', UNSET, &checkchar, NULL} /* this one must be last as marker */ }; Inputfns pnlinpfn = {'\n', UNSET, &parsenewline, NULL}; Inputfns ccinpfn = {'\0', UNSET, &checkchar, NULL}; Inputfns pjinpfn = {'j', UNSET, &parsejunk, NULL}; Options opts; /* So that in future we can have several sets of options, and yet still declare cf[] neatly as below, we shunt them in and out of opts */ Configfns cf[] = { {"TIMECOLS", &configallcols, (void *)(opts.outopts.cols)}, {"YEARCOLS", &configcols, (void *)(opts.outopts.cols[REP_YEAR])}, {"QUARTERLYCOLS", &configcols, (void *)(opts.outopts.cols[REP_QUARTERLY])}, {"MONTHCOLS", &configcols, (void *)(opts.outopts.cols[REP_MONTH])}, {"WEEKCOLS", &configcols, (void *)(opts.outopts.cols[REP_WEEK])}, {"DAYREPCOLS", &configcols, (void *)(opts.outopts.cols[REP_DAYREP])}, {"FULLDAYCOLS", &configcols, (void *)(opts.outopts.cols[REP_DAYREP])}, {"DAYSUMCOLS", &configcols, (void *)(opts.outopts.cols[REP_DAYSUM])}, {"DAYCOLS", &configcols, (void *)(opts.outopts.cols[REP_DAYSUM])}, {"HOURREPCOLS", &configcols, (void *)(opts.outopts.cols[REP_HOURREP])}, {"FULLHOURCOLS", &configcols, (void *)(opts.outopts.cols[REP_HOURREP])}, {"HOURSUMCOLS", &configcols, (void *)(opts.outopts.cols[REP_HOURSUM])}, {"HOURCOLS", &configcols, (void *)(opts.outopts.cols[REP_HOURSUM])}, {"WEEKHOURCOLS", &configcols, (void *)(opts.outopts.cols[REP_WEEKHOUR])}, {"QUARTERREPCOLS", &configcols, (void *)(opts.outopts.cols[REP_QUARTERREP])}, {"QUARTERCOLS", &configcols, (void *)(opts.outopts.cols[REP_QUARTERREP])}, {"QUARTERSUMCOLS", &configcols, (void *)(opts.outopts.cols[REP_QUARTERSUM])}, {"FIVEREPCOLS", &configcols, (void *)(opts.outopts.cols[REP_FIVEREP])}, {"FIVECOLS", &configcols, (void *)(opts.outopts.cols[REP_FIVEREP])}, {"FIVESUMCOLS", &configcols, (void *)(opts.outopts.cols[REP_FIVESUM])}, {"REQCOLS", &configcols, (void *)(opts.outopts.cols[REP_REQ])}, {"REDIRCOLS", &configcols, (void *)(opts.outopts.cols[REP_REDIR])}, {"FAILCOLS", &configcols, (void *)(opts.outopts.cols[REP_FAIL])}, {"TYPECOLS", &configcols, (void *)(opts.outopts.cols[REP_TYPE])}, {"SIZECOLS", &configcols, (void *)(opts.outopts.cols[REP_SIZE])}, {"PROCTIMECOLS", &configcols, (void *)(opts.outopts.cols[REP_PROCTIME])}, {"DIRCOLS", &configcols, (void *)(opts.outopts.cols[REP_DIR])}, {"HOSTCOLS", &configcols, (void *)(opts.outopts.cols[REP_HOST])}, {"REDIRHOSTCOLS", &configcols, (void *)(opts.outopts.cols[REP_REDIRHOST])}, {"FAILHOSTCOLS", &configcols, (void *)(opts.outopts.cols[REP_FAILHOST])}, {"DOMCOLS", &configcols, (void *)(opts.outopts.cols[REP_DOM])}, {"ORGCOLS", &configcols, (void *)(opts.outopts.cols[REP_ORG])}, {"REFCOLS", &configcols, (void *)(opts.outopts.cols[REP_REF])}, {"REFSITECOLS", &configcols, (void *)(opts.outopts.cols[REP_REFSITE])}, {"REDIRREFCOLS", &configcols, (void *)(opts.outopts.cols[REP_REDIRREF])}, {"FAILREFCOLS", &configcols, (void *)(opts.outopts.cols[REP_FAILREF])}, {"BROWREPCOLS", &configcols, (void *)(opts.outopts.cols[REP_BROWREP])}, {"FULLBROWCOLS", &configcols, (void *)(opts.outopts.cols[REP_BROWREP])}, {"BROWSUMCOLS", &configcols, (void *)(opts.outopts.cols[REP_BROWSUM])}, {"BROWCOLS", &configcols, (void *)(opts.outopts.cols[REP_BROWSUM])}, {"OSCOLS", &configcols, (void *)(opts.outopts.cols[REP_OS])}, {"VHOSTCOLS", &configcols, (void *)(opts.outopts.cols[REP_VHOST])}, {"REDIRVHOSTCOLS", &configcols, (void *)(opts.outopts.cols[REP_REDIRVHOST])}, {"FAILVHOSTCOLS", &configcols, (void *)(opts.outopts.cols[REP_FAILVHOST])}, {"USERCOLS", &configcols, (void *)(opts.outopts.cols[REP_USER])}, {"REDIRUSERCOLS", &configcols, (void *)(opts.outopts.cols[REP_REDIRUSER])}, {"FAILUSERCOLS", &configcols, (void *)(opts.outopts.cols[REP_FAILUSER])}, {"SEARCHQUERYCOLS", &configcols, (void *)(opts.outopts.cols[REP_SEARCHREP])}, {"SEARCHWORDCOLS", &configcols, (void *)(opts.outopts.cols[REP_SEARCHSUM])}, {"INTSEARCHQUERYCOLS", &configcols, (void *)(opts.outopts.cols[REP_INTSEARCHREP])}, {"INTSEARCHWORDCOLS", &configcols, (void *)(opts.outopts.cols[REP_INTSEARCHSUM])}, {"STATUSCOLS", &configcols, (void *)(opts.outopts.cols[REP_CODE])}, {"YEARGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_YEAR])}, {"QUARTERLYGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_QUARTERLY])}, {"MONTHGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_MONTH])}, {"WEEKGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_WEEK])}, {"DAYREPGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_DAYREP])}, {"FULLDAYGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_DAYREP])}, {"DAYSUMGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_DAYSUM])}, {"DAYGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_DAYSUM])}, {"HOURREPGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_HOURREP])}, {"FULLHOURGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_HOURREP])}, {"HOURSUMGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_HOURSUM])}, {"HOURGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_HOURSUM])}, {"WEEKHOURGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_WEEKHOUR])}, {"QUARTERREPGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_QUARTERREP])}, {"QUARTERGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_QUARTERREP])}, {"QUARTERSUMGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_QUARTERSUM])}, {"FIVEREPGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_FIVEREP])}, {"FIVEGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_FIVEREP])}, {"FIVESUMGRAPH", &configgraph, (void *)&(opts.outopts.graph[REP_FIVESUM])}, {"ALLGRAPH", &configallgraph, (void *)(opts.outopts.graph)}, {"ALLGRAPHS", &configallgraph, (void *)(opts.outopts.graph)}, #ifndef NOGRAPHICS {"REQCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REQ)])}, {"REDIRCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REDIR)])}, {"FAILCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_FAIL)])}, {"TYPECHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_TYPE)])}, {"SIZECHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_SIZE)])}, {"PROCTIMECHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_PROCTIME)])}, {"DIRCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_DIR)])}, {"HOSTCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_HOST)])}, {"REDIRHOSTCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REDIRHOST)])}, {"FAILHOSTCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_FAILHOST)])}, {"DOMCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_DOM)])}, {"ORGCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_ORG)])}, {"REFCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REF)])}, {"REFSITECHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REFSITE)])}, {"REDIRREFCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REDIRREF)])}, {"FAILREFCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_FAILREF)])}, {"BROWREPCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_BROWREP)])}, {"BROWSUMCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_BROWSUM)])}, {"OSCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_OS)])}, {"VHOSTCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_VHOST)])}, {"REDIRVHOSTCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REDIRVHOST)])}, {"FAILVHOSTCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_FAILVHOST)])}, {"USERCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_USER)])}, {"REDIRUSERCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_REDIRUSER)])}, {"FAILUSERCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_FAILUSER)])}, {"SEARCHQUERYCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_SEARCHREP)])}, {"SEARCHWORDCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_SEARCHSUM)])}, {"INTSEARCHQUERYCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_INTSEARCHREP)])}, {"INTSEARCHWORDCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_INTSEARCHSUM)])}, {"STATUSCHART", &configchoice, (void *)&(opts.outopts.chartby[G(REP_CODE)])}, {"ALLCHART", &configallchart, (void *)(opts.outopts.chartby)}, {"ALLCHARTS", &configallchart, (void *)(opts.outopts.chartby)}, {"REQCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_REQ)])}, {"REDIRCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_REDIR)])}, {"FAILCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_FAIL)])}, {"TYPECHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_TYPE)])}, {"DIRCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_DIR)])}, {"DOMCHARTEXPAND", &configstrlist, /* NB special case in configstrlist */ (void *)&(opts.outopts.expandhead[G(REP_DOM)])}, {"ORGCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_ORG)])}, {"REFCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_REF)])}, {"REFSITECHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_REFSITE)])}, {"REDIRREFCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_REDIRREF)])}, {"FAILREFCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_FAILREF)])}, {"BROWSUMCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_BROWSUM)])}, {"BROWCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_BROWSUM)])}, {"OSCHARTEXPAND", &configstrlist, (void *)&(opts.outopts.expandhead[G(REP_OS)])}, {"CHARTDIR", &configstr, (void *)&(opts.outopts.chartdir)}, {"LOCALCHARTDIR", &configstr, (void *)&(opts.outopts.localchartdir)}, #ifdef HAVE_GD {"JPEGCHARTS", &configchoice, (void *)&(opts.outopts.jpegcharts)}, #endif #endif /* NOGRAPHICS */ {"PNGIMAGES", &configchoice, (void *)&(opts.outopts.pngimages)}, {"BARSTYLE", &configbarstyle, (void *)&(opts.outopts.barstyle)}, {"COMPSEP", &configstr, (void *)&(opts.outopts.compsep)}, {"PRESEP", &configstr, (void *)&(opts.outopts.compsep)}, {"HOSTNAME", &configstr, (void *)&(opts.outopts.hostname)}, {"HOSTURL", &configstr, (void *)&(opts.outopts.hosturl)}, {"LOGO", &configstr, (void *)&(opts.outopts.logo)}, {"LOGOURL", &configstr, (void *)&(opts.outopts.logourl)}, {"STYLESHEET", &configstr, (void *)&(opts.outopts.stylesheet)}, {"CSSPREFIX", &configstr, (void *)&(opts.outopts.cssprefix)}, {"BASEURL", &configstr, (void *)&(opts.outopts.baseurl)}, {"LOGFORMAT", &configlogfmt, (void *)&logformat}, {"DEFAULTLOGFORMAT", &configlogfmt, (void *)&deflogformat}, {"APACHELOGFORMAT", &configapachelogfmt, (void *)&logformat}, {"APACHEDEFAULTLOGFORMAT", &configapachelogfmt, (void *)&deflogformat}, {"TIMEOFFSET", &configoffset, (void *)&stz}, {"LOGTIMEOFFSET", &configoffset, (void *)&tz}, {"LOGFILE", &configlogfile, (void *)(opts.miscopts.logfile)}, {"CACHEFILE", &configcachefile, (void *)(opts.miscopts.logfile)}, {"IMAGEDIR", &configstr, (void *)&(opts.outopts.imagedir)}, {"HEADERFILE", &configstr, (void *)&(opts.outopts.headerfile)}, {"FOOTERFILE", &configstr, (void *)&(opts.outopts.footerfile)}, {"LANGUAGE", &configlang, (void *)&(opts.outopts.lang)}, {"LANGFILE", &configstr, (void *)&(opts.outopts.lang.file)}, {"OUTFILE", &configoutfile, (void *)&(opts.outopts.outfile)}, {"CACHEOUTFILE", &configstr, (void *)&(opts.outopts.cacheoutfile)}, {"ERRFILE", &configerrfile, (void *)&errfile}, {"DOMAINSFILE", &configstr, (void *)&(opts.outopts.domainsfile)}, {"DESCFILE", &configstr, (void *)&(opts.outopts.descfile)}, {"DIRSUFFIX", &configstr, (void *)&(opts.miscopts.dirsuffix)}, {"SEPCHAR", &configchar, (void *)&(opts.outopts.sepchar)}, {"REPSEPCHAR", &configchar, (void *)&(opts.outopts.repsepchar)}, {"DECPOINT", &configchar, (void *)&(opts.outopts.decpt)}, {"DECPT", &configchar, (void *)&(opts.outopts.decpt)}, {"MARKCHAR", &configchar, (void *)&(opts.outopts.markchar)}, {"REQFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REQ)])}, {"REQARGSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_REQ)])}, {"REDIRFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REDIR)])}, {"REDIRARGSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_REDIR)])}, {"FAILFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_FAIL)])}, {"FAILARGSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_FAIL)])}, {"TYPEFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_TYPE)])}, {"SUBTYPEFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_TYPE)])}, {"DIRFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_DIR)])}, {"SUBDIRFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_DIR)])}, {"HOSTFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_HOST)])}, {"REDIRHOSTFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REDIRHOST)])}, {"FAILHOSTFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_FAILHOST)])}, {"DOMFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_DOM)])}, {"SUBDOMFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_DOM)])}, {"ORGFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_ORG)])}, {"SUBORGFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_ORG)])}, {"REFFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REF)])}, {"REFARGSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_REF)])}, {"REFSITEFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REFSITE)])}, {"REFDIRFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_REFSITE)])}, {"SUBREFSITEFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_REFSITE)])}, {"REDIRREFFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REDIRREF)])}, {"REDIRREFARGSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_REDIRREF)])}, {"FAILREFFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_FAILREF)])}, {"FAILREFARGSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_FAILREF)])}, {"BROWREPFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_BROWREP)])}, {"FULLBROWFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_BROWREP)])}, {"BROWSUMFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_BROWSUM)])}, {"BROWFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_BROWSUM)])}, {"SUBBROWFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_BROWSUM)])}, {"OSFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_OS)])}, {"SUBOSFLOOR", &configfloor, (void *)&(opts.outopts.subfloor[G(REP_OS)])}, {"VHOSTFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_VHOST)])}, {"REDIRVHOSTFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REDIRVHOST)])}, {"FAILVHOSTFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_FAILVHOST)])}, {"USERFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_USER)])}, {"REDIRUSERFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_REDIRUSER)])}, {"FAILUSERFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_FAILUSER)])}, {"SEARCHQUERYFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_SEARCHREP)])}, {"SEARCHWORDFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_SEARCHSUM)])}, {"INTSEARCHQUERYFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_INTSEARCHREP)])}, {"INTSEARCHWORDFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_INTSEARCHSUM)])}, {"STATUSFLOOR", &configfloor, (void *)&(opts.outopts.floor[G(REP_CODE)])}, {"FILEALIAS", &configalias, (void *)&(opts.aliashead[ITEM_FILE])}, {"HOSTALIAS", &configalias, (void *)&(opts.aliashead[ITEM_HOST])}, {"REFALIAS", &configalias, (void *)&(opts.aliashead[ITEM_REFERRER])}, {"BROWALIAS", &configalias, (void *)&(opts.aliashead[ITEM_BROWSER])}, {"USERALIAS", &configalias, (void *)&(opts.aliashead[ITEM_USER])}, {"VHOSTALIAS", &configalias, (void *)&(opts.aliashead[ITEM_VHOST])}, {"SEARCHENGINE", &configstrpair2list, (void *)&(opts.searchengines)}, {"INTSEARCHENGINE", &configstrpair2list, (void *)&(opts.intsearchengines)}, {"REQALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REQ)])}, {"REQOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REQ)])}, {"REDIRALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIR)])}, {"REDIROUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIR)])}, {"FAILALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAIL)])}, {"FAILOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAIL)])}, {"TYPEALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_TYPE)])}, {"TYPEOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_TYPE)])}, {"DIRALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_DIR)])}, {"DIROUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_DIR)])}, {"HOSTREPALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_HOST)])}, {"HOSTOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_HOST)])}, {"REDIRHOSTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRHOST)])}, {"REDIRHOSTOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRHOST)])}, {"FAILHOSTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILHOST)])}, {"FAILHOSTOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILHOST)])}, {"DOMALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_DOM)])}, {"DOMOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_DOM)])}, {"ORGALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_ORG)])}, {"ORGOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_ORG)])}, {"REFREPALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REF)])}, {"REFOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REF)])}, {"REFSITEALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REFSITE)])}, {"REFSITEOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REFSITE)])}, {"REDIRREFALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRREF)])}, {"REDIRREFOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRREF)])}, {"FAILREFALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILREF)])}, {"FAILREFOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILREF)])}, {"BROWREPALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_BROWREP)])}, {"BROWREPOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_BROWREP)])}, {"FULLBROWOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_BROWREP)])}, {"BROWSUMALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_BROWSUM)])}, {"BROWSUMOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_BROWSUM)])}, {"BROWOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_BROWSUM)])}, {"OSALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_OS)])}, {"OSOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_OS)])}, {"VHOSTREPALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_VHOST)])}, {"VHOSTOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_VHOST)])}, {"REDIRVHOSTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRVHOST)])}, {"REDIRVHOSTOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRVHOST)])}, {"FAILVHOSTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILVHOST)])}, {"FAILVHOSTOUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILVHOST)])}, {"USERREPALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_USER)])}, {"USEROUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_USER)])}, {"REDIRUSERALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRUSER)])}, {"REDIRUSEROUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_REDIRUSER)])}, {"FAILUSERALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILUSER)])}, {"FAILUSEROUTPUTALIAS", &configalias, (void *)&(opts.outopts.aliashead[G(REP_FAILUSER)])}, #ifndef NOPIPES {"UNCOMPRESS", &configstrpairlist, (void *)&uncompresshead}, #endif {"REQARGS", &configtree, (void *)&(opts.outopts.tree[G(REP_REQ)])}, {"REDIRARGS", &configtree, (void *)&(opts.outopts.tree[G(REP_REDIR)])}, {"FAILARGS", &configtree, (void *)&(opts.outopts.tree[G(REP_FAIL)])}, {"REFARGS", &configtree, (void *)&(opts.outopts.tree[G(REP_REF)])}, {"REDIRREFARGS", &configtree, (void *)&(opts.outopts.tree[G(REP_REDIRREF)])}, {"FAILREFARGS", &configtree, (void *)&(opts.outopts.tree[G(REP_FAILREF)])}, {"SUBDOMAIN", &configtree, (void *)&(opts.outopts.tree[G(REP_DOM)])}, {"SUBDOM", &configtree, (void *)&(opts.outopts.tree[G(REP_DOM)])}, {"SUBDIR", &configtree, (void *)&(opts.outopts.tree[G(REP_DIR)])}, {"SUBTYPE", &configtree, (void *)&(opts.outopts.tree[G(REP_TYPE)])}, {"REFDIR", &configtree, (void *)&(opts.outopts.tree[G(REP_REFSITE)])}, {"SUBREFSITE", &configtree, (void *)&(opts.outopts.tree[G(REP_REFSITE)])}, {"SUBBROW", &configtree, (void *)&(opts.outopts.tree[G(REP_BROWSUM)])}, {"SUBOS", &configtree, (void *)&(opts.outopts.tree[G(REP_OS)])}, {"SUBORG", &configstrlist, (void *)&(opts.outopts.suborgs)}, {"SUBORG2", &configtree, (void *)&(opts.outopts.tree[G(REP_ORG)])}, /* have to postpone SUBORG's until domains file has been read */ {"FILEINCLUDE", &configinc, (void *)&(opts.wanthead[ITEM_FILE])}, {"FILEEXCLUDE", &configexc, (void *)&(opts.wanthead[ITEM_FILE])}, {"HOSTINCLUDE", &confighostinc, (void *)&(opts.wanthead[ITEM_HOST])}, {"HOSTEXCLUDE", &confighostexc, (void *)&(opts.wanthead[ITEM_HOST])}, {"REFINCLUDE", &configinc, (void *)&(opts.wanthead[ITEM_REFERRER])}, {"REFEXCLUDE", &configexc, (void *)&(opts.wanthead[ITEM_REFERRER])}, {"BROWINCLUDE", &configinc, (void *)&(opts.wanthead[ITEM_BROWSER])}, {"BROWEXCLUDE", &configexc, (void *)&(opts.wanthead[ITEM_BROWSER])}, {"USERINCLUDE", &configinc, (void *)&(opts.wanthead[ITEM_USER])}, {"USEREXCLUDE", &configexc, (void *)&(opts.wanthead[ITEM_USER])}, {"VHOSTINCLUDE", &configinc, (void *)&(opts.wanthead[ITEM_VHOST])}, {"VHOSTEXCLUDE", &configexc, (void *)&(opts.wanthead[ITEM_VHOST])}, {"STATUSINCLUDE", &configscinc, (void *)(opts.code2type)}, {"STATUSEXCLUDE", &configscexc, (void *)(opts.code2type)}, {"304ISSUCCESS", &configchoice, (void *)&(opts.succ304)}, {"REQINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_REQ)])}, {"REQEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_REQ)])}, {"REDIRINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_REDIR)])}, {"REDIREXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_REDIR)])}, {"FAILINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_FAIL)])}, {"FAILEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_FAIL)])}, {"TYPEINCLUDE", &configincd, (void *)&(opts.outopts.wanthead[G(REP_TYPE)])}, {"TYPEEXCLUDE", &configexcd, (void *)&(opts.outopts.wanthead[G(REP_TYPE)])}, {"DIRINCLUDE", &configincs, (void *)&(opts.outopts.wanthead[G(REP_DIR)])}, {"DIREXCLUDE", &configexcs, (void *)&(opts.outopts.wanthead[G(REP_DIR)])}, {"HOSTREPINCLUDE", &confighostinc, (void *)&(opts.outopts.wanthead[G(REP_HOST)])}, {"HOSTREPEXCLUDE", &confighostexc, (void *)&(opts.outopts.wanthead[G(REP_HOST)])}, {"REDIRHOSTINCLUDE", &confighostinc, (void *)&(opts.outopts.wanthead[G(REP_REDIRHOST)])}, {"REDIRHOSTEXCLUDE", &confighostexc, (void *)&(opts.outopts.wanthead[G(REP_REDIRHOST)])}, {"FAILHOSTINCLUDE", &confighostinc, (void *)&(opts.outopts.wanthead[G(REP_FAILHOST)])}, {"FAILHOSTEXCLUDE", &confighostexc, (void *)&(opts.outopts.wanthead[G(REP_FAILHOST)])}, {"DOMINCLUDE", &configincd, (void *)&(opts.outopts.wanthead[G(REP_DOM)])}, {"DOMEXCLUDE", &configexcd, (void *)&(opts.outopts.wanthead[G(REP_DOM)])}, {"ORGINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_ORG)])}, {"ORGEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_ORG)])}, {"REFREPINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_REF)])}, {"REFREPEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_REF)])}, {"REFSITEINCLUDE", &configincs, (void *)&(opts.outopts.wanthead[G(REP_REFSITE)])}, {"REFSITEEXCLUDE", &configexcs, (void *)&(opts.outopts.wanthead[G(REP_REFSITE)])}, {"REDIRREFINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_REDIRREF)])}, {"REDIRREFEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_REDIRREF)])}, {"FAILREFINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_FAILREF)])}, {"FAILREFEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_FAILREF)])}, {"BROWSUMINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_BROWSUM)])}, {"BROWSUMEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_BROWSUM)])}, {"BROWREPINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_BROWREP)])}, {"BROWREPEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_BROWREP)])}, {"FULLBROWINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_BROWREP)])}, {"FULLBROWEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_BROWREP)])}, {"OSINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_OS)])}, {"OSEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_OS)])}, {"VHOSTREPINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_VHOST)])}, {"VHOSTREPEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_VHOST)])}, {"REDIRVHOSTINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_REDIRVHOST)])}, {"REDIRVHOSTEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_REDIRVHOST)])}, {"FAILVHOSTINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_FAILVHOST)])}, {"FAILVHOSTEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_FAILVHOST)])}, {"USERREPINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_USER)])}, {"USERREPEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_USER)])}, {"REDIRUSERINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_REDIRUSER)])}, {"REDIRUSEREXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_REDIRUSER)])}, {"FAILUSERINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_FAILUSER)])}, {"FAILUSEREXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_FAILUSER)])}, {"SEARCHQUERYINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_SEARCHREP)])}, {"SEARCHQUERYEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_SEARCHREP)])}, {"SEARCHWORDINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_SEARCHSUM)])}, {"SEARCHWORDEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_SEARCHSUM)])}, {"INTSEARCHQUERYINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_INTSEARCHREP)])}, {"INTSEARCHQUERYEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_INTSEARCHREP)])}, {"INTSEARCHWORDINCLUDE", &configinc, (void *)&(opts.outopts.wanthead[G(REP_INTSEARCHSUM)])}, {"INTSEARCHWORDEXCLUDE", &configexc, (void *)&(opts.outopts.wanthead[G(REP_INTSEARCHSUM)])}, {"LINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_REQ)])}, {"LINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_REQ)])}, {"REQLINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_REQ)])}, {"REQLINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_REQ)])}, {"REDIRLINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_REDIR)])}, {"REDIRLINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_REDIR)])}, {"FAILLINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_FAIL)])}, {"FAILLINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_FAIL)])}, {"REFLINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_REF)])}, {"REFLINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_REF)])}, {"REDIRREFLINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_REDIRREF)])}, {"REDIRREFLINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_REDIRREF)])}, {"FAILREFLINKINCLUDE", &configinc, (void *)&(opts.outopts.link[G(REP_FAILREF)])}, {"FAILREFLINKEXCLUDE", &configexc, (void *)&(opts.outopts.link[G(REP_FAILREF)])}, {"ARGSINCLUDE", &configinc, (void *)&(opts.argshead)}, {"ARGSEXCLUDE", &configexc, (void *)&(opts.argshead)}, {"REFARGSINCLUDE", &configinc, (void *)&(opts.refargshead)}, {"REFARGSEXCLUDE", &configexc, (void *)&(opts.refargshead)}, {"PAGEINCLUDE", &configinc, (void *)&(opts.ispagehead)}, {"PAGEEXCLUDE", &configexc, (void *)&(opts.ispagehead)}, {"ROBOTINCLUDE", &configinc, (void *)&(opts.robots)}, {"ROBOTEXCLUDE", &configexc, (void *)&(opts.robots)}, {"REQSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REQ)])}, {"REQARGSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_REQ)])}, {"REDIRSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REDIR)])}, {"REDIRARGSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_REDIR)])}, {"FAILSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_FAIL)])}, {"FAILARGSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_FAIL)])}, {"TYPESORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_TYPE)])}, {"SUBTYPESORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_TYPE)])}, {"DIRSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_DIR)])}, {"SUBDIRSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_DIR)])}, {"HOSTSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_HOST)])}, {"REDIRHOSTSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REDIRHOST)])}, {"FAILHOSTSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_FAILHOST)])}, {"DOMSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_DOM)])}, {"SUBDOMSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_DOM)])}, {"ORGSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_ORG)])}, {"SUBORGSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_ORG)])}, {"REFSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REF)])}, {"REFARGSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_REF)])}, {"REFSITESORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REFSITE)])}, {"REFDIRSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_REFSITE)])}, {"SUBREFSITESORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_REFSITE)])}, {"REDIRREFSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REDIRREF)])}, {"REDIRREFARGSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_REDIRREF)])}, {"FAILREFSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_FAILREF)])}, {"FAILREFARGSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_FAILREF)])}, {"BROWREPSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_BROWREP)])}, {"FULLBROWSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_BROWREP)])}, {"BROWSUMSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_BROWSUM)])}, {"BROWSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_BROWSUM)])}, {"SUBBROWSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_BROWSUM)])}, {"OSSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_OS)])}, {"SUBOSSORTBY", &configchoice, (void *)&(opts.outopts.subsortby[G(REP_OS)])}, {"STATUSSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_CODE)])}, {"VHOSTSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_VHOST)])}, {"REDIRVHOSTSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REDIRVHOST)])}, {"FAILVHOSTSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_FAILVHOST)])}, {"USERSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_USER)])}, {"REDIRUSERSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_REDIRUSER)])}, {"FAILUSERSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_FAILUSER)])}, {"SEARCHQUERYSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_SEARCHREP)])}, {"SEARCHWORDSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_SEARCHSUM)])}, {"INTSEARCHQUERYSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_INTSEARCHREP)])}, {"INTSEARCHWORDSORTBY", &configchoice, (void *)&(opts.outopts.sortby[G(REP_INTSEARCHSUM)])}, {"ALL", &configall, (void *)(opts.outopts.repq)}, {"ALLBACK", &configallback, (void *)(opts.outopts.back)}, {"YEARLY", &configchoice, (void *)&(opts.outopts.repq[REP_YEAR])}, {"QUARTERLY", &configchoice, (void *)&(opts.outopts.repq[REP_QUARTERLY])}, {"MONTHLY", &configchoice, (void *)&(opts.outopts.repq[REP_MONTH])}, {"WEEKLY", &configchoice, (void *)&(opts.outopts.repq[REP_WEEK])}, {"DAILYREP", &configchoice, (void *)&(opts.outopts.repq[REP_DAYREP])}, {"FULLDAILY", &configchoice, (void *)&(opts.outopts.repq[REP_DAYREP])}, {"DAILYSUM", &configchoice, (void *)&(opts.outopts.repq[REP_DAYSUM])}, {"DAILY", &configchoice, (void *)&(opts.outopts.repq[REP_DAYSUM])}, {"HOURLYREP", &configchoice, (void *)&(opts.outopts.repq[REP_HOURREP])}, {"FULLHOURLY", &configchoice, (void *)&(opts.outopts.repq[REP_HOURREP])}, {"HOURLYSUM", &configchoice, (void *)&(opts.outopts.repq[REP_HOURSUM])}, {"HOURLY", &configchoice, (void *)&(opts.outopts.repq[REP_HOURSUM])}, {"WEEKHOUR", &configchoice, (void *)&(opts.outopts.repq[REP_WEEKHOUR])}, {"QUARTERREP", &configchoice, (void *)&(opts.outopts.repq[REP_QUARTERREP])}, {"QUARTER", &configchoice, (void *)&(opts.outopts.repq[REP_QUARTERREP])}, {"QUARTERSUM", &configchoice, (void *)&(opts.outopts.repq[REP_QUARTERSUM])}, {"FIVEREP", &configchoice, (void *)&(opts.outopts.repq[REP_FIVEREP])}, {"FIVE", &configchoice, (void *)&(opts.outopts.repq[REP_FIVEREP])}, {"FIVESUM", &configchoice, (void *)&(opts.outopts.repq[REP_FIVESUM])}, {"GENERAL", &configchoice, (void *)&(opts.outopts.repq[REP_GENSUM])}, {"LASTSEVEN", &configchoice, (void *)&(opts.outopts.last7)}, {"RUNTIME", &configchoice, (void *)&(opts.outopts.runtime)}, {"GOTOS", &configchoice, (void *)&(opts.outopts.gotos)}, {"REPORTSPAN", &configchoice, (void *)&(opts.outopts.repspan)}, {"REPORTSPANTHRESHOLD", &configuint, (void *)&(opts.outopts.rsthresh)}, {"RSTHRESH", &configuint, (void *)&(opts.outopts.rsthresh)}, {"DESCRIPTIONS", &configchoice, (void *)&(opts.outopts.descriptions)}, {"REQUEST", &configchoice, (void *)&(opts.outopts.repq[REP_REQ])}, {"REDIR", &configchoice, (void *)&(opts.outopts.repq[REP_REDIR])}, {"REDIRECTION", &configchoice, (void *)&(opts.outopts.repq[REP_REDIR])}, {"FAILURE", &configchoice, (void *)&(opts.outopts.repq[REP_FAIL])}, {"FILETYPE", &configchoice, (void *)&(opts.outopts.repq[REP_TYPE])}, {"SIZE", &configchoice, (void *)&(opts.outopts.repq[REP_SIZE])}, {"PROCTIME", &configchoice, (void *)&(opts.outopts.repq[REP_PROCTIME])}, {"DIRECTORY", &configchoice, (void *)&(opts.outopts.repq[REP_DIR])}, {"HOST", &configchoice, (void *)&(opts.outopts.repq[REP_HOST])}, {"REDIRHOST", &configchoice, (void *)&(opts.outopts.repq[REP_REDIRHOST])}, {"FAILHOST", &configchoice, (void *)&(opts.outopts.repq[REP_FAILHOST])}, {"DOMAIN", &configchoice, (void *)&(opts.outopts.repq[REP_DOM])}, {"ORGANISATION", &configchoice, (void *)&(opts.outopts.repq[REP_ORG])}, {"ORGANIZATION", &configchoice, (void *)&(opts.outopts.repq[REP_ORG])}, {"REFERRER", &configchoice, (void *)&(opts.outopts.repq[REP_REF])}, {"REFERER", &configchoice, (void *)&(opts.outopts.repq[REP_REF])}, {"REFSITE", &configchoice, (void *)&(opts.outopts.repq[REP_REFSITE])}, {"REDIRREF", &configchoice, (void *)&(opts.outopts.repq[REP_REDIRREF])}, {"FAILREF", &configchoice, (void *)&(opts.outopts.repq[REP_FAILREF])}, {"BROWSERREP", &configchoice, (void *)&(opts.outopts.repq[REP_BROWREP])}, {"BROWREP", &configchoice, (void *)&(opts.outopts.repq[REP_BROWREP])}, {"FULLBROWSER", &configchoice, (void *)&(opts.outopts.repq[REP_BROWREP])}, {"BROWSERSUM", &configchoice, (void *)&(opts.outopts.repq[REP_BROWSUM])}, {"BROWSUM", &configchoice, (void *)&(opts.outopts.repq[REP_BROWSUM])}, {"BROWSER", &configchoice, (void *)&(opts.outopts.repq[REP_BROWSUM])}, {"OSREP", &configchoice, (void *)&(opts.outopts.repq[REP_OS])}, {"VHOST", &configchoice, (void *)&(opts.outopts.repq[REP_VHOST])}, {"REDIRVHOST", &configchoice, (void *)&(opts.outopts.repq[REP_REDIRVHOST])}, {"FAILVHOST", &configchoice, (void *)&(opts.outopts.repq[REP_FAILVHOST])}, {"USER", &configchoice, (void *)&(opts.outopts.repq[REP_USER])}, {"REDIRUSER", &configchoice, (void *)&(opts.outopts.repq[REP_REDIRUSER])}, {"FAILUSER", &configchoice, (void *)&(opts.outopts.repq[REP_FAILUSER])}, {"SEARCHQUERY", &configchoice, (void *)&(opts.outopts.repq[REP_SEARCHREP])}, {"SEARCHWORD", &configchoice, (void *)&(opts.outopts.repq[REP_SEARCHSUM])}, {"INTSEARCHQUERY", &configchoice, (void *)&(opts.outopts.repq[REP_INTSEARCHREP])}, {"INTSEARCHWORD", &configchoice, (void *)&(opts.outopts.repq[REP_INTSEARCHSUM])}, {"STATUS", &configchoice, (void *)&(opts.outopts.repq[REP_CODE])}, {"YEARBACK", &configchoice, (void *)&(opts.outopts.back[REP_YEAR])}, {"QUARTERLYBACK", &configchoice, (void *)&(opts.outopts.back[REP_QUARTERLY])}, {"MONTHBACK", &configchoice, (void *)&(opts.outopts.back[REP_MONTH])}, {"WEEKBACK", &configchoice, (void *)&(opts.outopts.back[REP_WEEK])}, {"DAYBACK", &configchoice, (void *)&(opts.outopts.back[REP_DAYREP])}, {"DAYREPBACK", &configchoice, (void *)&(opts.outopts.back[REP_DAYREP])}, {"FULLDAYBACK", &configchoice, (void *)&(opts.outopts.back[REP_DAYREP])}, {"HOURBACK", &configchoice, (void *)&(opts.outopts.back[REP_HOURREP])}, {"HOURREPBACK", &configchoice, (void *)&(opts.outopts.back[REP_HOURREP])}, {"FULLHOURBACK", &configchoice, (void *)&(opts.outopts.back[REP_HOURREP])}, {"QUARTERBACK", &configchoice, (void *)&(opts.outopts.back[REP_QUARTERREP])}, {"QUARTERREPBACK", &configchoice, (void *)&(opts.outopts.back[REP_QUARTERREP])}, {"FIVEBACK", &configchoice, (void *)&(opts.outopts.back[REP_FIVEREP])}, {"FIVEREPBACK", &configchoice, (void *)&(opts.outopts.back[REP_FIVEREP])}, {"RAWBYTES", &configchoice, (void *)&(opts.outopts.rawbytes)}, {"BYTESDP", &configuint, (void *)&(opts.outopts.bytesdp)}, {"NOROBOTS", &configchoice, (void *)&(opts.outopts.norobots)}, {"SETTINGS", &configchoice, (void *)&vblesonly}, {"CGI", &configchoice, (void *)&cgi}, {"OUTPUT", &configchoice, (void *)&(opts.outopts.outstyle)}, {"PDFLATEX", &configchoice, (void *)&(opts.outopts.pdflatex)}, {"CASE", &configchoice, (void *)&(opts.miscopts.case_insensitive)}, {"USERCASE", &configchoice, (void *)&(opts.miscopts.usercase_insensitive)}, {"SEARCHCHARCONVERT", &configchoice, (void *)&(opts.outopts.searchconv)}, {"YEARROWS", &configuint, (void *)&(opts.outopts.rows[REP_YEAR])}, {"QUARTERLYROWS", &configuint, (void *)&(opts.outopts.rows[REP_QUARTERLY])}, {"MONTHROWS", &configuint, (void *)&(opts.outopts.rows[REP_MONTH])}, {"WEEKROWS", &configuint, (void *)&(opts.outopts.rows[REP_WEEK])}, {"DAYROWS", &configuint, (void *)&(opts.outopts.rows[REP_DAYREP])}, {"DAYREPROWS", &configuint, (void *)&(opts.outopts.rows[REP_DAYREP])}, {"FULLDAYROWS", &configuint, (void *)&(opts.outopts.rows[REP_DAYREP])}, {"HOURROWS", &configuint, (void *)&(opts.outopts.rows[REP_HOURREP])}, {"HOURREPROWS", &configuint, (void *)&(opts.outopts.rows[REP_HOURREP])}, {"FULLHOURROWS", &configuint, (void *)&(opts.outopts.rows[REP_HOURREP])}, {"QUARTERROWS", &configuint, (void *)&(opts.outopts.rows[REP_QUARTERREP])}, {"QUARTERREPROWS", &configuint, (void *)&(opts.outopts.rows[REP_QUARTERREP])}, {"FIVEROWS", &configuint, (void *)&(opts.outopts.rows[REP_FIVEREP])}, {"FIVEREPROWS", &configuint, (void *)&(opts.outopts.rows[REP_FIVEREP])}, {"FILELOWMEM", &configlowmem, (void *)&(opts.miscopts.lowmem[ITEM_FILE])}, {"HOSTLOWMEM", &configlowmem, (void *)&(opts.miscopts.lowmem[ITEM_HOST])}, {"REFLOWMEM", &configlowmem, (void *)&(opts.miscopts.lowmem[ITEM_REFERRER])}, {"BROWLOWMEM", &configlowmem, (void *)&(opts.miscopts.lowmem[ITEM_BROWSER])}, {"USERLOWMEM", &configlowmem, (void *)&(opts.miscopts.lowmem[ITEM_USER])}, {"VHOSTLOWMEM", &configlowmem, (void *)&(opts.miscopts.lowmem[ITEM_VHOST])}, {"ASCIIPAGEWIDTH", &configuint, (void *)&(opts.outopts.plainpagewidth)}, {"PLAINPAGEWIDTH", &configuint, (void *)&(opts.outopts.plainpagewidth)}, {"HTMLPAGEWIDTH", &configuint, (void *)&(opts.outopts.htmlpagewidth)}, {"LATEXPAGEWIDTH", &configuint, (void *)&(opts.outopts.latexpagewidth)}, {"MINGRAPHWIDTH", &configuint, (void *)&(opts.outopts.mingraphwidth)}, {"ERRLINELENGTH", &configuint, (void *)&errwidth}, {"PROGRESSFREQ", &configulong, (void *)&progressfreq}, {"WEEKBEGINSON", &configchoice, (void *)&(opts.outopts.weekbeginson)}, {"FROM", &configstr, (void *)&(opts.dman.fromstr)}, {"TO", &configstr, (void *)&(opts.dman.tostr)}, {"REPORTORDER", &configrepord, (void *)(opts.outopts.reporder)}, {"DEBUG", &configdebug, (void *)&debug_args}, {"WARNINGS", &configdebug, (void *)&warn_args}, {"GENSUMLINES", &configdebug, (void *)&(opts.outopts.gensumlines)}, {"DOMLEVEL", &configdomlevel, (void *)&domlevels}, #ifndef NODNS {"DNS", &configchoice, (void *)&dnslevel}, {"DNSFILE", &configstr, (void *)&dnsfile}, {"DNSLOCKFILE", &configstr, (void *)&dnslockfile}, {"DNSGOODHOURS", &configuint, (void *)&dnsgoodhrs}, {"DNSBADHOURS", &configuint, (void *)&dnsbadhrs}, #ifndef NOALARM {"DNSTIMEOUT", &configuint, (void *)&dnstimeout}, #endif #endif {"CONFIGFILE", &configcall, NULL}, {"", NULL, NULL} /* at end as marker */ }; void globals(char *comname) { #ifndef NOFOLLOW struct stat buf; char *path, *pathcp, *s, *t = NULL; size_t l = 0; logical done; #endif int i; time(&starttime); starttimestr = ctime(&starttime); starttimestr[24] = '\0'; (void)parsedate(starttime, "-00-00-00:-00-00", &starttimec, FALSE, FALSE); (void)parsedate(starttime, "-00-00-00:-00-00", &starttimeuxc, FALSE, TRUE); /* parsedate() is needed because we don't know the encoding of time() */ errfile = stderr; setvbuf(stderr, NULL, ERRBUFMODE, BUFSIZ); signal(SIGTERM, sighandler); signal(SIGINT, sighandler); #ifdef SIGHUP signal(SIGHUP, sighandler); #endif #ifdef SIGQUIT signal(SIGQUIT, sighandler); #endif #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif workspace = (char *)xmalloc(BLOCKSIZE); block_start = (char *)xmalloc(BLOCKSIZE + 1); /* 1 for terminating char */ for (i = 0; i < ITEM_NUMBER; i++) { mm[i].curr_pos = NULL; mm[i].first = NULL; mm[i].alignment = 1; } mmq.curr_pos = NULL; mmq.first = NULL; mmq.alignment = 1; mms.curr_pos = NULL; mms.first = NULL; mms.alignment = 1; xmemman = (Memman *)xmalloc(sizeof(Memman)); xmemman->curr_pos = NULL; xmemman->first = NULL; xmemman->alignment = ALIGNSIZE; amemman = (Memman *)xmalloc(sizeof(Memman)); amemman->curr_pos = NULL; amemman->first = NULL; amemman->alignment = ALIGNSIZE; for (i = 0; i < 256; i++) termchar[i] = FALSE; termchar[(unsigned char)'\r'] = TRUE; termchar[(unsigned char)'\n'] = TRUE; termchar[(unsigned char)'\0'] = TRUE; if (IS_EMPTY_STRING(comname)) COPYSTR(commandname, "analog") /* no semicolon by defn of COPYSTR */ else COPYSTR(commandname, comname); #ifndef NOFOLLOW commandpath = (char *)xmalloc(PATH_MAX); done = FALSE; if (strpbrk(commandname, PATHSEPS) == NULL && (path = getenv("PATH")) != NULL) { pathcp = (char *)xmalloc(strlen(path) + 1); strcpy(pathcp, path); for (s = strtok(pathcp, ":"); !done && s != NULL; s = strtok(NULL, ":")) { ENSURE_LEN(t, l, strlen(s) + strlen(commandname) + 2); sprintf(t, "%s%c%s", s, DIRSEP, commandname); if (realpath(t, commandpath) != NULL && access(commandpath, X_OK) == 0 && stat(commandpath, &buf) == 0 && S_ISREG(buf.st_mode)) done = TRUE; } } else if (realpath(commandname, commandpath) != NULL) done = TRUE; if (!done) strcpy(commandpath, commandname); commandpath = (char *)xrealloc((void *)commandpath, strlen(commandpath) + 1); #else commandpath = commandname; #endif unwanted_entry = newhashentry(DATA_NUMBER, FALSE); blank_entry = newhashentry(DATA_NUMBER, FALSE); dummy_item = (Hashindex *)submalloc(xmemman, sizeof(Hashindex)); dummy_item->own = newhashentry(DATA_NUMBER, FALSE); rep2lng = (unsigned int *)xmalloc(REP_NUMBER * sizeof(unsigned int)); rep2lng[REP_GENSUM] = gensum_; rep2lng[REP_YEAR] = yearrep_; rep2lng[REP_QUARTERLY] = quarterlyrep_; rep2lng[REP_MONTH] = monthrep_; rep2lng[REP_WEEK] = weekrep_; rep2lng[REP_DAYREP] = dayrep_; rep2lng[REP_DAYSUM] = daysum_; rep2lng[REP_HOURREP] = hourrep_; rep2lng[REP_HOURSUM] = hoursum_; rep2lng[REP_WEEKHOUR] = weekhoursum_; rep2lng[REP_QUARTERREP] = quarterrep_; rep2lng[REP_QUARTERSUM] = quartersum_; rep2lng[REP_FIVEREP] = fiverep_; rep2lng[REP_FIVESUM] = fivesum_; rep2lng[REP_REQ] = reqrep_; rep2lng[REP_REDIR] = redirrep_; rep2lng[REP_FAIL] = failrep_; rep2lng[REP_TYPE] = typerep_; rep2lng[REP_SIZE] = sizerep_; rep2lng[REP_PROCTIME] = proctimerep_; rep2lng[REP_DIR] = dirrep_; rep2lng[REP_HOST] = hostrep_; rep2lng[REP_REDIRHOST] = redirhostrep_; rep2lng[REP_FAILHOST] = failhostrep_; rep2lng[REP_DOM] = domrep_; rep2lng[REP_ORG] = orgrep_; rep2lng[REP_REF] = refrep_; rep2lng[REP_REFSITE] = refsiterep_; rep2lng[REP_REDIRREF] = redirrefrep_; rep2lng[REP_FAILREF] = failrefrep_; rep2lng[REP_BROWREP] = browrep_; rep2lng[REP_BROWSUM] = browsum_; rep2lng[REP_OS] = osrep_; rep2lng[REP_VHOST] = vhostrep_; rep2lng[REP_REDIRVHOST] = redirvhostrep_; rep2lng[REP_FAILVHOST] = failvhostrep_; rep2lng[REP_USER] = userrep_; rep2lng[REP_REDIRUSER] = rediruserrep_; rep2lng[REP_FAILUSER] = failuserrep_; rep2lng[REP_SEARCHREP] = searchrep_; rep2lng[REP_SEARCHSUM] = searchsum_; rep2lng[REP_INTSEARCHREP] = intsearchrep_; rep2lng[REP_INTSEARCHSUM] = intsearchsum_; rep2lng[REP_CODE] = statrep_; rep2type = (choice *)xmalloc(REP_NUMBER * sizeof(choice)); rep2type[REP_YEAR] = INP_DATE; rep2type[REP_QUARTERLY] = INP_DATE; rep2type[REP_MONTH] = INP_DATE; rep2type[REP_WEEK] = INP_DATE; rep2type[REP_DAYREP] = INP_DATE; rep2type[REP_DAYSUM] = INP_DATE; rep2type[REP_HOURREP] = INP_DATE; rep2type[REP_HOURSUM] = INP_DATE; rep2type[REP_WEEKHOUR] = INP_DATE; rep2type[REP_QUARTERREP] = INP_DATE; rep2type[REP_QUARTERSUM] = INP_DATE; rep2type[REP_FIVEREP] = INP_DATE; rep2type[REP_FIVESUM] = INP_DATE; rep2type[REP_GENSUM] = UNSET; rep2type[REP_REQ] = ITEM_FILE; rep2type[REP_TYPE] = ITEM_FILE; rep2type[REP_DIR] = ITEM_FILE; rep2type[REP_REDIR] = ITEM_FILE; rep2type[REP_FAIL] = ITEM_FILE; rep2type[REP_HOST] = ITEM_HOST; rep2type[REP_REDIRHOST] = ITEM_HOST; rep2type[REP_FAILHOST] = ITEM_HOST; rep2type[REP_DOM] = ITEM_HOST; rep2type[REP_ORG] = ITEM_HOST; rep2type[REP_USER] = ITEM_USER; rep2type[REP_REDIRUSER] = ITEM_USER; rep2type[REP_FAILUSER] = ITEM_USER; rep2type[REP_REF] = ITEM_REFERRER; rep2type[REP_REFSITE] = ITEM_REFERRER; rep2type[REP_REDIRREF] = ITEM_REFERRER; rep2type[REP_FAILREF] = ITEM_REFERRER; rep2type[REP_SEARCHREP] = ITEM_REFERRER; rep2type[REP_SEARCHSUM] = ITEM_REFERRER; rep2type[REP_INTSEARCHREP] = ITEM_FILE; rep2type[REP_INTSEARCHSUM] = ITEM_FILE; rep2type[REP_BROWREP] = ITEM_BROWSER; rep2type[REP_BROWSUM] = ITEM_BROWSER; rep2type[REP_OS] = ITEM_BROWSER; rep2type[REP_VHOST] = ITEM_VHOST; rep2type[REP_REDIRVHOST] = ITEM_VHOST; rep2type[REP_FAILVHOST] = ITEM_VHOST; rep2type[REP_SIZE] = INP_BYTES; rep2type[REP_PROCTIME] = INP_PROCTIME; rep2type[REP_CODE] = INP_CODE; repistree = (logical *)xmalloc(GENREP_NUMBER * sizeof(logical)); for (i = 0; i < GENREP_NUMBER; i++) repistree[i] = FALSE; repistree[G(REP_REQ)] = TRUE; repistree[G(REP_REDIR)] = TRUE; repistree[G(REP_FAIL)] = TRUE; repistree[G(REP_REF)] = TRUE; repistree[G(REP_REDIRREF)] = TRUE; repistree[G(REP_FAILREF)] = TRUE; repistree[G(REP_TYPE)] = TRUE; repistree[G(REP_DIR)] = TRUE; repistree[G(REP_DOM)] = TRUE; repistree[G(REP_ORG)] = TRUE; repistree[G(REP_REFSITE)] = TRUE; repistree[G(REP_BROWSUM)] = TRUE; repistree[G(REP_OS)] = TRUE; rep2reqs = (choice *)xmalloc(GENREP_NUMBER * sizeof(choice)); rep2reqs7 = (choice *)xmalloc(GENREP_NUMBER * sizeof(choice)); rep2date = (choice *)xmalloc(GENREP_NUMBER * sizeof(choice)); rep2firstd = (choice *)xmalloc(GENREP_NUMBER * sizeof(choice)); for (i = 0; i < GENREP_NUMBER; i++) rep2reqs[i] = REQUESTS; rep2reqs[G(REP_REDIR)] = REDIR; rep2reqs[G(REP_FAIL)] = FAIL; rep2reqs[G(REP_REDIRHOST)] = REDIR; rep2reqs[G(REP_FAILHOST)] = FAIL; rep2reqs[G(REP_REDIRUSER)] = REDIR; rep2reqs[G(REP_FAILUSER)] = FAIL; rep2reqs[G(REP_REDIRREF)] = REDIR; rep2reqs[G(REP_FAILREF)] = FAIL; rep2reqs[G(REP_REDIRVHOST)] = REDIR; rep2reqs[G(REP_FAILVHOST)] = FAIL; for (i = 0; i < GENREP_NUMBER; i++) { rep2reqs7[i] = (rep2reqs[i] == REDIR)?REDIR7:\ ((rep2reqs[i] == FAIL)?FAIL7:REQUESTS7); rep2date[i] = (rep2reqs[i] == REDIR)?REDIRDATE:\ ((rep2reqs[i] == FAIL)?FAILDATE:SUCCDATE); rep2firstd[i] = (rep2reqs[i] == REDIR)?REDIRFIRSTD:\ ((rep2reqs[i] == FAIL)?FAILFIRSTD:SUCCFIRSTD); } rep2gran = (unsigned int *)xmalloc(DATEREP_NUMBER * sizeof(unsigned int)); rep2gran[REP_DAYREP] = 1; rep2gran[REP_HOURREP] = 24; rep2gran[REP_QUARTERREP] = 96; rep2gran[REP_FIVEREP] = 288; rep2gran[REP_YEAR] = 1; rep2gran[REP_QUARTERLY] = 1; rep2gran[REP_MONTH] = 1; rep2gran[REP_WEEK] = 1; rep2gran[REP_DAYSUM] = 1; rep2gran[REP_HOURSUM] = 24; rep2gran[REP_WEEKHOUR] = 24; rep2gran[REP_QUARTERSUM] = 96; rep2gran[REP_FIVESUM] = 288; rep2datefmt = (unsigned int *)xmalloc(DATEREP_NUMBER * sizeof(unsigned int)); rep2datefmt[REP_DAYREP] = dayrepfmt_; rep2datefmt[REP_DAYSUM] = daysumfmt_; rep2datefmt[REP_HOURREP] = hourrepfmt_; rep2datefmt[REP_QUARTERREP] = quarterrepfmt_; rep2datefmt[REP_FIVEREP] = quarterrepfmt_; rep2datefmt[REP_WEEK] = weekfmt_; rep2datefmt[REP_MONTH] = monthfmt_; rep2datefmt[REP_QUARTERLY] = quarterlyfmt_; rep2datefmt[REP_YEAR] = yearfmt_; rep2datefmt[REP_HOURSUM] = hoursumfmt_; rep2datefmt[REP_WEEKHOUR] = weekhoursumfmt_; rep2datefmt[REP_QUARTERSUM] = quartersumfmt_; rep2datefmt[REP_FIVESUM] = quartersumfmt_; rep2colhead = (unsigned int *)xmalloc(REP_NUMBER * sizeof(unsigned int)); rep2colhead[REP_DAYREP] = date_; rep2colhead[REP_DAYSUM] = day_; rep2colhead[REP_HOURREP] = time_; rep2colhead[REP_HOURSUM] = hr_; rep2colhead[REP_WEEKHOUR] = hr_; rep2colhead[REP_QUARTERREP] = time_; rep2colhead[REP_QUARTERSUM] = time_; rep2colhead[REP_FIVEREP] = time_; rep2colhead[REP_FIVESUM] = time_; rep2colhead[REP_WEEK] = weekbeg_; rep2colhead[REP_MONTH] = month_; rep2colhead[REP_QUARTERLY] = quarteryr_; rep2colhead[REP_YEAR] = year_; rep2colhead[REP_REQ] = file_; rep2colhead[REP_REDIR] = file_; rep2colhead[REP_FAIL] = file_; rep2colhead[REP_TYPE] = ext_; rep2colhead[REP_SIZE] = size_; rep2colhead[REP_PROCTIME] = seconds_; rep2colhead[REP_DIR] = dir_; rep2colhead[REP_HOST] = host_; rep2colhead[REP_REDIRHOST] = host_; rep2colhead[REP_FAILHOST] = host_; rep2colhead[REP_DOM] = dom_; rep2colhead[REP_ORG] = org_; rep2colhead[REP_REF] = url_; rep2colhead[REP_REFSITE] = site_; rep2colhead[REP_REDIRREF] = url_; rep2colhead[REP_FAILREF] = url_; rep2colhead[REP_BROWREP] = browser_; rep2colhead[REP_BROWSUM] = browser_; rep2colhead[REP_OS] = os_; rep2colhead[REP_VHOST] = vhost_; rep2colhead[REP_REDIRVHOST] = vhost_; rep2colhead[REP_FAILVHOST] = vhost_; rep2colhead[REP_USER] = user_; rep2colhead[REP_REDIRUSER] = user_; rep2colhead[REP_FAILUSER] = user_; rep2colhead[REP_SEARCHREP] = search_; rep2colhead[REP_SEARCHSUM] = search_; rep2colhead[REP_INTSEARCHREP] = search_; rep2colhead[REP_INTSEARCHSUM] = search_; rep2colhead[REP_CODE] = code_; rep2busystr = (unsigned int *)xmalloc(DATEREPORTS_NUMBER * sizeof(unsigned int)); rep2busystr[REP_DAYREP] = busyday_; rep2busystr[REP_HOURREP] = busyhour_; rep2busystr[REP_QUARTERREP] = busyquarterhr_; rep2busystr[REP_FIVEREP] = busyfive_; rep2busystr[REP_WEEK] = busyweek_; rep2busystr[REP_MONTH] = busymonth_; rep2busystr[REP_QUARTERLY] = busyquarteryr_; rep2busystr[REP_YEAR] = busyyear_; col2colhead = (unsigned int *)xmalloc(COL_NUMBER * sizeof(unsigned int)); col2colhead[COL_REQS] = nreqs_; col2colhead[COL_PAGES] = npgs_; col2colhead[COL_BYTES] = nbytes_; col2colhead[COL_PREQS] = preqs_; col2colhead[COL_PPAGES] = ppgs_; col2colhead[COL_PBYTES] = pbytes_; col2colhead[COL_REQS7] = nreqs7_; col2colhead[COL_PAGES7] = npgs7_; col2colhead[COL_BYTES7] = nbytes7_; col2colhead[COL_PREQS7] = preqs7_; col2colhead[COL_PPAGES7] = ppgs7_; col2colhead[COL_PBYTES7] = pbytes7_; col2colhead[COL_DATE] = lastdate_; col2colhead[COL_TIME] = lasttime_; col2colhead[COL_FIRSTD] = firstdate_; col2colhead[COL_FIRSTT] = firsttime_; col2colhead[COL_INDEX] = index_; method2sing = (unsigned int *)xmalloc(METHOD_NUMBER * sizeof(unsigned int)); method2sing[REQUESTS] = request_; method2sing[REQUESTS7] = request7_; method2sing[PAGES] = pagereq_; method2sing[PAGES7] = pagereq7_; method2sing[REDIR] = redirreq_; method2sing[REDIR7] = redirreq7_; method2sing[FAIL] = failreq_; method2sing[FAIL7] = failreq7_; method2sing[BYTES] = bytetraffic_; method2sing[BYTES7] = bytetraffic7_; method2pl = (unsigned int *)xmalloc(METHOD_NUMBER * sizeof(unsigned int)); method2pl[REQUESTS] = requests_; method2pl[REQUESTS7] = requests7_; method2pl[PAGES] = pagereqs_; method2pl[PAGES7] = pagereqs7_; method2pl[REDIR] = redirreqs_; method2pl[REDIR7] = redirreqs7_; method2pl[FAIL] = failreqs_; method2pl[FAIL7] = failreqs7_; method2pl[BYTES] = bytestraffic_; method2pl[BYTES7] = bytestraffic7_; method2date = (unsigned int *)xmalloc(METHOD_NUMBER * sizeof(unsigned int)); method2date[SUCCDATE] = sincedate_; method2date[REDIRDATE] = sinceredirdate_; method2date[FAILDATE] = sincefaildate_; method2date[SUCCFIRSTD] = sincefirstd_; method2date[REDIRFIRSTD] = sinceredirfirstd_; method2date[FAILFIRSTD] = sincefailfirstd_; method2pc = (unsigned int *)xmalloc(METHOD_NUMBER * sizeof(unsigned int)); method2pc[REQUESTS] = prequests_; method2pc[REQUESTS7] = prequests7_; method2pc[PAGES] = ppages_; method2pc[PAGES7] = ppages7_; method2pc[REDIR] = predirs_; method2pc[REDIR7] = predirs7_; method2pc[FAIL] = pfails_; method2pc[FAIL7] = pfails7_; method2pc[BYTES] = ptraffic_; method2pc[BYTES7] = ptraffic7_; method2relpc = (unsigned int *)xmalloc(METHOD_NUMBER * sizeof(unsigned int)); method2relpc[REQUESTS] = pmrequests_; method2relpc[REQUESTS7] = pmrequests7_; method2relpc[PAGES] = pmpages_; method2relpc[PAGES7] = pmpages7_; method2relpc[REDIR] = pmredirs_; method2relpc[REDIR7] = pmredirs7_; method2relpc[FAIL] = pmfails_; method2relpc[FAIL7] = pmfails7_; method2relpc[BYTES] = pmtraffic_; method2relpc[BYTES7] = pmtraffic7_; method2sort = (unsigned int *)xmalloc(METHOD_NUMBER * sizeof(unsigned int)); method2sort[REQUESTS] = nrequests_; method2sort[REQUESTS7] = nrequests7_; method2sort[PAGES] = npages_; method2sort[PAGES7] = npages7_; method2sort[REDIR] = nredirs_; method2sort[REDIR7] = nredirs7_; method2sort[FAIL] = nfails_; method2sort[FAIL7] = nfails7_; method2sort[SUCCDATE] = succdate_; method2sort[REDIRDATE] = redirdate_; method2sort[FAILDATE] = faildate_; method2sort[SUCCFIRSTD] = succfirstd_; method2sort[REDIRFIRSTD] = redirfirstd_; method2sort[FAILFIRSTD] = failfirstd_; method2sort[BYTES] = traffic_; method2sort[BYTES7] = traffic7_; } void defaults(Options *op) { double codethresh[] = {100., 101., 199., 200., 201., 202., 203., 204., 205., 206., 299., 300., 301., 302., 303., 304., 305., 306., 307., 399., 400., 401., 402., 403., 404., 405., 406., 407., 408., 409., 410., 411., 412., 413., 414., 415., 416., 417., 499., 500., 501., 502., 503., 504., 505., 506., 599., -1.}; double sizethresh[] = {0., 10., 100., 1024., 10240., 102400., 1048576., 10485760., 104857600., 1073741824., -1.}; double ptthresh[] = {0., 10., 20., 50., 100., 200., 500., 1000., 2000., 5000., 10000., 20000., 60000., 120000., 300000., 600000., -1.}; /* These thresholds have to be coordinated with the names in arrayrep(). The max codethresh & ptthresh also feature near the end of readcache(). */ double *thresh; int i, j, k; op->conffilelist = NULL; confline(op, "DEBUG", "OFF", NULL, -1); confline(op, "WARNINGS", "ON", NULL, -1); op->outopts.gensumlines = NULL; confline(op, "GENSUMLINES", "ON", NULL, -1); deflogformat = (Inputformatlist *)submalloc(xmemman, sizeof(Inputformatlist)); logformat = (Inputformatlist *)submalloc(xmemman, sizeof(Inputformatlist)); deflogformat->used = TRUE; logformat->used = TRUE; configlogfmt((void *)&deflogformat, "DEFAULTLOGFORMAT", "AUTO", NULL, -1); configlogfmt((void *)&logformat, "LOGFORMAT", "DEFAULT", NULL, -1); deflogformat->used = TRUE; op->miscopts.logfile[0] = NULL; op->miscopts.logfile[1] = NULL; confline(op, "LOGFILE", LOGFILE, NULL, -1); confline(op, "CACHEFILE", CACHEFILE, NULL, -1); op->outopts.domainsfile = NULL; op->outopts.descfile = NULL; COPYSTR(op->miscopts.dirsuffix, DIRSUFFIX); #ifndef NODNS dnslevel = DNS; dnsgoodhrs = DNSGOODHOURS; dnsbadhrs = DNSBADHOURS; COPYSTR(dnsfile, DNSFILE); COPYSTR(dnslockfile, DNSLOCKFILE); #ifndef NOALARM dnstimeout = DNSTIMEOUT; #endif #endif op->miscopts.case_insensitive = CASE_INSENSITIVE; op->miscopts.usercase_insensitive = USERCASE_INSENSITIVE; op->outopts.searchconv = SEARCHCHARCONVERT; op->outopts.outstyle = OUTPUT; op->outopts.html = TRUE; op->outopts.pdflatex = TRUE; COPYSTR(op->outopts.headerfile, HEADERFILE); COPYSTR(op->outopts.footerfile, FOOTERFILE); COPYSTR(op->outopts.outfile, OUTFILE); COPYSTR(op->outopts.cacheoutfile, CACHEOUTFILE); COPYSTR(op->outopts.imagedir, IMAGEDIR); op->outopts.chartdir = NULL; op->outopts.localchartdir = NULL; op->outopts.jpegcharts = FALSE; op->outopts.pngimages = PNGIMAGES; confline(op, "YEARCOLS", YEARCOLS, NULL, -1); confline(op, "QUARTERLYCOLS", QUARTERLYCOLS, NULL, -1); confline(op, "MONTHCOLS", MONTHCOLS, NULL, -1); confline(op, "WEEKCOLS", WEEKCOLS, NULL, -1); confline(op, "DAYREPCOLS", DAYREPCOLS, NULL, -1); confline(op, "DAYSUMCOLS", DAYSUMCOLS, NULL, -1); confline(op, "HOURREPCOLS", HOURREPCOLS, NULL, -1); confline(op, "HOURSUMCOLS", HOURSUMCOLS, NULL, -1); confline(op, "WEEKHOURCOLS", WEEKHOURCOLS, NULL, -1); confline(op, "QUARTERREPCOLS", QUARTERREPCOLS, NULL, -1); confline(op, "QUARTERSUMCOLS", QUARTERSUMCOLS, NULL, -1); confline(op, "FIVEREPCOLS", FIVEREPCOLS, NULL, -1); confline(op, "FIVESUMCOLS", FIVESUMCOLS, NULL, -1); confline(op, "REQCOLS", REQCOLS, NULL, -1); confline(op, "REDIRCOLS", REDIRCOLS, NULL, -1); confline(op, "FAILCOLS", FAILCOLS, NULL, -1); confline(op, "TYPECOLS", TYPECOLS, NULL, -1); confline(op, "SIZECOLS", SIZECOLS, NULL, -1); confline(op, "PROCTIMECOLS", PROCTIMECOLS, NULL, -1); confline(op, "DIRCOLS", DIRCOLS, NULL, -1); confline(op, "HOSTCOLS", HOSTCOLS, NULL, -1); confline(op, "REDIRHOSTCOLS", REDIRHOSTCOLS, NULL, -1); confline(op, "FAILHOSTCOLS", FAILHOSTCOLS, NULL, -1); confline(op, "DOMCOLS", DOMCOLS, NULL, -1); confline(op, "ORGCOLS", ORGCOLS, NULL, -1); confline(op, "REFCOLS", REFCOLS, NULL, -1); confline(op, "REFSITECOLS", REFSITECOLS, NULL, -1); confline(op, "REDIRREFCOLS", REDIRREFCOLS, NULL, -1); confline(op, "FAILREFCOLS", FAILREFCOLS, NULL, -1); confline(op, "BROWREPCOLS", BROWREPCOLS, NULL, -1); confline(op, "BROWSUMCOLS", BROWSUMCOLS, NULL, -1); confline(op, "OSCOLS", OSCOLS, NULL, -1); confline(op, "VHOSTCOLS", VHOSTCOLS, NULL, -1); confline(op, "REDIRVHOSTCOLS", REDIRVHOSTCOLS, NULL, -1); confline(op, "FAILVHOSTCOLS", FAILVHOSTCOLS, NULL, -1); confline(op, "USERCOLS", USERCOLS, NULL, -1); confline(op, "REDIRUSERCOLS", REDIRUSERCOLS, NULL, -1); confline(op, "FAILUSERCOLS", FAILUSERCOLS, NULL, -1); confline(op, "SEARCHQUERYCOLS", SEARCHQUERYCOLS, NULL, -1); confline(op, "SEARCHWORDCOLS", SEARCHWORDCOLS, NULL, -1); confline(op, "INTSEARCHQUERYCOLS", INTSEARCHQUERYCOLS, NULL, -1); confline(op, "INTSEARCHWORDCOLS", INTSEARCHWORDCOLS, NULL, -1); confline(op, "STATUSCOLS", STATUSCOLS, NULL, -1); op->outopts.repq[REP_YEAR] = YEARLY; op->outopts.repq[REP_QUARTERLY] = QUARTERLY; op->outopts.repq[REP_MONTH] = MONTHLY; op->outopts.repq[REP_WEEK] = WEEKLY; op->outopts.repq[REP_DAYREP] = DAILYREP; op->outopts.repq[REP_DAYSUM] = DAILYSUM; op->outopts.repq[REP_HOURREP] = HOURLYREP; op->outopts.repq[REP_HOURSUM] = HOURLYSUM; op->outopts.repq[REP_WEEKHOUR] = WEEKHOUR; op->outopts.repq[REP_QUARTERREP] = QUARTERREP; op->outopts.repq[REP_QUARTERSUM] = QUARTERSUM; op->outopts.repq[REP_FIVEREP] = FIVEREP; op->outopts.repq[REP_FIVESUM] = FIVESUM; op->outopts.repq[REP_GENSUM] = GENERAL; op->outopts.repq[REP_REQ] = REQUEST; op->outopts.repq[REP_REDIR] = REDIRREP; op->outopts.repq[REP_FAIL] = FAILREP; op->outopts.repq[REP_TYPE] = FILETYPE; op->outopts.repq[REP_SIZE] = SIZEREP; op->outopts.repq[REP_PROCTIME] = PROCTIME; op->outopts.repq[REP_DIR] = DIRECTORY; op->outopts.repq[REP_HOST] = HOST; op->outopts.repq[REP_REDIRHOST] = REDIRHOST; op->outopts.repq[REP_FAILHOST] = FAILHOST; op->outopts.repq[REP_DOM] = DOMAINREP; op->outopts.repq[REP_ORG] = ORGANISATION; op->outopts.repq[REP_REF] = REFERRER; op->outopts.repq[REP_REFSITE] = REFSITE; op->outopts.repq[REP_REDIRREF] = REDIRREF; op->outopts.repq[REP_FAILREF] = FAILREF; op->outopts.repq[REP_BROWREP] = BROWSERREP; op->outopts.repq[REP_BROWSUM] = BROWSERSUM; op->outopts.repq[REP_OS] = OSREP; op->outopts.repq[REP_VHOST] = VHOST; op->outopts.repq[REP_REDIRVHOST] = REDIRVHOST; op->outopts.repq[REP_FAILVHOST] = FAILVHOST; op->outopts.repq[REP_USER] = USER; op->outopts.repq[REP_REDIRUSER] = REDIRUSER; op->outopts.repq[REP_FAILUSER] = FAILUSER; op->outopts.repq[REP_SEARCHREP] = SEARCHQUERY; op->outopts.repq[REP_SEARCHSUM] = SEARCHWORD; op->outopts.repq[REP_INTSEARCHREP] = INTSEARCHQUERY; op->outopts.repq[REP_INTSEARCHSUM] = INTSEARCHWORD; op->outopts.repq[REP_CODE] = STATUS; op->outopts.last7 = LASTSEVEN; op->outopts.runtime = RUNTIME; op->outopts.gotos = GOTOS; op->outopts.repspan = REPORTSPAN; op->outopts.rsthresh = REPORTSPANTHRESHOLD; op->outopts.descriptions = DESCRIPTIONS; op->outopts.lang.code = LANGUAGE; op->outopts.lang.file = NULL; op->outopts.graph[REP_YEAR] = YEARGRAPH; op->outopts.graph[REP_QUARTERLY] = QUARTERLYGRAPH; op->outopts.graph[REP_MONTH] = MONTHGRAPH; op->outopts.graph[REP_WEEK] = WEEKGRAPH; op->outopts.graph[REP_DAYREP] = DAYREPGRAPH; op->outopts.graph[REP_DAYSUM] = DAYSUMGRAPH; op->outopts.graph[REP_HOURREP] = HOURREPGRAPH; op->outopts.graph[REP_HOURSUM] = HOURSUMGRAPH; op->outopts.graph[REP_WEEKHOUR] = WEEKHOURGRAPH; op->outopts.graph[REP_QUARTERREP] = QUARTERREPGRAPH; op->outopts.graph[REP_QUARTERSUM] = QUARTERSUMGRAPH; op->outopts.graph[REP_FIVEREP] = FIVEREPGRAPH; op->outopts.graph[REP_FIVESUM] = FIVESUMGRAPH; op->outopts.back[REP_YEAR] = YEARBACK; op->outopts.back[REP_QUARTERLY] = QUARTERLYBACK; op->outopts.back[REP_MONTH] = MONTHBACK; op->outopts.back[REP_WEEK] = WEEKBACK; op->outopts.back[REP_DAYREP] = DAYBACK; op->outopts.back[REP_HOURREP] = HOURBACK; op->outopts.back[REP_QUARTERREP] = QUARTERBACK; op->outopts.back[REP_FIVEREP] = FIVEBACK; op->outopts.rows[REP_YEAR] = YEARROWS; op->outopts.rows[REP_QUARTERLY] = QUARTERLYROWS; op->outopts.rows[REP_MONTH] = MONTHROWS; op->outopts.rows[REP_WEEK] = WEEKROWS; op->outopts.rows[REP_DAYREP] = DAYROWS; op->outopts.rows[REP_HOURREP] = HOURROWS; op->outopts.rows[REP_QUARTERREP] = QUARTERROWS; op->outopts.rows[REP_FIVEREP] = FIVEROWS; #ifndef NOGRAPHICS op->outopts.chartby[G(REP_REQ)] = REQCHART; op->outopts.chartby[G(REP_REDIR)] = REDIRCHART; op->outopts.chartby[G(REP_FAIL)] = FAILCHART; op->outopts.chartby[G(REP_TYPE)] = TYPECHART; op->outopts.chartby[G(REP_DIR)] = DIRCHART; op->outopts.chartby[G(REP_HOST)] = HOSTCHART; op->outopts.chartby[G(REP_REDIRHOST)] = REDIRHOSTCHART; op->outopts.chartby[G(REP_FAILHOST)] = FAILHOSTCHART; op->outopts.chartby[G(REP_DOM)] = DOMCHART; op->outopts.chartby[G(REP_REF)] = REFCHART; op->outopts.chartby[G(REP_REFSITE)] = REFSITECHART; op->outopts.chartby[G(REP_REDIRREF)] = REDIRREFCHART; op->outopts.chartby[G(REP_FAILREF)] = FAILREFCHART; op->outopts.chartby[G(REP_BROWREP)] = BROWREPCHART; op->outopts.chartby[G(REP_VHOST)] = VHOSTCHART; op->outopts.chartby[G(REP_REDIRVHOST)] = REDIRVHOSTCHART; op->outopts.chartby[G(REP_FAILVHOST)] = FAILVHOSTCHART; op->outopts.chartby[G(REP_USER)] = USERCHART; op->outopts.chartby[G(REP_REDIRUSER)] = REDIRUSERCHART; op->outopts.chartby[G(REP_FAILUSER)] = FAILUSERCHART; op->outopts.chartby[G(REP_ORG)] = ORGCHART; op->outopts.chartby[G(REP_SEARCHREP)] = SEARCHQUERYCHART; op->outopts.chartby[G(REP_SEARCHSUM)] = SEARCHWORDCHART; op->outopts.chartby[G(REP_INTSEARCHREP)] = INTSEARCHQUERYCHART; op->outopts.chartby[G(REP_INTSEARCHSUM)] = INTSEARCHWORDCHART; op->outopts.chartby[G(REP_BROWSUM)] = BROWSUMCHART; op->outopts.chartby[G(REP_OS)] = OSCHART; op->outopts.chartby[G(REP_SIZE)] = SIZECHART; op->outopts.chartby[G(REP_CODE)] = STATUSCHART; op->outopts.chartby[G(REP_PROCTIME)] = PROCTIMECHART; #else for (i = 0; i < GENREP_NUMBER; i++) op->outopts.chartby[i] = CHART_NONE;/* to avoid recording spurious stuff */ #endif /* NOGRAPHICS */ for (i = 0; i < GENREP_NUMBER; i++) { /* initialise all SUBSORTBYs to UNSET. Then we can use this later as a test for whether the report is a hierarchical report. Also set all SUBFLOOR methods to UNSET so that we don't count any unneeded data by mistake. */ op->outopts.subsortby[i] = UNSET; op->outopts.subfloor[i].floorby = UNSET; } op->outopts.sortby[G(REP_REQ)] = REQSORTBY; op->outopts.subsortby[G(REP_REQ)] = REQSORTBY; op->outopts.sortby[G(REP_REDIR)] = REDIRSORTBY; op->outopts.subsortby[G(REP_REDIR)] = REDIRSORTBY; op->outopts.sortby[G(REP_FAIL)] = FAILSORTBY; op->outopts.subsortby[G(REP_FAIL)] = FAILSORTBY; op->outopts.sortby[G(REP_TYPE)] = TYPESORTBY; op->outopts.subsortby[G(REP_TYPE)] = TYPESORTBY; op->outopts.sortby[G(REP_DIR)] = DIRSORTBY; op->outopts.subsortby[G(REP_DIR)] = DIRSORTBY; op->outopts.sortby[G(REP_HOST)] = HOSTSORTBY; op->outopts.sortby[G(REP_REDIRHOST)] = REDIRHOSTSORTBY; op->outopts.sortby[G(REP_FAILHOST)] = FAILHOSTSORTBY; op->outopts.sortby[G(REP_DOM)] = DOMSORTBY; op->outopts.subsortby[G(REP_DOM)] = DOMSORTBY; op->outopts.sortby[G(REP_ORG)] = ORGSORTBY; op->outopts.subsortby[G(REP_ORG)] = ORGSORTBY; op->outopts.sortby[G(REP_REF)] = REFSORTBY; op->outopts.subsortby[G(REP_REF)] = REFSORTBY; op->outopts.sortby[G(REP_REFSITE)] = REFSITESORTBY; op->outopts.subsortby[G(REP_REFSITE)] = REFSITESORTBY; op->outopts.sortby[G(REP_REDIRREF)] = REDIRREFSORTBY; op->outopts.subsortby[G(REP_REDIRREF)] = REDIRREFSORTBY; op->outopts.sortby[G(REP_FAILREF)] = FAILREFSORTBY; op->outopts.subsortby[G(REP_FAILREF)] = FAILREFSORTBY; op->outopts.sortby[G(REP_BROWREP)] = BROWREPSORTBY; op->outopts.sortby[G(REP_BROWSUM)] = BROWSUMSORTBY; op->outopts.subsortby[G(REP_BROWSUM)] = BROWSUMSORTBY; op->outopts.sortby[G(REP_OS)] = OSSORTBY; op->outopts.subsortby[G(REP_OS)] = OSSORTBY; op->outopts.sortby[G(REP_VHOST)] = VHOSTSORTBY; op->outopts.sortby[G(REP_REDIRVHOST)] = REDIRVHOSTSORTBY; op->outopts.sortby[G(REP_FAILVHOST)] = FAILVHOSTSORTBY; op->outopts.sortby[G(REP_USER)] = USERSORTBY; op->outopts.sortby[G(REP_REDIRUSER)] = REDIRUSERSORTBY; op->outopts.sortby[G(REP_FAILUSER)] = FAILUSERSORTBY; op->outopts.sortby[G(REP_SEARCHREP)] = SEARCHQUERYSORTBY; op->outopts.sortby[G(REP_SEARCHSUM)] = SEARCHWORDSORTBY; op->outopts.sortby[G(REP_INTSEARCHREP)] = INTSEARCHQUERYSORTBY; op->outopts.sortby[G(REP_INTSEARCHSUM)] = INTSEARCHWORDSORTBY; op->outopts.sortby[G(REP_CODE)] = STATUSSORTBY; op->outopts.sortby[G(REP_SIZE)] = ALPHABETICAL; op->outopts.sortby[G(REP_PROCTIME)] = ALPHABETICAL; confline(op, "REQFLOOR", REQFLOOR, NULL, -1); confline(op, "REQARGSFLOOR", REQARGSFLOOR, NULL, -1); confline(op, "REDIRFLOOR", REDIRFLOOR, NULL, -1); confline(op, "REDIRARGSFLOOR", REDIRARGSFLOOR, NULL, -1); confline(op, "FAILFLOOR", FAILFLOOR, NULL, -1); confline(op, "FAILARGSFLOOR", FAILARGSFLOOR, NULL, -1); confline(op, "TYPEFLOOR", TYPEFLOOR, NULL, -1); confline(op, "SUBTYPEFLOOR", SUBTYPEFLOOR, NULL, -1); confline(op, "DIRFLOOR", DIRFLOOR, NULL, -1); confline(op, "SUBDIRFLOOR", SUBDIRFLOOR, NULL, -1); confline(op, "HOSTFLOOR", HOSTFLOOR, NULL, -1); confline(op, "REDIRHOSTFLOOR", REDIRHOSTFLOOR, NULL, -1); confline(op, "FAILHOSTFLOOR", FAILHOSTFLOOR, NULL, -1); confline(op, "DOMFLOOR", DOMFLOOR, NULL, -1); confline(op, "SUBDOMFLOOR", SUBDOMFLOOR, NULL, -1); confline(op, "ORGFLOOR", ORGFLOOR, NULL, -1); confline(op, "SUBORGFLOOR", SUBORGFLOOR, NULL, -1); confline(op, "REFFLOOR", REFFLOOR, NULL, -1); confline(op, "REFARGSFLOOR", REFARGSFLOOR, NULL, -1); confline(op, "REFSITEFLOOR", REFSITEFLOOR, NULL, -1); confline(op, "REFDIRFLOOR", REFDIRFLOOR, NULL, -1); confline(op, "REDIRREFFLOOR", REDIRREFFLOOR, NULL, -1); confline(op, "REDIRREFARGSFLOOR", REDIRREFARGSFLOOR, NULL, -1); confline(op, "FAILREFFLOOR", FAILREFFLOOR, NULL, -1); confline(op, "FAILREFARGSFLOOR", FAILREFARGSFLOOR, NULL, -1); confline(op, "BROWREPFLOOR", BROWREPFLOOR, NULL, -1); confline(op, "BROWSUMFLOOR", BROWSUMFLOOR, NULL, -1); confline(op, "SUBBROWFLOOR", SUBBROWFLOOR, NULL, -1); confline(op, "OSFLOOR", OSFLOOR, NULL, -1); confline(op, "SUBOSFLOOR", SUBOSFLOOR, NULL, -1); confline(op, "VHOSTFLOOR", VHOSTFLOOR, NULL, -1); confline(op, "REDIRVHOSTFLOOR", REDIRVHOSTFLOOR, NULL, -1); confline(op, "FAILVHOSTFLOOR", FAILVHOSTFLOOR, NULL, -1); confline(op, "USERFLOOR", USERFLOOR, NULL, -1); confline(op, "REDIRUSERFLOOR", REDIRUSERFLOOR, NULL, -1); confline(op, "FAILUSERFLOOR", FAILUSERFLOOR, NULL, -1); confline(op, "SEARCHQUERYFLOOR", SEARCHQUERYFLOOR, NULL, -1); confline(op, "SEARCHWORDFLOOR", SEARCHWORDFLOOR, NULL, -1); confline(op, "INTSEARCHQUERYFLOOR", INTSEARCHQUERYFLOOR, NULL, -1); confline(op, "INTSEARCHWORDFLOOR", INTSEARCHWORDFLOOR, NULL, -1); confline(op, "STATUSFLOOR", STATUSFLOOR, NULL, -1); confline(op, "REPORTORDER", REPORTORDER, NULL, -1); op->outopts.barstyle = BARSTYLE; op->outopts.markchar = MARKCHAR; op->outopts.rawbytes = RAWBYTES; op->outopts.bytesdp = BYTESDP; op->outopts.norobots = NOROBOTS; COPYSTR(op->outopts.hostname, HOSTNAME); COPYSTR(op->outopts.hosturl, HOSTURL); op->outopts.baseurl = NULL; COPYSTR(op->outopts.logo, LOGO); COPYSTR(op->outopts.logourl, LOGOURL); COPYSTR(op->outopts.stylesheet, STYLESHEET); COPYSTR(op->outopts.cssprefix, CSSPREFIX); op->outopts.weekbeginson = WEEKBEGINSON; op->outopts.plainpagewidth = PLAINPAGEWIDTH; op->outopts.htmlpagewidth = HTMLPAGEWIDTH; op->outopts.latexpagewidth = LATEXPAGEWIDTH; op->outopts.mingraphwidth = MINGRAPHWIDTH; op->outopts.sepchar = (char)UNSET; op->outopts.repsepchar = (char)UNSET; op->outopts.decpt = (char)UNSET; COPYSTR(op->outopts.compsep, COMPSEP); for (i = 0; i < GENREP_NUMBER; i++) { op->outopts.link[i] = NULL; op->outopts.wanthead[i] = NULL; op->outopts.aliashead[i] = NULL; op->outopts.expandhead[i] = NULL; op->outopts.tree[i] = (Tree *)xmalloc(sizeof(Tree)); op->outopts.tree[i]->tree = NULL; op->outopts.tree[i]->space = (Memman *)xmalloc(sizeof(Memman)); op->outopts.tree[i]->space->curr_pos = NULL; op->outopts.tree[i]->space->first = NULL; op->outopts.tree[i]->space->alignment = ALIGNSIZE; } domlevels = (Strpairlist **)xmalloc(DOMLEVEL_NUMBER * sizeof(Strpairlist *)); for (i = 0; i < DOMLEVEL_NUMBER; i++) domlevels[i] = NULL; op->outopts.tree[G(REP_REQ)]->cutfn = &rnextname; op->outopts.tree[G(REP_REDIR)]->cutfn = &rnextname; op->outopts.tree[G(REP_FAIL)]->cutfn = &rnextname; op->outopts.tree[G(REP_REF)]->cutfn = &rnextname; op->outopts.tree[G(REP_REDIRREF)]->cutfn = &rnextname; op->outopts.tree[G(REP_FAILREF)]->cutfn = &rnextname; op->outopts.tree[G(REP_TYPE)]->cutfn = &tnextname; op->outopts.tree[G(REP_DIR)]->cutfn = &inextname; op->outopts.tree[G(REP_DOM)]->cutfn = &onextname; op->outopts.tree[G(REP_REFSITE)]->cutfn = &snextname; op->outopts.tree[G(REP_BROWSUM)]->cutfn = &bnextname; op->outopts.tree[G(REP_OS)]->cutfn = &pnextname; op->outopts.tree[G(REP_ORG)]->cutfn = &Znextname; for (i = 0; i < DERVREP_NUMBER; i++) { op->outopts.derv[i] = (Derv *)xmalloc(sizeof(Derv)); op->outopts.derv[i]->table = rehash(NULL, HASHSIZE, NULL); op->outopts.derv[i]->space = (Memman *)xmalloc(sizeof(Memman)); op->outopts.derv[i]->space->curr_pos = NULL; op->outopts.derv[i]->space->first = NULL; op->outopts.derv[i]->space->alignment = 1; } op->outopts.derv[REP_SEARCHREP - FIRST_DERVREP]->cutfn = &Nnextname; op->outopts.derv[REP_SEARCHSUM - FIRST_DERVREP]->cutfn = &nnextname; op->outopts.derv[REP_INTSEARCHREP - FIRST_DERVREP]->cutfn = &Nnextname; op->outopts.derv[REP_INTSEARCHSUM - FIRST_DERVREP]->cutfn = &nnextname; op->outopts.derv[REP_BROWSUM - FIRST_DERVREP]->cutfn = &Bnextname; op->outopts.derv[REP_OS - FIRST_DERVREP]->cutfn = &Pnextname; /* derv[*]->arg is set in finalinit so that lists of search engines and robots have already been read in */ op->outopts.suborgs = NULL; for (i = 0; i < LOGDATA_NUMBER; i++) op->miscopts.data[i] = 0; op->miscopts.bytes = 0.0; op->miscopts.bytes7 = 0.0; confline(op, "REQARGS", "*?*", NULL, -1); confline(op, "REDIRARGS", "*?*", NULL, -1); confline(op, "FAILARGS", "*?*", NULL, -1); confline(op, "REFARGS", "*?*", NULL, -1); confline(op, "REDIRREFARGS", "*?*", NULL, -1); confline(op, "FAILREFARGS", "*?*", NULL, -1); confline(op, "SUBDOMAIN", "*", NULL, -1); confline(op, "SUBORG2", "*", NULL, -1); confline(op, "SUBDIR", "*", NULL, -1); confline(op, "SUBTYPE", "*", NULL, -1); confline(op, "REFDIR", "*", NULL, -1); confline(op, "SUBBROW", "*", NULL, -1); confline(op, "SUBOS", "*:*", NULL, -1); for (i = 0; i < ITEM_NUMBER; i++) { op->wanthead[i] = NULL; op->aliashead[i] = NULL; op->hash[i] = rehash(NULL, HASHSIZE, NULL); op->miscopts.lowmem[i] = 0; } for (i = 0; i < MIN_SC; i++) op->code2type[i] = UNWANTED; for ( ; i < SC_NUMBER; i++) op->code2type[i] = UNSET; op->code2type[0] = UNSET; /* code2type[0] used as a special marker in ... */ op->succ304 = TRUE; /* ... configsinex(), correctlogfmt() & finalinit() */ for (i = 0; i < ARRAYREP_NUMBER; i++) { if (i == REP_CODE - FIRST_ARRAYREP) thresh = codethresh; else if (i == REP_SIZE - FIRST_ARRAYREP) thresh = sizethresh; else thresh = ptthresh; for (k = 0; thresh[k] > -0.5; k++) ; /* find size of array */ k++; op->arraydata[i] = (Arraydata *)xmalloc(k * sizeof(Arraydata)); for (j = 0; j < k; j++) { op->arraydata[i][j].threshold = thresh[j]; op->arraydata[i][j].reqs = 0; op->arraydata[i][j].pages = 0; op->arraydata[i][j].bytes = 0.0; op->arraydata[i][j].reqs7 = 0; op->arraydata[i][j].pages7 = 0; op->arraydata[i][j].bytes7 = 0.0; op->arraydata[i][j].lastdate = 0; op->arraydata[i][j].firstdate = LAST_TIME; } } op->searchengines = NULL; op->intsearchengines = NULL; op->robots = NULL; op->ispagehead = NULL; op->argshead = NULL; op->refargshead = NULL; confline(op, "PAGEINCLUDE", "*/", NULL, -1); confline(op, "PAGEINCLUDE", "REGEXPI:\\.html?$", NULL, -1); op->dman.fromstr = NULL; op->dman.tostr = NULL; op->dman.currdp = NULL; op->dman.firstdp = NULL; op->dman.lastdp = NULL; op->dman.firsttime = LAST_TIME; op->dman.lasttime = FIRST_TIME; } analog-6.0/src/hash.c0000644000175000017500000002040210161303542014605 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** hash.c; the functions which do all the work in the hash tables. ***/ #include "anlghea3.h" Hashtable *rehash(Hashtable *old, unsigned long size, Memman *treespace) { /* Construct a new hash table out of an old one, using same buckets */ unsigned long i, magic; Hashindex *p, *nextp; Hashtable *ans; char *c; if (treespace != NULL && size * sizeof(Hashindex *) < BLOCKSIZE) { ans = (Hashtable *)submalloc(treespace, sizeof(Hashtable)); ans->head = (Hashindex **)submalloc(treespace, size * sizeof(Hashindex *)); } else { ans = (Hashtable *)xmalloc(sizeof(Hashtable)); ans->head = (Hashindex **)xmalloc(size * sizeof(Hashindex *)); } ans->size = size; ans->n = 0; for (i = 0; i < size; i++) ans->head[i] = NULL; if (old != NULL) { if (treespace != NULL) /* i.e. is tree */ ans->head[0] = old->head[0]; for (i = (unsigned long)(treespace != NULL); i < old->size; i++) { /* run through items in old table */ for (p = old->head[i]; p != NULL; p = nextp) { nextp = p->next; /* rehash p into new table */ if (treespace != NULL) { c = strchr(p->name, '\0'); MAGICNOTREE(magic, p->name, c, size); } else MAGICNO(magic, p->name, size); p->next = ans->head[magic]; ans->head[magic] = p; ans->n++; } } if (treespace == NULL || old->size * sizeof(Hashindex *) >= BLOCKSIZE) { /* free old table, if originally xmalloc'ed */ free((void *)(old->head)); free((void *)old); } } return(ans); } Hashindex *hashfind(Memman *mp, Hashtable **table, unsigned int data_number, Include *wanthead, choice ispage, Include *ispagehead, Alias *aliashead, char *dirsuffix, unsigned int dirsufflength, logical usercase_insensitive, unsigned char convfloor, logical multibyte, choice type, logical aliased) { /* NB The calling function will normally consult (lp->own) if aliased, (Hashentry *)(lp->other) if !aliased */ /* NB2 ispage != UNSET only if aliasing and in/excluding already done too */ /* If aliased, aliashead isn't used */ /* convfloor and multibyte only passed to do_alias, and only used if we are constructing the Search Word Report or Search Query Report */ extern Hashentry *unwanted_entry, *blank_entry; extern Memman *amemman, *xmemman; unsigned long magic; /* register'ing this made it slower on my machine */ Hashindex *lp, *lastlp; char *name, *c; choice rc; if (TOO_FULL((*table)->n, (*table)->size)) *table = rehash(*table, NEW_SIZE((*table)->size), NULL); name = (char *)(mp->curr_pos); MAGICNO(magic, name, (*table)->size); lp = (*table)->head[magic]; lastlp = NULL; while (TRUE) { if (lp == NULL) { /* need a new index entry */ lp = (Hashindex *)submalloc(xmemman, sizeof(Hashindex)); if (lastlp == NULL) (*table)->head[magic] = lp; else lastlp->next = lp; lp->name = name; lp->own = NULL; lp->other = NULL; lp->next = NULL; ((*table)->n)++; if (aliased) { if (ispage == UNSET) { ispage = (choice)pageq(name, ispagehead, type); if (included(name, (logical)ispage, wanthead)) lp->own = newhashentry(data_number, (logical)ispage); else lp->own = unwanted_entry; } else lp->own = newhashentry(data_number, (logical)ispage); } else { if ((rc = do_alias(lp->name, amemman, aliashead, dirsuffix, dirsufflength, usercase_insensitive, convfloor, multibyte, type)) == TRUE) lp->other = (void *)hashfind(amemman, table, data_number, wanthead, UNSET, ispagehead, NULL, dirsuffix, dirsufflength, usercase_insensitive, convfloor, multibyte, type, TRUE)->own; else if (rc == ERR) { if (included("", FALSE, wanthead)) { lp->own = blank_entry; lp->other = (void *)blank_entry; } else { lp->own = unwanted_entry; lp->other = (void *)unwanted_entry; } } else { ispage = (choice)pageq(name, ispagehead, type); if (included(name, (logical)ispage, wanthead)) { lp->own = newhashentry(data_number, (logical)ispage); lp->other = (void *)(lp->own); } else { lp->own = unwanted_entry; lp->other = (void *)unwanted_entry; } } } /* end !aliased */ return(lp); } /* end need new entry */ else if (STREQ(lp->name, name)) { /* found it */ mp->next_pos = mp->curr_pos; /* overwrites old name in mp */ if (aliased) { if (lp->own == NULL) { /* haven't calculated lp->own yet */ if (ispage == UNSET) { if (type == ITEM_FILE) { if ((c = strchr(name, '?')) != NULL) { *c = '\0'; ispage = (choice)included(name, FALSE, ispagehead); *c = '?'; } else ispage = (choice)included(name, FALSE, ispagehead); } else ispage = FALSE; if (included(name, (logical)ispage, wanthead)) lp->own = newhashentry(data_number, (logical)ispage); else lp->own = unwanted_entry; } else lp->own = newhashentry(data_number, (logical)ispage); } } else { /* !aliased */ if (lp->other == NULL) { if ((rc = do_alias(lp->name, amemman, aliashead, dirsuffix, dirsufflength, usercase_insensitive, convfloor, multibyte, type)) == FALSE) lp->other = (void *)(lp->own); /* own must have been set because alias hasn't */ else if (rc == TRUE) lp->other = (void *)hashfind(amemman, table, data_number, wanthead, UNSET, ispagehead, NULL, dirsuffix, dirsufflength, usercase_insensitive, convfloor, multibyte, type, TRUE)->own; else /* rc == ERR */ if (included("", FALSE, wanthead)) lp->other = (void *)blank_entry; else lp->other = (void *)unwanted_entry; } } /* end !aliased */ return(lp); } /* end found it */ else { lastlp = lp; TO_NEXT(lp); } } } Hashentry *newhashentry(unsigned int data_number, logical ispage) { extern Memman *xmemman; Hashentry *ans; unsigned int i; ans = (Hashentry *)submalloc(xmemman, sizeof(Hashentry)); ans->data = (unsigned long *)submalloc(xmemman, data_number * sizeof(unsigned long)); for (i = 0; i < data_number; i++) ans->data[i] = 0; ans->bytes = 0.0; ans->bytes7 = 0.0; ans->ispage = ispage; ans->reused = TRUE; /* only used in tree.c: see newtreedata() there */ return(ans); } void hashscore(Hashentry *ep, unsigned long data[DATA2_NUMBER], choice datacols[DATACOLS_NUMBER][2], choice outcome, double bytes) { for ( ; **datacols >= 0; datacols++) { if ((*datacols)[1] == DATE2) ep->data[(*datacols)[0]] = MAX(ep->data[(*datacols)[0]], data[DATE2]); else if ((*datacols)[1] == FIRSTD2 && ep->data[(*datacols)[0]] != 0 && data[FIRSTD2] != 0) /* kludge for first entry: too hard to initialise the correct columns to LAST_TIME in newhashentry */ ep->data[(*datacols)[0]] = MIN(ep->data[(*datacols)[0]], data[FIRSTD2]); else ep->data[(*datacols)[0]] += data[(*datacols)[1]]; } if (outcome == SUCCESS) { ep->bytes += bytes; if (data[REQUESTS72] > 0) { ep->bytes7 += bytes; } } } void unhash(Hashtable *hash, Hashindex **gooditems, Hashindex **baditems) { Hashindex *p, *nextp; unsigned long j; *gooditems = NULL; *baditems = NULL; for (j = 0; j < hash->size; j++) { /* run through all items */ for (p = hash->head[j]; p != NULL; p = nextp) { nextp = p->next; p->next = *gooditems; /* compiling backwards is easier */ *gooditems = p; } } } void unhashall(Hashtable **hash, Hashindex ***gooditems, Hashindex ***baditems) { unsigned int i; *gooditems = (Hashindex **)xmalloc(ITEM_NUMBER * sizeof(Hashindex *)); *baditems = (Hashindex **)xmalloc(ITEM_NUMBER * sizeof(Hashindex *)); for (i = 0; i < ITEM_NUMBER; i++) { unhash(hash[i], &((*gooditems)[i]), &((*baditems)[i])); } } analog-6.0/src/init.c0000644000175000017500000020377410161303542014644 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** init.c; initialisation routines ***/ /* See also init2.c and globals.c */ #include "anlghea3.h" void initialise(int argc, char *argv[], Options *op) { #ifdef MAC_EVENTS MacInit(&argc, &argv); #endif #ifdef WIN32 Win32Init(); #endif globals(argv[0]); defaults(op); settings(op, argc, argv); correct(op); finalinit(op); } void confline(Options *op, char *cmd, char *arg1, char *arg2, int rc) { extern Options opts; extern Configfns cf[]; extern char *pos; char u[265]; /* see nextconfline() and uses of u below */ char *savepos; int i; logical done = FALSE; strtoupper(cmd); if (rc >= 2 && (STREQ(cmd, "SUBDOMAIN") || STREQ(cmd, "SUBDOM"))) { /* ugly but easy */ if (strchr(arg1, '*') != NULL) warn('C', TRUE, "Can't have * in first of two arguments to SUBDOMAIN: " "ignoring second argument"); else { sprintf(u, "PLAIN:%s (%s)", arg1, arg2); configalias((void *)&(op->outopts.aliashead[G(REP_DOM)]), "SUBDOMAIN", arg1, u, -1); } rc--; /* to avoid error message */ } for (i = 0; cf[i].fn != NULL && !done; i++) { if (STREQ(cmd, cf[i].name)) { /* I think memcpy is OK, but in case we call it recursively one day... */ memmove((void *)&opts, (void *)op, sizeof(Options)); cf[i].fn(cf[i].opt, cmd, arg1, arg2, rc); memmove((void *)op, (void *)&opts, sizeof(Options)); if (cf[i].fn == &configcall && rc != '\0' && !IS_EMPTY_STRING(arg1)) { savepos = pos; strcpy(u, arg1); /* or name will get obliterated before fclose */ (void)config(u, op, FALSE); pos = savepos; } done = TRUE; } } if (!done) unknownwarn(cmd, arg1, arg2); } choice config(char *filename, Options *op, logical fromcommandline) { extern Inputformatlist *logformat; extern char *pos; static int no_confs = 0; FILE *f; char *fullname, *cmd, *arg1, *arg2; int rc; if (fromcommandline || IS_STDIN(filename)) fullname = filename; else fullname = buildfilename(CONFIGDIR, "", filename); if ((f = my_fopen(fullname, "configuration file")) == NULL) return(ERR); if (no_confs++ >= MAX_CONFIGS) error("Attempted to read more than %d configuration files", MAX_CONFIGS); configstrlist((void *)&(op->conffilelist), "", fullname, NULL, -1); pos = NULL; while ((rc = nextconfline(f, &cmd, &arg1, &arg2)) != EOF) confline(op, cmd, arg1, arg2, rc); (void)my_fclose(f, fullname, "configuration file"); if (!(logformat->used)) warn('D', TRUE, "LOGFORMAT in configuration file %s with no subsequent LOGFILE", filename); configlogfmt((void *)&logformat, "LOGFORMAT", "DEFAULT", NULL, -1); return(OK); } void settings(Options *op, int argc, char *argv[]) { extern Inputformatlist *logformat; extern logical newloglist; int i; logical done; /* once through command line arguments to see if we just want help */ for (i = 0; i < argc; i++) { if (STREQ(argv[i], "-help") || STREQ(argv[i], "-version") || STREQ(argv[i], "--help") || STREQ(argv[i], "--version")) { fprintf(stderr, "This is analog version %s\n", VERSION); fprintf(stderr, "For help see docs/Readme.html, " #ifdef UNIX "or man analog, " #endif "or %s\n", ANALOGURL); my_exit(EXIT_SUCCESS); } } /* once through command line arguments to see if default config wanted */ newloglist = TRUE; if (!strcaseeq(DEFAULTCONFIGFILE, "none")) { for (i = argc - 1, done = FALSE; i >= 1 && !done; i--) { if (!IS_EMPTY_STRING(argv[i]) && argv[i][1] == 'G' && (argv[i][0] == '+' || argv[i][0] == '-')) { done = TRUE; CLLONGCHECK(if (argv[i][0] == '+') (void)config(DEFAULTCONFIGFILE, op, FALSE);) } } if (!done) (void)config(DEFAULTCONFIGFILE, op, FALSE); } /* now read in rest of command line arguments */ newloglist = TRUE; clargs(op, argc, argv); if (!(logformat->used)) warn('D', TRUE, "LOGFORMAT on command line with no subsequent logfile"); configlogfmt((void *)&logformat, "LOGFORMAT", "DEFAULT", NULL, -1); /* finally, read in mandatory config file, aborting if not found */ newloglist = TRUE; if (!strcaseeq(MANDATORYCONFIGFILE, "none") && config(MANDATORYCONFIGFILE, op, FALSE) == ERR) error("Cannot ignore mandatory configuration file"); } Inputformatlist *correctlogfmt(Logfile *lp, Include **wanthead, choice *code2type, Dateman *dman) { /* Here's a summary of what happens, minus several bells and whistles. At logfile parse time (strtoinfmt() below), fmt->count[ITEM] was set to 2 for counted items, 1 for starred items. Now if the item isn't wanted, its count is reduced to 1. Then if an item with count 1 is not filtered, its count is reduced to 0 and its %x is changed to %j. Filenames are special because whether a lot of other things get counted depend on the presence of a filename. If there are no items left with count 2, the whole logfile is ignored. */ extern choice wantitem[]; extern Inputfns inpfns[], pjinpfn; extern char *item_type[]; Inputformatlist *fmt; Inputformat *fns; logical noitem[ITEM_NUMBER], nodates, nocodes, nonames, nobytes; int count, i, j; for (count = 0, fmt = lp->format; fmt != NULL; TO_NEXT(fmt)) { if (!wantitem[INP_CODE] && fmt->count[INP_CODE] == 2) fmt->count[INP_CODE] = 1; if (!wantitem[INP_DATE] && fmt->count[INP_DATE] == 2) fmt->count[INP_DATE] = 1; /* NB read date even if not filtered */ for (fns = fmt->form; fns->inpfns != NULL; TO_NEXT(fns)) { for (i = 0; i < ITEMFNS_NUMBER; i++) { if (fns->inpfns == &inpfns[i]) { j = inpfns[i].type; if (!wantitem[j] && fmt->count[j] == 2 && !(j == ITEM_FILE && (fmt->count[INP_DATE] == 2 || fmt->count[INP_CODE] > 0 || fmt->count[INP_BYTES] > 0 || fmt->count[INP_PROCTIME] > 0))) fmt->count[j] = 1; if (wanthead[j] == NULL && fmt->count[j] == 1 && j != ITEM_FILE && !(j == ITEM_VHOST && lp->pvpos != UNSET)) { if (inpfns[i].fn != &parseref) fns->inpfns = &pjinpfn; fmt->count[j] = 0; } count += (int)(fmt->count[j] == 2); } } /* end for i through ITEMFNS */ if (fns->inpfns->fn == &parselogfmt) { count++; for (i = 0; i < INPUT_NUMBER; i++) fmt->count[i] = 1; /* just so doesn't trigger warnings below */ } } /* end for fns in fmt */ } /* end for fmt through formats */ if (count == 0) lp->format = NULL; /* i.e., mark logfile to be ignored */ else { for (i = 0; i < ITEM_NUMBER; i++) noitem[i] = FALSE; nodates = FALSE; nocodes = FALSE; nonames = FALSE; nobytes = FALSE; for (fmt = lp->format; fmt != NULL; TO_NEXT(fmt)) { for (count = 0, j = 0; j < INPUT_NUMBER; j++) count += (int)(fmt->count[j] == 2); if (count > 0) { for (i = 0; i < ITEM_NUMBER; i++) { if (fmt->count[i] == 0) noitem[i] = TRUE; } if (fmt->count[INP_DATE] == 0) nodates = TRUE; if (fmt->count[INP_CODE] == 0) nocodes = TRUE; if (fmt->count[ITEM_FILE] == 0) nonames = TRUE; if (fmt->count[INP_BYTES] == 0) nobytes = TRUE; } } for (i = 0; i < ITEM_NUMBER; i++) { if (wanthead[i] != NULL && noitem[i]) warn('M', TRUE, "Logfile %s contains lines with no %s, which are " "being filtered", lp->name, item_type[i]); } if (code2type[0] != UNSET && nocodes) warn('M', TRUE, "Logfile %s contains lines with no status codes, " "which are being filtered", lp->name); if ((dman->from > FIRST_TIME || dman->to < LAST_TIME) && nodates) warn('M', TRUE, "Logfile %s contains lines with no dates, which are " "being filtered", lp->name); if (nonames) warn('M', TRUE, "Logfile %s contains lines with no file names: " "page counts may be low", lp->name); if (nobytes) warn('M', TRUE, "Logfile %s contains lines with no bytes: byte counts " "may be low", lp->name); } return(lp->format); } void correct(Options *op) { extern time_t origstarttime, starttime; extern timecode_t starttimec; extern int stz; extern Inputformatlist *deflogformat; extern char *repname[], *methodname[]; extern unsigned int *rep2gran; extern choice *rep2type, *rep2reqs; extern choice wantitem[]; extern logical vblesonly; Outchoices *od = &(op->outopts); choice outstyle = od->outstyle; char *sf = "SUBFLOOR"; char *af = "ARGSFLOOR"; char *ss = "SUBSORTBY"; char *as = "ARGSSORTBY"; Logfile *lp; Include *incp, *lastincp; choice rep, *cols, floor, subfloor, sortby, subsortby, chartby; char *subf, *subs, *c; logical colsinc[COL_NUMBER], istree, templ; char graph; int i, j, k; /* NB some options, e.g. reportorder, corrected when parsed */ origstarttime = starttime; starttime = shifttime(starttime, stz); starttimec += stz; if (od->markchar == '\0') { warn('C', TRUE, "MARKCHAR none not allowed. Using + instead."); od->markchar = '+'; } if (od->decpt == '\0') { warn('C', TRUE, "DECPOINT none not allowed. " "Getting it from language file instead."); od->decpt = (char)UNSET; /* and will be read from lang file */ } if (od->bytesdp > 6) { warn('C', TRUE, "The maximum allowed value of BYTESDP is 6. " "For exact numbers, use RAWBYTES ON"); od->bytesdp = 6; } op->dman.from = FIRST_TIME; if (op->dman.fromstr != NULL && /* so parse unless fromstr is NULL */ parsedate(starttime, op->dman.fromstr, &(op->dman.from), TRUE, FALSE) == ERR) warn('C', TRUE, "Invalid FROM string %s: ignoring it", op->dman.fromstr); op->dman.to = LAST_TIME; if (op->dman.tostr != NULL && parsedate(starttime, op->dman.tostr, &(op->dman.to), FALSE, FALSE) == ERR) warn('C', TRUE, "Invalid TO string %s: ignoring it", op->dman.tostr); if (op->dman.from > op->dman.to) { warn('C', TRUE, "FROM time is later than TO time: " "would exclude everything so ignoring them"); op->dman.from = FIRST_TIME; op->dman.to = LAST_TIME; } for (i = 0, lp = op->miscopts.logfile[0]; lp != NULL; TO_NEXT(lp)) i = MAX(i, lp->tz); if (op->dman.from > starttimec + i + 60) /* one hour's grace */ warn('D', TRUE, "FROM time is later than the present"); if (op->dman.to < LAST_TIME) { op->dman.last7from = op->dman.to - MINS_IN_WEEK; op->dman.last7to = op->dman.to; } else { op->dman.last7from = starttimec - MINS_IN_WEEK; op->dman.last7to = starttimec; } if (outstyle == HTML || outstyle == XHTML) { if (od->htmlpagewidth == 0) od->htmlpagewidth = 1; else if (od->htmlpagewidth > MAXPAGEWIDTH) { warn('C', TRUE, "HTMLPAGEWIDTH %u too large: using maximum allowed " "value of %u", od->htmlpagewidth, MAXPAGEWIDTH); od->htmlpagewidth = MAXPAGEWIDTH; } } else if (outstyle == ASCII || outstyle == PLAIN) { if (od->plainpagewidth == 0) od->plainpagewidth = 1; else if (od->plainpagewidth > MAXPAGEWIDTH) { warn('C', TRUE, "PLAINPAGEWIDTH %u too large: using maximum allowed " "value of %u", od->plainpagewidth, MAXPAGEWIDTH); od->plainpagewidth = MAXPAGEWIDTH; } } else if (outstyle == LATEX) { if (od->latexpagewidth == 0) od->latexpagewidth = 1; else if (od->latexpagewidth > MAXPAGEWIDTH) { warn('C', TRUE, "LATEXPAGEWIDTH %u too large: using maximum allowed " "value of %u", od->latexpagewidth, MAXPAGEWIDTH); od->latexpagewidth = MAXPAGEWIDTH; } } for (lastincp = NULL, incp = op->argshead, templ = FALSE; incp != NULL; TO_NEXT(incp)) { if (STREQ((char *)(incp->name), "pages")) { if (!templ) warn('C', TRUE, "ARGSINCLUDE/EXCLUDE can't include 'pages'"); templ = TRUE; if (lastincp == NULL) op->argshead = incp->next; else lastincp->next = incp->next; } else lastincp = incp; } for (lastincp = NULL, incp = op->refargshead, templ = FALSE; incp != NULL; TO_NEXT(incp)) { if (STREQ((char *)(incp->name), "pages")) { if (!templ) warn('C', TRUE, "REFARGSINCLUDE/EXCLUDE can't include 'pages'"); templ = TRUE; if (lastincp == NULL) op->refargshead = incp->next; else lastincp->next = incp->next; } else lastincp = incp; } for (i = 0, j = 0, k = 0; i < DATEREPORTS_NUMBER; i++) { j += (int)(od->repq[i] && od->back[i]); k += (int)(od->repq[i]); } if (j != 0 && j != k) warn('D', TRUE, "Time reports have not all got same value of BACK"); /* The next bit is totally foul, so here's a guide. Numbers are repeated in comments below. [C] problems are overridden, [D] are just warned. for (i through reports turned on, except GENSUM) { if (time report) { *** (1) *** check COLS don't include C, c, D, d, E, e, Q, q, S, s or N [C] check GRAPH included in COLS [D] } else (non-time reports) { *** (2) *** if (REP_REQ || REP_TYPE) { *** (3) *** Check P, Q not in COLS or (sub)SORTBY or (sub)FLOOR [C] For REP_TYPE, also check p, q not in COLS or CHART [C] } else if (redirection/failure report || REP_CODE) { *** (4) *** Check P, p, Q, q, B, b, C, c not in COLS or (sub)SORTBY or (sub)FLOOR or CHART [C] } Interpret "CHART SORTBY" *** (5) *** if (REP_SIZE || REP_PROCTIME) { *** (6) *** Check N not in COLS [C] } else { *** (7) *** Check SORTBY matches SUBSORTBY [D] Check FLOOR matches SUBFLOOR [D] Check SORTBY matches FLOOR [D] Check CHART matches SORTBY [D] Check no column N if SORTBY ALPHABETICAL or RANDOM [D] Check (sub)SORTBY and (sub)FLOOR and CHART in COLS [D] } } Check COLS non-empty [D] *** (8) *** } */ for (i = 0; od->reporder[i] != -1; i++) { rep = od->reporder[i]; if (rep != REP_GENSUM && od->repq[rep]) { cols = od->cols[rep]; for (j = 0; j < COL_NUMBER; j++) colsinc[j] = FALSE; for (j = 0; cols[j] != COL_NUMBER; j++) colsinc[cols[j]] = TRUE; if (rep < DATEREP_NUMBER) { /* *** (1) *** time reports */ graph = od->graph[rep]; if (colsinc[COL_FIRSTD] || colsinc[COL_FIRSTT] || colsinc[COL_DATE] || colsinc[COL_TIME] || colsinc[COL_INDEX] || colsinc[COL_REQS7] || colsinc[COL_PAGES7] || colsinc[COL_BYTES7] || colsinc[COL_PREQS7] || colsinc[COL_PPAGES7] || colsinc[COL_PBYTES7]) { warn('C', TRUE, "In %s, C, c, D, d, E, e, Q, q, S, s and N not " "allowed in COLS: ignoring them", repname[rep]); for (j = 0; cols[j] != COL_NUMBER; j++) { if (cols[j] == COL_FIRSTD || cols[j] == COL_FIRSTT || cols[j] == COL_DATE || cols[j] == COL_TIME || cols[j] == COL_REQS7 || cols[j] == COL_PAGES7 || cols[j] == COL_BYTES7 || cols[j] == COL_PREQS7 || cols[j] == COL_PPAGES7 || cols[j] == COL_PBYTES7 || cols[j] == COL_INDEX) { for (k = j; cols[k] != COL_NUMBER; k++) cols[k] = cols[k + 1]; j--; } } } if (cols[0] != COL_NUMBER) { /* o/wise different warning below */ if (((graph == 'R' || graph == 'r') && !colsinc[COL_REQS] && !colsinc[COL_PREQS]) || ((graph == 'P' || graph == 'p') && !colsinc[COL_PAGES] && !colsinc[COL_PPAGES]) || ((graph == 'B' || graph == 'b') && !colsinc[COL_BYTES] && !colsinc[COL_PBYTES])) warn('D', TRUE, "In %s, GRAPH (%c) isn't included in COLS", repname[rep], graph); } } /* end if time report */ else { /* *** (2) *** non-time reports */ sortby = od->sortby[G(rep)]; floor = od->floor[G(rep)].floorby; subsortby = od->subsortby[G(rep)]; subfloor = od->subfloor[G(rep)].floorby; chartby = (outstyle == HTML || outstyle == XHTML)?\ (od->chartby[G(rep)]):CHART_NONE; if (rep == REP_REQ || rep == REP_FAIL || rep == REP_REDIR || rep == REP_REF || rep == REP_FAILREF || rep == REP_REDIRREF) { subf = af; /* Just to get the error messages right */ subs = as; } else { subf = sf; subs = ss; } istree = (od->subsortby[G(rep)] != UNSET); /* For istree, see comment on initialising SUBSORTBYs in globals.c */ if (rep == REP_REQ || rep == REP_TYPE) { /* *** (3) *** */ if (rep == REP_REQ) { if (colsinc[COL_PAGES] || colsinc[COL_PAGES7]) { warn('C', TRUE, "In %s, P and Q not allowed in COLS: " "ignoring them", repname[rep]); for (j = 0; cols[j] != COL_NUMBER; j++) { if (cols[j] == COL_PAGES || cols[j] == COL_PAGES7) { for (k = j; cols[k] != COL_NUMBER; k++) cols[k] = cols[k + 1]; j--; } } } } else /* REP_TYPE */if (colsinc[COL_PAGES] || colsinc[COL_PAGES7] || colsinc[COL_PPAGES] || colsinc[COL_PPAGES7]) { warn('C', TRUE, "In %s, P, p, Q and q not allowed in COLS: " "ignoring them", repname[rep]); for (j = 0; cols[j] != COL_NUMBER; j++) { if (cols[j] == COL_PAGES || cols[j] == COL_PAGES7 || cols[j] == COL_PPAGES|| cols[j] == COL_PPAGES7) { for (k = j; cols[k] != COL_NUMBER; k++) cols[k] = cols[k + 1]; j--; } } } if (sortby == PAGES || sortby == PAGES7) { warn('C', TRUE, "In %s, illegal SORTBY (%s): will sort by " "requests instead", repname[rep], methodname[sortby]); od->sortby[G(rep)] = (sortby == PAGES)?REQUESTS:REQUESTS7; sortby = (sortby == PAGES)?REQUESTS:REQUESTS7; } if (floor == PAGES || floor == PAGES7) { warn('C', TRUE, "In %s, illegal FLOOR (%s): will use requests " "instead", repname[rep], methodname[floor]); od->floor[G(rep)].floorby = (floor == PAGES)?REQUESTS:REQUESTS7; floor = (floor == PAGES)?REQUESTS:REQUESTS7; } if (istree) { if (subsortby == PAGES || subsortby == PAGES7) { warn('C', TRUE, "In %s, illegal %s (%s): will sort by requests " "instead", repname[rep], subs, methodname[subsortby]); od->subsortby[G(rep)] = (subsortby == PAGES)?REQUESTS:REQUESTS7; subsortby = (subsortby == PAGES)?REQUESTS:REQUESTS7; } if (subfloor == PAGES || subfloor == PAGES7) { warn('C', TRUE, "In %s, illegal %s (%s): will use requests " "instead", repname[rep], subf, methodname[subfloor]); od->subfloor[G(rep)].floorby = (subfloor == PAGES)?REQUESTS:REQUESTS7; subfloor = (subfloor == PAGES)?REQUESTS:REQUESTS7; } } if (rep == REP_TYPE && (chartby == PAGES || chartby == PAGES7)) { warn('C', TRUE, "In %s, illegal CHART (%s): will chart by " "requests instead", repname[rep], methodname[chartby]); od->chartby[G(rep)] = REQUESTS; chartby = REQUESTS; } } /* end rep == REP_REQ || rep == REP_TYPE */ else if (rep2reqs[G(rep)] != REQUESTS || rep == REP_CODE) { /* i.e. redirection/failure or REP_CODE */ /* *** (4) *** */ if (colsinc[COL_PAGES] || colsinc[COL_PPAGES] || colsinc[COL_PAGES7] || colsinc[COL_PPAGES7] || colsinc[COL_BYTES] || colsinc[COL_PBYTES] || colsinc[COL_BYTES7] || colsinc[COL_PBYTES7]) { warn('C', TRUE, "In %s, P, p, Q, q B, b, C and c not allowed in " "COLS: ignoring them", repname[rep]); for (j = 0; cols[j] != COL_NUMBER; j++) { if (cols[j] == COL_PAGES || cols[j] == COL_PPAGES || cols[j] == COL_PAGES7 || cols[j] == COL_PPAGES7 || cols[j] == COL_BYTES || cols[j] == COL_PBYTES || cols[j] == COL_BYTES7 || cols[j] == COL_PBYTES7) { for (k = j; cols[k] != COL_NUMBER; k++) cols[k] = cols[k + 1]; j--; } } } if (sortby == PAGES || sortby == PAGES7 || sortby == BYTES || sortby == BYTES7) { warn('C', TRUE, "In %s, illegal SORTBY (%s): will sort by " "requests instead", repname[rep], methodname[sortby]); od->sortby[G(rep)] = REQUESTS; sortby = REQUESTS; } if (floor == PAGES || floor == PAGES7 || floor == BYTES || floor == BYTES7) { warn('C', TRUE, "In %s, illegal FLOOR (%s): will use -50r instead", repname[rep], methodname[floor]); od->floor[G(rep)].min = -50; od->floor[G(rep)].qual = '\0'; od->floor[G(rep)].floorby = REQUESTS; floor = REQUESTS; } if (chartby == PAGES || chartby == PAGES7 || chartby == BYTES || chartby == BYTES7) { warn('C', TRUE, "In %s, illegal CHART (%s): will chart by " "requests instead", repname[rep], methodname[chartby]); od->chartby[G(rep)] = REQUESTS; chartby = REQUESTS; } if (istree) { if (subsortby == PAGES || subsortby == PAGES7 || subsortby == BYTES || subsortby == BYTES7) { warn('C', TRUE, "In %s, illegal %s (%s): will sort by requests " "instead", repname[rep], subs, methodname[subsortby]); od->subsortby[G(rep)] = REQUESTS; subsortby = REQUESTS; } if (subfloor == PAGES || subfloor == PAGES7 || subfloor == BYTES || subfloor == BYTES7) { warn('C', TRUE, "In %s, illegal %s (%s): will use -1r instead", repname[rep], subf, methodname[subfloor]); od->subfloor[G(rep)].min = -1; od->subfloor[G(rep)].qual = '\0'; od->subfloor[G(rep)].floorby = REQUESTS; subfloor = REQUESTS; } } } /* end redirection/failure || REP_CODE */ if (chartby == CHART_SORTBY) { /* *** (5) *** */ if (sortby == REQUESTS || sortby == REQUESTS7 || sortby == PAGES || sortby == PAGES7 || sortby == BYTES || sortby == BYTES7) od->chartby[G(rep)] = sortby; else if (floor == REQUESTS || floor == REQUESTS7 || floor == PAGES || floor == PAGES7 || floor == BYTES || floor == BYTES7) od->chartby[G(rep)] = floor; else od->chartby[G(rep)] = REQUESTS; chartby = od->chartby[G(rep)]; } /* "if" not "else if" is correct (to make next "else if" work) */ if (rep == REP_SIZE || rep == REP_PROCTIME) { /* *** (6) *** */ if (colsinc[COL_INDEX]) { warn('C', TRUE, "In %s, N not allowed in COLS: ignoring it", repname[rep]); for (j = 0; cols[j] != COL_NUMBER; j++) { if (cols[j] == COL_INDEX) { for (k = j; cols[k] != COL_NUMBER; k++) cols[k] = cols[k + 1]; j--; } } } } else { /* *** (7) *** rep != REP_SIZE && rep != REP_PROCTIME */ /* check SORTBYs (SIZE & PROCTIME don't have SORTBY's) */ if (istree) { if (sortby != subsortby && subsortby != ALPHABETICAL && subsortby != RANDOM) warn('D', TRUE, "In %s, SORTBY (%s) doesn't match %s (%s)", repname[rep], methodname[sortby], subs, methodname[subsortby]); if (floor != subfloor) warn('D', TRUE, "In %s, FLOOR (%s) doesn't match %s (%s)", repname[rep], methodname[floor], subf, methodname[subfloor]); } if (((sortby == REQUESTS || sortby == REQUESTS7 || sortby == PAGES || sortby == PAGES7 || sortby == BYTES || sortby == BYTES7) && (floor == REQUESTS || floor == REQUESTS7 || floor == PAGES || floor == PAGES7 || floor == BYTES || floor == BYTES7) && sortby != floor) || (sortby == DATESORT && floor == FIRSTDATE) || (sortby == FIRSTDATE && floor == DATESORT)) warn('D', TRUE, "In %s, SORTBY (%s) doesn't match FLOOR (%s)", repname[rep], methodname[sortby], methodname[floor]); if (chartby != CHART_NONE) { if (sortby == REQUESTS || sortby == REQUESTS7 || sortby == PAGES || sortby == PAGES7 || sortby == BYTES || sortby == BYTES7) { if (sortby != chartby) { warn('D', TRUE, "In %s, CHART (%s) doesn't match SORTBY (%s)", repname[rep], methodname[chartby], methodname[sortby]); } } else if ((floor == REQUESTS || floor == REQUESTS7 || floor == PAGES || floor == PAGES7 || floor == BYTES || floor == BYTES7) && floor != chartby) { warn('D', TRUE, "In %s, CHART (%s) doesn't match FLOOR (%s)", repname[rep], methodname[chartby], methodname[floor]); } } if (sortby == ALPHABETICAL && colsinc[COL_INDEX]) warn('D', TRUE, "In %s, column N with SORTBY ALPHABETICAL", repname[rep]); else if (sortby == RANDOM && colsinc[COL_INDEX]) warn('D', TRUE, "In %s, column N with SORTBY RANDOM", repname[rep]); if (cols[0] != COL_NUMBER) { /* o/wise different warning below */ if ((sortby == REQUESTS && !colsinc[COL_REQS] && !colsinc[COL_PREQS]) || (sortby == REQUESTS7 && !colsinc[COL_REQS7] && !colsinc[COL_PREQS7]) || (sortby == PAGES && !colsinc[COL_PAGES] && !colsinc[COL_PPAGES]) || (sortby == PAGES7 && !colsinc[COL_PAGES7] && !colsinc[COL_PPAGES7]) || (sortby == BYTES && !colsinc[COL_BYTES] && !colsinc[COL_PBYTES]) || (sortby == BYTES7 && !colsinc[COL_BYTES7] && !colsinc[COL_PBYTES7]) || (sortby == DATESORT && !colsinc[COL_DATE] && !colsinc[COL_TIME]) || (sortby == FIRSTDATE && !colsinc[COL_FIRSTD] && !colsinc[COL_FIRSTT])) warn('D', TRUE, "In %s, SORTBY (%s) isn't included in COLS", repname[rep], methodname[sortby]); if ((floor == REQUESTS && !colsinc[COL_REQS] && !colsinc[COL_PREQS]) || (floor == REQUESTS7 && !colsinc[COL_REQS7] && !colsinc[COL_PREQS7]) || (floor == PAGES && !colsinc[COL_PAGES] && !colsinc[COL_PPAGES]) || (floor == PAGES7 && !colsinc[COL_PAGES7] && !colsinc[COL_PPAGES7]) || (floor == BYTES && !colsinc[COL_BYTES] && !colsinc[COL_PBYTES]) || (floor == BYTES7 && !colsinc[COL_BYTES7] && !colsinc[COL_PBYTES7]) || (floor == DATESORT && !colsinc[COL_DATE] && !colsinc[COL_TIME]) || (floor == FIRSTDATE && !colsinc[COL_FIRSTD] && !colsinc[COL_FIRSTT])) warn('D', TRUE, "In %s, FLOOR (%s) isn't included in COLS", repname[rep], methodname[floor]); if (istree) { if ((subsortby == REQUESTS && !colsinc[COL_REQS] && !colsinc[COL_PREQS]) || (subsortby == REQUESTS7 && !colsinc[COL_REQS7] && !colsinc[COL_PREQS7]) || (subsortby == PAGES && !colsinc[COL_PAGES] && !colsinc[COL_PPAGES]) || (subsortby == PAGES7 && !colsinc[COL_PAGES7] && !colsinc[COL_PPAGES7]) || (subsortby == BYTES && !colsinc[COL_BYTES] && !colsinc[COL_PBYTES]) || (subsortby == BYTES7 && !colsinc[COL_BYTES7] && !colsinc[COL_PBYTES7]) || (subsortby == DATESORT && !colsinc[COL_DATE] && !colsinc[COL_TIME]) || (subsortby == FIRSTDATE && !colsinc[COL_FIRSTD] && !colsinc[COL_FIRSTT])) warn('D', TRUE, "In %s, %s (%s) isn't included in COLS", repname[rep], subs, methodname[subsortby]); if ((subfloor == REQUESTS && !colsinc[COL_REQS] && !colsinc[COL_PREQS]) || (subfloor == REQUESTS7 && !colsinc[COL_REQS7] && !colsinc[COL_PREQS7]) || (subfloor == PAGES && !colsinc[COL_PAGES] && !colsinc[COL_PPAGES]) || (subfloor == PAGES7 && !colsinc[COL_PAGES7] && !colsinc[COL_PPAGES7]) || (subfloor == BYTES && !colsinc[COL_BYTES] && !colsinc[COL_PBYTES]) || (subfloor == BYTES7 && !colsinc[COL_BYTES7] && !colsinc[COL_PBYTES7]) || (subfloor == DATESORT && !colsinc[COL_DATE] && !colsinc[COL_TIME]) || (subfloor == FIRSTDATE && !colsinc[COL_FIRSTD] && !colsinc[COL_FIRSTT])) warn('D', TRUE, "In %s, %s (%s) isn't included in COLS", repname[rep], subf, methodname[subfloor]); } if ((chartby == REQUESTS && !colsinc[COL_REQS] && !colsinc[COL_PREQS]) || (chartby == REQUESTS7 && !colsinc[COL_REQS7] && !colsinc[COL_PREQS7]) || (chartby == PAGES && !colsinc[COL_PAGES] && !colsinc[COL_PPAGES]) || (chartby == PAGES7 && !colsinc[COL_PAGES7] && !colsinc[COL_PPAGES7]) || (chartby == BYTES && !colsinc[COL_BYTES] && !colsinc[COL_PBYTES]) || (chartby == BYTES7 && !colsinc[COL_BYTES7] && !colsinc[COL_PBYTES7])) warn('D', TRUE, "In %s, CHART (%s) isn't included in COLS", repname[rep], methodname[chartby]); } } } if (cols[0] == COL_NUMBER) /* *** (8) *** */ warn('D', TRUE, "%s contains no COLS", repname[rep]); } } /* end for i through reports */ /* change logformats to ignore items which are not wanted (see 28/10/97) */ for (lp = op->miscopts.logfile[0]; lp != NULL; TO_NEXT(lp)) { if (lp->format->form->inpfns->fn == &parselogfmt && lp->format->form->sep == '0') /* DEFAULT format */ lp->format = deflogformat; } if (!vblesonly) { if (STREQ(od->cssprefix, "none")) od->cssprefix[0] = '\0'; if (!STREQ(od->cacheoutfile, "none")) { if (outstyle != OUT_NONE) { if (IS_STDOUT(od->outfile) && IS_STDOUT(od->cacheoutfile)) error("OUTFILE and CACHEOUTFILE both set to stdout"); else if (STREQ(od->cacheoutfile, od->outfile)) error("OUTFILE and CACHEOUTFILE are the same"); /* won't catch same file under different names, but cache file opening will still fail later in that case */ } for (i = 0; i < INPUT_NUMBER; i++) wantitem[i] = TRUE; op->miscopts.granularity = rep2gran[REP_FIVEREP]; for (i = 0, j = 0; i < ITEM_NUMBER; i++) j += (int)(op->miscopts.lowmem[i] >= 3); if (j != 0) warn('D', TRUE, "LOWMEM 3 prevents that item being cached"); } else if (outstyle == OUT_NONE) error("OUTPUT NONE and CACHEOUTFILE none selected"); else { /* cachefile == none */ for (i = 0; i < INPUT_NUMBER; i++) wantitem[i] = FALSE; for (op->miscopts.granularity = 1, i = 0; od->reporder[i] != -1; i++) { rep = od->reporder[i]; if (rep < DATEREP_NUMBER && od->repq[rep]) op->miscopts.granularity = MAX(op->miscopts.granularity, rep2gran[rep]); if (od->repq[rep] && rep2type[rep] != UNSET) wantitem[rep2type[rep]] = TRUE; if (strchr(od->gensumlines, 'I') != NULL) wantitem[ITEM_FILE] = TRUE; if (strchr(od->gensumlines, 'J') != NULL) wantitem[ITEM_HOST] = TRUE; } } /* end cachefile == none */ for (lp = op->miscopts.logfile[0], templ = FALSE; lp != NULL; TO_NEXT(lp)) { (void)correctlogfmt(lp, op->wanthead, op->code2type, &(op->dman)); if (op->miscopts.lowmem[ITEM_VHOST] >= 3 && lp->pvpos != UNSET) { if (!templ) { warn('C', TRUE, "Ignoring %%v in logfile prefixes because of VHOSTLOWMEM 3"); templ = TRUE; } lp->pvpos = UNSET; } } } /* end if (!vblesonly) */ if (outstyle == COMPUTER) { od->sepchar = '\0'; od->repsepchar = '\0'; od->decpt = '.'; od->rawbytes = TRUE; od->lang.code = ENGLISH; /* force English in CRO */ od->lang.file = NULL; while ((c = strstr(od->compsep, "\\t")) != NULL) { *c = '\t'; memmove((void *)(c + 1), (void *)(c + 2), strlen(c + 2) + 1); } } else if (od->repsepchar == (char)UNSET) od->repsepchar = '\0'; /* sepchar, decpt set from langfile below */ /* lower case appropriate aliases and in/excludes */ /* NB could send them through all fixed aliases, but others probably never needed and could cause confusion */ toloweralias(op->aliashead[ITEM_HOST], TRUE); toloweralias(od->aliashead[G(REP_HOST)], FALSE); toloweralias(od->aliashead[G(REP_DOM)], FALSE); toloweralias(od->aliashead[G(REP_ORG)], FALSE); tolowerinc(op->wanthead[ITEM_HOST]); tolowerinc(od->wanthead[G(REP_HOST)]); tolowerinc(od->wanthead[G(REP_DOM)]); tolowerinc(od->wanthead[G(REP_ORG)]); toloweralias(op->aliashead[ITEM_VHOST], TRUE); toloweralias(od->aliashead[G(REP_VHOST)], FALSE); tolowerinc(op->wanthead[ITEM_VHOST]); tolowerinc(od->wanthead[G(REP_VHOST)]); tolowerinc(od->wanthead[G(REP_SEARCHREP)]); tolowerinc(od->wanthead[G(REP_SEARCHSUM)]); if (op->miscopts.usercase_insensitive) { toloweralias(op->aliashead[ITEM_USER], TRUE); toloweralias(od->aliashead[G(REP_USER)], FALSE); toloweralias(od->aliashead[G(REP_FAILUSER)], FALSE); tolowerinc(op->wanthead[ITEM_USER]); tolowerinc(od->wanthead[G(REP_USER)]); tolowerinc(od->wanthead[G(REP_FAILUSER)]); } if (op->miscopts.case_insensitive) { toloweralias(op->aliashead[ITEM_FILE], TRUE); toloweralias(od->aliashead[G(REP_REQ)], FALSE); toloweralias(od->aliashead[G(REP_REDIR)], FALSE); toloweralias(od->aliashead[G(REP_FAIL)], FALSE); toloweralias(od->aliashead[G(REP_TYPE)], FALSE); toloweralias(od->aliashead[G(REP_DIR)], FALSE); tolowerinc(op->wanthead[ITEM_FILE]); tolowerinc(op->ispagehead); tolowerinc(op->argshead); tolowerinc(od->wanthead[G(REP_REQ)]); tolowerinc(od->wanthead[G(REP_REDIR)]); tolowerinc(od->wanthead[G(REP_FAIL)]); tolowerinc(od->wanthead[G(REP_TYPE)]); tolowerinc(od->wanthead[G(REP_DIR)]); tolowerse(op->intsearchengines); } } #define POSSTREE(r) if (op->miscopts.lowmem[rep2type[r]] >= 3 && od->repq[r]) \ od->alltrees[i++] = r #define POSSDERV(r) if (op->miscopts.lowmem[rep2type[r]] >= 3 && od->repq[r]) \ od->alldervs[i++] = r #define POSSDATACOL(t, a, b) if (op->data2cols[i][a] >= 0) { \ op->datacols[i][t][k][0] = op->data2cols[i][a]; \ op->datacols[i][t][k++][1] = b; } #define CLOSECATEGORY(t) op->datacols[i][t][k][0] = -1; k = 0; #define ALIASP(c, f, t) ENSURE_LEN(ss, len, strlen(t) + 7); \ sprintf(ss, "PLAIN:%s", t); confline(op, c, f, ss, -1) void finalinit(Options *op) { #ifndef NODNS extern choice dnslevel; extern char *dnsfile, *dnslockfile; extern FILE *dnsfilep, *dnslock; extern Hashtable *dnstable; extern unsigned int dnsgoodhrs, dnsbadhrs; extern Outputter cro_outputter, html_outputter, latex_outputter, plain_outputter, xhtml_outputter, xml_outputter; timecode_t timec, goodtimec, badtimec; char *name, *alias; choice rc; #endif #ifndef NOPIPES extern Strpairlist *uncompresshead; #endif extern timecode_t starttimeuxc; extern char *country[]; extern Memman *xmemman; extern choice *rep2type, *rep2reqs, *rep2reqs7, *rep2date, *rep2firstd; extern choice cache_records[]; extern char *pos; extern logical vblesonly; extern logical unprintable[256]; static char *ss = NULL; static size_t len = 0; Outchoices *od = &(op->outopts); choice outstyle = od->outstyle; Logfile *lp, *lastlp; logical wantcol[ITEM_NUMBER][DATA_NUMBER]; choice *cols; char **lngstr = NULL; /* just to keep compiler happy */ FILE *tempf; char temps[10]; /* for "ukdom.tab" */ char *s; Strlist *sp; int i, j, k; /* if only doing cache file, turn off all reports to avoid recording unwanted stuff inadvertently */ if (outstyle == OUT_NONE) { for (i = 0; i < REP_NUMBER; i++) od->repq[i] = FALSE; } /* set code2type variable */ for (i = MIN_SC; i < SC_NUMBER; i++) { if (op->code2type[i] == UNWANTED || (op->code2type[i] == UNSET && op->code2type[0] == SUCCESS)) op->code2type[i] = UNWANTED; else if (i <= 199) op->code2type[i] = INFO; else if (i <= 299 || (i == 304 && op->succ304)) op->code2type[i] = SUCCESS; else if (i <= 399) op->code2type[i] = REDIRECT; else op->code2type[i] = FAILURE; } /* swap aliases round */ for (i = 0; i < ITEM_NUMBER; i++) reversealias(&(op->aliashead[i])); for (i = 0; i < GENREP_NUMBER; i++) reversealias(&(od->aliashead[i])); /* and swap uncompress list round */ #ifndef NOPIPES reversestrpairlist(&uncompresshead); #endif /* Translate filenames to put files in the correct directories */ /* Also interpret %date codes and wild cards where appropriate */ if (!strcaseeq(od->headerfile, "none") && !IS_STDIN(od->headerfile)) od->headerfile = buildfilename(HEADERDIR, "", od->headerfile); if (!strcaseeq(od->footerfile, "none") && !IS_STDIN(od->footerfile)) od->footerfile = buildfilename(HEADERDIR, "", od->footerfile); if (!STREQ(od->cacheoutfile, "none") && !IS_STDOUT(od->cacheoutfile)) { s = timesprintf(NULL, buildfilename(CACHEDIR, "", od->cacheoutfile), op->dman.last7to, TRUE); COPYSTR(od->cacheoutfile, s); } if (!IS_STDOUT(od->outfile)) { s = timesprintf(NULL, od->outfile, op->dman.last7to, TRUE); /* outfile has already had buildfilename() in configoutfile() */ COPYSTR(od->outfile, s); } for (i = 0; i <= 1; i++) { for (lp = op->miscopts.logfile[i], lastlp = NULL; lp != NULL; lastlp = lp, TO_NEXT(lp)) { if (!IS_STDIN(lp->name)) { s = timesprintf(NULL, lp->name, op->dman.last7to, TRUE); COPYSTR(lp->name, s); #ifndef NODIRENT if (strchr(lp->name, '*') != NULL || strchr(lp->name, '?') != NULL) lp = expandwildlogs(lp, (lastlp == NULL)?\ (&(op->miscopts.logfile[i])):(&(lastlp->next))); #endif } } } #ifndef NOGRAPHICS if (outstyle == HTML || outstyle == XHTML) { if (od->chartdir == NULL || od->localchartdir == NULL) { /* If CHARTDIR and LOCALCHARTDIR both set, everything is OK */ for (i = 0, j = 0; i < GENREP_NUMBER; i++) j += (od->chartby[i] != CHART_NONE && od->repq[i + FIRST_GENREP]); if (j != 0) { /* j = number of wanted charts */ if (od->chartdir != NULL) warn('C', TRUE, "Ignoring CHARTDIR because LOCALCHARTDIR is unset"); else if (od->localchartdir != NULL) warn('C', TRUE, "Ignoring LOCALCHARTDIR because CHARTDIR is unset"); if (IS_STDOUT(od->outfile)) { warn('D', TRUE, "Turning all pie charts off because OUTFILE is " "stdout and CHARTDIR is unset"); for (i = 0, j = 0; i < GENREP_NUMBER; i++) od->chartby[i] = CHART_NONE; } else { od->localchartdir = buildfilename(od->outfile, "", ""); od->chartdir = ""; } } } /* convert any date codes in CHARTDIRs */ if (od->chartdir != NULL && od->localchartdir != NULL) { s = timesprintf(NULL, od->localchartdir, op->dman.last7to, TRUE); COPYSTR(od->localchartdir, s); s = timesprintf(NULL, od->chartdir, op->dman.last7to, TRUE); COPYSTR(od->chartdir, s); } } #endif #ifndef NODNS if (!IS_STDIN(dnsfile)) dnsfile = buildfilename(DNSDIR, "", dnsfile); dnslockfile = buildfilename(LOCKDIR, "", dnslockfile); #endif if (od->domainsfile != NULL && !IS_STDIN(od->domainsfile)) od->domainsfile = buildfilename(LANGDIR, "lang", od->domainsfile); if (od->descfile != NULL && !IS_STDIN(od->descfile)) od->descfile = buildfilename(LANGDIR, "lang", od->descfile); if (od->lang.file == NULL) selectlang(country[od->lang.code], &(op->outopts)); else if (!IS_STDIN(od->lang.file)) od->lang.file = buildfilename(LANGDIR, "lang", od->lang.file); if (od->domainsfile == NULL) { sprintf(temps, "ukdom%ctab", EXTSEP); od->domainsfile = buildfilename(LANGDIR, "lang", temps); } od->multibyte = FALSE; if (outstyle == PLAIN) { od->outstyle = ASCII; outstyle = ASCII; /* The only difference is the langfile, which we have just chosen */ } if (outstyle == ASCII) od->outputter = &plain_outputter; else if (outstyle == HTML) od->outputter = &html_outputter; else if (outstyle == XHTML) od->outputter = &xhtml_outputter; else if (outstyle == LATEX) od->outputter = &latex_outputter; else if (outstyle == XML) od->outputter = &xml_outputter; else /* outstyle == COMPUTER */ od->outputter = &cro_outputter; if (!vblesonly) { /* persists to end of function */ if (outstyle != OUT_NONE) { /* Read in language information */ if ((tempf = my_fopen(od->lang.file, "language file")) == NULL) error("Can't read language file %s", od->lang.file); od->lngstr = (char **)xmalloc(LNGSTR_NUMBER * sizeof(char *)); lngstr = od->lngstr; /* just for conciseness */ pos = NULL; COPYSTR(lngstr[charset_], nextlngstr(tempf, od->lang.file, TRUE)); if (outstyle == LATEX && !strcaseeq(lngstr[charset_], "US-ASCII") && !(headcasematch(lngstr[charset_], "ISO-8859-") && (lngstr[charset_][9] == '1' || lngstr[charset_][9] == '2') && lngstr[charset_][10] == '\0')) error("OUTPUT LATEX only available with US-ASCII, ISO-8859-1 and " "ISO-8859-2 character sets"); /* NB Latin-3 and -5 have LaTeX .def files too but I have no such language files, so no way to test them (and no need). Ditto some Windows codepages. */ if (*(lngstr[charset_]) == '*') { od->multibyte = TRUE; (lngstr[charset_])++; od->html = FALSE; } if (outstyle == HTML || outstyle == XHTML) { if (strcaseeq(lngstr[charset_], "UTF-8")) od->outputter->strlength = &html_strlength_utf8; else if (strcaseeq(lngstr[charset_], "ISO-2022-JP")) od->outputter->strlength = &html_strlength_jis; } for (i = 0; i < 7; i++) COPYSTR(od->dayname[i], nextlngstr(tempf, od->lang.file, TRUE)); for (i = 0; i < 12; i++) COPYSTR(od->monthname[i], nextlngstr(tempf, od->lang.file, TRUE)); for (i = 1; i < LNGSTR_NUMBER; i++) /* charset_ was 0 */ COPYSTR(lngstr[i], nextlngstr(tempf, od->lang.file, TRUE)); (void)nextlngstr(tempf, od->lang.file, FALSE); /* This final nextlngstr() checks the language file isn't too long */ if (strchr(lngstr[xbytes_], '?') == NULL || strchr(lngstr[nxbytes_], '?') == NULL || strchr(lngstr[nxbytes7_], '?') == NULL || strchr(lngstr[xbytestraffic_], '?') == NULL || strchr(lngstr[xbytestraffic7_], '?') == NULL) error("language file %s corrupt: translation of \"?bytes\" missing " "a question mark", od->lang.file); /* Fatal error is harsh here: but it avoids all sorts of trouble later */ od->plainmonthlen = arraymaxlen(od->monthname, 12, NULL); /* plain is longer: by pretending to be ASCII it includes whole strlen */ /* But note that even this is not enough for formatted dates: could need max_ascii_len + (max_html_len - min_html_len) to apply spacing */ od->monthlen = arraymaxlen(od->monthname, 12, od); od->plaindaylen = arraymaxlen(od->dayname, 7, NULL); od->daylen = arraymaxlen(od->dayname, 7, od); od->plainampmlen = MAX(strlen(lngstr[am_]), strlen(lngstr[pm_])); od->ampmlen = MAX(od->outputter->strlength(lngstr[am_]), od->outputter->strlength(lngstr[pm_])); /* Set the convfloor (see do_alias(n|N)). We only do this approximately: convert A0-FF for ISO-8859-*, 80-FF o/wise. This may still include some non-printable characters! But we can't have a table for every charset. */ if (od->searchconv == UNSET) od->searchconv = !(od->multibyte); if (!od->searchconv || strcaseeq(lngstr[charset_], "US-ASCII")) od->convfloor = 0; else if (substrcaseeq(lngstr[charset_], "iso-8859-") || strcaseeq(lngstr[charset_], "armscii-8")) od->convfloor = 0xA0; else od->convfloor = 0x80; /* Similarly set the characters we shall consider as unprintable in the reports. */ #ifdef EBCDIC for (i = 0; i <= 0x3F; i++) unprintable[i] = TRUE; #else for (i = 0; i <= 0x1F; i++) unprintable[i] = TRUE; for (i = 0x20; i <= 0xFF; i++) unprintable[i] = FALSE; if (substrcaseeq(lngstr[charset_], "iso-8859-") || strcaseeq(lngstr[charset_], "armscii-8")) { for (i = 0x80; i <= 0x9F; i++) unprintable[i] = TRUE; } unprintable[0x7F] = TRUE; #endif unprintable[(unsigned char)'\0'] = FALSE; unprintable[(unsigned char)'\t'] = FALSE; if (od->baseurl != NULL && STREQ(od->baseurl, "none")) od->baseurl = NULL; if (outstyle == COMPUTER) { COPYSTR(lngstr[succreqs_], "SRS7"); COPYSTR(lngstr[totunknown_], "NCC7"); COPYSTR(lngstr[totpages_], "PRP7"); COPYSTR(lngstr[totfails_], "FLF7"); COPYSTR(lngstr[totredirs_], "RRR7"); COPYSTR(lngstr[inforeqs_], "NII7"); COPYSTR(lngstr[distfiles_], "NFN7"); COPYSTR(lngstr[disthosts_], "NHH7"); COPYSTR(lngstr[corrupt_], "CL"); COPYSTR(lngstr[unwanted_], "UL"); COPYSTR(lngstr[totdata_], "BTB7"); COPYSTR(lngstr[dayrepfmt_], "%Y%\b%M%\b%D"); COPYSTR(lngstr[daysumfmt_], "%w"); COPYSTR(lngstr[hourrepfmt_], "%Y%\b%M%\b%D%\b%H"); COPYSTR(lngstr[hoursumfmt_], "%H"); COPYSTR(lngstr[weekhoursumfmt_], "%w%\b%H"); COPYSTR(lngstr[quarterrepfmt_], "%Y%\b%M%\b%D%\b%H%\b%n"); COPYSTR(lngstr[quartersumfmt_], "%H%\b%n"); COPYSTR(lngstr[weekfmt_], "%Y%\b%M%\b%D"); COPYSTR(lngstr[monthfmt_], "%Y%\b%M"); COPYSTR(lngstr[quarterlyfmt_], "%Y%\b%q"); COPYSTR(lngstr[yearfmt_], "%Y"); COPYSTR(lngstr[genrepdate_], "%Y%\b%M%\b%D"); COPYSTR(lngstr[genreptime_], "%Y%\b%M%\b%D%\b%H%\b%n"); COPYSTR(lngstr[datefmt1_], "%Y%\b%M%\b%D%\b%H%\b%n"); COPYSTR(lngstr[datefmt2_], "%Y%\b%M%\b%D%\b%H%\b%n"); } /* repsepchar done above. Also OUTPUT COMPUTER versions done above. */ if (od->sepchar == (char)UNSET) od->sepchar = *(lngstr[sepchar_]); if (od->decpt == (char)UNSET) od->decpt = *(lngstr[decpoint_]); (void)my_fclose(tempf, od->lang.file, "language file"); if ((tempf = my_fopen(od->domainsfile, "domains file")) != NULL) { process_domainsfile(tempf, op); (void)my_fclose(tempf, od->domainsfile, "domains file"); } if (od->descriptions && od->descfile != NULL && (tempf = my_fopen(od->descfile, "report descriptions file")) != NULL) { process_descfile(tempf, od->descfile, op); (void)my_fclose(tempf, od->descfile, "report descriptions file"); } else od->descriptions = FALSE; } /* end outstyle != OUT_NONE */ /* Which data we should collect about each item? */ for (i = 0; i < ITEM_NUMBER; i++) { for (j = 0; j < DATA_NUMBER; j++) wantcol[i][j] = FALSE; } if (!strcaseeq(od->cacheoutfile, "none")) { /* If we are writing a cache file, must have everything it records. */ for (i = 0; i < ITEM_NUMBER; i++) for (j = 0; j < V5_DATA_NUMBER; j++) wantcol[i][cache_records[j]] = TRUE; } if (outstyle != OUT_NONE) { /* For a regular output file, check all reports to see what's wanted. */ for (i = FIRST_GENREP; i <= LAST_NORMALREP; i++) { if (od->repq[i]) { /* always need REQUESTS */ wantcol[rep2type[i]][rep2reqs[G(i)]] = TRUE; /* need (SUB)FLOOR and (SUB)SORTBY and CHART */ if (od->floor[G(i)].floorby == REQUESTS7 || od->sortby[G(i)] == REQUESTS7 || od->subfloor[G(i)].floorby == REQUESTS7 || od->subsortby[G(i)] == REQUESTS7 || od->chartby[G(i)] == REQUESTS7) wantcol[rep2type[i]][rep2reqs7[G(i)]] = TRUE; if (od->floor[G(i)].floorby == PAGES || od->sortby[G(i)] == PAGES || od->subfloor[G(i)].floorby == PAGES || od->subsortby[G(i)] == PAGES || od->chartby[G(i)] == PAGES) wantcol[rep2type[i]][PAGES] = TRUE; if (od->floor[G(i)].floorby == PAGES7 || od->sortby[G(i)] == PAGES7 || od->subfloor[G(i)].floorby == PAGES7 || od->subsortby[G(i)] == PAGES7 || od->chartby[G(i)] == PAGES7) wantcol[rep2type[i]][PAGES7] = TRUE; if (od->floor[G(i)].floorby == DATESORT || od->sortby[G(i)] == DATESORT || od->subfloor[G(i)].floorby == DATESORT || od->subsortby[G(i)] == DATESORT) /* NB chartby can't be date or firstdate */ wantcol[rep2type[i]][rep2date[G(i)]] = TRUE; if (od->floor[G(i)].floorby == FIRSTDATE || od->sortby[G(i)] == FIRSTDATE || od->subfloor[G(i)].floorby == FIRSTDATE || od->subsortby[G(i)] == FIRSTDATE) wantcol[rep2type[i]][rep2firstd[G(i)]] = TRUE; /* need COLS */ cols = od->cols[i]; for (j = 0; cols[j] != COL_NUMBER; j++) { if (cols[j] == COL_REQS7 || cols[j] == COL_PREQS7) wantcol[rep2type[i]][rep2reqs7[G(i)]] = TRUE; else if (cols[j] == COL_PAGES || cols[j] == COL_PPAGES) wantcol[rep2type[i]][PAGES] = TRUE; else if (cols[j] == COL_PAGES7 || cols[j] == COL_PPAGES7) wantcol[rep2type[i]][PAGES7] = TRUE; else if (cols[j] == COL_DATE || cols[j] == COL_TIME) wantcol[rep2type[i]][rep2date[G(i)]] = TRUE; else if (cols[j] == COL_FIRSTD || cols[j] == COL_FIRSTT) wantcol[rep2type[i]][rep2firstd[G(i)]] = TRUE; } /* if reportspan is on, need firsttime and lasttime */ if (od->repspan) { wantcol[rep2type[i]][rep2date[G(i)]] = TRUE; wantcol[rep2type[i]][rep2firstd[G(i)]] = TRUE; } } } /* and General Summary needs count of files and hosts */ wantcol[ITEM_FILE][REQUESTS] = TRUE; wantcol[ITEM_FILE][REQUESTS7] = TRUE; wantcol[ITEM_HOST][REQUESTS] = TRUE; wantcol[ITEM_HOST][REQUESTS7] = TRUE; } /* end outstyle != OUT_NONE */ /* now assemble wantcol into a data2cols structure */ for (i = 0; i < ITEM_NUMBER; i++) { for (j = 0, k = 0; j < DATA_NUMBER; j++) op->data2cols[i][j] = (wantcol[i][j])?(k++):(-1); op->no_cols[i] = k; } /* and finally, turn data2cols into datacols */ for (i = 0, k = 0; i < ITEM_NUMBER; i++) { POSSDATACOL(SUCCESS, REQUESTS, REQUESTS2); POSSDATACOL(SUCCESS, REQUESTS7, REQUESTS72); POSSDATACOL(SUCCESS, PAGES, PAGES2); POSSDATACOL(SUCCESS, PAGES7, PAGES72); POSSDATACOL(SUCCESS, SUCCDATE, DATE2); POSSDATACOL(SUCCESS, SUCCFIRSTD, FIRSTD2); CLOSECATEGORY(SUCCESS); POSSDATACOL(FAILURE, FAIL, REQUESTS2); POSSDATACOL(FAILURE, FAIL7, REQUESTS72); POSSDATACOL(FAILURE, FAILDATE, DATE2); POSSDATACOL(FAILURE, FAILFIRSTD, FIRSTD2); CLOSECATEGORY(FAILURE); POSSDATACOL(REDIRECT, REDIR, REQUESTS2); POSSDATACOL(REDIRECT, REDIR7, REQUESTS72); POSSDATACOL(REDIRECT, REDIRDATE, DATE2); POSSDATACOL(REDIRECT, REDIRFIRSTD, FIRSTD2); CLOSECATEGORY(REDIRECT); } op->miscopts.dirsufflength = strlen(op->miscopts.dirsuffix); for (i = 0; i < GENREP_NUMBER; i++) allgraft(od->tree[i]->tree, od->tree[i]->space, op->no_cols[rep2type[i + FIRST_GENREP]]); for (sp = od->suborgs; sp != NULL; TO_NEXT(sp)) { if (strlen(sp->name) > 0 && !ISDIGIT(*(sp->name)) && sp->name[strlen(sp->name) - 1] == '*') /* won't catch 3com.* */ warn('C', TRUE, "SUBORG %s meaningless: must specify a domain because " "organisations are at different levels in different domains", sp->name); else confline(op, "SUBORG2", sp->name, NULL, 1); } od->alltrees = (choice *)submalloc(xmemman, 6 * sizeof(choice)); i = 0; POSSTREE(REP_DIR); POSSTREE(REP_DOM); POSSTREE(REP_ORG); POSSTREE(REP_TYPE); POSSTREE(REP_REFSITE); /* if adding more, change '6' above */ od->alltrees[i] = REP_NUMBER; od->alldervs = (choice *)submalloc(xmemman, 5 * sizeof(choice)); i = 0; POSSDERV(REP_SEARCHREP); POSSDERV(REP_SEARCHSUM); POSSDERV(REP_BROWSUM); POSSDERV(REP_OS); /* if adding more, change '5' above */ od->alldervs[i] = REP_NUMBER; od->derv[REP_SEARCHREP - FIRST_DERVREP]->arg = (void *)(op->searchengines); od->derv[REP_SEARCHSUM - FIRST_DERVREP]->arg = (void *)(op->searchengines); od->derv[REP_INTSEARCHREP - FIRST_DERVREP]->arg = (void *)(op->intsearchengines); od->derv[REP_INTSEARCHSUM - FIRST_DERVREP]->arg = (void *)(op->intsearchengines); od->derv[REP_OS - FIRST_DERVREP]->arg = (void *)(op->robots); od->derv[REP_BROWSUM - FIRST_DERVREP]->arg = NULL; if (outstyle != OUT_NONE) { ALIASP("DOMOUTPUTALIAS", LNGSTR_UNRESOLVED, lngstr[unresolved_]); ALIASP("DOMOUTPUTALIAS", LNGSTR_NODOMAIN, lngstr[nodomain_]); ALIASP("DOMOUTPUTALIAS", LNGSTR_UNKDOMAIN, lngstr[unkdomain_]); ALIASP("ORGOUTPUTALIAS", LNGSTR_NODOMAIN, lngstr[nodomain_]); ALIASP("ORGOUTPUTALIAS", LNGSTR_UNKDOMAIN, lngstr[unkdomain_]); ALIASP("DIROUTPUTALIAS", LNGSTR_ROOTDIR, lngstr[rootdir_]); ALIASP("DIROUTPUTALIAS", LNGSTR_NODIR, lngstr[nodir_]); ALIASP("TYPEOUTPUTALIAS", LNGSTR_NOEXT, lngstr[noext_]); ALIASP("TYPEOUTPUTALIAS", LNGSTR_BRKDIRS, lngstr[brkdirs_]); ALIASP("OSOUTPUTALIAS", LNGSTR_UNKWIN, lngstr[unkwin_]); ALIASP("OSOUTPUTALIAS", LNGSTR_UNKUX, lngstr[unkux_]); ALIASP("OSOUTPUTALIAS", LNGSTR_UNKOS, lngstr[unkos_]); ALIASP("OSOUTPUTALIAS", LNGSTR_ROBOTS, lngstr[robots_]); } #ifndef NODNS if (dnslevel != DNS_NONE) { dnstable = rehash(NULL, HASHSIZE, NULL); if ((tempf = my_fopen(dnsfile, "DNS input file")) != NULL) { pos = NULL; goodtimec = (starttimeuxc > (timecode_t)dnsgoodhrs * 60)?\ (starttimeuxc - (timecode_t)dnsgoodhrs * 60):0; badtimec = (starttimeuxc > (timecode_t)dnsbadhrs * 60)?\ (starttimeuxc - (timecode_t)dnsbadhrs * 60):0; while((rc = nextdnsline(tempf, &timec, &name, &alias)) != EOF) { if (rc == TRUE && ((STREQ(alias, "*") && timec >= badtimec) || (!STREQ(alias, "*") && timec >= goodtimec)) && !(timec > starttimeuxc + MINS_IN_WEEK)) do_dns(name, alias, dnslevel); } (void)my_fclose(tempf, dnsfile, "DNS input file"); } if (dnslevel == DNS_WRITE) { #ifdef NOOPEN /* The ANSI, but less preferred, option. There is a race problem. Also if we have got overwrite access but not read, it will go wrong. */ if ((tempf = FOPENR(dnslockfile)) == NULL) { if ((dnslock = FOPENW(dnslockfile)) == NULL) { warn('F', TRUE, "Failed to create DNS lock file %s: " "backing off to DNS LOOKUP", dnslockfile); dnslevel = DNS_LOOKUP; } else debug('F', "Creating %s as DNS lock file", dnslockfile); } else { fclose(tempf); warn('F', TRUE, "DNS lock file %s already exists: backing off to DNS LOOKUP", dnslockfile); dnslevel = DNS_LOOKUP; } #else /* The following is not the strictly correct procedure on Unix. NFS is broken, so there can still be a race condition. One should really @ create a guaranteed unique file; @ hard link the lock file to the unique file; @ stat the unique file, testing for links == 2. However, this has the disadvantage that it can leave files with weird names lying around. Also it can't then share code with other platforms. I think that the chance of a problem is so small, and the consequences sufficiently non-serious, that this is good enough. */ if ((i = open(dnslockfile, O_WRONLY | O_CREAT | O_EXCL, OPEN_MODE)) < 0) { if (errno == EEXIST) warn('F', TRUE, "DNS lock file %s already exists: backing off to DNS LOOKUP", dnslockfile); else warn('F', TRUE, "Failed to create DNS lock file %s: " "backing off to DNS LOOKUP", dnslockfile); dnslevel = DNS_LOOKUP; } else if ((dnslock = fdopen(i, "w")) == NULL) { /* can this happen? */ /* We don't actually write to the dnslock. But this is convenient for compatibility with the #ifdef NOOPEN approach. */ warn('F', TRUE, "Failed to create DNS lock file %s: backing off to DNS LOOKUP", dnslockfile); dnslevel = DNS_LOOKUP; } else debug('F', "Creating %s as DNS lock file", dnslockfile); #endif /* NOOPEN */ if (dnslevel == DNS_WRITE) { if ((dnsfilep = FOPENA(dnsfile)) == NULL) { warn('F', TRUE, "Failed to open DNS output file %s for writing: " "backing off to DNS LOOKUP", dnsfile); dnslevel = DNS_LOOKUP; fclose(dnslock); dnslock = NULL; if (remove(dnslockfile) != 0) warn('F', TRUE, "Trouble deleting DNS lock file %s", dnslockfile); else debug('F', "Deleting DNS lock file %s", dnslockfile); } else debug('F', "Opening %s as DNS output file", dnsfile); } } } /* end if dnslevel != DNS_NONE */ #endif /* NODNS */ } /* end if !vblesonly */ } /* Now functions for turning strings into log formats. */ /* The actual mapping of codes to functions is at inpfns[] in globals.c. */ choice strtoinfmt(Inputformat **ans, char *s, choice *count) { /* For a discussion of count[], see correctlogfmt() above */ extern Memman *xmemman; extern Inputfns inpfns[], pnlinpfn, ccinpfn; Inputformat *ifp; logical done, count_this, typedone[INP_NUMBER]; char tempchar = '\0'; char *c; int i; if (strchr(s, '%') == NULL) return(FMT_NOPC); for (i = 0; i < ITEM_NUMBER; i++) count[i] = 0; for (i = 0; i < INP_NUMBER; i++) typedone[i] = FALSE; *ans = (Inputformat *)submalloc(xmemman, sizeof(Inputformat)); ifp = *ans; /* First a messy special case. If %s occurs but not %S, promote %s to %S */ for (c = s, done = FALSE; *c != '\0' && !done; c++) { if (*c == '%') { c++; if (*c == '*') c++; if (*c == 'S') done = TRUE; c++; } } if (!done) { for (c = s; *c != '\0'; c++) { if (*c == '%') { c++; if (*c == '*') c++; if (*c == 's') *c = 'S'; c++; } } } /* Now the main routine */ for (c = s; *c != '\0'; c++) { if (*c == '%') { c++; if (*c == '%') { ifp->inpfns = &ccinpfn; ifp->sep = *c; } else { if (*c == '*') { count_this = FALSE; c++; } else count_this = TRUE; done = FALSE; for (i = 0; !done && inpfns[i].code != '\0'; i++) { if (*c == inpfns[i].code) { if (inpfns[i].type != UNSET) { if (typedone[inpfns[i].type]) return(FMT_DUP); typedone[inpfns[i].type] = TRUE; } ifp->inpfns = &inpfns[i]; if (inpfns[i].fn == &parsestring || inpfns[i].fn == &parseref || inpfns[i].fn == &parsemsbrow || inpfns[i].fn == &parsejunk || inpfns[i].fn == &parsecode) { c++; if (*c == '\0') { ifp->sep = '\n'; c--; } else if (*c == '\\') { c++; if (*c == '\\') ifp->sep = *c; else if (*c == 'n' || *c == 'r') ifp->sep = '\n'; else if (*c == 't') ifp->sep = '\t'; else return(FMT_BADCHAR); } else if (*c == '%') { c++; if (*c == '%') ifp->sep = *c; else if (*c == 'w' && inpfns[i].fn != &parseref) { ifp->sep = WHITESPACE; /* parseref can't take %w */ c -= 2; /* need to parsespace() too */ } else return(FMT_NOTERM); } else ifp->sep = *c; } else if (inpfns[i].fn == &parselogfmt) { c++; if (*c < '0' || *c > '6') return(FMT_BADBUILTIN); else ifp->sep = *c; } else /* fn != parse(string|ref|msbrow|junk|code|logfmt) */ ifp->sep = '\0'; if (i < ITEMFNS_NUMBER) count[inpfns[i].type] = count_this?2:1; done = TRUE; } /* end if *c == inpfns[i].code */ } /* end for i */ if (!done) return(FMT_BADPC); } } /* end if *c == '%' */ else if (*c == '\\') { c++; if (*c == '\\') { ifp->inpfns = &ccinpfn; ifp->sep = *c; } else if (*c == 'n' || *c == 'r') { ifp->inpfns = &pnlinpfn; ifp->sep = '\n'; } else if (*c == 't') { ifp->inpfns = &ccinpfn; ifp->sep = '\t'; } else return(FMT_BADCHAR); } /* end if *c == '\\' */ else { ifp->inpfns = &ccinpfn; ifp->sep = *c; } ifp->next = (Inputformat *)submalloc(xmemman, sizeof(Inputformat)); tempchar = ifp->sep; TO_NEXT(ifp); } if (tempchar != '\n') { ifp->inpfns = &pnlinpfn; ifp->next = (Inputformat *)submalloc(xmemman, sizeof(Inputformat)); TO_NEXT(ifp); } ifp->inpfns = NULL; if (typedone[INP_YEAR] || typedone[INP_MONTH] || typedone[INP_DATE] || typedone[INP_HOUR] || typedone[INP_MIN] || typedone[INP_AM]) { if (typedone[INP_UNIXTIME]) return(FMT_DUP); if (!(typedone[INP_YEAR] && typedone[INP_MONTH] && typedone[INP_DATE] && typedone[INP_HOUR] && typedone[INP_MIN])) return(FMT_PARTTIME); /* partial time info is corrupt */ count[INP_DATE] = (count[ITEM_FILE] == 2)?2:1; count[INP_AM] = (choice)typedone[INP_AM]; count[INP_UNIXTIME] = 0; } else if (typedone[INP_UNIXTIME]) { count[INP_DATE] = (count[ITEM_FILE] == 2)?2:1; count[INP_AM] = 0; count[INP_UNIXTIME] = 1; } else { count[INP_DATE] = 0; count[INP_AM] = 0; count[INP_UNIXTIME] = 0; } if (typedone[INP_QUERY] && !typedone[ITEM_FILE]) return(FMT_QBUTNOR); count[INP_BYTES] = typedone[INP_BYTES]?((count[ITEM_FILE] == 2)?2:1):0; count[INP_PROCTIME] = 2 * (choice)(typedone[INP_PROCTIME] && count[ITEM_FILE] == 2); if (typedone[INP_CODE] && count[ITEM_FILE] == 2) count[INP_CODE] = 2; else if (typedone[INP_CODE]) count[INP_CODE] = 1; else count[INP_CODE] = 0; return(FMT_OK); } char *apachelogfmt(char *fmt) { static char *ans = NULL; static size_t len = 0; char *p, *q; ENSURE_LEN(ans, len, 32); /* Arbitrary amount to get started */ ans[0] = '\0'; for (p = fmt; *p != '\0'; p++) { ENSURE_LEN(ans, len, strlen(ans) + 20); /* Enough to add any next string. Not v efficient, but that's OK. */ if (*p == '\\' && (*(p + 1) == '"' || *(p + 1) == '\\')) p++; /* NB \t will stay as \t etc. and analog LOGFORMAT will interpret */ if (*p == '%' && *(p + 1) != '\0') { p++; while (ISDIGIT(*p) || *p == ',' || *p == '!' || *p == '<' || *p == '>') p++; if (*p == 'b') strcat(ans, "%b"); else if (*p == 'u') strcat(ans, "%u"); else if (*p == 'h' || *p == 'a') strcat(ans, "%S"); else if (*p == 's') strcat(ans, "%c"); else if (*p == 'U') strcat(ans, "%r"); else if (*p == 'r') strcat(ans, "%j%w%r%wHTTP%j"); else if (*p == 't') strcat(ans, "[%d/%M/%Y:%h:%n:%j]"); else if (*p == 'T') strcat(ans, "%t"); else if (*p == 'D') strcat(ans, "%D"); else if (*p == 'q') strcat(ans, "%q"); else if (*p == 'A' || *p == 'v' || *p == 'V') strcat(ans, "%v"); else if (substrcaseeq(p, "{host}") && *(p + 6) == 'i') { strcat(ans, "%v"); p += 6; } else if (substrcaseeq(p, "{user-agent}") && *(p + 12) == 'i') { strcat(ans, "%B"); p += 12; } else if (substrcaseeq(p, "{referer}") && *(p + 9) == 'i') { strcat(ans, "%f"); p += 9; } else { /* unknown or unwanted code */ if (*p == '{') { while (*p != '}' && *p != '\0') p++; if (*p == '}') p++; if (*p == 't') return(NULL); } strcat(ans, "%j"); } } /* *p == '%' && ... */ else { q = strchr(ans, '\0'); *(q++) = *p; *q = '\0'; } } return(ans); } /*** Finally we move on to the command line argument processing. ***/ void clconfline(Options *op, char *s) { char *cmd = NULL, *arg1 = NULL, *arg2 = NULL; int rc; if ((rc = parseconfline(s, &cmd, &arg1, &arg2)) != -1) confline(op, cmd, arg1, arg2, rc); } void clgenrep(Options *op, choice rep, char *arg) { size_t len; char c, *d; op->outopts.repq[rep] = (arg[0] == '+')?TRUE:FALSE; if (arg[0] == '-') { if (arg[2] != '\0') CLLONGWARN(arg); } else if (arg[2] != '\0') { /* parse sort method */ rep = G(rep); /* future args are genargs only */ if (!ISALPHA(arg[2])) d = arg + 2; else { d = arg + 3; c = TOLOWER(arg[2]); if (c == 'r') op->outopts.sortby[rep] = REQUESTS; else if (c == 's') op->outopts.sortby[rep] = REQUESTS7; else if (c == 'p') op->outopts.sortby[rep] = PAGES; else if (c == 'q') op->outopts.sortby[rep] = PAGES7; else if (c == 'b') op->outopts.sortby[rep] = BYTES; else if (c == 'c') op->outopts.sortby[rep] = BYTES7; else if (c == 'a') op->outopts.sortby[rep] = ALPHABETICAL; else if (c == 'd') op->outopts.sortby[rep] = DATESORT; else if (c == 'e') op->outopts.sortby[rep] = FIRSTDATE; else if (c == 'x') op->outopts.sortby[rep] = RANDOM; else { warn('C', TRUE, "Unknown sort method in command line option %s", arg); return; } } if (*d != '\0') { /* parse floor */ len = strlen(d); c = TOLOWER(*(d + len - 1)); /* final character */ if (c != 'r' && c != 's' && c != 'p' && c != 'q' && c != 'b' && c != 'c' && c != 'd' && c != 'e') { if (d == arg + 2) { warn('C', TRUE, "No sort method or floor given in command line option %s", arg); return; } /* else deduce floor method */ c = arg[2]; memmove((void *)(arg + 2), (void *)(arg + 3), len + 1); if (c == 'a' || c == 'x') *(d + len - 1) = 'r'; else *(d + len - 1) = c; configfloor((void *)&(op->outopts.floor[rep]), arg, arg + 2, NULL, -2); } else configfloor((void *)&(op->outopts.floor[rep]), arg, d, NULL, -2); } } } void cldebug(char **s, char *arg) { if (arg[0] == '-') { if (arg[2] != '\0') CLLONGWARN(arg); configdebug(s, arg, "FALSE", NULL, -2); } else if (arg[2] == '\0') configdebug(s, arg, "TRUE", NULL, -2); else configdebug(s, arg, arg + 2, NULL, -2); } void clargs(Options *op, int argc, char *argv[]) { extern char repcodes[]; extern logical vblesonly; extern char *debug_args, *warn_args; int i; choice j; for (i = 1; i < argc; i++) { if (strlen(argv[i]) > 255) { argv[i][70] = '\0'; warn('C', TRUE, "Ignoring long command line argument starting\n%s", argv[i]); } else if (!IS_EMPTY_STRING(argv[i])) { if (argv[i][0] != '+' && argv[i][0] != '-') configlogfile((void *)&(op->miscopts.logfile[0]), argv[i], argv[i], NULL, -2); else switch (argv[i][1]) { case '\0': configlogfile((void *)&(op->miscopts.logfile[0]), argv[i], "stdin", NULL, -2); break; case '1': case '4': case '5': case '6': case '7': case 'd': case 'D': case 'H': case 'h': case 'm': case 'P': case 'Q': case 'W': case 'w': case 'x': case 'z': for (j = 0; repcodes[j] != argv[i][1]; j++) ; CLREPTOGGLE(j); break; case 'b': case 'B': case 'c': case 'E': case 'f': case 'i': case 'I': case 'j': case 'J': case 'k': case 'K': case 'l': case 'L': case 'M': case 'n': case 'N': case 'p': case 'o': case 'r': case 'R': case 'S': case 't': case 'u': case 'v': case 'y': case 'Y': case 'Z': for (j = 0; repcodes[j] != argv[i][1]; j++) ; clgenrep(op, j, argv[i]); break; case 's': if (STREQ(argv[i] + 2, "ettings")) vblesonly = TRUE; else clgenrep(op, REP_REFSITE, argv[i]); break; case 'a': CLOUTSTYLE(op->outopts.outstyle); break; case 'A': CLLONGCHECK(configall((void *)(op->outopts.repq), argv[i], (argv[i][0] == '+')?"ON":"OFF", NULL, -2)); break; case 'C': CLSHORTCHECK(clconfline(op, argv[i] + 2)); break; case 'F': if (argv[i][0] == '-') { CLLONGCHECK(op->dman.fromstr = NULL); } else CLSHORTCHECK(confline(op, "FROM", argv[i] + 2, NULL, -2)); break; case 'g': CLSHORTCHECK((void)config(argv[i] + 2, op, TRUE)); break; case 'G': /* mandatory config file: already dealt with */ break; case 'O': CLSHORTCHECK(confline(op, "OUTFILE", argv[i] + 2, NULL, -2)); break; case 'q': cldebug(&warn_args, argv[i]); break; case 'T': if (argv[i][0] == '-') { CLLONGCHECK(op->dman.tostr = NULL); } else CLSHORTCHECK(confline(op, "TO", argv[i] + 2, NULL, -2)); break; case 'U': CLSHORTCHECK(confline(op, "CACHEFILE", argv[i] + 2, NULL, -2)); break; case 'V': cldebug(&debug_args, argv[i]); break; case 'X': CLGOTOS(op->outopts.gotos); break; case '-': if (STREQ(argv[i] + 2, "settings")) vblesonly = TRUE; else warn('C', TRUE, "Ignoring unknown command line argument %s", argv[i]); /* --help and --version are detected earlier, */ break; /* in settings() */ default: warn('C', TRUE, "Ignoring unknown command line argument %s", argv[i]); break; } } } } analog-6.0/src/init2.c0000644000175000017500000016014710161303542014722 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** init2.c; subsiduary functions for parsing config files */ /* See also init.c */ #include "anlghea3.h" /*** All config commands have the following structure: void config.....(void *opt, char *cmd, char *arg1, char *arg2, int rc) opt is the variable to be changed, "cmd arg1 arg2" is the config command issued, rc is the number of arguments retrieved from the config line (0..3), or -1 if the config command was issued by the program internally, or -2 if it was issued by the program in parsing command line (for those -2's which don't go through confline(), cmd is command line option). -3 is occasionally used for special cases. ***/ /* First some warnings of things that can go wrong in config commands. NB rc = -1 announced to be because anlghead.h got messed up. But it could be an internal error caused by a bug. */ void shortwarn(char *cmd, char *arg1, int rc) { char *s = "Not enough arguments for configuration command: ignoring it"; if (rc == -1) error("Default given for %s in anlghead.h too short"); else if (arg1 == NULL) warn('C', TRUE, "%s:\n%s", s, cmd); else warn('C', TRUE, "%s:\n%s %s", s, cmd, delimit(arg1)); } void longwarn(char *cmd, char *arg1, char *arg2, int rc) { char *s = "Too many arguments for configuration command: " "ignoring end of line starting"; if (rc == -1) warn('C', TRUE, "Default given for %s in anlghead.h too long: " "ignoring end of it", cmd); else if (arg2 == NULL) warn('C', TRUE, "%s:\n%s %s", s, cmd, delimit(arg1)); else warn('C', TRUE, "%s:\n%s %s %s", s, cmd, delimit(arg1), delimit(arg2)); } void badwarn(char *cmd, choice domess, char *arg1, char *arg2, int rc) { char *s = "Bad argument in configuration command: ignoring it"; if (rc == -2) warn('C', TRUE, "Bad argument in command line argument %s: ignoring it", cmd); else if (rc == -1) error("Incorrect default given for %s in anlghead.h", cmd); else if (arg2 == NULL) warn('C', domess, "%s:\n%s %s", s, cmd, delimit(arg1)); else warn('C', domess, "%s:\n%s %s %s", s, cmd, delimit(arg1), delimit(arg2)); } void unknownwarn(char *cmd, char *arg1, char *arg2) { char *s = "Unknown configuration command: ignoring it"; if (arg1 == NULL) warn('C', TRUE, "%s:\n%s", s, cmd); else if (arg2 == NULL) warn('C', TRUE, "%s:\n%s %s", s, cmd, delimit(arg1)); else warn('C', TRUE, "%s:\n%s %s %s", s, cmd, delimit(arg1), delimit(arg2)); } void configcall(void *opt, char *cmd, char *arg1, char *arg2, int rc) { if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); /* calling function will then call config() */ } void configcols(void *opt, char *cmd, char *arg1, char *arg2, int rc) { extern char colcodes[]; choice *cols = (choice *)opt; /* see also configallcols() */ logical warn1 = FALSE, warn2 = FALSE, warn3; char *c; int i = 0, j, k; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } for (c = arg1; *c != '\0' && i < COL_NUMBER - 1; c++, i++) { for (cols[i] = COL_NUMBER, k = 0; cols[i] == COL_NUMBER && colcodes[k] != '\0'; k++) { if (*c == colcodes[k]) cols[i] = k; } if (cols[i] == COL_NUMBER) { i--; if (!warn1) { warn('C', TRUE, "Ignoring unknown columns in\n%s %s", cmd, arg1); warn1 = TRUE; } } /* check for repeated columns */ else if ((cols[i] == COL_DATE && strchr(arg1, 'D') != NULL) || (cols[i] == COL_FIRSTD && strchr(arg1, 'E') != NULL)) { i--; /* cancel i++ in for loop, so overwriting this column */ if (!warn2) { warn('C', TRUE, "Ignoring repeated columns in configuration command\n%s %s", cmd, arg1); warn2 = TRUE; } } else { for (j = 0, warn3 = FALSE; j < i && !warn3; j++) { if (cols[j] == cols[i]) { /* shortest code, not least work */ warn3 = TRUE; i--; /* see above */ if (!warn2) { warn('C', TRUE, "Ignoring repeated columns in configuration command\n%s %s", cmd, arg1); warn2 = TRUE; } } } } } /* for c */ if (*c != '\0' /* can this happen? */ || rc > 1) longwarn(cmd, arg1, arg2, rc); cols[i] = COL_NUMBER; } void configallcols(void *opt, char *cmd, char *arg1, char *arg2, int rc) { choice *cols = (choice *)opt; int j; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); for (j = 0; j < DATEREP_NUMBER; j++) /* possibility of dup. warns */ configcols((void *)&(cols[j * COL_NUMBER]), cmd, arg1, NULL, -3); } /* A set of symbolic word choices for use with configchoice() below. Must all end with "". */ Choices sortbychoices[] = {{"REQUESTS", REQUESTS}, {"REQUESTS7", REQUESTS7}, {"PAGES", PAGES}, {"PAGES7", PAGES7}, {"BYTES", BYTES}, {"BYTES7", BYTES7}, {"LASTDATE", DATESORT}, {"DATE", DATESORT}, {"FIRSTDATE", FIRSTDATE}, {"ALPHABETICAL", ALPHABETICAL}, {"RANDOM", RANDOM}, {"", 0}}; #ifndef NOGRAPHICS Choices chartchoices[] = {{"ON", CHART_SORTBY}, {"TRUE", CHART_SORTBY}, {"SORTBY", CHART_SORTBY}, {"OFF", CHART_NONE}, {"FALSE", CHART_NONE}, {"NONE", CHART_NONE}, {"REQUESTS", REQUESTS}, {"REQUESTS7", REQUESTS7}, {"PAGES", PAGES}, {"PAGES7", PAGES7}, {"BYTES", BYTES}, {"BYTES7", BYTES7}, {"", 0}}; #endif Choices outstylechoices[] = {{"HTML", HTML}, {"XHTML", XHTML}, {"PLAIN", PLAIN}, {"ASCII", ASCII}, {"LATEX", LATEX}, {"COMPUTER", COMPUTER}, {"PREFORMATTED", COMPUTER}, {"CRO", COMPUTER}, {"XML", XML}, {"CACHE", OUT_NONE}, {"NONE", OUT_NONE}, {"", 0}}; #ifndef NODNS Choices dnschoices[] = {{"NONE", DNS_NONE}, {"OFF", DNS_NONE}, {"READ", DNS_READ}, {"LOOKUP", DNS_LOOKUP}, {"WRITE", DNS_WRITE}, {"", 0}}; #endif Choices gotochoices[] = {{"ON", TRUE}, {"TRUE", TRUE}, {"ALL", TRUE}, {"OFF", FALSE}, {"FALSE", FALSE}, {"NONE", FALSE}, {"FEW", FEW}, {"SOME", FEW}, {"", 0}}; Choices casechoices[] = {{"INSENSITIVE", TRUE}, {"SENSITIVE", FALSE}, {"", 0}}; Choices daychoices[] = {{"SUNDAY", SUNDAY}, {"MONDAY", MONDAY}, {"TUESDAY", TUESDAY}, {"WEDNESDAY", WEDNESDAY}, {"THURSDAY", THURSDAY}, {"FRIDAY", FRIDAY}, {"SATURDAY", SATURDAY}, {"", 0}}; Choices langchoices[] = {{"ARMENIAN", ARMENIAN}, {"BASQUE", BASQUE}, {"BOSNIAN", OLDLANG}, {"BULGARIAN", BULGARIAN}, {"BULGARIAN-MIK", BULGARIAN_MIK}, {"CATALAN", CATALAN}, {"SIMP-CHINESE", SIMP_CHINESE}, {"CHINESE", SIMP_CHINESE}, {"TRAD-CHINESE", TRAD_CHINESE}, {"TAIWANESE", TRAD_CHINESE}, {"CROATIAN", OLDLANG}, {"CZECH", CZECH}, {"CZECH-1250", CZECH_1250}, {"DANISH", DANISH}, {"DUTCH", DUTCH}, {"FLEMISH", DUTCH}, {"ENGLISH", ENGLISH}, {"US-ENGLISH", US_ENGLISH}, {"FINNISH", FINNISH}, {"FRENCH", FRENCH}, {"GERMAN", GERMAN}, {"GREEK", OLDLANG}, {"HUNGARIAN", HUNGARIAN}, {"ICELANDIC", OLDLANG}, {"INDONESIAN", INDONESIAN}, {"ITALIAN", ITALIAN}, {"JAPANESE-EUC", JAPANESE_EUC}, {"JAPANESE-JIS", JAPANESE_JIS}, {"JAPANESE-SJIS", JAPANESE_SJIS}, {"JAPANESE-UTF", JAPANESE_UTF}, {"JAPANESE", JAPANESE_JIS}, {"KOREAN", KOREAN}, {"LATVIAN", LATVIAN}, {"LITHUANIAN", OLDLANG}, {"NORWEGIAN", NORWEGIAN}, {"BOKMAL", NORWEGIAN}, {"BOKMAAL", NORWEGIAN}, {"NYNORSK", NYNORSK}, {"POLISH", POLISH}, {"PORTUGUESE", PORTUGUESE}, {"PORTUGESE", PORTUGUESE}, {"BR-PORTUGUESE", BR_PORTUGUESE}, {"BR-PORTUGESE", BR_PORTUGUESE}, {"BRAZILIAN", BR_PORTUGUESE}, {"ROMANIAN", OLDLANG}, {"RUSSIAN", RUSSIAN}, {"RUSSIAN-1251", RUSSIAN_1251}, {"SERBIAN", SERBIAN}, {"SERBOCROATIAN", SERBIAN}, {"SERBOCROAT", SERBIAN}, {"SLOVAK", SLOVAK}, {"SLOVAK-1250", SLOVAK_1250}, {"SLOVENE", SLOVENE}, {"SLOVENIAN", SLOVENE}, {"SLOVENE-1250", SLOVENE_1250}, {"SLOVENIAN-1250", SLOVENE_1250}, {"SPANISH", SPANISH}, {"SWEDISH", SWEDISH}, {"SWEDISH-ALT", SWEDISH_ALT}, {"TURKISH", TURKISH}, {"UKRAINIAN", UKRAINIAN}, {"UKRANIAN", UKRAINIAN}, {"", 0}}; Choices onoffchoices[] = {{"ON", TRUE}, {"TRUE", TRUE}, {"OFF", FALSE}, {"FALSE", FALSE}, {"", 0}}; void configchoice(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Choices *choices; choice *ans = (choice *)opt; logical *ansl = (logical *)opt; char *cmdend = strchr(cmd, '\0'); int i; logical done, islog = FALSE; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (STREQ(cmdend - 6, "SORTBY")) choices = sortbychoices; #ifndef NOGRAPHICS else if (STREQ(cmdend - 5, "CHART")) choices = chartchoices; #endif else if (STREQ(cmd, "OUTPUT")) choices = outstylechoices; #ifndef NODNS else if (STREQ(cmd, "DNS")) choices = dnschoices; #endif else if (STREQ(cmd, "LANGUAGE")) choices = langchoices; else if (STREQ(cmd, "GOTOS")) choices = gotochoices; else if (STREQ(cmdend - 4, "CASE")) { choices = casechoices; islog = TRUE; } else if (STREQ(cmd, "WEEKBEGINSON")) choices = daychoices; else if (STREQ(cmd, "SEARCHCHARCONVERT")) choices = onoffchoices; else { choices = onoffchoices; islog = TRUE; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); for (i = 0, done = FALSE; !done && !IS_EMPTY_STRING(choices[i].name); i++) { if (strcaseeq(arg1, choices[i].name)) { if (islog) *ansl = (logical)(choices[i].arg); else *ans = choices[i].arg; /* I'm sure islog is unnecessary -- that we can safely pass a logical in to this function and pretend it's a choice in here. But let's pretend we're in a strongly-typed language. :-) */ done = TRUE; } } if (!done) badwarn(cmd, TRUE, arg1, arg2, rc); } #ifndef NOGRAPHICS void configallchart(void *opt, char *cmd, char *arg1, char *arg2, int rc) { /* only takes ON and OFF to avoid invalid choices */ choice *q = (choice *)opt; choice p = UNSET; int i; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strcaseeq(arg1, "ON") || strcaseeq(arg1, "TRUE") || strcaseeq(arg1, "SORTBY")) p = CHART_SORTBY; else if (strcaseeq(arg1, "OFF") || strcaseeq(arg1, "FALSE") || strcaseeq(arg1, "NONE")) p = CHART_NONE; if (p == UNSET) badwarn(cmd, TRUE, arg1, arg2, rc); else for (i = 0; i < GENREP_NUMBER; i++) q[i] = p; } #endif /* NOGRAPHICS */ void configdebug(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char **args = (char **)opt; char *a, *c; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strcaseeq(arg1, "ON") || strcaseeq(arg1, "TRUE") || strcaseeq(arg1, "ALL")) configstr(args, NULL, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", NULL, -1); else if (strcaseeq(arg1, "OFF") || strcaseeq(arg1, "FALSE") || strcaseeq(arg1, "NONE")) configstr(args, NULL, "", NULL, -1); else { strtoupper(arg1); if (arg1[0] == '-') { while ((c = strpbrk(*args, arg1 + 1)) != NULL) memmove((void *)c, (void *)(c + 1), strlen(c)); } else if (arg1[0] == '+') { /* c.f. configstr() */ *args = (char *)xrealloc((void *)(*args), strlen(arg1) + strlen(*args)); for (a = strchr(*args, '\0'), c = arg1 + 1; *c != '\0'; c++) { if (!strchr(*args, *c)) { *a = *c; *(++a) = '\0'; } } } else configstr(args, NULL, arg1, NULL, -1); } } void configall(void *opt, char *cmd, char *arg1, char *arg2, int rc) { logical *q = (logical *)opt; choice result = UNSET; int i; configchoice((void *)(&result), cmd, arg1, arg2, rc); if (result != UNSET) { for (i = 0; i < REP_NUMBER; i++) { if (i != REP_GENSUM) q[i] = result; } } } void configallback(void *opt, char *cmd, char *arg1, char *arg2, int rc) { logical *q = (logical *)opt; /* same as configall(), but only DATEREPORTs */ choice result = UNSET; int i; configchoice((void *)(&result), cmd, arg1, arg2, rc); if (result != UNSET) { for (i = 0; i < DATEREPORTS_NUMBER; i++) q[i] = (logical)result; } } void configlang(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Lang *lang = (Lang *)opt; choice code = UNSET; configchoice((void *)(&code), cmd, arg1, arg2, rc); if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (code == OLDLANG) { badwarn(cmd, FALSE, arg1, arg2, rc); warn('C', CONTINUATION, " (language not yet translated for version 5)"); } else if (code != UNSET) { /* code == UNSET warning in configchoice() */ lang->code = code; lang->file = NULL; } } void selectlang(char *country, Outchoices *op) { /* Select localisation files with country code. If outstyle is HTML/XHTML or ASCII, look first for special files for those styles. */ char partname[13]; /* The longest name we might want to build is 3 for the country code, 1 for h or a, 8 for "desc.txt" and terminating \0. */ char *filename = NULL; /* Just to keep the compiler happy */ FILE *f; if (op->outstyle == HTML || op->outstyle == XHTML || op->outstyle == ASCII) { sprintf(partname, "%s%c%clng", country, (op->outstyle == ASCII)?'a':'h', EXTSEP); filename = buildfilename(LANGDIR, "lang", partname); } if ((op -> outstyle != HTML && op->outstyle != XHTML && op->outstyle != ASCII) || (f = FOPENR(filename)) == NULL) { sprintf(partname, "%s%clng", country, EXTSEP); filename = buildfilename(LANGDIR, "lang", partname); } else fclose(f); COPYSTR(op->lang.file, filename); if (op->domainsfile == NULL) { if (op->outstyle == HTML || op->outstyle == XHTML || op->outstyle == ASCII) { sprintf(partname, "%s%cdom%ctab", country, (op->outstyle == ASCII)?'a':'h', EXTSEP); filename = buildfilename(LANGDIR, "lang", partname); } if ((op->outstyle == HTML || op->outstyle == XHTML || op->outstyle == ASCII) && (f = FOPENR(filename)) != NULL) fclose(f); else { sprintf(partname, "%sdom%ctab", country, EXTSEP); filename = buildfilename(LANGDIR, "lang", partname); if ((f = FOPENR(filename)) == NULL) filename = NULL; /* and will get set to ukdom.tab on return */ else fclose(f); } if (filename != NULL) COPYSTR(op->domainsfile, filename); } if (op->descriptions && op->descfile == NULL) { if (op->outstyle == HTML || op->outstyle == XHTML || op->outstyle == ASCII) { sprintf(partname, "%s%cdesc%ctxt", country, (op->outstyle == ASCII)?'a':'h', EXTSEP); filename = buildfilename(LANGDIR, "lang", partname); } if ((op->outstyle == HTML || op->outstyle == XHTML || op->outstyle == ASCII) && (f = FOPENR(filename)) != NULL) fclose(f); else { sprintf(partname, "%sdesc%ctxt", country, EXTSEP); filename = buildfilename(LANGDIR, "lang", partname); if ((f = FOPENR(filename)) == NULL) filename = NULL; else fclose(f); } if (filename != NULL) COPYSTR(op->descfile, filename); } } void configlogfmt(void *opt, char *cmd, char *arg1, char *arg2, int rc) { extern Memman *xmemman; Inputformatlist **logfmt = (Inputformatlist **)opt; Inputformatlist *fp; Inputformat *form; choice count[INPUT_NUMBER]; choice rc2; char code; int i; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strcaseeq(arg1, "DEFAULT")) { (*logfmt)->used = TRUE; configlogfmt(opt, NULL, "%x0", NULL, -1); (*logfmt)->used = TRUE; } else if (strcaseeq(arg1, "AUTO")) { (*logfmt)->used = TRUE; configlogfmt(opt, NULL, "%x1", NULL, -1); (*logfmt)->used = TRUE; } else if (strcaseeq(arg1, "COMMON")) { configlogfmt(opt, NULL, LOG_COMMON1, NULL, -1); configlogfmt(opt, NULL, LOG_COMMON2, NULL, -1); configlogfmt(opt, NULL, LOG_COMMON3, NULL, -1); } else if (strcaseeq(arg1, "MS-COMMON")) { configlogfmt(opt, NULL, LOG_MS_COMMON1, NULL, -1); configlogfmt(opt, NULL, LOG_COMMON2, NULL, -1); configlogfmt(opt, NULL, LOG_COMMON3, NULL, -1); } else if (strcaseeq(arg1, "COMBINED")) { configlogfmt(opt, NULL, LOG_COMBINED1, NULL, -1); configlogfmt(opt, NULL, LOG_COMBINED2, NULL, -1); configlogfmt(opt, NULL, LOG_COMBINED3, NULL, -1); } else if (strcaseeq(arg1, "MICROSOFT-NA") || strcaseeq(arg1, "MICROSOFT-NA2") || strcaseeq(arg1, "MICROSOFT-NA4")) { /* NA2 and NA4 are legacy */ configlogfmt(opt, NULL, LOG_MS_NA1, NULL, -1); configlogfmt(opt, NULL, LOG_MS_NA2, NULL, -1); } else if (strcaseeq(arg1, "MICROSOFT-INT") || strcaseeq(arg1, "MICROSOFT-INT2") || strcaseeq(arg1, "MICROSOFT-INT4")) { configlogfmt(opt, NULL, LOG_MS_INT1, NULL, -1); configlogfmt(opt, NULL, LOG_MS_INT2, NULL, -1); } else if (strcaseeq(arg1, "WEBSITE-NA")) configlogfmt(opt, NULL, LOG_WEBSITE_NA, NULL, -1); else if (strcaseeq(arg1, "WEBSITE-INT")) configlogfmt(opt, NULL, LOG_WEBSITE_INT, NULL, -1); else if (strcaseeq(arg1, "WEBSTAR")) { configlogfmt(opt, NULL, LOG_WEBSTAR1, NULL, -1); configlogfmt(opt, NULL, LOG_WEBSTAR2, NULL, -1); } else if (strcaseeq(arg1, "EXTENDED")) { configlogfmt(opt, NULL, LOG_EXTENDED1, NULL, -1); configlogfmt(opt, NULL, LOG_EXTENDED2, NULL, -1); } else if (strcaseeq(arg1, "MS-EXTENDED")) { configlogfmt(opt, NULL, LOG_MS_EXTENDED1, NULL, -1); configlogfmt(opt, NULL, LOG_EXTENDED2, NULL, -1); } else if (strcaseeq(arg1, "WEBSTAR-EXTENDED")) { configlogfmt(opt, NULL, LOG_WEBSTAR_EXTENDED1, NULL, -1); configlogfmt(opt, NULL, LOG_EXTENDED2, NULL, -1); } else if (strcaseeq(arg1, "MACHTTP")) configlogfmt(opt, NULL, LOG_MACHTTP, NULL, -1); else if (strcaseeq(arg1, "NETSCAPE")) configlogfmt(opt, NULL, LOG_NETSCAPE, NULL, -1); else if (strcaseeq(arg1, "BROWSER")) configlogfmt(opt, NULL, LOG_BROWSER, NULL, -1); else if (strcaseeq(arg1, "REFERRER") || strcaseeq(arg1, "REFERER")) { configlogfmt(opt, NULL, LOG_REFERRER1, NULL, -1); configlogfmt(opt, NULL, LOG_REFERRER2, NULL, -1); } else if ((rc2 = strtoinfmt(&form, arg1, count)) != FMT_OK) { code = (rc == -3)?'F':'C'; if (rc == -3) warn(code, FALSE, "Ignoring corrupt format line in logfile"); else badwarn(cmd, FALSE, arg1, arg2, rc); if (rc2 == FMT_DUP) warn(code, CONTINUATION, " (reason: one item occurs twice in format)"); else if (rc2 == FMT_PARTTIME) warn(code, CONTINUATION, " (reason: time without date or vice versa)"); else if (rc2 == FMT_BADPC) warn(code, CONTINUATION, " (reason: an unknown item code is present)"); else if (rc2 == FMT_NOPC) warn(code, CONTINUATION, " (reason: no item codes are present)"); else if (rc2 == FMT_BADCHAR) warn(code, CONTINUATION, " (reason: an unknown escape sequence is present)"); else if (rc2 == FMT_NOTERM) warn(code, CONTINUATION, " (reason: an unterminated string is present)"); else if (rc2 == FMT_BADBUILTIN) warn(code, CONTINUATION, " (reason: non-existent built-in format)"); else if (rc2 == FMT_QBUTNOR) warn(code, CONTINUATION, " (reason: query string without filename)"); /* despite finishing "else if", that should be all the rc2's */ return; } else { if ((*logfmt)->used) { fp = (Inputformatlist *)submalloc(xmemman, sizeof(Inputformatlist)); *logfmt = fp; (*logfmt)->used = FALSE; } else { for (fp = *logfmt; fp->next != NULL; TO_NEXT(fp)) ; fp->next = (Inputformatlist *)submalloc(xmemman, sizeof(Inputformatlist)); TO_NEXT(fp); } fp->form = form; for (i = 0; i < INPUT_NUMBER; i++) fp->count[i] = count[i]; fp->next = NULL; } } void configapachelogfmt(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char *p; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if ((p = apachelogfmt(arg1)) == NULL) warn('C', TRUE, "Sorry, can't parse \"%%...{format}t\" in %s: ignoring whole line", cmd); else if (STREQ(cmd, "APACHELOGFORMAT")) configlogfmt(opt, "APACHELOGFORMAT -> LOGFORMAT", p, NULL, 1); else configlogfmt(opt, "APACHEDAFAULTLOGFORMAT -> DEFAULTLOGFORMAT", p, NULL, 1); } void configrepord(void *opt, char *cmd, char *arg1, char *arg2, int rc) { extern char repcodes[]; char *s1 = "REPORTORDER"; char *s2 = "REPORTORDER in anlghead.h"; char *s = (rc == -1)?s2:s1; choice *order = (choice *)opt; logical used[REP_NUMBER]; int i, j, k; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } for (i = 0; i < REP_NUMBER; i++) used[i] = 0; for (i = 0, k = 0; k < REP_NUMBER && arg1[i] != '\0'; i++) { if (ISALNUM(arg1[i])) { /* else ignore */ for (j = 0; repcodes[j] != arg1[i] && repcodes[j] != '\0'; j++) ; if (repcodes[j] == '\0') warn('C', TRUE, "Spurious character %c in %s: ignoring it", arg1[i], s); else if (used[j] == 0) { order[k++] = j; used[j] = 1; } else if (used[j] == 1) { warn('C', TRUE, "Character %c used more than once in %s: " "ignoring later occurrences", arg1[i], s); used[j] = 2; } } } if (rc > 1 || arg1[i] != '\0') longwarn(cmd, arg1, arg2, rc); if (k < REP_NUMBER) { for (i = 0; i < REP_NUMBER && k < REP_NUMBER; i++) { if (used[i] == 0) { /* k should stay < R_N automatically, but... */ warn('C', TRUE, "Character %c not used in %s: adding it at end", repcodes[i], s); order[k++] = i; } } } order[k] = -1; } void configstr(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char **s = (char **)opt; size_t len; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); len = strlen(arg1); *s = (char *)xrealloc((void *)(*s), len + 1); strcpy(*s, arg1); } void configstrlist(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Strlist **list = (Strlist **)opt; Strlist *lp = NULL; char *t; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc == -1) /* have to be careful because can't strtok a const string */ t = arg1; else if ((t = strtok(arg1, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (*list != NULL) { for (lp = *list; lp->next != NULL; TO_NEXT(lp)) ; /* find end of list */ } for ( ; t != NULL; t = ((rc == -1)?NULL:strtok((char *)NULL, ","))) { if (strcaseeq(t, "none")) *list = NULL; else { if (*list == NULL) { lp = (Strlist *)xmalloc(sizeof(Strlist)); *list = lp; } else { lp->next = (Strlist *)xmalloc(sizeof(Strlist)); TO_NEXT(lp); } if (STREQ(cmd, "DOMCHARTEXPAND") && *t == '.') /* ugly special case */ t++; COPYSTR(lp->name, t); lp->next = NULL; } } return; } void configerrfile(void *opt, char *cmd, char *arg1, char *arg2, int rc) { /* NB Don't use freopen(), coz fatal errors sent to both errfile & stderr. */ FILE **err = (FILE **)opt; FILE *tmp; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strcaseeq(arg1, "stderr")) { if (*err != stderr) { debug('F', "Opening stderr as new ERRFILE"); warn('E', TRUE, "Redirecting future diagnostic messages to stderr"); fclose(*err); *err = stderr; } } else { arg1 = buildfilename(ERRDIR, "", arg1); if ((tmp = FOPENW(arg1)) == NULL) warn('F', TRUE, "Failed to open ERRFILE %s: ignoring it", arg1); else { debug('F', "Opening %s as new ERRFILE", arg1); warn('E', TRUE, "Redirecting future diagnostic messages to %s", arg1); if (*err != stderr) fclose(*err); *err = tmp; setvbuf(*err, NULL, ERRBUFMODE, BUFSIZ); } } } /* There are several versions of expandwildlogs(), according to the following flags: NODIRENT excludes all wildcards in logfile names. Otherwise, if VMSDIRENT, MACDIRENT, WIN32DIRENT or RISCOSDIRENT is defined, use that. Otherwise use POSIX.2 glob, unless NOGLOB is defined when use POSIX.1 stuff, not allowing wildcards in directory names. MACDIRENT does actually include the POSIX.1 dirent code here, but implements all the functions itself in macstuff.c. In all cases, expandwildlogs() takes an argument, Logfile *lp, and clones it within the list (using clonelogs()) as it expands the wildcards. It returns a pointer to the last clone. E.g. expandwildlogs(log2*) turns log1 -> log2* -> log3 into log1 -> log2a -> log2b -> log3 returning log2b */ #ifndef NODIRENT Logfile *clonelogs(Logfile *from, char *name) { Logfile *ans = (Logfile *)xmalloc(sizeof(Logfile)); memcpy(ans, from, sizeof(Logfile)); COPYSTR(ans->name, name); ans->next = from->next; from->next = ans; return(ans); } #ifndef VMSDIRENT #ifndef WIN32DIRENT #ifndef RISCOSDIRENT #ifndef NOGLOB /* Glob code is due to Owen Cliffe Feb 2001, slightly modified by Stephen Turner */ Logfile *expandwildlogs(Logfile *lp, Logfile **pter) { Logfile *ans = lp; glob_t globbuf; struct stat statbuf; int i; globbuf.gl_offs = 0; if(glob(lp->name,GLOB_NOCHECK,NULL,&globbuf) != 0){ warn('F', TRUE, "Failed to expand wildcards %s", lp->name); return(ans); } for(i=0;inext; return(ans); } #else /* not GLOB; use POSIX dirent */ Logfile *expandwildlogs(Logfile *lp, Logfile **pter) { Logfile *ans = lp; struct dirent *filep; struct stat buf; DIR *dirp; char *dirname, *filename, *c; size_t dirlen, len = 0; if ((c = strrpbrk(lp->name, PATHSEPS)) == NULL) { filename = lp->name; dirname = (char *)xmalloc(3); #ifdef MAC dirname[0] = '\0'; #else sprintf(dirname, ".%c", DIRSEP); #endif } else { filename = c + 1; dirname = (char *)xmalloc((size_t)(c - lp->name) + 2); memcpy((void *)dirname, (void *)(lp->name), (size_t)(c - lp->name) + 1); dirname[(c - lp->name) + 1] = '\0'; } if ((dirp = opendir(dirname)) == NULL) { if (strchr(dirname, '*') != NULL || strchr(dirname, '?') != NULL) warn('F', TRUE, "Cannot open directory %s: won't expand wildcards %s\n" "(wildcards not allowed in directory name)", dirname, lp->name); else warn('F', TRUE, "Cannot open directory %s: won't expand wildcards %s", dirname, lp->name); return(ans); } dirlen = strlen(dirname); while ((filep = readdir(dirp)) != NULL) { if (MATCHES(filep->d_name, filename)) { if (strlen(filep->d_name) > len) { len = strlen(filep->d_name); /* d_namlen is not portable */ dirname = (char *)xrealloc((void *)dirname, dirlen + len + 1); } memcpy((void *)(dirname + dirlen), (void *)(filep->d_name), len + 1); stat(dirname, &buf); /* dirname now contains complete filename */ if (S_ISREG(buf.st_mode)) ans = clonelogs(ans, dirname); } } closedir(dirp); free((void *)dirname); if (ans != lp) *pter = lp->next; return(ans); } #endif /* NOGLOB */ #else /* RISCOSDIRENT */ /* The RISC OS dirent is due to Stefan Bellon (sbellon@sbellon.de) */ static struct { unsigned int load, exec, length, attributes, type; char name[255]; /* WARNING: arbitrary limit */ } direntry; Logfile *expandwildlogs(Logfile *lp, Logfile **pter) { Logfile *ans = lp; char *dirname, *leafname, *filename, *c; int count, context = 0; _kernel_oserror *e; size_t dirlen, path = 0, len = 0; if ((c = strrpbrk(lp->name, PATHSEPS)) == NULL) { path = 0; dirname = (char *)xmalloc(1); dirname[0] = '\0'; leafname = lp->name; } else { path = 1; dirname = (char *)xmalloc((size_t)(c - lp->name) + 1); memcpy((void *)dirname, (void *)(lp->name), (size_t)(c - lp->name)); dirname[(c - lp->name)] = '\0'; leafname = c + 1; } dirlen = strlen(dirname); filename = (char *)xmalloc(dirlen + path + 1); memcpy(filename, dirname, dirlen); filename[dirlen] = DIRSEP; filename[dirlen + path] = '\0'; /* may overwrite the DIRSEP again */ while (context != -1) { e = _swix(OS_GBPB, _INR(0,6) | _OUTR(3,4), 10, dirname, &direntry, 1, context, sizeof(direntry), leafname, &count, &context); if (e != NULL) error("%s\n", e->errmess); if (count > 0 && direntry.type == 1) { if (strlen(direntry.name) > len) { len = strlen(direntry.name); filename = (char *)xrealloc((void *)filename, dirlen + path + len + 1); } memcpy((void *)(filename + dirlen + path), (void *)(direntry.name), len + 1); ans = clonelogs(ans, filename); } } free((void *)dirname); free((void *)filename); if (ans != lp) *pter = lp->next; return(ans); } #endif /* RISCOSDIRENT */ #else /* WIN32DIRENT */ Logfile *expandwildlogs(Logfile *lp, Logfile **pter) { Logfile *ans = lp; struct _stat buf; char *dirname, *c; struct _finddata_t file; long code; int rc2; size_t dirlen, len = 0; if ((code = _findfirst(lp->name, &file)) != (long)(-1)) { if ((c = strrpbrk(lp->name, PATHSEPS)) == NULL) { dirname = (char *)xmalloc(1); dirname[0] = '\0'; } else { dirname = (char *)xmalloc((size_t)(c - lp->name) + 2); memcpy((void *)dirname, (void *)(lp->name), (size_t)(c - lp->name) + 1); dirname[(c - lp->name) + 1] = '\0'; } dirlen = strlen(dirname); for (rc2 = 0; rc2 == 0; rc2 = _findnext(code, &file)) { if (strlen(file.name) > len) { len = strlen(file.name); dirname = (char *)xrealloc((void *)dirname, dirlen + len + 1); } memcpy((void *)(dirname + dirlen), (void *)(file.name), len + 1); _stat(dirname, &buf); /* dirname now contains complete filename */ if (_S_IFREG & buf.st_mode) /* bitwise & */ ans = clonelogs(ans, dirname); } _findclose(code); free((void *)dirname); } if (ans != lp) *pter = lp->next; return(ans); } #endif /* WIN32DIRENT */ #else /* VMSDIRENT */ /* This function is due to Dave Jones (except for any errors I introduced when converting from old configwildlogs() to new expandwildlogs()) */ Logfile *expandwildlogs(Logfile *lp, Logfile **pter) { Logfile *ans = lp; static char fspec[VMS_FSPEC_MAX], related[VMS_FSPEC_MAX]; static char result[VMS_FSPEC_MAX]; static $DESCRIPTOR(fspec_dx,fspec); static $DESCRIPTOR(related_dx,""); static $DESCRIPTOR(default_dx,".log"); static $DESCRIPTOR(result_dx,result); char *space, *ques; long int context; int status, stsval, length, LIB$FIND_FILE(), LIB$FIND_FILE_END(); length = strlen (lp->name); if ( length >= VMS_FSPEC_MAX ) length = VMS_FSPEC_MAX - 1; strncpy ( fspec, lp->name, length ); fspec[length] = '\0'; while ( ques = strchr(fspec,'?') ) *ques = '%'; fspec_dx.dsc$w_length = length; for ( context = 0; 1&(status=LIB$FIND_FILE ( &fspec_dx, &result_dx, &context, &default_dx, &related_dx, &stsval, (long *) 0 )); ) { space = strchr ( result, ' ' ); if ( !space ) space = &result[VMS_FSPEC_MAX-1]; *space = '\0'; ans = clonelogs(ans, result); /* Save last result to use as default for next lookup */ strcpy ( related, result ); related_dx.dsc$w_length = strlen(result); related_dx.dsc$a_pointer = related; } if ( context ) LIB$FIND_FILE_END ( &context ); if (ans != lp) *pter = lp->next; return(ans); } #endif /* VMSDIRENT */ #endif /* NODIRENT */ void configlogfile(void *opt, char *cmd, char *arg1, char *arg2, int rc) { extern Inputformatlist *logformat; extern logical newloglist, iscache; /* see note in configcachefile() below re iscache */ extern int tz; Logfile **logfile = (Logfile **)opt; /* logfile[0] is logfiles, logfile[1] is cache files */ Logfile *lf; char *s, *t; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 2) longwarn(cmd, arg1, arg2, rc); if (strchr(arg1, ',') != NULL) { s = (char *)xmalloc(strlen(arg1) + 1); strcpy(s, arg1); /* can't strtok arg1 directly in case it's const */ if ((t = strtok(s, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); free((void *)s); return; } for ( ; t != NULL; t = strtok((char *)NULL, ",")) configlogfile(opt, "LOGFILE", t, arg2, rc); free((void *)s); return; } if (strcaseeq(arg1, "NONE")) { /* from LOGFILE not CACHEFILE because CACHEFILE NONE caught earlier */ configlogfmt((void *)&logformat, "LOGFORMAT", "DEFAULT", NULL, -1); logfile[iscache] = NULL; return; } if (newloglist) { logfile[0] = NULL; logfile[1] = NULL; newloglist = FALSE; } if (logfile[iscache] == NULL) { logfile[iscache] = (Logfile *)xmalloc(sizeof(Logfile)); lf = logfile[iscache]; } else { for (lf = logfile[iscache]; lf->next != NULL; TO_NEXT(lf)) ; lf->next = (Logfile *)xmalloc(sizeof(Logfile)); TO_NEXT(lf); } if (IS_STDIN(arg1) || rc == -2) { COPYSTR(lf->name, arg1); } else lf->name = buildfilename(iscache?(char *)CACHEDIR:(char *)LOGSDIR, "", arg1); /* Non-configuration options initialised in my_lfopen */ lf->type = LF_NOTOPENED; lf->format = logformat; lf->tz = tz; if (rc >= 2) { /* not from CACHEFILE: those are caught earlier */ COPYSTR(lf->prefix, arg2); lf->prefixlen = strlen(lf->prefix); if (strstr(arg2, "%v") == NULL) lf->pvpos = UNSET; else lf->pvpos = strstr(arg2, "%v") - arg2; } else lf->prefix = NULL; lf->next = NULL; if (!iscache) logformat->used = TRUE; } void configcachefile(void *opt, char *cmd, char *arg1, char *arg2, int rc) { /* a wrapper to configlogfile(), but we have to catch a few cases first */ Logfile **logfile = (Logfile **)opt; extern logical iscache; /* iscache tells configlogfile() to use logfile[1] instead of logfile[0], not to change logformat->used, and to use CACHEDIR instead of LOGSDIR. */ if (rc > 1) { longwarn(cmd, arg1, arg2, rc); rc = 1; } if (strcaseeq(arg1, "NONE")) { logfile[1] = NULL; return; } iscache = TRUE; configlogfile(opt, cmd, arg1, NULL, rc); iscache = FALSE; } void configoutfile(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char **file = (char **)opt; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (IS_STDOUT(arg1) || rc == -2) { COPYSTR(*file, arg1); } else *file = buildfilename(OUTDIR, "", arg1); } void configchar(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char *c = (char *)opt; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (IS_EMPTY_STRING(arg1) || strcaseeq(arg1, "none")) *c = '\0'; else { if (arg1[1] != '\0') longwarn(cmd, arg1, arg2, rc); *c = arg1[0]; } } void configbarstyle(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char *g = (char *)opt; char h; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (rc > 1 || arg1[1] != '\0') longwarn(cmd, arg1, arg2, rc); h = TOLOWER(arg1[0]); if (h != 'a' && h != 'b' && h != 'c' && h != 'd' && h != 'e' && h != 'f' && h != 'g' && h != 'h' && h != 'i' && h != 'j') badwarn(cmd, TRUE, arg1, arg2, rc); else *g = h; } void configgraph(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char *g = (char *)opt; /* see also configallgraph() below */ if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (rc > 1 || arg1[1] != '\0') longwarn(cmd, arg1, arg2, rc); if (arg1[0] != 'R' && arg1[0] != 'P' && arg1[0] != 'B' && arg1[0] != 'r' && arg1[0] != 'p' && arg1[0] != 'b') badwarn(cmd, TRUE, arg1, arg2, rc); else *g = arg1[0]; } void configallgraph(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char *g = (char *)opt; /* same as configgraph() */ int i; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (rc > 1 || arg1[1] != '\0') longwarn(cmd, arg1, arg2, rc); if (arg1[0] != 'R' && arg1[0] != 'P' && arg1[0] != 'B' && arg1[0] != 'r' && arg1[0] != 'p' && arg1[0] != 'b') badwarn(cmd, TRUE, arg1, arg2, rc); else { for (i = 0; i < DATEREP_NUMBER; i++) g[i] = arg1[0]; } } void configfloor(void *opt, char *cmd, char *arg1, char *arg2, int rc) { /* This function parses the following formats for floor r = requests, p = pages, b = bytes, s = 7-day requests, q = 7-day pages, c = 7-day bytes, d = last date, e = first date. -100(r|s|p|q|b|c|d|e) // top 100 1000(r|s|p|q|b|c) // at least 1000 9.5(k|M|G|T|P|E|Z|Y)(b|c) // ditto 0.5%(r|s|p|q|b|c) // at least 0.5% of total 0.5:(r|s|p|q|b|c) // at least 0.5% of largest 970701(d|e) // last/first access since -00-0201(d|e) // same with a relative date Upper case letters for r|p|b|c|d are also acceptable. */ extern time_t starttime; extern char *byteprefix; Floor *floor = (Floor *)opt; char **b, *c, d; choice floorby; char qual = '\0'; double mn; timecode_t t; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); c = arg1 + strlen(arg1) - 1; d = TOUPPER(*c); if (d == 'R') floorby = REQUESTS; else if (d == 'S') floorby = REQUESTS7; else if (d == 'P') floorby = PAGES; else if (d == 'Q') floorby = PAGES7; else if (d == 'B') floorby = BYTES; else if (d == 'C') floorby = BYTES7; else if (d == 'D') floorby = DATESORT; else if (d == 'E') floorby = FIRSTDATE; else { badwarn(cmd, TRUE, arg1, arg2, rc); return; } if (floorby != DATESORT && floorby != FIRSTDATE) { b = (char **)xmalloc(sizeof(char *)); mn = strtod(arg1, b); if (*b == arg1) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } else if (*b == c - 1) { if (mn < 0) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } else if (**b == '%' || **b == ':' || ((floorby == BYTES || floorby == BYTES7) && strchr(byteprefix + 1, **b))) qual = **b; else { badwarn(cmd, TRUE, arg1, arg2, rc); return; } } free((void *)b); } else { /* floorby == DATESORT or FIRSTDATE */ if (arg1[0] == '-' && arg1[1] != '0' && ISDIGIT(arg1[1])) mn = atof(arg1); else if (parsedate(starttime, arg1, &t, TRUE, FALSE) == ERR) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } else mn = (double)t; } floor->min = mn; floor->qual = qual; floor->floorby = floorby; } void configtree(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Tree **treex = (Tree **)opt; Hashindex item; Hashentry *own; char *name, *nameend, *t; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strchr(arg1, ',') != NULL) { if ((t = strtok(arg1, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } for ( ; t != NULL; t = strtok((char *)NULL, ",")) configtree(opt, cmd, t, NULL, -1); return; } own = newhashentry(DATA_NUMBER, FALSE); item.own = own; item.name = arg1; name = NULL; (*treex)->cutfn(&name, &nameend, item.name, TRUE); (void)treefind(name, nameend, &((*treex)->tree), &item, (*treex)->cutfn, TRUE, TRUE, FALSE, (*treex)->space, NULL, DATA_NUMBER); } void configulong(void *opt, char *cmd, char *arg1, char *arg2, int rc) { unsigned int *x = (unsigned int *)opt; char **c; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (!ISDIGIT(arg1[0])) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } c = (char **)xmalloc(sizeof(char *)); *x = strtoul(arg1, c, 10); if (rc > 1 || **c != '\0') longwarn(cmd, arg1, arg2, rc); free((void *)c); } void configuint(void *opt, char *cmd, char *arg1, char *arg2, int rc) { unsigned int *x = (unsigned int *)opt; char **c; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (!ISDIGIT(arg1[0])) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } c = (char **)xmalloc(sizeof(char *)); *x = (unsigned int)strtoul(arg1, c, 10); if (rc > 1 || **c != '\0') longwarn(cmd, arg1, arg2, rc); free((void *)c); } void configoffset(void *opt, char *cmd, char *arg1, char *arg2, int rc) { /* configint with extra checks */ int *x = (int *)opt; char **c; int y; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (arg1[0] == '+') { if (!ISDIGIT(arg1[1])) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } arg1++; } else if (!ISDIGIT(arg1[0]) && !(arg1[0] == '-' && ISDIGIT(arg1[1]))) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } c = (char **)xmalloc(sizeof(char *)); y = (int)strtol(arg1, c, 10); if (rc > 1 || **c != '\0') longwarn(cmd, arg1, arg2, rc); if (y > 40320 || y < -40320) warn('C', TRUE, "Ignoring offset of more than 28 days in configuration " "command\n%s %s", cmd, arg1); else { *x = y; if (*x % 30 != 0) warn('D', TRUE, "Offset not a multiple of 30 in configuration command\n%s %s", cmd, arg1); else if (*x > 1500 || *x < -1500) warn('D', TRUE, "Offset more than 25 hours in configuration command\n%s %s", cmd, arg1); } free((void *)c); } void configlowmem(void *opt, char *cmd, char *arg1, char *arg2, int rc) { choice *x = (choice *)opt; if (rc == 0 || IS_EMPTY_STRING(arg1)) { shortwarn(cmd, arg1, rc); return; } if (!(arg1[0] >= '0' && arg1[0] <= '3')) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } if (rc > 1 || arg1[1] != '\0') longwarn(cmd, arg1, arg2, rc); *x = (choice)(arg1[0] - '0'); } int aliastocount(char *s) { int n; if (headcasematch(s, "PLAIN:")) return(0); n = (strchr(s, '*') != NULL); while ((s = strchr(s, '$')) != NULL) { s++; if (*s < '1' || *s > '9') s++; else n = MAX(n, (*s - '0')); } return(n); } AliasTo *configaliasto(char *s, logical is_regex) { /* Can prob be optimised somewhat, but with loss of any remaining clarity. */ AliasTo *ans, *atp; char *t, next; ans = (AliasTo *)xmalloc(sizeof(AliasTo)); if (headcasematch(s, "PLAIN:")) { ans->string = (char *)xmalloc(strlen(s) - 5); strcpy(ans->string, s + 6); ans->after = -1; ans->next = NULL; return(ans); } /* else the normal case */ atp = ans; while (TRUE) { t = strpbrk(s, "*$"); while (t != NULL && *t == '$' && (*(t + 1) < '1' || *(t + 1) > '9')) /* ignore ${non-digit} */ t = strpbrk(t + 2, "*$"); if (t == NULL) t = strchr(s, '\0'); atp->string = (char *)xmalloc(t - s + 1); memcpy(atp->string, s, t - s); atp->string[t - s] = '\0'; for (s = atp->string; (s = strstr(s, "$$")) != NULL; s++) memmove(s + 1, s + 2, strlen(s + 1)); /* "$$"->"$" (reuse s) */ if (*t == '\0') atp->after = -1; else { if (*t == '*') next = '1'; else /* *t == '$' */ next = *(++t); atp->after = 2 * ((int)next - (int)(is_regex?'0':'1')); /* internal index of *'s is from 0; of regex brackets is from 1 */ } if (*t == '\0' || *(t + 1) == '\0') { atp->next = NULL; return(ans); } else { atp->next = (AliasTo *)xmalloc(sizeof(AliasTo)); TO_NEXT(atp); } s = t + 1; /* set s to rest of original string */ } } void configalias(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Alias **alias = (Alias **)opt; Alias *ap; unsigned int leftstars; int maxrightstar; char starchar; logical is_regex = FALSE; pcre *pattern = NULL; char *errstr; int erroffset; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc == 1) { if (strcaseeq(arg1, "none")) *alias = NULL; else shortwarn(cmd, arg1, rc); return; } if (rc > 2) longwarn(cmd, arg1, arg2, rc); if (headcasematch(arg1, "REGEXP:") || headcasematch(arg1, "REGEXPI:")) { if ((pattern = pcre_compile(arg1 + 7 + (arg1[6] != ':'), PCRE_DOTALL | ((arg1[6] == ':')?0:PCRE_CASELESS), (const char **)(&errstr), &erroffset, NULL)) == NULL) { badwarn(cmd, FALSE, arg1, arg2, rc); warn('C', CONTINUATION, " (%s in regular expression)", errstr); return; } starchar = '('; pcre_fullinfo(pattern, NULL, PCRE_INFO_CAPTURECOUNT, (void *)&leftstars); is_regex = TRUE; } else { starchar = '*'; leftstars = chrdistn(arg1, starchar); } if (leftstars >= 2 && strchr(arg2, '*') != NULL && !headcasematch(arg2, "PLAIN:")) { badwarn(cmd, FALSE, arg1, arg2, rc); warn('C', CONTINUATION, " (Can't have * on RHS with two %c's on LHS: use $1, $2 etc.)", starchar); return; } if ((maxrightstar = aliastocount(arg2)) > (int)leftstars) { badwarn(cmd, FALSE, arg1, arg2, rc); warn('C', CONTINUATION, " (More substitutions on RHS than %c's on LHS)", starchar); return; } /* add new one to front for speed; swap round in reversealias() later */ ap = (Alias *)xmalloc(sizeof(Alias)); COPYSTR(ap->from, arg1); /* save string even for regex: might l.c. */ ap->to = configaliasto(arg2, is_regex); ap->isregex = is_regex; if (is_regex) ap->pattern = pattern; ap->next = *alias; *alias = ap; } void configstrpair(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Strpairlist **pair = (Strpairlist **)opt; Strpairlist *ap; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc == 1) { if (strcaseeq(arg1, "none")) *pair = NULL; else shortwarn(cmd, arg1, rc); return; } if (chrn(arg1, '*') >= 2 && strchr(arg2, '*') != NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } if (rc > 2) longwarn(cmd, arg1, arg2, rc); if (*pair == NULL) { ap = (Strpairlist *)xmalloc(sizeof(Strpairlist)); *pair = ap; } else { for (ap = *pair; ap->next != NULL; TO_NEXT(ap)) ; /* find end of list */ ap->next = (Strpairlist *)xmalloc(sizeof(Strpairlist)); TO_NEXT(ap); } COPYSTR(ap->name, arg1); COPYSTR(ap->data, arg2); ap->next = NULL; } void configstrpairlist(void *opt, char *cmd, char *arg1, char *arg2, int rc) { char *t; if (arg1 == NULL) { configstrpair(opt, cmd, arg1, arg2, rc); /* will warn about args if nec. */ return; } if ((t = strtok(arg1, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } for ( ; t != NULL; t = strtok((char *)NULL, ",")) configstrpair(opt, cmd, t, arg2, rc); return; } void configstrpair2list(void *opt, char *cmd, char *arg1, char *arg2, int rc) { /* comma-separated list in arg2 instead of arg1 */ char *t; if (arg2 == NULL) { configstrpair(opt, cmd, arg1, arg2, rc); /* will warn about args if nec. */ return; } if ((t = strtok(arg2, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } for ( ; t != NULL; t = strtok((char *)NULL, ",")) configstrpair(opt, cmd, arg1, t, rc); return; } void configdomlevel(void *opt, char *cmd, char *arg1, char *arg2, int rc) { Strpairlist ***levels = (Strpairlist ***)opt; unsigned int c; c = 26 * ((int)(*arg1 - 'a')); if (*arg1 != '\0') c += (int)(*(arg1 + 1) - 'a'); if (c >= DOMLEVEL_NUMBER) /* this shouldn't happen */ c = DOMLEVEL_NUMBER - 1; configstrpair((void *)(&((*levels)[c])), cmd, arg1, arg2, rc); } void configinex(void *opt, char *cmd, char *arg1, char *arg2, int rc, logical in, logical omitinitdot, logical omittrailslash) { Include **include = (Include **)opt; Include *ip; char *errstr; int erroffset; char *t; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strchr(arg1, ',') != NULL && !headcasematch(arg1, "REGEXP:") && !headcasematch(arg1, "REGEXPI:")) { /* This still allows a REGEXP in a comma-separated list if it's not the first item and doesn't contain a comma. The docs don't admit this. :) */ if ((t = strtok(arg1, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } for ( ; t != NULL; t = strtok((char *)NULL, ",")) configinex(opt, cmd, t, NULL, -1, in, omitinitdot, omittrailslash); return; } /* NB Put new include on front of list (so will test it earlier) */ ip = *include; *include = (Include *)xmalloc(sizeof(Include)); if (omitinitdot && arg1[0] == '.') arg1++; if (omittrailslash && !IS_EMPTY_STRING(arg1) && arg1[strlen(arg1) - 1] == '/') arg1[strlen(arg1) - 1] = '\0'; COPYSTR((*include)->name, arg1); (*include)->next = ip; /* save name even for regex: might l.c. */ if (headcasematch(arg1, "REGEXP:") || headcasematch(arg1, "REGEXPI:")) { if (((*include)->pattern = pcre_compile(arg1 + 7 + (arg1[6] != ':'), PCRE_DOTALL | ((arg1[6] == ':')?0:PCRE_CASELESS), (const char **)(&errstr), &erroffset, NULL)) == NULL) { *include = ip; badwarn(cmd, FALSE, arg1, arg2, rc); warn('C', CONTINUATION, " (%s in regular expression)", errstr); return; } (*include)->type = in?(REGEX_INC):(REGEX_EXC); } else { if (strcaseeq((*include)->name, "pages")) strcpy((*include)->name, "pages"); (*include)->type = in?(NORMAL_INC):(NORMAL_EXC); } } void configinc(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configinex(opt, cmd, arg1, arg2, rc, TRUE, FALSE, FALSE); } void configexc(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configinex(opt, cmd, arg1, arg2, rc, FALSE, FALSE, FALSE); } /* same, omitting initial dot */ void configincd(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configinex(opt, cmd, arg1, arg2, rc, TRUE, TRUE, FALSE); } void configexcd(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configinex(opt, cmd, arg1, arg2, rc, FALSE, TRUE, FALSE); } /* same, omitting trailing slash */ void configincs(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configinex(opt, cmd, arg1, arg2, rc, TRUE, FALSE, TRUE); } void configexcs(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configinex(opt, cmd, arg1, arg2, rc, FALSE, FALSE, TRUE); } /* Try and interpret a string representing a range of IP addresses or a subnet mask. Return whether successful. cf matchiprange() in utils.c. */ logical parseiprange(char *arg1, unsigned long *minaddr, unsigned long *maxaddr) { unsigned long addr = 0, mask; int n1, n2, octet, i; char *arg, *tok, *sep, *c; /* We only interpret ranges and subnet masks here, not single addresses or wildcards, for example. Everything else is rejected so that it gets submitted to normal string matching, which is more efficient. */ if (!ISDIGIT(*arg1) || (strchr(arg1, '-') == NULL && strchr(arg1, '/') == NULL)) return FALSE; /* We can't use strtok here because it's already used in an outer loop in confighostinex(), so we do it by hand. We first copy arg1 into arg so that we don't have to worry about restoring arg1 afterwards. */ COPYSTR(arg, arg1); for (octet = 0, tok = arg; octet < 4 && tok != NULL; octet++, tok = sep) { if ((sep = strchr(tok, '.')) != NULL) { *sep = '\0'; sep++; /* sep is now NULL if no more tokens, else start of next token */ } /* Case 1: 131.111-114 or 131.111-114.* */ if ((c = strchr(tok, '-')) != NULL) { *c = 0; n1 = atoi255(tok); n2 = atoi255(c + 1); if (n1 < 0 || n2 <= n1) /* includes n2 < 0 */ return FALSE; /* Check just dots and stars left in the string. We don't bother checking for too many dots though. */ for (c = sep; c != NULL && *c != '\0'; c++) { if (*c != '.' && *c != '*') return FALSE; } addr <<= 8 * (4 - octet); *minaddr = addr + (n1 << 8 * (3 - octet)); *maxaddr = addr + (((n2 + 1) << 8 * (3 - octet)) - 1); /* brackets essential to avoid underflow or overflow */ return TRUE; } /* Case 2: 131.111.20.18/24 */ if ((c = strchr(tok, '/')) != NULL) { if (octet != 3) /* slash only valid after last octet */ return FALSE; if (sep != NULL && *sep != '\0') /* check end of string */ return FALSE; *c = 0; n1 = atoi255(tok); n2 = atoi255(c + 1); if (n1 < 0 || n2 < 1 || n2 > 32) return FALSE; addr <<= 8; addr += n1; /* calculate subnet mask */ mask = 0; for (i = 0; i < 32; i++) { mask <<= 1; mask += (i < n2); } addr &= mask; *minaddr = addr; *maxaddr = addr + ((1 << (32 - n2)) - 1); /* brackets essential to avoid underflow or overflow */ return TRUE; } /* Case 3: The normal case: just the next number */ n1 = atoi255(tok); if (n1 < 0) return FALSE; addr <<= 8; addr += n1; } /* for octet */ /* We can only get here if we've read four octets but still not encountered - or / . In that case, the string is corrupt. */ return FALSE; } /* For hosts, use confighostinex(). */ /* First try parsing as a contiguous range of IP addresses, using parseiprange() above. If that fails, pass to configinex for normal processing. */ void confighostinex(void *opt, char *cmd, char *arg1, char *arg2, int rc, logical in) { Include **include = (Include **)opt; Include *ip; unsigned long minaddr, maxaddr; char *c; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strchr(arg1, ',') != NULL) { if ((c = strtok(arg1, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } for ( ; c != NULL; c = strtok((char *)NULL, ",")) confighostinex(opt, cmd, c, NULL, 1, in); return; } /* First try parsing the argument as a range of IP addresses. */ if (parseiprange(arg1, &minaddr, &maxaddr)) { ip = *include; *include = (Include *)xmalloc(sizeof(Include)); COPYSTR((*include)->name, arg1); (*include)->minaddr = minaddr; (*include)->maxaddr = maxaddr; (*include)->next = ip; (*include)->type = in?(IPADDR_INC):(IPADDR_EXC); } /* If that fails, parse to the regular string-like processing. */ else configinex(opt, cmd, arg1, arg2, rc, in, FALSE, FALSE); } void confighostinc(void *opt, char *cmd, char *arg1, char *arg2, int rc) { confighostinex(opt, cmd, arg1, arg2, rc, TRUE); } void confighostexc(void *opt, char *cmd, char *arg1, char *arg2, int rc) { confighostinex(opt, cmd, arg1, arg2, rc, FALSE); } /* for status codes */ void configscinex(void *opt, char *cmd, char *arg1, char *arg2, int rc, logical in) { choice *code2type = (choice *)opt; unsigned int bottom, top, i; char *c, *d; logical f = FALSE; if (rc == 0) { shortwarn(cmd, arg1, rc); return; } if (rc > 1) longwarn(cmd, arg1, arg2, rc); if (strchr(arg1, ',') != NULL) { if ((c = strtok(arg1, ",")) == NULL) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } for ( ; c != NULL; c = strtok((char *)NULL, ",")) configscinex(opt, cmd, c, NULL, 1, in); return; } if (STREQ(arg1, "*")) { bottom = MIN_SC; top = SC_NUMBER - 1; } else { if (*arg1 == '-') { bottom = MIN_SC; c = arg1 + 1; if (!ISDIGIT(*c)) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } } else { bottom = (unsigned int)strtoul(arg1, &c, 10); if (*c == '-') { c++; f = TRUE; } if (bottom < MIN_SC || bottom >= SC_NUMBER || (*c != '\0' && !ISDIGIT(*c))) { badwarn(cmd, TRUE, arg1, arg2, rc); return; } } if (*c == '\0') { if (f) top = SC_NUMBER - 1; else top = bottom; } else { top = (unsigned int)strtoul(c, &d, 10); if (top < bottom || top >= SC_NUMBER || *d != '\0') { badwarn(cmd, TRUE, arg1, arg2, rc); return; } } } if (code2type[0] == UNSET) code2type[0] = in?SUCCESS:UNWANTED; /* mark first in/ex: see finalinit() */ for (i = bottom; i <= top; i++) code2type[i] = in?SUCCESS:UNWANTED; /* SUCCESS set more carefully there */ } void configscinc(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configscinex(opt, cmd, arg1, arg2, rc, TRUE); } void configscexc(void *opt, char *cmd, char *arg1, char *arg2, int rc) { configscinex(opt, cmd, arg1, arg2, rc, FALSE); } analog-6.0/src/input.c0000644000175000017500000014306010161303542015027 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** input.c; parsing the logfiles */ #include "anlghea3.h" extern char *block_start, *block_end, *block_bell, *record_start, *pos; extern logical termchar[]; static logical stdin_used = FALSE; static char gzmagic[2] = {(char)0x1f, (char)0x8b}; static char zipmagic[4] = {'P', 'K', 0x03, 0x04}; static char bz2magic[3] = {'B', 'Z', 'h'}; /* Open logfile for reading. NB Even if open fails, may need to call my_lfclose() to clear up */ logical my_lfopen(Logfile *lf, char *filetype) { #ifndef NOPIPES extern Strpairlist *uncompresshead; char *cmd; Strpairlist *up; #endif #ifndef LINE_PARSER unz_file_info info; char magic[5]; size_t n, len; int bze; #endif int i; /* Initialise logfile */ lf->from = LAST_TIME; lf->to = FIRST_TIME; for (i = 0; i < LOGDATA_NUMBER; i++) lf->data[i] = 0; lf->bytes = 0; lf->bytes7 = 0; #ifndef LINE_PARSER /* Previously opened zip file: open next member. (Last member closed in my_lfclose()). */ if (lf->type == LF_ZIP) { if (unzGoToNextFile((unzFile)(lf->file)) == UNZ_OK && unzOpenCurrentFile((unzFile)(lf->file)) == UNZ_OK) { duplogfile(lf); /* One logfile for this member and 1 for the whole zip */ /* Calculate the name of the member, in the form "foo.zip:bar.log" */ /* Same code below */ len = strlen(lf->name); unzGetCurrentFileInfo((unzFile)(lf->file), &info, NULL, 0, NULL, 0, NULL, 0); lf->name = (char *)xmalloc(len + info.size_filename + 2); strcpy(lf->name, lf->next->name); /* lf->next is a clone of lf */ lf->name[len] = ':'; unzGetCurrentFileInfo((unzFile)(lf->file), NULL, lf->name + len + 1, info.size_filename + 1, NULL, 0, NULL, 0); debug('F', "Opening %s as zipped %s", lf->name, filetype); lf->type = LF_ZIPMEMBER; return TRUE; } return FALSE; /* no more members */ } else #endif /* LINE_PARSER */ if (lf->type != LF_NOTOPENED) return FALSE; /* other previously opened file: shouldn't happen */ /* Open the file */ lf->file = NULL; if (IS_STDIN(lf->name)) { if (stdin_used) { warn('F', TRUE, "stdin already used; cannot use it as %s", filetype); return FALSE; } else { lf->file = (void *)stdin; stdin_used = TRUE; debug('F', "Opening stdin as %s", filetype); lf->type = LF_NORMAL; return TRUE; } } lf->file = (void *)FOPENR(lf->name); if (lf->file == NULL) { warn('F', TRUE, "Failed to open %s %s: ignoring it", filetype, lf->name); return FALSE; } /* First see if it matches an UNCOMPRESS command: if so pass to a pipe */ #ifndef NOPIPES for (up = uncompresshead; up != NULL; TO_NEXT(up)) { if (strpbrk(lf->name, "*?") == NULL && MATCHES(lf->name, up->name)) { /* * and ? might be a security risk from the form: actually probably not because (i) they shouldn't get this far -- they are interpreted by configlogfile() unless they don't match anything; (ii) they probably wouldn't cause any harm anyway: but let's be over-cautious. */ fclose((FILE *)(lf->file)); cmd = (char *)xmalloc(strlen(up->data) + strlen(lf->name) + 4); if (strchr(lf->name, ' ') != NULL) sprintf(cmd, "%s \"%s\"", up->data, lf->name); else sprintf(cmd, "%s %s", up->data, lf->name); lf->file = (void *)POPENR(cmd); free((void *)cmd); debug('F', "Opening %s as %s", lf->name, filetype); debug('F', " Using %s to uncompress it", up->data); lf->type = LF_PIPE; return TRUE; } } #endif #ifndef LINE_PARSER /* Mac version has its own zip/gzip/bzip decompression */ /* If it didn't match an UNCOMPRESS, read in the first four bytes to see if it's a known decompression scheme. */ n = fread((void *)magic, 1, 4, (FILE *)(lf->file)); rewind((FILE *)(lf->file)); if (n >= 3 && strncmp(magic, bz2magic, 3) == 0) { lf->file2 = (void *)BZ2_bzReadOpen(&bze, (FILE *)(lf->file), 0, 0, NULL, 0); if (lf->file2 == NULL) { warn('F', TRUE, "Failed to open %s %s as bzip2 file: ignoring it", filetype, lf->name); return FALSE; } debug('F', "Opening %s as bzip2'ed %s", lf->name, filetype); lf->type = LF_BZ2; return TRUE; } else if (n >= 2 && strncmp(magic, gzmagic, 2) == 0) { fclose((FILE *)(lf->file)); lf->file = (void *)gzopen(lf->name, "rb"); if (lf->file == NULL) { warn('F', TRUE, "Failed to open %s %s as gzip file: ignoring it", filetype, lf->name); return FALSE; } debug('F', "Opening %s as gzipped %s", lf->name, filetype); lf->type = LF_GZIP; return TRUE; } else if (n >= 4 && strncmp(magic, zipmagic, 4) == 0) { fclose((FILE *)(lf->file)); lf->file = (void *)unzOpen(lf->name); /* Check file was opened, and first member can be opened */ if (lf->file == NULL || unzGoToFirstFile((unzFile)(lf->file)) != UNZ_OK || unzOpenCurrentFile((unzFile)(lf->file)) != UNZ_OK) { warn('F', TRUE, "Failed to open %s %s as zip file: ignoring it", filetype, lf->name); return FALSE; } debug('F', "Opening %s as zip file", lf->name); lf->type = LF_ZIP; duplogfile(lf); /* One logfile for this member and one for the whole zip */ /* Calculate the name of the member, in the form "foo.zip:bar.log" */ /* Same code above */ len = strlen(lf->name); unzGetCurrentFileInfo((unzFile)(lf->file), &info, NULL, 0, NULL, 0, NULL, 0); lf->name = (char *)xmalloc(len + info.size_filename + 2); strcpy(lf->name, lf->next->name); /* lf->next is a clone of lf */ lf->name[len] = ':'; unzGetCurrentFileInfo((unzFile)(lf->file), NULL, lf->name + len + 1, info.size_filename + 1, NULL, 0, NULL, 0); debug('F', "Opening %s as zipped %s", lf->name, filetype); lf->type = LF_ZIPMEMBER; return TRUE; } #endif /* LINE_PARSER */ /* The normal case: just an ordinary file */ debug('F', "Opening %s as %s", lf->name, filetype); lf->type = LF_NORMAL; return TRUE; } FILE *my_fopen(char *name, char *filetype) { /* open for reading */ FILE *f; if (IS_STDIN(name)) { if (stdin_used) { warn('F', TRUE, "stdin already used; cannot use it as %s", filetype); f = NULL; } else { f = stdin; stdin_used = TRUE; debug('F', "Opening stdin as %s", filetype); } } else { if ((f = FOPENR(name)) == NULL) warn('F', TRUE, "Failed to open %s %s: ignoring it", filetype, name); else debug('F', "Opening %s as %s", name, filetype); } return(f); } #define LFCLOSE_DATEFMT "%d/%m/%y:%H%n" void my_lfclose(Logfile *p, Logfile *allc, Logfile *allp, char *filetype, Dateman *dman, unsigned long *totdata, double *bys, double *bys7) { extern FILE *errfile; extern char *warn_args; unsigned long *data = p->data; Logfile *ap, *nextap; Inputformatlist *fmt; choice count[INPUT_NUMBER]; logical done; int i; #ifndef LINE_PARSER int bze; #endif if (p->type == LF_NOTOPENED) return; #ifndef LINE_PARSER /* zip container: don't do diagnostics etc. */ if (p->type == LF_ZIP) { debug('F', "Closing zip file %s", IS_STDIN(p->name)?"stdin":(p->name)); unzClose((unzFile)(p->file)); return; } #endif debug('F', "Closing %s %s", filetype, IS_STDIN(p->name)?"stdin":(p->name)); debug('S', "Successful requests: %lu", data[LOGDATA_SUCC]); debug('S', "Redirected requests: %lu", data[LOGDATA_REDIR]); debug('S', "Failed requests: %lu", data[LOGDATA_FAIL]); debug('S', "Requests returning informational status code: %lu", data[LOGDATA_INFO]); debug('S', "Status code not given: %lu", data[LOGDATA_UNKNOWN]); if (allp != NULL) { /* i.e. logfile not cache file */ debug('S', "Unwanted lines: %lu", data[LOGDATA_UNWANTED]); debug('S', "Corrupt lines: %lu", data[LOGDATA_CORRUPT]); if (data[LOGDATA_CORRUPT] > (data[LOGDATA_SUCC] + data[LOGDATA_REDIR] + data[LOGDATA_FAIL] + data[LOGDATA_INFO] + data[LOGDATA_UNKNOWN] + data[LOGDATA_UNWANTED]) / 10 && data[LOGDATA_CORRUPT] > 10) { warn('L', TRUE, "Large number of corrupt lines in %s %s: " "turn debugging on or try different LOGFORMAT", filetype, IS_STDIN(p->name)?"stdin":(p->name)); if (strchr(warn_args, 'L') != NULL) report_logformat(errfile, p->format, TRUE); } } for (i = 0; i < LOGDATA_NUMBER; i++) totdata[i] += data[i]; *bys += p->bytes; *bys7 += p->bytes7; if (p->from <= p->to) { dman->firsttime = MIN(dman->firsttime, p->from); dman->lasttime = MAX(dman->lasttime, p->to); if (p->tz > 0) debug('S', "Times in %s offset by +%d minutes", filetype, p->tz); else if (p->tz < 0) debug('S', "Times in %s offset by %d minutes", filetype, p->tz); debug('S', "Earliest entry in %s: %s", filetype, timesprintf(NULL, LFCLOSE_DATEFMT, p->from, FALSE)); debug('S', "Latest entry in %s: %s", filetype, timesprintf(NULL, LFCLOSE_DATEFMT, p->to, FALSE)); if (allp == NULL) { p->format->count[ITEM_FILE] = 2; /* good enough for date check */ count[ITEM_FILE] = 2; p->from += 4; /* avoid false alerts */ } else { for (i = 0; i < INPUT_NUMBER; i++) count[i] = 0; for (fmt = p->format; fmt != NULL; TO_NEXT(fmt)) { for (i = 0; i < INPUT_NUMBER; i++) count[i] = MAX(count[i], fmt->count[i]); } } for (ap = (allc == NULL)?allp:allc; ap != p; ap = nextap) { if (ap->from < p->to && p->from < ap->to) { for (done = FALSE, fmt = ap->format; fmt != NULL && !done; TO_NEXT(fmt)) { for (i = 0; i < INPUT_NUMBER && !done; i++) { if (fmt->count[i] == 2 && count[i] == 2) { warn('L', TRUE, "%ss %s and %s overlap: " "possible double counting", filetype, ap->name, p->name); done = TRUE; } } } } nextap = ap->next; if (nextap == NULL) nextap = allp; /* run through allc then through allp */ } } else if (data[LOGDATA_SUCC] + data[LOGDATA_REDIR] + data[LOGDATA_FAIL] + data[LOGDATA_INFO] + data[LOGDATA_UNKNOWN] > 0) debug('S', "No times in %s", filetype); /* Actually close the file */ switch (p->type) { case LF_NORMAL: fclose((FILE *)(p->file)); break; #ifndef LINE_PARSER case LF_GZIP: gzclose((gzFile)(p->file)); break; case LF_ZIPMEMBER: unzCloseCurrentFile((unzFile)(p->file)); break; case LF_BZ2: BZ2_bzReadClose(&bze, (BZFILE *)(p->file2)); fclose((FILE *)(p->file)); break; #endif #ifndef NOPIPES case LF_PIPE: if (feof((FILE *)(p->file))) { if (pclose((FILE *)(p->file)) != 0) warn('F', TRUE, "Problems uncompressing %s %s", filetype, p->name); } else pclose((FILE *)(p->file)); /* not reached EOF: pclose will return broken pipe */ break; #endif } } int my_fclose(FILE *f, char *name, char *filetype) { debug('F', "Closing %s %s", filetype, IS_STDIN(name)?"stdin":name); return(fclose(f)); } logical logfile_init(Logfile *lf) { extern unsigned int year, code; extern double bytes; if (lf->format == NULL) { debug('F', "Ignoring logfile %s, which contains no items being analysed", lf->name); return FALSE; } pos = NULL; year = 0; bytes = 0; code = 0; return(my_lfopen(lf, "logfile")); } /* Duplicate a logfile in the logfile list. Used to expand a zip file into many individual files. NB copies data member pointers not contents. */ void duplogfile(Logfile *lf) { Logfile *nextlf = lf->next; Logfile *newlf = (Logfile *)xmalloc(sizeof(Logfile)); memcpy(newlf, lf, sizeof(Logfile)); lf->next = newlf; newlf->next = nextlf; } choice getmoredata(Logfile *lf, char *start, size_t length) { #ifndef LINE_PARSER int bze; #endif int n; switch (lf->type) { case LF_NORMAL: case LF_PIPE: n = fread((void *)start, 1, length, (FILE *)(lf->file)); break; #ifndef LINE_PARSER case LF_GZIP: n = gzread((gzFile)(lf->file), (void *)start, length); if (n < 0) n = 0; /* gzread() returns -1 on error */ break; case LF_ZIPMEMBER: n = unzReadCurrentFile((unzFile)(lf->file), (void *)start, length); if (n < 0) n = 0; /* unzReadCurrentFile() returns -1 on error */ break; case LF_BZ2: n = BZ2_bzRead(&bze, (BZFILE *)(lf->file2), (void *)start, length); if (bze != BZ_OK && bze != BZ_STREAM_END) n = 0; /* return value from BZ2_bzRead() undefined on error */ break; #endif default: n = 0; /* shouldn't happen, but if it does return EOF */ } block_end = start + n; block_bell = block_end - BLOCK_EPSILON; /* saves repeating this calc. */ /* need to set block_end and block_bell even if returning EOF because still have to parse the rest of the last line of the file */ if (block_end == start) return(EOF); return(OK); } choice getnextline(FILE *f, char *start, size_t used) { /* not very efficient: only for use during initialisation */ char *s = start; if ((*s = (char)getc(f)) == (char)EOF && feof(f)) /* in case char == 255 */ return(EOF); while (*s == '\r' || *s == '\n') *s = (char)getc(f); /* run past any new line */ if (*s == (char)EOF && feof(f)) return(EOF); for (*(++s) = (char)getc(f); *s != '\r' && *s != '\n' && !feof(f) && s < start + BLOCKSIZE - used - 1; *(++s) = (char)getc(f)) ; /* read in to next new line */ *s = '\0'; if (s == start + BLOCKSIZE - 1) return(FALSE); return(TRUE); } void shunt_data(Logfile *lf) { memmove((void *)block_start, (void *)record_start, (size_t)(block_end - record_start)); (void)getmoredata(lf, block_start + (block_end - record_start), (size_t)(BLOCKSIZE - (block_end - record_start))); pos -= record_start - block_start; record_start = block_start; } int strtomonth(char *m) /* convert 3 letter month abbrev. to int */ { int monthno = ERR; switch (m[0]) { case 'A': case 'a': if ((m[1] == 'p' || m[1] == 'P') && (m[2] == 'r' || m[2] == 'R')) monthno = 3; else if ((m[1] == 'u' || m[1] == 'U') && (m[2] == 'g' || m[2] == 'G')) monthno = 7; break; case 'D': case 'd': if ((m[1] == 'e' || m[1] == 'E') && (m[2] == 'c' || m[2] == 'C')) monthno = 11; break; case 'F': case 'f': if ((m[1] == 'e' || m[1] == 'E') && (m[2] == 'b' || m[2] == 'B')) monthno = 1; break; case 'J': case 'j': if ((m[1] == 'a' || m[1] == 'A') && (m[2] == 'n' || m[2] == 'N')) monthno = 0; if ((m[1] == 'u' || m[1] == 'U')) { if ((m[2] == 'l' || m[2] == 'L')) monthno = 6; else if ((m[2] == 'n' || m[2] == 'N')) monthno = 5; } break; case 'M': case 'm': if ((m[1] == 'a' || m[1] == 'A')) { if ((m[2] == 'r' || m[2] == 'R')) monthno = 2; else if ((m[2] == 'y' || m[2] == 'Y')) monthno = 4; } break; case 'N': case 'n': if ((m[1] == 'o' || m[1] == 'O') && (m[2] == 'v' || m[2] == 'V')) monthno = 10; break; case 'O': case 'o': if ((m[1] == 'c' || m[1] == 'C') && (m[2] == 't' || m[2] == 'T')) monthno = 9; break; case 'S': case 's': if ((m[1] == 'e' || m[1] == 'E') && (m[2] == 'p' || m[2] == 'P')) monthno = 8; break; } return(monthno); } choice parsemonth(Logfile *lf, void *arg, char c) { unsigned int *m = (unsigned int *)arg; *block_end = '\0'; *m = (unsigned int)strtomonth(pos); if (*m == (unsigned int)ERR) return(FALSE); else { pos += 3; return(TRUE); } } choice parseuint2(Logfile *lf, void *arg, char c) { unsigned int *x = (unsigned int *)arg; *block_end = '\0'; if (!ISDIGIT(*pos)) { if (*pos == ' ') *x = 0; else return(FALSE); } else *x = *pos - '0'; pos++; if (!ISDIGIT(*pos)) return(TRUE); *x *= 10; *x += *pos - '0'; pos++; return(TRUE); } choice parsenmonth(Logfile *lf, void *arg, char c) { /* nearly same as uint2 */ unsigned int *x = (unsigned int *)arg; *block_end = '\0'; if (!ISDIGIT(*pos)) return(FALSE); *x = *pos - '0'; pos++; if (!ISDIGIT(*pos)) { if (*x == 0) { pos--; return(FALSE); } (*x)--; /* to convert to internal month representation */ return(TRUE); } *x *= 10; *x += *pos - '0'; if (*x == 0) return(FALSE); pos++; (*x)--; return(TRUE); } choice parseulong(Logfile *lf, void *arg, char c) { unsigned long *x = (unsigned long *)arg; register char *p = pos; *block_end = '\0'; if (!ISDIGIT(*p)) return(FALSE); *x = 0; while (ISDIGIT(*p)) { if (*x >= 429496729) /* (usual) max for unsigned long, divided by 10 */ return(FALSE); /* best to keep pos at beginning of number this time */ *x *= 10; *x += (*p - '0'); p++; } pos = p; return(TRUE); } choice parseunixtime(Logfile *lf, void *arg, char c) { unsigned long *x = (unsigned long *)arg; register char *p = pos; *block_end = '\0'; if (!ISDIGIT(*p)) return(FALSE); *x = 0; while (ISDIGIT(*p)) { if (*x >= 214748364) /* max for Unix time, divided by 10 */ return(FALSE); /* best to keep pos at beginning of number this time */ *x *= 10; *x += (*p - '0'); p++; } pos = p; return(TRUE); } /* Parse processing time in microseconds, convert to milliseconds */ choice parseproctimeu(Logfile *lf, void *arg, char c) { unsigned long *x; choice rc; rc = parseulong(lf, arg, c); if (rc == FALSE) return(FALSE); x = (unsigned long *)arg; *x /= 1000; return(rc); } choice parseproctime(Logfile *lf, void *arg, char c) { /* parse processing time in decimal seconds, converting to milliseconds */ unsigned long *x = (unsigned long *)arg; register char *p = pos; *block_end = '\0'; if (!ISDIGIT(*p)) /* NB Decimals must begin "0." not just "." */ return(FALSE); if (ISDIGIT(*(p + 3)) && ISDIGIT(*(p + 2)) && ISDIGIT(*(p + 1))) { *x = 1000000; /* signifying at least 1000 seconds */ while (ISDIGIT(*p)) p++; if (*p == '.') { p++; while (ISDIGIT(*p)) p++; } pos = p; return(TRUE); } for (*x = 0; ISDIGIT(*p); p++) { *x *= 10; *x += (*p - '0'); } *x *= 1000; if (*p == '.') { /* decimal follows; only read first 3 places */ p++; if (ISDIGIT(*p)) { *x += 100 * (*(p++) - '0'); if (ISDIGIT(*p)) { *x += 10 * (*(p++) - '0'); if (ISDIGIT(*p)) { *x += (*(p++) - '0'); while (ISDIGIT(*p)) p++; } } } } pos = p; return(TRUE); } choice parseuint2strict(Logfile *lf, void *arg, char c) { unsigned int *x = (unsigned int *)arg; *block_end = '\0'; if (!ISDIGIT(*pos)) return(FALSE); *x = 10 * (*pos - '0'); pos++; if (!ISDIGIT(*pos)) return(FALSE); *x += *pos - '0'; pos++; return(TRUE); } choice parsescode(Logfile *lf, void *arg, char c) { /* parseuint3strict() with twiddles */ unsigned int *x = (unsigned int *)arg; *block_end = '\0'; if (*pos < '1' || *pos > '5') { /* only accept codes 100 - 599, or - */ if (*pos == '-') { /* see also MIN_SC, SC_NUMBER in anlghea3.h */ pos++; *x = 200; return(TRUE); } else return(FALSE); } *x = 100 * (*pos - '0'); pos++; if (!ISDIGIT(*pos)) return(FALSE); *x += 10 * (*pos - '0'); pos++; if (!ISDIGIT(*pos)) return(FALSE); *x += *pos - '0'; pos++; return(TRUE); } choice parseuint4strict(Logfile *lf, void *arg, char c) { unsigned int *x = (unsigned int *)arg; *block_end = '\0'; if (!ISDIGIT(*pos)) return(FALSE); *x = 1000 * (*pos - '0'); pos++; if (!ISDIGIT(*pos)) return(FALSE); *x += 100 * (*pos - '0'); pos++; if (!ISDIGIT(*pos)) return(FALSE); *x += 10 * (*pos - '0'); pos++; if (!ISDIGIT(*pos)) return(FALSE); *x += *pos - '0'; pos++; return(TRUE); } choice parseudint(Logfile *lf, void *arg, char c) { double *x = (double *)arg; *block_end = '\0'; if (*pos == '-') { *x = 0.0; /* because used for bytes (only) */ pos++; return(TRUE); } if (!ISDIGIT(*pos)) return(FALSE); *x = *pos - '0'; pos++; while (ISDIGIT(*pos)) { *x *= 10; *x += *pos - '0'; pos++; } return(TRUE); } choice parseyear2(Logfile *lf, void *arg, char c) { unsigned int *y = (unsigned int *)arg; logical rc; rc = parseuint2strict(lf, arg, c); if (*y >= 70) *y += 1900; else *y += 2000; return(rc); } choice parseyear2or4(Logfile *lf, void *arg, char c) { if (*pos == '\0' || (*(pos + 1) == '\0')) return(FALSE); else if (ISDIGIT(*(pos + 2))) return(parseuint4strict(lf, arg, c)); else return(parseyear2(lf, arg, c)); } choice parseam(Logfile *lf, void *arg, char c) { char *d = (char *)arg; *block_end = '\0'; *d = TOLOWER(*pos); if (*d == 'a' || *d == 'p') { pos++; return(TRUE); } else return(FALSE); } choice parsecode(Logfile *lf, void *arg, char c) { unsigned int *x = (unsigned int *)arg; char *d = pos, e, *g; *block_end = '\0'; if (parsejunk(lf, NULL, c) == FALSE || pos == d) return(FALSE); g = (c == WHITESPACE)?pos:(pos - 1); /* parsejunk normally leaves pos AFTER delimiter, but ON delimiter if delimiter == WHITESPACE */ e = *g; *g = '\0'; *x = IGNORE_CODE; if (d[0] == 'O' && d[1] == 'K') *x = 200; else if (STREQ(d, "ERR!")) *x = 404; else if (STREQ(d, "PRIV")) *x = 401; else if (STREQ(d, "not modified")) *x = 304; else if (*(d++) == 'g' && *(d++) == 'e' && *(d++) == 't' && *(d++) == ' ' && *(d++) == 'f') { if (STREQ(d, "ile")) *x = 200; else if (STREQ(d, "ailed")) *x = 499; } *g = e; return(TRUE); } choice parsejunk(Logfile *lf, void *arg, char c) { /* NB allow empty strings */ register char *p = pos; if (c == WHITESPACE) { termchar[(unsigned char)' '] = TRUE; termchar[(unsigned char)'\t'] = TRUE; *block_end = ' '; } else { termchar[(unsigned char)c] = TRUE; *block_end = c; } while (!termchar[(unsigned char)(*p)]) p++; if (p == block_end) { if (record_start == block_start) { if (c == WHITESPACE) { termchar[(unsigned char)' '] = FALSE; termchar[(unsigned char)'\t'] = FALSE; } else if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; pos = p; return(FALSE); } pos = p; shunt_data(lf); p = pos; *block_end = (c == WHITESPACE)?' ':c; while (!termchar[(unsigned char)(*p)]) p++; if (p == block_end) { if (c == WHITESPACE) { termchar[(unsigned char)' '] = FALSE; termchar[(unsigned char)'\t'] = FALSE; } else if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; pos = p; return(FALSE); } } if (c == WHITESPACE) { termchar[(unsigned char)' '] = FALSE; termchar[(unsigned char)'\t'] = FALSE; } else if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; if (*p != c && !(c == '\n' && *p == '\r') && !(c == WHITESPACE && (*p == ' ' || *p == '\t'))) { pos = p; return(FALSE); } if (c == '\n' || c == '\r') { while ((*p == '\n' || *p == '\r') && p < block_end) p++; } else if (c != WHITESPACE) p++; /* Leave pos AFTER delimiter, except ON delimiter if delim == WHITESPACE */ pos = p; return(TRUE); } choice parsespace(Logfile *lf, void *arg, char c) { *block_end = '\0'; if (pos == block_end && record_start != block_start) shunt_data(lf); if (*pos != '\t' && *pos != ' ') return(FALSE); while (*pos == '\t' || *pos == ' ') pos++; if (pos == block_end && record_start != block_start) { shunt_data(lf); while (*pos == '\t' || *pos == ' ') pos++; } return(TRUE); } choice parseoptspace(Logfile *lf, void *arg, char c) { *block_end = '\0'; if (pos == block_end && record_start != block_start) shunt_data(lf); while (*pos == '\t' || *pos == ' ') pos++; if (pos == block_end && record_start != block_start) { shunt_data(lf); while (*pos == '\t' || *pos == ' ') pos++; } return(TRUE); } choice parsenewline(Logfile *lf, void *arg, char c) { /* allow new line to be preceded by white space */ *block_end = 'a'; if (*pos != '\n' && *pos != ' ' && *pos != '\r' && *pos != '\t') return(FALSE); while (*pos == ' ' || *pos == '\t') pos++; if (pos == block_end && record_start != block_start) { shunt_data(lf); *block_end = 'a'; while (*pos == ' ' || *pos == '\t') pos++; } if (*pos != '\n' && *pos != '\r') return(FALSE); termchar[(unsigned char)'\0'] = FALSE; while (termchar[(unsigned char)(*pos)]) pos++; if (pos == block_end && record_start != block_start) { shunt_data(lf); *block_end = 'a'; while (termchar[(unsigned char)(*pos)]) pos++; } termchar[(unsigned char)'\0'] = TRUE; return(TRUE); } void parsenonnewline(Logfile *lf) { *block_end = '\n'; termchar[(unsigned char)'\0'] = FALSE; while (!termchar[(unsigned char)(*pos)]) pos++; if (pos == block_end) { if (record_start == block_start) { termchar[(unsigned char)'\0'] = TRUE; return; } shunt_data(lf); *block_end = '\n'; while (!termchar[(unsigned char)(*pos)]) pos++; } termchar[(unsigned char)'\0'] = TRUE; } choice parsestring(Logfile *lf, void *arg, char c) { /*NB allow empty strings*/ register char *p = pos; Memman *m = (Memman *)arg; size_t length = 0; char *string_start; string_start = p; if (c == WHITESPACE) { termchar[(unsigned char)' '] = TRUE; termchar[(unsigned char)'\t'] = TRUE; *block_end = ' '; } else { termchar[(unsigned char)c] = TRUE; *block_end = c; } while (!termchar[(unsigned char)(*p)]) { p++; length++; } if (p == block_end) { if (record_start == block_start) { if (c == WHITESPACE) { termchar[(unsigned char)' '] = FALSE; termchar[(unsigned char)'\t'] = FALSE; } else if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; pos = p; return(FALSE); } string_start -= record_start - block_start; pos = p; shunt_data(lf); p = pos; *block_end = (c == WHITESPACE)?' ':c; while (!termchar[(unsigned char)(*p)]) { p++; length++; } if (p == block_end) { if (c == WHITESPACE) { termchar[(unsigned char)' '] = FALSE; termchar[(unsigned char)'\t'] = FALSE; } else if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; pos = p; return(FALSE); } } if (c == WHITESPACE) { termchar[(unsigned char)' '] = FALSE; termchar[(unsigned char)'\t'] = FALSE; } else if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; if (*p != c && !(c == '\n' && *p == '\r') && !(c == WHITESPACE && (*p == ' ' || *p == '\t'))) { pos = p; return(FALSE); } memcpy(submalloc(m, length + 1), (void *)string_start, length); *((char *)(m->next_pos) - 1) = '\0'; /* = curr_pos + length */ if (c == '\n' || c == '\r') { while ((*p == '\n' || *p == '\r') && p < block_end) p++; } else if (c != WHITESPACE) p++; pos = p; return(TRUE); } choice parsemsbrow(Logfile *lf, void *arg, char c) { Memman *m = (Memman *)arg; char *d; if (parsestring(lf, arg, c) == FALSE) return(FALSE); for (d = m->curr_pos; *d != '\0'; d++) { if (*d == '+') *d = ' '; } return(TRUE); } choice parseref(Logfile *lf, void *arg, char c) { /* For referrer in old referrer logs: as parsestring except also checks -> immediately after delimiting character (presumably space: may not be \n or \r: also WHITESPACE wouldn't work so is disallowed in strtoinfmt()) */ register char *p = pos; Memman *m = (Memman *)arg; size_t length = 0; char *string_start; string_start = p; *block_end = '\r'; termchar[(unsigned char)c] = TRUE; /* p + 1 or p + 2 could be past block_end, but this doesn't matter because they will never be read; *block_end == '\r' and there is no way to set c == '\r'. */ while (!termchar[(unsigned char)(*p)] || (*p == c && (*(p + 1) != '-' || *(p + 2) != '>'))) { p++; length++; } if (p == block_end) { if (record_start == block_start) { if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; pos = p; return(FALSE); } string_start -= record_start - block_start; pos = p; shunt_data(lf); p = pos; *block_end = '\r'; while (!termchar[(unsigned char)(*p)] || (*p == c && (*(p + 1) != '-' || *(p + 2) != '>'))) { p++; length++; } if (p == block_end) { if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; pos = p; return(FALSE); } } if (c != '\r' && c != '\n' && c != '\0') termchar[(unsigned char)c] = FALSE; if (*p != c) { pos = p; return(FALSE); } memcpy(submalloc(m, length + 1), (void *)string_start, length); *((char *)(m->next_pos) - 1) = '\0'; p++; pos = p; return(TRUE); } choice checkchar(Logfile *lf, void *arg, char c) { if (*pos == c) { pos++; return(TRUE); } else return(FALSE); } void resolveconflicts(unsigned int n, char *delims, ...) { /* Used in parselogfmt(). Munges a format header line, which is in pos, so that there are no "repeated" fields. n is the number of alternatives. */ va_list ap; char *arg, *s, *t; logical found; unsigned int i; va_start(ap, delims); for (i = 0, found = FALSE; i < n; i++) { arg = va_arg(ap, char *); for (s = strstr(pos, arg); s != NULL; s = strstr(s + 1, arg)) { t = s + strlen(arg); if ((s == pos || strchr(delims, *(s - 1)) != NULL) && (*t == '\0' || strchr(delims, *t) != NULL)) { /* true match */ if (found) { /* found an earlier occurrence */ *s = 'X'; *(s + 1) = 'X'; } else /* no earlier occurrence: leave this one alone */ found = TRUE; } } } va_end(ap); } choice parselogfmt(Logfile *lf, void *arg, char c) { extern Inputformatlist *logformat; static char *fmt = NULL; static size_t fmtlen = 0; char *d, *e; unsigned int x, y; logformat->used = TRUE; /* so as to start afresh */ *block_end = '\n'; d = strpbrk(pos, "\r\n"); if (d == block_end) { shunt_data(lf); *block_end = '\n'; d = strpbrk(pos, "\r\n"); if (d == block_end) return(FALSE); } if (d == NULL) return(BADLOGFMT); else *d = '\0'; switch (c) { case '0': /* DEFAULT format. These are caught and translated earlier: this is just in case we have specified DEFAULTLOGFORMAT DEFAULT */ case '1': /* AUTO format */ if (*pos == '!' && *(pos + 1) == '!') { debug('F', " Detect that it's in WebSTAR format"); configlogfmt((void *)&logformat, NULL, "WEBSTAR", NULL, -1); } else if (chrn(pos, ',') == 15) { e = strchr(strchr(pos, ',') + 1, ',') + 2; x = (*(e++) - '0'); if (ISDIGIT(*e)) x = x * 10 + (*(e++) - '0'); if (*(e++) != '/') { warn('F', TRUE, "Logfile seems to be in Microsoft format " "but I can't parse the date: use LOGFORMAT command"); return(BADLOGFMT); } y = (*(e++) - '0'); if (ISDIGIT(*e)) y = y * 10 + (*(e++) - '0'); if (*e != '/') { warn('F', TRUE, "Logfile seems to be in Microsoft format " "but I can't parse the date: use LOGFORMAT command"); return(BADLOGFMT); } if (x <= 12 && y > 12) { debug('F', " Detect that it's in Microsoft format (North American dates)"); configlogfmt((void *)&logformat, NULL, "MICROSOFT-NA", NULL, -1); } else if (x > 12 && y <= 12) { debug('F', " Detect that it's in Microsoft format (international dates)"); configlogfmt((void *)&logformat, NULL, "MICROSOFT-INT", NULL, -1); } else if (x > 12 && y > 12) { warn('F', TRUE, "Logfile seems to be in Microsoft format " "but I can't parse the date: use LOGFORMAT command"); return(BADLOGFMT); } else { warn('F', TRUE, "Microsoft logfile with ambiguous dates: " "use LOGFORMAT MICROSOFT-NA or LOGFORMAT MICROSOFT-INT"); *d = '\n'; return(BADLOGFMT); } } else if (*pos == 'f' && *(pos + 1) == 'o' && *(pos + 2) == 'r' && *(pos + 3) == 'm' && *(pos + 4) == 'a' && *(pos + 5) == 't' && *(pos + 6) == '=') { debug('F', " Detect that it's in Netscape format"); configlogfmt((void *)&logformat, NULL, "NETSCAPE", NULL, -1); } else if (ISDIGIT(*pos) && ISDIGIT(*(pos + 3)) && *(pos + 5) == '/' && *(pos + 14) == ':' && ISDIGIT(*(pos + 16))) { if (chrn(pos, '\t') == 12) { x = (*pos - '0') * 10 + (*(pos + 1) - '0'); y = (*(pos + 3) - '0') * 10 + (*(pos + 4) - '0'); if (x <= 12 && y > 12) { debug('F', " Detect that it's in WebSite format (North American dates)"); configlogfmt((void *)&logformat, NULL, "WEBSITE-NA", NULL, -1); } else if (x > 12 && y <= 12) { debug('F', " Detect that it's in WebSite format (international dates)"); configlogfmt((void *)&logformat, NULL, "WEBSITE-INT", NULL, -1); } else { warn('F', TRUE, "WebSite logfile with ambiguous dates: " "use LOGFORMAT WEBSITE-NA or LOGFORMAT WEBSITE-INT"); *d = '\n'; return(BADLOGFMT); } } else if (chrn(pos, '\t') == 5) { debug('F', " Detect that it's in MacHTTP format"); configlogfmt((void *)&logformat, NULL, "MACHTTP", NULL, -1); } else { *d = '\n'; return(BADLOGFMT); } } else if (strstr(pos, " -> ") != NULL) { debug('F', " Detect that it's in referrer log format"); configlogfmt((void *)&logformat, NULL, "REFERRER", NULL, -1); } else if (*pos == '[' && (*(pos + 21) == ']' || *(pos + 27) == ']')) { debug('F', " Detect that it's in browser log format"); configlogfmt((void *)&logformat, NULL, "BROWSER", NULL, -1); } else if (*pos == '#') { /* look at first the two lines to determine vendor, although we expect Microsoft string on first line, and WebSTAR on second. */ for (e = d + 1; *e == '\n' || *e == '\r'; e++) ; if (headmatch(pos + 1, "Software: Microsoft Internet Information Serv") || headmatch(e, "#Software: Microsoft Internet Information Serv")) { debug('F', " Detect that it's in Microsoft's version of extended format"); configlogfmt((void *)&logformat, NULL, "MS-EXTENDED", NULL, -1); } else if (headmatch(e, "#Software: WebSTAR") || headmatch(pos + 1, "Software: WebSTAR")) { debug('F', " Detect that it's in extended format (WebSTAR server)"); configlogfmt((void *)&logformat, NULL, "WEBSTAR-EXTENDED", NULL, -1); } else { debug('F', " Detect that it's in W3 extended format"); configlogfmt((void *)&logformat, NULL, "EXTENDED", NULL, -1); } } else if ((e = strchr(pos + 6, '[')) != NULL && *(e + 27) == ']' && strchr(pos, '"') == e + 29) { x = chrn(e + 23, '"'); if (x == 2) { debug('F', " Detect that it's in common log format"); configlogfmt((void *)&logformat, NULL, "COMMON", NULL, -1); } else if (x == 3) { debug('F', " Detect that it's in Microsoft's broken common log format"); configlogfmt((void *)&logformat, NULL, "MS-COMMON", NULL, -1); } else if (x == 6) { debug('F', " Detect that it's in NCSA combined format"); configlogfmt((void *)&logformat, NULL, "COMBINED", NULL, -1); } else { *d = '\n'; return(BADLOGFMT); } } else { *d = '\n'; return(BADLOGFMT); } *d = '\n'; break; case '2': /* WebSTAR format */ /* pos is already start of format proper */ strtoupper(pos); resolveconflicts(5, " \t", "SC-STATUS", "RESULT_CODE", "STATUS", "CS-STATUS", "RESULT"); resolveconflicts(3, " \t", "CS-URI-STEM", "CS-URI", "URL"); resolveconflicts(2, " \t", "BYTES", "BYTES_SENT"); resolveconflicts(4, " \t", "HOSTNAME", "C-DNS", "CS-HOST", "CS-DNS"); resolveconflicts(2, " \t", "C-IP", "CS-IP"); resolveconflicts(2, " \t", "REFERER", "CS(REFERER)"); resolveconflicts(2, " \t", "AGENT", "CS(USER-AGENT)"); resolveconflicts(4, " \t", "HOSTFIELD", "CS(HOST)", "HOST", "CS-SIP"); resolveconflicts(2, " \t", "SEARCH_ARGS", "CS-URI-QUERY"); ENSURE_LEN(fmt, fmtlen, 32); /* Arbitrary amount to get started */ fmt[0] = '\0'; pos = strtok(pos, " \t"); while (pos != NULL) { ENSURE_LEN(fmt, fmtlen, strlen(fmt) + 12); /* Enough to add \t + any next string. Not v efficient, but that's OK. */ if (!IS_EMPTY_STRING(fmt)) strcat(fmt, "\t"); if (STREQ(pos, "COMMON_LOG_FORMAT")) strcpy(fmt, "COMMON"); else if (STREQ(pos, "DATE")) strcat(fmt, "%m/%d/%Z"); else if (STREQ(pos, "TIME")) strcat(fmt, "%W%h:%n:%j"); else if (STREQ(pos, "RESULT")) strcat(fmt, "%C"); else if (STREQ(pos, "SC-STATUS") || STREQ(pos, "CS-STATUS") || STREQ(pos, "RESULT_CODE") || STREQ(pos, "STATUS")) strcat(fmt, "%c"); else if (STREQ(pos, "URL") || STREQ(pos, "CS-URI-STEM") || STREQ(pos, "CS-URI")) strcat(fmt, "%r"); else if (STREQ(pos, "BYTES") || STREQ(pos, "BYTES_SENT")) strcat(fmt, "%b"); else if (STREQ(pos, "HOSTNAME") || STREQ(pos, "CS-HOST") || STREQ(pos, "C-DNS") || STREQ(pos, "CS-DNS")) strcat(fmt, "%S"); else if (STREQ(pos, "CS-IP") || STREQ(pos, "C-IP")) strcat(fmt, "%s"); else if (STREQ(pos, "REFERER")) strcat(fmt, "%f"); else if (STREQ(pos, "CS(REFERER)")) strcat(fmt, "\"%f\""); else if (STREQ(pos, "AGENT")) strcat(fmt, "%B"); else if (STREQ(pos, "CS(USER-AGENT)")) strcat(fmt, "\"%B\""); else if (STREQ(pos, "CS(HOST)") || STREQ(pos, "HOSTFIELD")) strcat(fmt, "\"%v\""); else if (STREQ(pos, "HOST") || STREQ(pos, "CS-SIP")) strcat(fmt, "%v"); else if (STREQ(pos, "SEARCH_ARGS") || STREQ(pos, "CS-URI-QUERY")) strcat(fmt, "%q"); else if (STREQ(pos, "USER")) strcat(fmt, "%u"); else if (STREQ(pos, "TRANSFER_TIME")) strcat(fmt, "%t"); else strcat(fmt, "%j"); pos = strtok((char *)NULL, " \t"); } configlogfmt((void *)&logformat, NULL, "WEBSTAR", NULL, -1); configlogfmt((void *)&logformat, NULL, fmt, NULL, -3); pos = d + 1; /* start at next line */ (void)parsenewline(lf, NULL, '\0'); break; case '3': /* W3 extended format */ case '5': /* Microsoft's attempt at same */ case '6': /* WebSTAR's (much closer :-) attempt at same */ strtoupper(pos); resolveconflicts(2, " \t", "BYTES", "SC-BYTES"); resolveconflicts(2, " \t", "C-IP", "CS-IP"); if (c == '6') { /* WebSTAR */ resolveconflicts(3, " \t", "C-DNS", "CS-DNS", "CS-HOST"); resolveconflicts(6, " \t", "CS(HOST)", "S-DNS", "S-IP", "CS-SIP", "S-SITENAME", "S-COMPUTERNAME"); } else { resolveconflicts(2, " \t", "C-DNS", "CS-DNS"); resolveconflicts(7, " \t", "CS(HOST)", "CS-HOST", "S-DNS", "S-IP", "S-SITENAME", "S-COMPUTERNAME", "CS-SIP"); } resolveconflicts(2, " \t", "CS-URI-STEM", "CS-URI"); resolveconflicts(3, " \t", "CS-USERNAME", "CS(FROM)", "CS(COOKIE)"); ENSURE_LEN(fmt, fmtlen, 32); /* See above */ fmt[0] = '\0'; pos = strtok(pos, " \t"); while (pos != NULL) { ENSURE_LEN(fmt, fmtlen, strlen(fmt) + 11); /* See above */ if (!IS_EMPTY_STRING(fmt)) strcat(fmt, "%w"); if (STREQ(pos, "DATE")) strcat(fmt, "%Y-%m-%d"); else if (STREQ(pos, "TIME")) strcat(fmt, "%h:%n:%j"); else if (STREQ(pos, "BYTES") || STREQ(pos, "SC-BYTES")) strcat(fmt, "%b"); else if (STREQ(pos, "SC-STATUS")) strcat(fmt, "%c"); else if (STREQ(pos, "C-DNS") || STREQ(pos, "CS-DNS")) strcat(fmt, "%S"); else if (STREQ(pos, "CS-IP") || STREQ(pos, "C-IP")) strcat(fmt, "%s"); else if (STREQ(pos, "CS-URI-STEM") || STREQ(pos, "CS-URI")) strcat(fmt, "%r"); else if (STREQ(pos, "CS(REFERER)")) { if (c == '5') /* Microsoft */ strcat(fmt, "%f"); else strcat(fmt, "\"%f\""); } else if (STREQ(pos, "CS(USER-AGENT)")) { if (c == '5') /* Microsoft */ strcat(fmt, "%A"); else strcat(fmt, "\"%B\""); } else if (STREQ(pos, "CS-HOST")) { if (c == '6') /* WebSTAR */ strcat(fmt, "%S"); else strcat(fmt, "%v"); } else if (STREQ(pos, "CS(HOST)")) strcat(fmt, "\"%v\""); else if (STREQ(pos, "S-IP") || STREQ(pos, "S-DNS") || STREQ(pos, "CS-SIP") || STREQ(pos, "S-SITENAME") || STREQ(pos, "S-COMPUTERNAME")) strcat(fmt, "%v"); else if (STREQ(pos, "CS-URI-QUERY")) strcat(fmt, "%q"); else if (STREQ(pos, "CS(FROM)")) strcat(fmt, "\"%u\""); else if (STREQ(pos, "CS-USERNAME") || STREQ(pos, "CS(COOKIE)")) strcat(fmt, "%u"); else if (STREQ(pos, "TIME-TAKEN")) { if (c == '5') /* Microsoft */ strcat(fmt, "%T"); else strcat(fmt, "%t"); } else strcat(fmt, "%j"); pos = strtok((char *)NULL, " \t"); } if (c == '3') configlogfmt((void *)&logformat, NULL, "EXTENDED", NULL, -1); else if (c == '5') configlogfmt((void *)&logformat, NULL, "MS-EXTENDED", NULL, -1); else /* c == '6' */ configlogfmt((void *)&logformat, NULL, "WEBSTAR-EXTENDED", NULL, -1); configlogfmt((void *)&logformat, NULL, fmt, NULL, -3); pos = d + 1; (void)parsenewline(lf, NULL, '\0'); break; case '4': /* Netscape format */ resolveconflicts(2, "%", "Req->vars.auth-user", "Req->vars.pauth-user"); resolveconflicts(2, "%", "Req->reqpb.clf-request", "Req->reqpb.proxy-request"); resolveconflicts(3, "%", "Req->srvhdrs.content-length", "Req->headers.content-length", "Req->vars.p2c-cl"); resolveconflicts(2, "%", "Req->vars.xfer-time", "Req->vars.xfer-time-total"); ENSURE_LEN(fmt, fmtlen, 32); /* See above */ fmt[0] = '\0'; while (*pos != '\0') { ENSURE_LEN(fmt, fmtlen, strlen(fmt) + 18); /* See above */ if (*pos != '%') { e = strchr(fmt, '\0'); *e = *(pos++); *(e + 1) = '\0'; } else { if ((e = strchr(++pos, '%')) == NULL) return(BADLOGFMT); else *e = '\0'; if (STREQ(pos, "Ses->client.ip")) strcat(fmt, "%S"); else if (STREQ(pos, "Req->vars.auth-user") || STREQ(pos, "Req->vars.pauth-user")) strcat(fmt, "%u"); else if (STREQ(pos, "SYSDATE")) strcat(fmt, "%d/%M/%Y:%h:%n:%j"); else if (STREQ(pos, "Req->reqpb.clf-request") || STREQ(pos, "Req->reqpb.proxy-request")) strcat(fmt, "%j%w%r%wHTTP%j"); else if (STREQ(pos, "Req->srvhdrs.clf-status")) strcat(fmt, "%c"); else if (STREQ(pos, "Req->srvhdrs.content-length") || STREQ(pos, "Req->headers.content-length") || STREQ(pos, "Req->vars.p2c-cl")) strcat(fmt, "%b"); else if (STREQ(pos, "Req->headers.referer")) strcat(fmt, "%f"); else if (STREQ(pos, "Req->headers.user-agent")) strcat(fmt, "%B"); else if (STREQ(pos, "Req->headers.host")) strcat(fmt, "%v"); else if (STREQ(pos, "Req->vars.xfer-time") || STREQ(pos, "Req->vars.xfer-time-total")) strcat(fmt, "%t"); else strcat(fmt, "%j"); pos = e + 1; } } configlogfmt((void *)&logformat, NULL, "NETSCAPE", NULL, -1); configlogfmt((void *)&logformat, NULL, fmt, NULL, -3); pos = d + 1; (void)parsenewline(lf, NULL, '\0'); break; } return(NEWLOGFMT); } choice parsenextrecord(Logfile *lf, Inputformat *format) { Inputformat *ipf, *ipf2; logical rc; if (pos == NULL) { /* new logfile */ if (getmoredata(lf, block_start, BLOCKSIZE) == EOF) return(EOF); pos = block_start; if (*pos == '\n' || *pos == '\r') parsenewline(lf, NULL, '\0'); /* ignore completely blank lines at top */ record_start = pos; } pos = record_start; for (ipf = format; ipf->inpfns != NULL; TO_NEXT(ipf)) { if (pos > block_bell) { if (record_start != block_start) shunt_data(lf); if (pos == block_end && block_end - block_start < BLOCKSIZE) return(EOF); } rc = ipf->inpfns->fn(lf, ipf->inpfns->opt, ipf->sep); if (rc != TRUE) { for (ipf2 = format; ipf2 != ipf; TO_NEXT(ipf2)) { if (ipf2->inpfns->fn == &parsestring || ipf2->inpfns->fn == &parseref) ((Memman *)(ipf2->inpfns->opt))->next_pos = ((Memman *)(ipf2->inpfns->opt))->curr_pos; /* reset strings; NB ipf returned !TRUE so didn't allocate */ } return(rc); } } return(TRUE); } int parseconfline(char *s, char **cmd, char **arg1, char **arg2) { char *c, d; for (c = s; *c == ' ' || *c == '\t'; c++) ; /* run past white space */ if (*c == '\0' || *c == '#') return(-1); *cmd = c; while (*c != ' ' && *c != '\t' && *c != '\0' && *c != '#') c++; if (*c == '\0' || *c == '#') { *c = '\0'; return(0); } *c = '\0'; c++; for ( ; *c == ' ' || *c == '\t'; c++) ; /* run past white space again */ if (*c == '\0' || *c == '#') return(0); *arg1 = c; if (*c == '\'' || *c == '"' || *c == '(') { d = (*c == '(')?')':(*c); /* terminating character for next string */ *arg1 = (++c); while (*c != d && *c != '\0') c++; } else while (*c != ' ' && *c != '\t' && *c != '\0' && *c != '#') c++; if (*c == '\0' || *c == '#') { *c = '\0'; return(1); } *c = '\0'; c++; for ( ; *c == ' ' || *c == '\t'; c++) ; if (*c == '\0' || *c == '#') return(1); *arg2 = c; if (*c == '\'' || *c == '"' || *c == '(') { d = (*c == '(')?')':(*c); *arg2 = (++c); while (*c != d && *c != '\0') c++; } else while (*c != ' ' && *c != '\t' && *c != '\0' && *c != '#') c++; if (*c == '\0' || *c == '#') { *c = '\0'; return(2); } *c = '\0'; c++; for ( ; *c == ' ' || *c == '\t'; c++) ; if (*c == '\0' || *c == '#') return(2); return(3); } int nextconfline(FILE *f, char **cmd, char **arg1, char **arg2) { /* if 255 increased, so must u[] be in confline() */ size_t l; int rc; *cmd = NULL; *arg1 = NULL; *arg2 = NULL; while (TRUE) { if (getnextline(f, block_start, 0) == EOF) return(EOF); while ((l = strlen(block_start)) > 0 && *(block_start + l - 1) == '\\') { if (getnextline(f, block_start + l - 1, l - 1) == EOF) return(EOF); } if (l >= 255) { *(block_start + 70) = '\0'; warn('C', TRUE, "Ignoring long configuration line starting\n%s", block_start); } else if ((rc = parseconfline(block_start, cmd, arg1, arg2)) != -1) return(rc); /* o/wise line was blank or a comment: go round again */ } } char *nextlngstr(FILE *f, char *name, logical want) { while (TRUE) { if (getnextline(f, block_start, 0) == EOF) { /* EOF reached */ if (want) error("language file %s too short", name); else return((char *)NULL); } if (strlen(block_start) >= 255) error("language file %s contains excessively long lines", name); if (block_start[0] != '#' || block_start[1] != '#') { /* found a line */ if (want) return(block_start); else error("language file %s too long", name); } /* otherwise just found a comment; go round again */ } } choice nextdnsline(FILE *f, timecode_t *timec, char **name, char **alias) { char *timestr = NULL; *name = NULL; *alias = NULL; if (getnextline(f, block_start, 0) == EOF) return(EOF); if (strlen(block_start) >= 255) { *(block_start + 70) = '\0'; warn('G', TRUE, "Ignoring long line in DNS file starting\n%s", block_start); return(FALSE); } if ((timestr = strtok(block_start, " ")) == NULL || (*name = strtok((char *)NULL, " ")) == NULL || (*alias = strtok((char *)NULL, " ")) == NULL || strtok((char *)NULL, " ") != NULL || !ISDIGIT(*timestr) || (*timec = strtoul(timestr, (char **)NULL, 10)) == 0) { warn('G', TRUE, "Ignoring corrupt line in DNS file\n%s %s %s", block_start, (*name == NULL)?"":(*name), (*alias == NULL)?"":(*alias)); return(FALSE); } return(TRUE); } void process_domainsfile(FILE *f, Options *op) { /* size of v must be bounded because u in confline is */ char *s, *t, *c, *u, v[256]; while (TRUE) { if (getnextline(f, block_start, 0) == EOF) return; if (*block_start == '#') ; /* ignore comment line */ else if (strlen(block_start) >= 250) { *(block_start + 70) = '\0'; warn('G', TRUE, "Ignoring long line in domains file starting\n%s", block_start); } else { for (s = block_start; *s == ' ' || *s == '\t'; s++) ; for (t = s; *t != ' ' && *t != '\t' && *t != '\0'; t++) ; if (*t == '\0') warn('G', TRUE, "Ignoring incomplete line in domains file\n%s", block_start); else { for (c = t + 1; *c == ' ' || *c == '\t'; c++) ; if (*c < '1' || *c > '9' || (*(c + 1) != ' ' && *(c + 1) != '\t')) warn('G', TRUE, "Ignoring corrupt line in domains file\n%s", block_start); else { *t = '\0'; *(c + 1) = '\0'; for (t = c + 2; *t == ' ' || *t == '\t'; t++) ; for (u = strchr(block_start, '\0') - 1; (*u == ' ' || *u == '\t') && u > t; u--) ; if (u > t) *(u + 1) = '\0'; confline(op, "DOMLEVEL", s, c, -1); sprintf(v, "PLAIN:.%s (%s)", s, t); confline(op, "DOMOUTPUTALIAS", s, v, -1); } } } } } void process_descfile(FILE *f, char *name, Options *op) { int i; for (i = 0; i < REP_NUMBER; i++) { if (getnextline(f, block_start, 0) == EOF) { warn ('F', TRUE, "report descriptions file %s too short: ignoring it", name); op->outopts.descriptions = FALSE; return; } if (*block_start == '#') i--; /* ignore comment line */ else { if (strlen(block_start) > 500) { *(block_start + 500) = '\0'; warn('G', TRUE, "Long line in report descriptions file: truncating it " "at 500 characters"); /* Limit is because of prettyprintf() */ } COPYSTR(op->outopts.descstr[i], block_start); } } while (getnextline(f, block_start, 0) != EOF) { if (*block_start != '#') { warn ('F', TRUE, "report descriptions file %s too long: ignoring it", name); op->outopts.descriptions = FALSE; return; } } } analog-6.0/src/macdir.h0000644000175000017500000000406210161303542015132 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** The contents of this file is copyright (c) Jason Linhart 1997. ***/ /*** macdir.h * * Directory Operations for Mac based on BSD 4.3 * By Jason Linhart, January 1997 ***/ #ifndef _MACDIR_H #define _MACDIR_H 1 #include #define NAME_MAX 255 /* # chars in a file name */ struct dirent { #ifdef COMMENT long d_ino; off_t d_off; unsigned short d_reclen; #endif char d_name[NAME_MAX+1]; }; /* The internal is hidden from the user. */ typedef void DIR; /* Open a directory stream on NAME. Return a DIR stream on the directory, or NULL if it could not be opened. */extern DIR *opendir (const char *name); /* Close the directory stream DIRP. Return 0 if successful, -1 if not. */ extern int closedir (DIR * dirp); /* Read a directory entry from DIRP. Return a pointer to a `struct dirent' describing the entry, or NULL for EOF or error. The storage returned may be overwritten by a later readdir call on the same DIR stream. */ extern struct dirent *readdir (DIR * dirp); /* Rewind DIRP to the beginning of the directory. */ extern void rewinddir (DIR * dirp); /* Seek to position POS on DIRP. */ extern void seekdir (DIR * dirp, off_t pos); /* Return the current position of DIRP. */ extern off_t telldir (DIR * dirp); /* Fake stat to work with current directory entry */ #define stat(file_name,buf) dirstat(file_name,buf) extern int dirstat(const char *file_name, struct stat *buf); #endif /* macdir.h */ analog-6.0/src/macinput.c0000644000175000017500000003674110161303542015517 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** The contents of this file is copyright (c) Jason Linhart 1998 - 2001. ***/ /*** macinput.c; input functions for Mac */ #define REAL_STDIO /* Define these to suppress defines in anlghea3.h */ /* #define DEBUG_VERSION */ #include "anlghea3.h" #ifdef MAC #ifdef USE_ZLIB #include #include #include #include "my_bzlib.h" #include "my_zlib.h" #include "unzip.jtl.h" #endif #ifdef LINE_PARSER /* Input file parsing */ #define LOC_BUFF_SIZE (16*1024) #ifndef USE_ZLIB typedef long gzFile; typedef long unzFile; typedef long BZFILE; #endif static FILE *in_fp = 0; static gzFile gz_fp; static unzFile zip_fp; static BZFILE *bz_fp; static int zip_eof; static int in_mode = 0; // 0-plain, 1-GZip, 2-PKZip, 3-BZip2 static long line_num; static int buff_cnt, buff_offset; static char *buff = nil; static void FillBuff(int drop_cnt) { buff_offset+=drop_cnt; buff_cnt-=drop_cnt; if (buff_cnt0) memmove(buff,buff+buff_offset,buff_cnt); buff_offset=0; switch (in_mode) { case 0: buff_cnt+=fread(buff+buff_cnt,1,LOC_BUFF_SIZE-buff_cnt,in_fp); break; #ifdef USE_ZLIB case 1: buff_cnt+=gzread(gz_fp,(voidp)(buff+buff_cnt),LOC_BUFF_SIZE-buff_cnt); break; case 2: while (buff_cntdataHandle) /* a reply is sought */ err=AEPutParamPtr(reply,'errs','TEXT',"Ignoring",8); return(err); } static pascal OSErr DoAEOpenDoc(const AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon) { #pragma unused ( reply ) #pragma unused ( handlerRefcon ) OSErr err; AEDescList docList; Size actualSize; AEKeyword keywd; DescType typeCode; long itemsInList; err=AEGetParamDesc(theAppleEvent,keyDirectObject,typeAEList,&docList); if (!err) { err=GotRequiredParams(theAppleEvent); if (!err) { err=AECountItems(&docList,&itemsInList); if (!err && itemsInList>0) { err=AEGetNthPtr(&docList,1,typeFSS,&keywd,&typeCode,(Ptr)&myFSS, sizeof(myFSS),&actualSize); if (!err) haveFSS=true; } } AEDisposeDesc(&docList); } return(err); } char mac_do_script[256] = ""; static pascal OSErr DoAEDo(const AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon) { #pragma unused ( reply ) #pragma unused ( handlerRefcon ) OSErr err; AEDesc desc; Size actualSize; DescType typeCode; err=AEGetParamDesc(theAppleEvent,keyDirectObject,typeChar,&desc); if (!err) { err=GotRequiredParams(theAppleEvent); if (!err) { err=AEGetParamPtr(theAppleEvent,keyDirectObject,typeChar, &typeCode,(Ptr)mac_do_script,256,&actualSize); if (err) mac_do_script[0]=0; else { mac_do_script[255]=0; if (actualSize>=0 && actualSize<256) mac_do_script[actualSize]=0; } } AEDisposeDesc(&desc); } return(err); } int mac_quit_now = 0; static pascal OSErr /* Used for Quit event */ DoAEQuit(const AppleEvent *theAppleEvent,AppleEvent *reply,long handlerRefcon) { #pragma unused ( handlerRefcon ) OSErr err; err=GotRequiredParams(theAppleEvent); if (!err && reply->dataHandle) /* a reply is sought */ err=AEPutParamPtr(reply,'errs','TEXT',"Ignoring",8); mac_quit_now=1; SIOUXQuitting=true; return(err); } #ifndef _MSL_USE_NEW_FILE_APIS // These are Pro 7 concepts!! #ifndef _MSL_USE_OLD_FILE_APIS // If neither is defined, this is Pro 6 #define _MSL_USE_OLD_FILE_APIS 1 // In Pro 6 do it the old way #endif #endif #if _MSL_USE_OLD_AND_NEW_FILE_APIS extern _MSL_IMP_EXP_C char __msl_system_has_new_file_apis(void); #endif static OSErr OpenFork(FSSpec *spec,char permission,short *refNum) { #if _MSL_USE_NEW_FILE_APIS FSRef theRef; #endif OSErr err; #if _MSL_USE_OLD_AND_NEW_FILE_APIS if (__msl_system_has_new_file_apis()) { #endif /* _MSL_USE_OLD_AND_NEW_FILE_APIS */ #if _MSL_USE_NEW_FILE_APIS err=FSpMakeFSRef(spec,&theRef); if (!err) err=FSOpenFork(&theRef,0,NULL,permission,refNum); #endif #if _MSL_USE_OLD_AND_NEW_FILE_APIS } else { #endif /* _MSL_USE_OLD_AND_NEW_FILE_APIS */ #if _MSL_USE_OLD_FILE_APIS err=FSpOpenDF(spec,permission,refNum); #endif #if _MSL_USE_OLD_AND_NEW_FILE_APIS } #endif return(err); } char TryAEOpen(void); char TryAEOpen(void) { AEEventHandlerUPP HandlerUPP; EventRecord myEvent; OSErr result; long lvalue; int cnt; short refNum; char c[2]; if (Gestalt(gestaltAppleEventsAttr,&lvalue)!=noErr) return(false); result=noErr; HandlerUPP=NewAEEventHandlerUPP(&DoAEOpenDoc); result=AEInstallEventHandler(kCoreEventClass,kAEOpenDocuments,HandlerUPP,0,false); if (result==noErr) { HandlerUPP=NewAEEventHandlerUPP(&DoAENoop); result=AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,HandlerUPP,0,false); } if (result==noErr) { HandlerUPP=NewAEEventHandlerUPP(&DoAENoop); result=AEInstallEventHandler(kCoreEventClass,kAEPrintDocuments,HandlerUPP,0,false); } if (result==noErr) { HandlerUPP=NewAEEventHandlerUPP(&DoAEQuit); result=AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,HandlerUPP,0,false); } if (result==noErr) { HandlerUPP=NewAEEventHandlerUPP(&DoAEDo); result=AEInstallEventHandler(kAEMiscStandards,kAEDoScript,HandlerUPP,0,false); } if (result==noErr) { for (cnt=0; cnt<40; ++cnt) { if (GetNextEvent(everyEvent,&myEvent)) { if (myEvent.what==kHighLevelEvent) AEProcessAppleEvent(&myEvent); else SIOUXHandleOneEvent(&myEvent); } } } if (haveFSS && !OpenFork(&myFSS,fsRdPerm,&refNum)) { read(refNum,c,2); close(refNum); return((c[0]=='#' && c[1]==' ')?'#':' '); } return(0); } #ifdef USE_ZLIB #define GZ_NUM_BLOCKS 16 static int gz_sizes[GZ_NUM_BLOCKS] = { 16, 24, 28, 64, 76, 100, 108, 140, 2048, 2048, 5816, 11520, 16*1024, 32*1024, 64*1024, 64*1024 }; static void *gz_blocks[GZ_NUM_BLOCKS] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static int gz_bflags[GZ_NUM_BLOCKS] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; static voidpf my_gz_alloc_func(voidpf opaque,uInt items,uInt size) { int indx; size*=items; if (size<512) { if (size<70) { if (size<=16) indx=0; else if (size==24) indx=1; else if (size==28) indx=2; else if (size==64) indx=3; else indx=GZ_NUM_BLOCKS; } else { if (size==76) indx=4; else if (size==100) indx=5; else if (size==108) indx=6; else if (size==140) indx=7; else indx=GZ_NUM_BLOCKS; } } else { if (size<=2048) indx=8; /* There are two sets of these, indx */ /* 8 and 9, special case in loop below */ else if (size==5816) indx=10; else if (size==11520) indx=11; else if (size==16*1024) indx=12; else if (size==32*1024) indx=13; else if (size==64*1024) indx=14; /* There are two sets of these, indx */ /* 14 and 15, special case in loop below */ else indx=GZ_NUM_BLOCKS; } if (indx>=GZ_NUM_BLOCKS) { #ifdef DEBUG_VERSION printf("gz alloc: unusual size, %d bytes\n",size); #endif return(malloc(size)); } while (true) { if (!gz_bflags[indx]) { gz_bflags[indx]=1; return(gz_blocks[indx]); } else if (gz_bflags[indx]==2) { gz_blocks[indx]=malloc(gz_sizes[indx]); gz_bflags[indx]=1; return(gz_blocks[indx]); } if (indx==8 || indx==14) ++indx; else break; } #ifdef DEBUG_VERSION printf("gz alloc: table in use already, %d bytes\n",size); #endif return(malloc(size)); } static void my_gz_free_func(voidpf opaque,voidpf address) { void **ptr; int indx; if (!address) return; ptr=gz_blocks; for (indx=0; indx1AY&SY" */ else if (buff[0]=='B' && buff[1]=='Z' && buff[2]=='h' && isdigit(buff[3]) && !memcmp("1AY&SY",buff+4,6)) { bzsetalloc(my_bz_alloc_func,my_bz_free_func,0); bz_fp=BZ2_bzfopen(in_fp,"rb"); in_mode=3; } /* ZIP files start with "PK\03\04" - we only read deflated and stored items (nothing else tends to occur) */ else in_mode=0; } else in_mode=0; #else in_mode=0; #endif FillBuff(0); return((FILE *)in_fp); } return(nil); } int mac_fclose(FILE *file) { int result; if ((gzFile)file==in_fp) { switch (in_mode) { case 0: result=fclose(in_fp); break; #ifdef USE_ZLIB case 1: result=gzclose(gz_fp); break; case 2: if (!zip_eof) unzCloseCurrentFile(zip_fp); unzClose(zip_fp); result=0; break; case 3: BZ2_bzclose(bz_fp); result=0; break; #endif } in_fp=nil; } else result=fclose(file); return(result); } size_t mac_fread(void *ptr,size_t size,size_t num,FILE *file) { size_t total; long len; if (in_fp!=(gzFile)file) return(fread(ptr,size,num,file)); num*=size; total=0; while (num>0) { if (buff_cnt<=0) return(total); len=buff_cnt; if (len>num) len=num; memcpy(ptr,buff+buff_offset,len); ((char *)ptr)+=len; FillBuff(len); num-=len; total+=len; } return(total/size); } int mac_getc(FILE *file) { int result; if (in_fp!=(gzFile)file) return(getc(file)); if (buff_cnt<=0) return(EOF); result = *((unsigned char *)buff+buff_offset); FillBuff(1); return(result); } int mac_feof(FILE *file) { if (in_fp!=(gzFile)file) return(feof(file)); return(buff_cnt<=0); } #endif #define PNG_NUM_BLOCKS 11 static int png_sizes[PNG_NUM_BLOCKS] = { 10, 10, 80, 560, 700, /* 80 used for 64, 700 used for 601 */ 5816, 8192, 65536, 65536, 65536, 65536 }; void *png_blocks[PNG_NUM_BLOCKS] = { 0, 0, 0, 0 ,0 ,0 ,0 ,0 ,0, 0, 0 }; /* address of the block */ int png_bflags[PNG_NUM_BLOCKS] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; /* 0-available, 1-in use, 2-not allocated */ extern void *mac_png_malloc(unsigned long size); extern void mac_png_free(void *ptr); void * /* Allocate memory - use cached block if size is right */ mac_png_malloc(unsigned long size) { int indx; #ifdef DEBUG_VERSION // printf("png alloc: %d bytes\n",size); #endif if (size<1000) { if (size==10) indx=0; /* There are two sets of these, indx */ /* 0 and 1, special case in loop below */ else if (size<=80) indx=2; else if (size==560) indx=3; else if (size<=700) indx=4; else indx=PNG_NUM_BLOCKS; } else { if (size==5816) indx=5; else if (size==8192) indx=6; else if (size==65536) indx=7; /* There are four sets of these, indx */ /* 7, 8, 9, and 10, special case in loop below */ else indx=PNG_NUM_BLOCKS; } if (indx=7 && indx<=9)) ++indx; else break; } #ifdef DEBUG_VERSION printf("png alloc: table in use already, %d bytes\n",size); #endif return(malloc(size)); } #ifdef DEBUG_VERSION printf("png alloc: unusual size, %d bytes\n",size); #endif return(malloc(size)); } void /* Free memory - put blocks back in the cache */ mac_png_free(void *address) { void **ptr; int indx; if (!address) return; ptr=png_blocks; for (indx=0; indx0 is open, 0 is closed, -1 is at end */ static unsigned char fname[257]; // The current file name static short dir_volume; // The open dir's volume static long dir_ID; // The open dir's dir ID static char last_attrib; // The attributes of the last entry read static void CToPCpy(unsigned char *pstr, const char *cstr) { /* Convert a C string to a Pascal string */ register char *dptr, len; len=0; dptr=(char *)pstr+1; while (len<255 && (*dptr++ = *cstr++)!=0) ++len; *pstr=len; } DIR * opendir (const char *name) /* Open a directory stream on NAME. */ /* Return a DIR stream on the directory, or NULL if it could not be opened. */ { CInfoPBRec cat_info; FSSpec spec; Boolean targetIsFolder, wasAliased; if (indx) { // We don't support more than one dir open at a time closedir((DIR *)1); // Fail hard return((DIR *)0); } dir_volume=0; // Default to the application directory dir_ID=0; while (name[0]=='.') ++name; // Don't allow leading '.', avoids device names CToPCpy(fname,name); if (!FSMakeFSSpec(0,0,fname,&spec)) { // Figure out where user is pointing ResolveAliasFile(&spec, true, &targetIsFolder, &wasAliased); cat_info.dirInfo.ioCompletion=(IOCompletionUPP)0; cat_info.dirInfo.ioNamePtr=spec.name; cat_info.dirInfo.ioVRefNum=spec.vRefNum; cat_info.dirInfo.ioFDirIndex = 0; // Use full spec cat_info.dirInfo.ioDrDirID=spec.parID; cat_info.dirInfo.ioFVersNum=0; if (!PBGetCatInfoSync(&cat_info) && (cat_info.dirInfo.ioFlAttrib&16)) spec.parID=cat_info.dirInfo.ioDrDirID; // Found it, save it's volume and dirID dir_volume=spec.vRefNum; dir_ID=spec.parID; } else return ((DIR *)0); indx=1; return((DIR *)1); } int closedir (DIR * dirp) /* Close the directory stream DIRP. Return 0 if successful, -1 if not. */ { if (indx) { indx=0; return(0); } return(-1); } struct dirent * readdir (DIR * dirp) /* Read a directory entry from DIRP. */ /* Return a pointer to a `struct dirent' describing the entry, or NULL for EOF or error. The storage returned may be overwritten by a later readdir call on the same DIR stream. */ { CInfoPBRec finfo; finfo.hFileInfo.ioCompletion=(IOCompletionUPP)0; // No completion routine finfo.hFileInfo.ioNamePtr=fname; // Where to return file names finfo.hFileInfo.ioVRefNum=dir_volume; // Saved volume and directory finfo.hFileInfo.ioDirID=dir_ID; finfo.hFileInfo.ioFDirIndex=indx; // Appropriate entry in dir if (indx>0 && !PBGetCatInfoSync(&finfo)) { // Get info about the next dir entry last_attrib=finfo.hFileInfo.ioFlAttrib; fname[fname[0]+1]=0; ++indx; return((struct dirent *)(fname+1)); } if (indx) indx = -1; // Must be at end of dir return((struct dirent *)0); } void rewinddir (DIR * dirp) /* Rewind DIRP to the beginning of the directory. */ { if (indx) indx=1; } void seekdir (DIR * dirp, off_t pos) /* Seek to position POS on DIRP. */ { if (indx && pos>0) indx=pos; } off_t telldir (DIR * dirp) /* Return the current position of DIRP. */ { return((indx>0)?indx:-1); } int dirstat(const char *file_name, struct stat *buf) /* Special version of stat that only works for most recent dir entry */ { if (indx) { if (last_attrib&0x10) buf->st_mode=S_IFDIR; else buf->st_mode=S_IFREG; return(0); } return(-1); } #endif #ifdef MAC #ifndef NODNS static long OpenNetwork(void); /* Takes a string of an IP address in *hostname, resolves it to a domain name, and returns the name in *hostname. Returns nil if unresolvable (or something else went wrong), otherwise returns 1. */ /* URL processing and host lookup */ static long slNetChecked = 0, slNetPresent = 0, slNetSvcOpen = 0; static OTNotifyUPP svcnotifyproc = 0; typedef struct { /* Open Transport Internet services provider info */ InetSvcRef ref; /* provider reference */ Boolean done; /* true when asynch operation has completed */ OTResult result; /* result code */ void *cookie; /* cookie */ } SvcInfo; static SvcInfo sSvcRef; #if !TARGET_API_MAC_CARBON static ResultUPP gMacTCPDNRResultProcUPP = 0; static pascal void MacTCPDNRResultProc (struct hostInfo *hInfoPtr, char *userDataPtr) { *(Boolean*)userDataPtr = true; } #endif int IpAddr2Name(char *hostname) { #if !TARGET_API_MAC_CARBON struct hostInfo hInfoMacTCP; OSErr err; int cnt, tmp; char *cptr; Boolean done; #endif OSStatus lStatus; InetHost lHostAddr; if (!slNetChecked) { slNetPresent = OpenNetwork(); slNetChecked = 1; } if (slNetPresent == 1) { /* turn ascii with periods into a long */ lStatus = OTInetStringToHost(hostname, &lHostAddr); if (lStatus != noErr) return 0; /* turn the long into a reverse-resolved name */ sSvcRef.done=false; lStatus=OTInetAddressToName(sSvcRef.ref,lHostAddr,hostname); if (!lStatus) { do { MacIdle(); } while (!sSvcRef.done); lStatus=sSvcRef.result; } if (!lStatus) { if (hostname[strlen(hostname)-1]=='.') hostname[strlen(hostname)-1]=0; return(1); } } #if !TARGET_API_MAC_CARBON else if (slNetPresent==2) { lHostAddr=0; cptr=hostname; for (cnt=0; cnt<4; ++cnt) { if (!ISDIGIT(*cptr)) return(0); tmp=atoi(cptr); if (tmp<0 || tmp>255) return(0); lHostAddr=(lHostAddr<<8)|tmp; while (ISDIGIT(*cptr)) ++cptr; if (cnt!=3 && *cptr!='.') return(0); ++cptr; } memset(&hInfoMacTCP, 0, sizeof(hInfoMacTCP)); done=false; err = AddrToName(lHostAddr, &hInfoMacTCP, gMacTCPDNRResultProcUPP, (char*)&done); if (err == cacheFault) { while (!done) MacIdle(); err = hInfoMacTCP.rtnCode; } if (err == noErr) { hInfoMacTCP.cname[254] = 0; (void)strcpy(hostname, hInfoMacTCP.cname); if (hostname[strlen(hostname)-1]=='.') hostname[strlen(hostname)-1]=0; return(1); } } #endif return 0; } /* end IpAddr2Name() */ /* Must call this before quitting app */ void ResolverCleanup(void) { if (slNetChecked && slNetSvcOpen) { if (slNetPresent==1) OTCloseProvider(sSvcRef.ref); #if !TARGET_API_MAC_CARBON else if (slNetPresent==2) CloseResolver(); #endif } } /* end ResolverCleanup() */ /* #pragma mark - */ /* Check for availbility of OT/TCP 1.1 or later, or MacTCP and open the service. Return nil if it isn't. */ static pascal void SvcNotifyProc(void *dataPtr,OTEventCode code,OTResult result,void *cookie) { register SvcInfo *svcInfo; svcInfo=(SvcInfo *)dataPtr; svcInfo->done=true; svcInfo->result=result; svcInfo->cookie=cookie; } static Boolean OpenInetServices(SvcInfo *svcInfo) { OSStatus result; svcInfo->done=false; if (!svcnotifyproc) svcnotifyproc=NewOTNotifyUPP(&SvcNotifyProc); #ifdef __CARBON__ result=OTAsyncOpenInternetServicesInContext(kDefaultInternetServicesPath, 0, svcnotifyproc, svcInfo, NULL); #else result=OTAsyncOpenInternetServices(kDefaultInternetServicesPath, 0, svcnotifyproc, svcInfo); #endif if (!result) { do { MacIdle(); } while (!svcInfo->done); result=svcInfo->result; } if (result) return(false); svcInfo->ref=(InetSvcRef)svcInfo->cookie; return(true); } static long OpenNetwork(void) { OSStatus lStatus; OSErr err; long lResponse, lCriteria; err = Gestalt(gestaltOpenTpt, &lResponse); if (err == noErr) { /* Older OpenTransport Headers require that thenext line read: lCriteria = gestaltOpenTptPresent + gestaltOpenTptTCPPresent; */ lCriteria = gestaltOpenTptPresentMask + gestaltOpenTptTCPPresentMask; lResponse = lCriteria & lResponse; if (lResponse == lCriteria) { #ifdef __CARBON__ lStatus=InitOpenTransportInContext(kInitOTForApplicationMask,NULL); #else lStatus = InitOpenTransport(); #endif if (lStatus == noErr) { if (OpenInetServices(&sSvcRef)) { slNetSvcOpen=1; return(1); } } return(0); /* OT present, but won't open */ } } #if !TARGET_API_MAC_CARBON else { gMacTCPDNRResultProcUPP = NewResultProc(&MacTCPDNRResultProc); err = OpenResolver(nil); if (err == noErr) { slNetSvcOpen=1; return(2); } } #endif return(0); } /* end OpenNetwork() */ #endif #endif #ifdef MAC #define MY_MAGIC_ONE 0x3748596A #define MY_MAGIC_TWO 0xA7958473 #define MY_BIG_SIZE (32*1024) #define MY_BLOCK_SIZE (4*(MY_BIG_SIZE+3*sizeof(long))) #if MY_BIG_SIZE!=BLOCKSIZE Look into this! They should be the same, but changes would require other adjustments. #endif static long my_cur_avail = 0; static char *my_cur_block; static struct my_block { struct my_block **next; char storage[MY_BLOCK_SIZE]; } **temp_mem_blocks = nil; static struct my_free { struct my_free *next; char storage[MY_BIG_SIZE-sizeof(struct my_free *)]; } *my_free_list = nil; void mac_temp_free(void); void mac_temp_free(void) { OSErr result; struct my_block **block, **next; block=temp_mem_blocks; while (block) { next=(*block)->next; TempDisposeHandle((Handle)block,&result); if (result) break; block=next; } } static void * my_temp_malloc(size_t size) { OSErr result; struct my_block **block; long version; char *ret_ptr; size=(size+3)&~3; if (Gestalt(gestaltSystemVersion,&version) || version<0x700) return(nil); if (size>MY_BLOCK_SIZE) { if (TempFreeMem()<1024*1024+size) return(nil); block=(struct my_block **)TempNewHandle(size+sizeof(struct my_block **),&result); if (!block || !*block || result) return(nil); TempHLock((Handle)block,&result); (*block)->next=temp_mem_blocks; temp_mem_blocks=block; return((void *)&(*block)->storage); } if (size>my_cur_avail) { if (TempFreeMem()<1024*1024+MY_BLOCK_SIZE) return(nil); block=(struct my_block **)TempNewHandle(sizeof(struct my_block),&result); if (!block || !*block || result) return(nil); TempHLock((Handle)block,&result); (*block)->next=temp_mem_blocks; temp_mem_blocks=block; my_cur_block=(*block)->storage; my_cur_avail=MY_BLOCK_SIZE; } ret_ptr=my_cur_block; my_cur_block+=size; my_cur_avail-=size; return((void *)ret_ptr); } #define MAC_LEAVE_FREE (64*1024) static void * sub_mac_malloc(size_t size) { char *ret_ptr; size=(size+3)&~3; if (size>=MY_BIG_SIZE) { if (MaxBlock()<=MAC_LEAVE_FREE+size) return(my_temp_malloc(size)); return(malloc(size)); } if (size>my_cur_avail) { if (MaxBlock()=MY_BIG_SIZE) { if (size==MY_BIG_SIZE && my_free_list) { ptr=(long *)my_free_list; my_free_list=my_free_list->next; } else { size+=(size/MY_BIG_SIZE)*3*sizeof(long); ptr=(long *)sub_mac_malloc(size); if (ptr) { *ptr++ = size; *ptr++ = MY_MAGIC_ONE; *ptr++ = MY_MAGIC_TWO; } } } else ptr=(long *)sub_mac_malloc(size); return((void *)ptr); } void * mac_calloc(size_t num,size_t size) { return(mac_malloc(num*size)); } void * mac_realloc(void *ptr,size_t size) { void *new_blk; if (!size || !(new_blk=mac_malloc(size))) return(nil); memcpy(new_blk,ptr,size); mac_free(ptr); return(new_blk); } void mac_free(void *ptr) { struct my_free *blk; long *lptr, size; lptr=(long *)ptr; if (lptr) { lptr-=3; if (lptr[1]==MY_MAGIC_ONE && lptr[2]==MY_MAGIC_TWO) { size = *lptr + 3*sizeof(long); while (size>=MY_BIG_SIZE+3*sizeof(long)) { blk=(struct my_free *)(lptr+3); blk->next=my_free_list; my_free_list=blk; *lptr=MY_BIG_SIZE+3*sizeof(long); lptr[1]=MY_MAGIC_ONE; lptr[2]=MY_MAGIC_TWO; lptr+=(MY_BIG_SIZE/sizeof(long))+3; size-=MY_BIG_SIZE+3*sizeof(long); } } } } #endif analog-6.0/src/outcro.c0000644000175000017500000003135410161303542015205 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** outcro.c; computer-readable output ***/ #include "anlghea3.h" /* Page width -- unused in this output style */ unsigned int cro_pagewidth(Outchoices *od) { return 0; } /* The top of the output if we are in CGI mode */ void cro_cgihead(FILE *outf, Outchoices *od) { fprintf(outf, "Content-Type: text/plain\n\n"); } /* Stuff this output style needs in the page header */ void cro_stylehead(FILE *outf, Outchoices *od) { } /* The title of the page, plus the user's HEADERFILE */ void cro_pagetitle(FILE *outf, Outchoices *od) { if (!strcaseeq(od->headerfile, "none")) cro_includefile(outf, od, od->headerfile, 'h'); fprintf(outf, "x%sVE%sanalog %s\n", od->compsep, od->compsep, VNUMBER); fprintf(outf, "x%sHN%s%s\n", od->compsep, od->compsep, od->hostname); if (!strcaseeq(od->hosturl, "none")) fprintf(outf, "x%sHU%s%s\n", od->compsep, od->compsep, od->hosturl); } /* Program start time, and logfile start and end times */ void cro_timings(FILE *outf, Outchoices *od, Dateman *dman) { extern timecode_t starttimec; char *compsep = od->compsep; if (od->runtime) fprintf(outf, "x%sPS%s%s\n", compsep, compsep, timesprintf(od, od->lngstr[datefmt2_], starttimec, UNSET)); if (dman->firsttime <= dman->lasttime) { fprintf(outf, "x%sFR%s%s\n", compsep, compsep, timesprintf(od, od->lngstr[datefmt2_], dman->firsttime, UNSET)); fprintf(outf, "x%sLR%s%s\n", compsep, compsep, timesprintf(od, od->lngstr[datefmt2_], dman->lasttime, UNSET)); } } /* Finishing the top of the page */ void cro_closehead(FILE *outf, Outchoices *od) { } /* Starting the bottom of the page */ void cro_pagebotstart(FILE *outf, Outchoices *od) { } /* The credit line at the bottom of the page */ void cro_credit(FILE *outf, Outchoices *od) { /* Already printed at the top of the page in cro_pagehead() */ } /* The program run time */ void cro_runtime(FILE *outf, Outchoices *od, long secs) { } /* The page footer, including the user's FOOTERFILE */ void cro_pagefoot(FILE *outf, Outchoices *od) { if (!strcaseeq(od->footerfile, "none")) cro_includefile(outf, od, od->footerfile, 'f'); } /* Footer material for this output style */ void cro_stylefoot(FILE *outf, Outchoices *od) { } /* Report title */ void cro_reporttitle(FILE *outf, Outchoices *od, choice rep) { } /* Report footer */ void cro_reportfooter(FILE *outf, Outchoices *od, choice rep) { } /* Report description */ void cro_reportdesc(FILE *outf, Outchoices *od, choice rep) { } /* The time period spanned by the report */ void cro_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind) { extern char repcodes[]; fprintf(outf, "%c%s*FR%s%s\n", repcodes[rep], od->compsep, od->compsep, timesprintf(od, od->lngstr[datefmt2_], mind, UNSET)); fprintf(outf, "%c%s*LR%s%s\n", repcodes[rep], od->compsep, od->compsep, timesprintf(od, od->lngstr[datefmt2_], maxd, UNSET)); } /* General Summary header */ void cro_gensumhead(FILE *outf, Outchoices *od) { } /* General Summary footer */ void cro_gensumfoot(FILE *outf, Outchoices *od) { } /* Single General Summary line, long data */ void cro_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage) { char *compsep = od->compsep; char *name = od->lngstr[namecode]; if (isaverage) return; /* CRO doesn't display averages */ fprintf(outf, "x%s%c%c%s%lu", compsep, name[0], name[1], compsep, x); if (x7 != (unsigned long)UNSET) fprintf(outf, "\nx%s%c%c%s%lu", compsep, name[2], name[3], compsep, x7); putc('\n', outf); } /* Single General Summary line, bytes data */ void cro_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage) { char *compsep = od->compsep; char *name = od->lngstr[namecode]; if (isaverage) return; /* CRO doesn't display averages */ fprintf(outf, "x%s%c%c%s%.0f", compsep, name[0], name[1], compsep, x); if (x7 != UNSET) fprintf(outf, "\nx%s%c%c%s%.0f", compsep, name[2], name[3], compsep, x7); putc('\n', outf); } /* "Last seven" explanation line */ void cro_lastseven(FILE *outf, Outchoices *od, timecode_t last7to) { fprintf(outf, "x%sE7%s%s\n", od->compsep, od->compsep, timesprintf(od, od->lngstr[datefmt1_], last7to, UNSET)); } /* Start of a
 section */
void cro_prestart(FILE *outf, Outchoices *od) {
}

/* End of a 
 section */
void cro_preend(FILE *outf, Outchoices *od) {
}

/* A horizontal rule */
void cro_hrule(FILE *outf, Outchoices *od) {
}

/* An en dash */
char *cro_endash(void) {
  return "-";
}

/* putc with special characters escaped */
void cro_putch(FILE *outf, char c) {
  putc(c, outf);
}

/* strlen */
size_t cro_strlength(const char *s) {
  return strlen(s);
}

/* Allow month in dates? DO NOT enable for human-readable text because of
   i18n problems. */
logical cro_allowmonth(void) {
  return TRUE;
}

/* Calculate column widths */
void cro_calcwidths(Outchoices *od, choice rep, unsigned int width[],
		      unsigned int *bmult, unsigned int *bmult7, double *unit,
		      unsigned long maxr, unsigned long maxr7,
		      unsigned long maxp, unsigned long maxp7, double maxb,
		      double maxb7, unsigned long howmany) {
  unsigned int i;

  for (i = 0; i < COL_NUMBER; i++)
    width[i] = 0;

  *bmult = 0;
  *bmult7 = 0;
}

/* "Each unit represents" line */
void cro_declareunit(FILE *outf, Outchoices *od, char graphby, double unit,
		     unsigned int bmult) {
}

/* Start of column header line */
void cro_colheadstart(FILE *outf, Outchoices *od, choice rep) {
}

/* Column header line: individual column */
void cro_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col,
		    unsigned int width, char *colname, logical unterminated) {
}

/* End of column header line */
void cro_colheadend(FILE *outf, Outchoices *od, choice rep) {
}

/* Start of column header underlining line */
void cro_colheadustart(FILE *outf, Outchoices *od, choice rep) {
}

/* Underlining of one column header */
void cro_colheadunderline(FILE *ouf, Outchoices *od, choice rep, choice col,
			  unsigned int width, char *name) {
}

/* End of column header underlining line */
void cro_colheaduend(FILE *outf, Outchoices *od, choice rep) {
}

/* Start of a table row */
void cro_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols,
		  int level, char *name, char *datefmt, char *timefmt) {
  extern char repcodes[];
  extern char colcodes[];

  unsigned int c;

  fprintf(outf, "%c%s", repcodes[rep], od->compsep);
  if (level >= 1)
    putc('l', outf);
  for (c = 0; cols[c] != COL_NUMBER; c++)
    putc(colcodes[cols[c]], outf);
  fputs(od->compsep, outf);
}

/* Print level in hierarchy represented by this row */
void cro_levelcell(FILE *outf, Outchoices *od, choice rep, int level) {
  if (level >= 1)
        fprintf(outf, "%d%s", level, od->compsep);
}

/* Name column */
void cro_namecell(FILE *outf, Outchoices *od, choice rep, char *name,
		  choice source, unsigned int width, logical name1st,
		  logical isfirst, logical rightalign, Alias *aliashead,
		  Include *linkhead, logical ispage, unsigned int spaces,
		  char *baseurl) {
  extern char *workspace;

  if (isfirst)
    return;

  strcpy(workspace, name);
  do_aliasx(workspace, aliashead);
  fputs(workspace, outf);
}

/* Single cell, unsigned long argument */
void cro_ulcell(FILE *outf, Outchoices *od, choice rep, choice col,
		unsigned long x, unsigned int width) {
  fprintf(outf, "%lu%s", x, od->compsep);
}

/* Single cell, TRUSTED string argument */
void cro_strcell(FILE *outf, Outchoices *od, choice rep, choice col,
		 char *s, unsigned int width) {
  fprintf(outf, "%s%s", s, od->compsep);
}

/* Single cell, listing bytes */
void cro_bytescell(FILE *outf, Outchoices *od, choice rep, choice col,
		   double b, double bmult, unsigned int width) {
  fprintf(outf, "%.0f%s", b, od->compsep);
}

/* Single cell, listing percentage */
void cro_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n,
		double tot, unsigned int width) {
  fprintf(outf, "%.3f", (tot == 0)?0.0:(n * 100.0 / tot));
  fputs(od->compsep, outf);
}

/* Single cell, index */
void cro_indexcell(FILE *outf, Outchoices *od, choice rep, choice col,
		   long index, unsigned int width) {
  /* If index is 0 (i.e. sub-item), don't print anything */
  if (index > 0)
    fprintf(outf, "%ld", index);
  fputs(od->compsep, outf);
}

/* End of a table row */
void cro_rowend(FILE *outf, Outchoices *od, choice rep) {
  putc('\n', outf);
}

/* Blank line in time reports */
void cro_blankline(FILE *outf, Outchoices *od, choice *cols) {
}

/* Barchart in time reports */
void cro_barchart(FILE *outf, Outchoices *od, int y, char graphby) {
}

/* "Busiest time period" line */
void cro_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt,
		    unsigned long reqs, unsigned long pages, double bys,
		    datecode_t date, unsigned int hr, unsigned int min,
		    datecode_t newdate, unsigned int newhr,
		    unsigned int newmin, char graphby) {
  extern char repcodes[];

  char *compsep = od->compsep;

  putc(repcodes[rep], outf);
  if (TOLOWER(graphby) == 'r')
    fprintf(outf, "%s*BT%sR%s%lu", compsep, compsep, compsep, reqs);
  else if (TOLOWER(graphby) == 'p')
    fprintf(outf, "%s*BT%sP%s%lu", compsep, compsep, compsep, pages);
  else /* TOLOWER(graphby) == 'b' */
    fprintf(outf, "%.0f", bys);
  fprintf(outf, "%s%s\n", compsep,
	  datesprintf(od, datefmt, date, hr, min, newdate, newhr, newmin,
		      TRUE, UNSET));
}

/* End of "Not listed" line. */
void cro_notlistedstr(FILE *outf, Outchoices *od, choice rep,
		      unsigned long badn) {
  extern unsigned int *rep2lng;

  char **lngstr = od->lngstr;
  char gender = lngstr[rep2lng[rep] + 3][0];

  char *notlistedstr;

  if (gender == 'm')
    notlistedstr = lngstr[notlistedm_];
  else if (gender == 'f')
    notlistedstr = lngstr[notlistedf_];
  else
    notlistedstr = lngstr[notlistedn_];

  fprintf(outf, "[%s: %lu]", notlistedstr, badn);
}

/* The line declaring the floor and sort for a report */
void cro_whatincluded(FILE *outf, Outchoices *od, choice rep,
		      unsigned long n, Dateman *dman) {
  extern char repcodes[];

  choice sortby = od->sortby[G(rep)];
  double floormin = od->floor[G(rep)].min;
  char floorqual = od->floor[G(rep)].qual;
  choice floorby = od->floor[G(rep)].floorby;

  timecode_t tempd;

  fprintf(outf, "%c%s*f%s", repcodes[rep], od->compsep, od->compsep);
  if (floormin < 0)
    fprintf(outf, "-%lu", (unsigned long)(-floormin + EPSILON));
  else if (floorby == DATESORT || floorby == FIRSTDATE) {
    tempd = (timecode_t)(floormin + EPSILON);
    fputs(timesprintf(od, "%Y%M%D:%H%n", tempd, UNSET), outf);
  }
  else if (floorqual == '\0')
    fprintf(outf, "%lu", (unsigned long)(floormin + EPSILON));
  else
    fprintf(outf, "%f", floormin);
  if (floorqual != '\0')
    putc(floorqual, outf);
  if (floorby == REQUESTS)
    putc('R', outf);
  else if (floorby == REQUESTS7)
    putc('S', outf);
  else if (floorby == PAGES)
    putc('P', outf);
  else if (floorby == PAGES7)
    putc('Q', outf);
  else if (floorby == BYTES)
    putc('B', outf);
  else if (floorby == BYTES7)
    putc('C', outf);
  else if (floorby == DATESORT)
    putc('D', outf);
  else /* floorby == FIRSTDATE */
    putc('E', outf);

  /* now the sortby */
  if (floormin < 0 && sortby == RANDOM)
    sortby = floorby;
  fprintf(outf, "%s", od->compsep);
  if (sortby == ALPHABETICAL)
    putc('a', outf);
  else if (sortby == BYTES)
    putc('b', outf);
  else if (sortby == BYTES7)
    putc('c', outf);
  else if (sortby == DATESORT)
    putc('d', outf);
  else if (sortby == FIRSTDATE)
    putc('e', outf);
  else if (sortby == PAGES)
    putc('p', outf);
  else if (sortby == PAGES7)
    putc('q', outf);
  else if (sortby == REQUESTS)
    putc('r', outf);
  else if (sortby == REQUESTS7)
    putc('s', outf);
  else /* sortby == RANDOM */
    putc('x', outf);
  putc('\n', outf);
}

/* Include a header file or footer file */
void cro_includefile(FILE *outf, Outchoices *od, char *name, char type) {
  FILE *inf;
  char buffer[BLOCKSIZE];
  size_t n;

  if ((inf = my_fopen(name, (type == 'h')?"header file":"footer file")) !=
      NULL) {
    while ((n = fread(buffer, 1, BLOCKSIZE, inf)))  /* single equals */
      fwrite((void *)buffer, 1, n, outf);
    (void)my_fclose(inf, name, (type == 'h')?"header file":"footer file");
  }
}

/* Filetype for RISC OS */
unsigned int cro_riscosfiletype(void) {
  return 0xfff;
}
analog-6.0/src/outhtml.c0000644000175000017500000012556210161303542015373 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** outhtml.c; HTML output ***/

#include "anlghea3.h"

/* Page width */
unsigned int html_pagewidth(Outchoices *od) {
  return od->htmlpagewidth;
}

/* The top of the output if we are in CGI mode */
void html_cgihead(FILE *outf, Outchoices *od) {
  fprintf(outf, "Content-Type: text/html; charset=%s\n\n",
	  od->lngstr[charset_]);
}

/* Stuff this output style needs in the page header */
void html_stylehead(FILE *outf, Outchoices *od) {
  fputs("\n", outf);
  fputs("\n\n", outf);
  fprintf(outf, "\n", od->lngstr[charset_]);
  if (od->norobots)
    fputs("\n", outf);
  fprintf(outf, "\n",
	  VERSION);
  fprintf(outf, "%s ", od->lngstr[webstatsfor_]);
  htmlputs(outf, od, od->hostname, FROM_CFG);
  fputs("\n", outf);
  if (!strcaseeq(od->stylesheet, "none")) {
    fputs("stylesheet, IN_HREF);
    fputs("\" rel=\"stylesheet\">\n", outf);
  }
  fputs("\n", outf);
  fputs("\n", outf);
}

/* The title of the page, plus the user's HEADERFILE */
void html_pagetitle(FILE *outf, Outchoices *od) {
  fputs("

", outf); if (!strcaseeq(od->logo, "none")) { fputs("logo[0] != '/' && strstr(od->logo, "://") == NULL) htmlputs(outf, od, od->imagedir, IN_HREF); htmlputs(outf, od, od->logo, IN_HREF); if (STREQ(od->logo, "analogo")) fprintf(outf, ".%s", od->pngimages?"png":"gif"); /* Above: '.' not EXTSEP even on RISC OS */ fputs("\" alt=\"\"> ", outf); } if (strcaseeq(od->hosturl, "none")) { fprintf(outf, "%s ", od->lngstr[webstatsfor_]); htmlputs(outf, od, od->hostname, FROM_CFG); } else { fprintf(outf, "%s lngstr[webstatsfor_]); htmlputs(outf, od, od->hosturl, IN_HREF); fputs("\">", outf); htmlputs(outf, od, od->hostname, FROM_CFG); fputs("", outf); } fputs("

\n\n", outf); if (!strcaseeq(od->headerfile, "none")) html_includefile(outf, od, od->headerfile, 'h'); } /* Program start time, and logfile start and end times */ void html_timings(FILE *outf, Outchoices *od, Dateman *dman) { extern timecode_t starttimec; char **lngstr = od->lngstr; double t0; int t1, t2; if (od->runtime) fprintf(outf, "%s %s.\n
", lngstr[progstart_], timesprintf(od, lngstr[datefmt2_], starttimec, UNSET)); if (dman->firsttime <= dman->lasttime) { fprintf(outf, "%s %s ", lngstr[reqstart_], timesprintf(od, lngstr[datefmt2_], dman->firsttime, UNSET)); fprintf(outf, "%s %s", lngstr[to_], timesprintf(od, lngstr[datefmt2_], dman->lasttime, UNSET)); t0 = (dman->lasttime - dman->firsttime) / 1440.0 + 0.005; t1 = (int)t0; t2 = (int)(100 * (t0 - (double)t1)); fprintf(outf, " (%d", t1); html_putch(outf, od->decpt); fprintf(outf, "%02d %s).\n", t2, lngstr[days_]); } } /* Finishing the top of the page */ void html_closehead(FILE *outf, Outchoices *od) { if (od->gotos == FEW) html_gotos(outf, od, -1); html_hrule(outf, od); } /* Starting the bottom of the page */ void html_pagebotstart(FILE *outf, Outchoices *od) { } /* The credit line at the bottom of the page */ void html_credit(FILE *outf, Outchoices *od) { fprintf(outf, "%s analog %s.\n", od->lngstr[credit_], ANALOGURL, VNUMBER); } /* The program run time */ void html_runtime(FILE *outf, Outchoices *od, long secs) { char **lngstr = od->lngstr; fprintf(outf, "
%s: ", lngstr[runtime_]); if (secs == 0) fprintf(outf, "%s %s.\n", lngstr[lessone_], lngstr[second_]); else if (secs < 60) fprintf(outf, "%ld %s.\n", secs, (secs == 1)?lngstr[second_]:lngstr[seconds_]); else fprintf(outf, "%ld %s, %ld %s.\n", secs / 60, (secs < 120)?lngstr[minute_]:lngstr[minutes_], secs % 60, (secs % 60 == 1)?lngstr[second_]:lngstr[seconds_]); } /* The page footer, including the user's FOOTERFILE */ void html_pagefoot(FILE *outf, Outchoices *od) { fputs("
\n", outf); if (od->gotos != FALSE) html_gotos(outf, od, -1); if (!strcaseeq(od->footerfile, "none")) html_includefile(outf, od, od->footerfile, 'f'); fputs("

\n", outf); fputs("imagedir, IN_HREF); fprintf(outf, "html2.%s\"\n", od->pngimages?"png":"gif"); /* Above: '.' not EXTSEP even on RISC OS */ fputs("alt=\"HTML 2.0 Conformant!\">\n", outf); } /* Footer material for this output style */ void html_stylefoot(FILE *outf, Outchoices *od) { fputs("\n\n", outf); } /* Report title */ void html_reporttitle(FILE *outf, Outchoices *od, choice rep) { extern char *anchorname[]; extern unsigned int *rep2lng; fprintf(outf, "

%s

\n", anchorname[rep], od->lngstr[rep2lng[rep]]); if (od->gotos == TRUE) html_gotos(outf, od, rep); } /* Report footer */ void html_reportfooter(FILE *outf, Outchoices *od, choice rep) { } /* Report description */ void html_reportdesc(FILE *outf, Outchoices *od, choice rep) { fprintf(outf, "

%s\n", od->descstr[rep]); } /* The time period spanned by the report */ void html_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind) { /* NB Can't combine next two lines because timesprintf uses static buffer. */ fprintf(outf, "

%s %s ", od->lngstr[repspan_], timesprintf(od, od->lngstr[datefmt2_], mind, UNSET)); fprintf(outf, "%s %s.\n", od->lngstr[to_], timesprintf(od, od->lngstr[datefmt2_], maxd, UNSET)); } /* General Summary header */ void html_gensumhead(FILE *outf, Outchoices *od) { } /* General Summary footer */ void html_gensumfoot(FILE *outf, Outchoices *od) { } /* Single General Summary line, long data */ void html_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage) { /* If this is the first Gen Sum line, and there is no seven-day data, then start a new paragraph. Otherwise the new paragraph has already been started in html_lastseven(). */ if (namecode == succreqs_ && x7 == (unsigned long)UNSET) fprintf(outf, "

%s%s ", od->lngstr[namecode], od->lngstr[colon_]); else fprintf(outf, "
%s%s ", od->lngstr[namecode], od->lngstr[colon_]); f3printf(outf, od, (double)x, 0, od->sepchar); if (x7 != (unsigned long)UNSET) { fputs(" (", outf); f3printf(outf, od, (double)x7, 0, od->sepchar); putc(')', outf); } putc('\n', outf); } /* Single General Summary line, bytes data */ void html_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage) { char **lngstr = od->lngstr; unsigned int bm; char *c; fprintf(outf, "
%s%s ", lngstr[namecode], lngstr[colon_]); bm = (od->rawbytes)?0:findbmult(x, od->bytesdp); printbytes(outf, od, x, bm, 0, od->sepchar); if (bm > 0) { c = strchr(lngstr[xbytes_], '?'); *c = '\0'; fprintf(outf, " %s%s%s", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1); *c = '?'; } else fprintf(outf, " %s", lngstr[bytes_]); if (x7 != UNSET) { fputs(" (", outf); bm = (od->rawbytes)?0:findbmult(x7, od->bytesdp); printbytes(outf, od, x7, bm, 0, od->sepchar); if (bm > 0) { c = strchr(lngstr[xbytes_], '?'); *c = '\0'; fprintf(outf, " %s%s%s)", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1); *c = '?'; } else fprintf(outf, " %s)", lngstr[bytes_]); } putc('\n', outf); } /* "Last seven" explanation line */ void html_lastseven(FILE *outf, Outchoices *od, timecode_t last7to) { fputs("

", outf); fprintf(outf, "(%s %s %s).\n", od->lngstr[brackets_], od->lngstr[sevendaysto_], timesprintf(od, od->lngstr[datefmt1_], last7to, UNSET)); } /* Start of a

 section */
void html_prestart(FILE *outf, Outchoices *od) {
  fputs("
", outf);
}

/* End of a 
 section */
void html_preend(FILE *outf, Outchoices *od) {
  fputs("
\n", outf); } /* A horizontal rule */ void html_hrule(FILE *outf, Outchoices *od) { fputs("
\n", outf); } /* An en dash */ char *html_endash(void) { return "-"; /* Should be – but not all browsers implement –, and when they do it's usually just a regular dash. */ } /* putc with special characters escaped */ void html_putch(FILE *outf, char c) { if (c == '<') fputs("<", outf); else if (c == '>') fputs(">", outf); else if (c == '&') fputs("&", outf); else if (c == '"') fputs(""", outf); else putc(c, outf); } /* strlen for HTML strings. Assume string contains no &'s except as markup. */ /* NB This may not work well for multibyte charsets, but it's hard to know whether an & is markup or just a byte of a multibyte character. Special cases for particular charsets are given below and selected in init.c. */ /* NOTE html_strlengthgth_utf8 and _jis in outhtml only. Other outputters just have _strlengthgth */ size_t html_strlength(const char *s) { const char *t; logical f; size_t i; for (t = s, f = TRUE, i = 0; *t != '\0'; t++) { if (*t == '&') f = FALSE; else if (*t == ';') f = TRUE; if (f) i++; } return(f?i:strlen(s)); /* If !f, something went wrong (eg multibyte). Maybe the & wasn't markup. */ } size_t html_strlength_utf8(const char *s) { /* This only knows about jp chars in the range 1110xxxx 10xxxxxx 10xxxxxx. Other languages using UTF-8 would need new code. */ const unsigned char *t; size_t i; for (i = 0, t = (const unsigned char *)s; *t != '\0'; t++) { if ((*t & 0xf0) == 0xe0 && (*(t + 1) & 0xc0) == 0x80 && (*(t + 2) & 0xc0) == 0x80) { t += 2; /* plus 1 in loop */ i += 2; /* three-character jp sequence = one jp char = length 2 wrt ASCII */ } else i++; } return(i); } size_t html_strlength_jis(const char *s) { size_t i; for (i = 0; *s != '\0'; s++) { if (*s == 0x1B && (*(s + 1) == '$' || *(s + 1) == '(') && *(s + 2) == 'B') s += 2; /* plus 1 in loop */ /* ignore ESC $ B and ESC ( B switches */ else i++; } return(i); /* returns length in bytes, because one jp char = two bytes and width of one jp char = width of two ASCII chars */ } /* Allow month in dates? DO NOT enable for human-readable text because of i18n problems. */ logical html_allowmonth(void) { return FALSE; } /* Calculate column widths */ void html_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany) { calcwidths(od, rep, width, bmult, bmult7, unit, maxr, maxr7, maxp, maxp7, maxb, maxb7, howmany); } /* "Each unit represents" line */ void html_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult) { char **lngstr = od->lngstr; char *s; fputs("

\n", outf); fprintf(outf, "%s (", lngstr[eachunit_]); if (ISLOWER(graphby)) fprintf(outf, "%c", od->markchar); else { fprintf(outf, "imagedir, IN_HREF); fprintf(outf, "bar%c1.%s\" alt=\"%c\">", od->barstyle, od->pngimages?"png":"gif", od->markchar); /* Above: '.' not EXTSEP even on RISC OS */ } fprintf(outf, ") %s ", lngstr[represents_]); if (graphby == 'R' || graphby == 'r') { f3printf(outf, od, unit, 0, od->sepchar); if (unit == 1.) fprintf(outf, " %s.", lngstr[request_]); else fprintf(outf, " %s %s.", lngstr[requests_], lngstr[partof_]); } else if (graphby == 'P' || graphby == 'p') { f3printf(outf, od, unit, 0, od->sepchar); if (unit == 1.) fprintf(outf, " %s.", lngstr[pagereq_]); else fprintf(outf, " %s %s.", lngstr[pagereqs_], lngstr[partof_]); } else { if (bmult > 0) { html_printdouble(outf, od, unit); s = strchr(lngstr[xbytes_], '?'); /* checked in initialisation */ *s = '\0'; fprintf(outf, " %s%s%s %s.", lngstr[xbytes_], lngstr[byteprefix_ + bmult], s + 1, lngstr[partof_]); *s = '?'; } else { f3printf(outf, od, unit, 0, od->sepchar); fprintf(outf, " %s %s.", lngstr[bytes_], lngstr[partof_]); } } putc('\n', outf); } /* Start of column header line */ void html_colheadstart(FILE *outf, Outchoices *od, choice rep) { } /* Column header line: individual column */ void html_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated) { if (unterminated) fputs(colname, outf); else fprintf(outf, "%*s: ", width + strlen(colname) - od->outputter->strlength(colname), colname); } /* End of column header line */ void html_colheadend(FILE *outf, Outchoices *od, choice rep) { putc('\n', outf); } /* Start of column header underlining line */ void html_colheadustart(FILE *outf, Outchoices *od, choice rep) { } /* Underlining of one column header. */ /* If column is terminated, set width and leave name blank; and conversely. */ void html_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name) { if (width > 0) { matchlengthn(outf, od, (size_t)width, '-'); fputs(": ", outf); } else matchlength(outf, od, name, '-'); } /* End of column header underlining line */ void html_colheaduend(FILE *outf, Outchoices *od, choice rep) { putc('\n', outf); } /* Start of a table row */ void html_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt) { } /* Print level in hierarchy represented by this row */ void html_levelcell(FILE *outf, Outchoices *od, choice rep, int level) { } /* Name column */ void html_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl) { extern char *workspace; choice savemultibyte; logical linked; int i; if (name1st != isfirst) return; if (isfirst) matchlengthn(outf, od, width - od->outputter->strlength(name), ' '); savemultibyte = od->multibyte; if (rep == REP_SIZE || rep == REP_PROCTIME) /* Kludge: for these two reports, we know the texts are things like "< 1" and we want to convert > and < */ od->multibyte = FALSE; strcpy(workspace, name); do_aliasx(workspace, aliashead); if (!isfirst) { if (rightalign) i = (int)width - (int)od->outputter->strlength(workspace) - (int)spaces; else i = (int)spaces; matchlengthn(outf, od, i, ' '); } linked = (linkhead != NULL && included(name, ispage, linkhead)); if (linked) { /* We link to the unaliased name, because the OUTPUTALIAS is usually in the nature of an annotation. */ fputs("", outf); } htmlputs(outf, od, workspace, source); if (linked) fputs("", outf); if (isfirst) fputs(": ", outf); od->multibyte = savemultibyte; /* restore multibyte */ } /* Single cell, unsigned long argument */ void html_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width) { f3printf(outf, od, (double)x, width, od->repsepchar); fputs(": ", outf); } /* Single cell, TRUSTED string argument */ void html_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width) { matchlengthn(outf, od, width - od->outputter->strlength(s), ' '); htmlputs(outf, od, s, TRUSTED); fputs(": ", outf); } /* Single cell, listing bytes */ void html_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width) { printbytes(outf, od, b, bmult, width, od->repsepchar); fputs(": ", outf); } /* Single cell, listing percentage */ void html_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width) { double pc; unsigned int pc1, pc2; matchlengthn(outf, od, width - 6, ' '); if (tot == 0) pc = 0.0; else pc = n * 10000.0 / tot; if (pc >= 9999.5) fputs(" 100%", outf); else if (pc < 0.5) fputs(" ", outf); else { pc1 = ((int)(pc + 0.5)) / 100; pc2 = ((int)(pc + 0.5)) % 100; fprintf(outf, "%2d", pc1); html_putch(outf, od->decpt); fprintf(outf, "%02d%%", pc2); } fputs(": ", outf); } /* Single cell, index */ void html_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width) { /* If index is 0 (i.e. sub-item), just print spaces */ if (index <= 0) matchlengthn(outf, od, width, ' '); else f3printf(outf, od, (double)index, width, od->repsepchar); fputs(": ", outf); } /* End of a table row */ void html_rowend(FILE *outf, Outchoices *od, choice rep) { putc('\n', outf); } /* Blank line in time reports */ void html_blankline(FILE *outf, Outchoices *od, choice *cols) { putc('\n', outf); } /* Barchart in time reports */ void html_barchart(FILE *outf, Outchoices *od, int y, char graphby) { int i, j; logical first = TRUE; if (ISLOWER(graphby)) { for (i = 0; i < y; i++) html_putch(outf, od->markchar); return; } for (j = 32; j >= 1; j /= 2) { while (y >= j) { fputs("imagedir, IN_HREF); fprintf(outf, "bar%c%d.%s\" alt=\"", od->barstyle, j, od->pngimages?"png":"gif"); /* '.' not EXTSEP even on RISC OS */ if (first) { for (i = 0; i < y; i++) html_putch(outf, od->markchar); first = FALSE; } fputs("\">", outf); y -= j; } } } /* "Busiest time period" line */ void html_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby) { extern unsigned int *rep2busystr; char **lngstr = od->lngstr; char sepchar = od->sepchar; unsigned int bmult; char *s; fprintf(outf, "%s %s (", lngstr[rep2busystr[rep]], datesprintf(od, datefmt, date, hr, min, newdate, newhr, newmin, TRUE, UNSET)); if (TOLOWER(graphby) == 'r') { f3printf(outf, od, (double)reqs, 0, sepchar); fprintf(outf, " %s).\n", (reqs == 1)?lngstr[request_]:lngstr[requests_]); } else if (TOLOWER(graphby) == 'p') { f3printf(outf, od, (double)pages, 0, sepchar); fprintf(outf, " %s).\n", (pages == 1)?lngstr[pagereq_]:lngstr[pagereqs_]); } else /* TOLOWER(graphby) == 'b' */ { if (od->rawbytes) bmult = 0; else bmult = findbmult(bys, od->bytesdp); printbytes(outf, od, bys, bmult, 0, sepchar); putc(' ', outf); if (bmult >= 1) { s = strchr(lngstr[xbytes_], '?'); /* checked in initialisation */ *s = '\0'; fprintf(outf, "%s%s%s).\n", lngstr[xbytes_], lngstr[byteprefix_ + bmult], s + 1); *s = '?'; } else fprintf(outf, "%s).\n", lngstr[bytes_]); } } /* End of "Not listed" line. */ void html_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn) { extern unsigned int *rep2lng, *rep2colhead; char **lngstr = od->lngstr; char *colhead = lngstr[rep2colhead[rep]]; char *colheadp = lngstr[rep2colhead[rep] + 1]; char gender = lngstr[rep2lng[rep] + 3][0]; char *notlistedstr; if (gender == 'm') notlistedstr = lngstr[notlistedm_]; else if (gender == 'f') notlistedstr = lngstr[notlistedf_]; else notlistedstr = lngstr[notlistedn_]; fprintf(outf, "[%s: ", notlistedstr); f3printf(outf, od, (double)badn, 0, od->sepchar); fprintf(outf, " %s]", (badn == 1)?colhead:colheadp); } /* The line declaring the floor and sort for a report */ void html_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman) { whatincluded(outf, od, rep, n, dman); } /* Spacing at the start of the whatincluded line */ void html_whatinchead(FILE *outf, Outchoices *od) { fputs("

\n", outf); } /* Finishing the whatincluded line */ void html_whatincfoot(FILE *outf, Outchoices *od) { putc('\n', outf); } /* Printing part of the whatincluded line */ void html_whatincprintstr(FILE *outf, Outchoices *od, char *s) { htmlputs(outf, od, s, TRUSTED); } /* Print a double to a nice number of decimal places */ void html_printdouble(FILE *outf, Outchoices *od, double x) { unsigned int prec; double d; /* first calculate how many decimal places we need */ for (prec = 0, d = x - (double)((int)(x)); d - (double)((int)(d + 0.000005)) > 0.00001; d *= 10) prec++; /* now print it */ if (prec > 0) { fprintf(outf, "%d", (int)x); html_putch(outf, od->decpt); fprintf(outf, "%0*d", prec, (int)(d + EPSILON)); } else fprintf(outf, "%d", (int)(x + EPSILON)); } /* Include a header file or footer file */ void html_includefile(FILE *outf, Outchoices *od, char *name, char type) { FILE *inf; char buffer[BLOCKSIZE]; size_t n; if ((inf = my_fopen(name, (type == 'h')?"header file":"footer file")) != NULL) { od->html = FALSE; html_hrule(outf, od); while ((n = fread(buffer, 1, BLOCKSIZE, inf))) /* single equals */ fwrite((void *)buffer, 1, n, outf); if (type == 'h') html_hrule(outf, od); (void)my_fclose(inf, name, (type == 'h')?"header file":"footer file"); } } /* Filetype for RISC OS */ unsigned int html_riscosfiletype(void) { return 0xfaf; } /* ======================================================================= */ /* Supporting functions for HTML */ /* Print "goto"s. Assume we've checked that we want gotos here. */ void html_gotos(FILE *outf, Outchoices *od, choice rep) { extern unsigned int *rep2lng; extern char *anchorname[]; choice *reporder = od->reporder; char **lngstr = od->lngstr; int i; fprintf(outf, "

(%s", lngstr[goto_]); fprintf(outf, "%s %s", lngstr[colon_], lngstr[top_]); for (i = 0; reporder[i] != -1; i++) { if (reporder[i] == rep) fprintf(outf, "%s %s", lngstr[colon_], lngstr[rep2lng[reporder[i]]]); else if (od->repq[reporder[i]]) fprintf(outf, "%s %s", lngstr[colon_], anchorname[reporder[i]], lngstr[rep2lng[reporder[i]]]); } fputs(")\n", outf); } /* Escape names for use in hyperlinks. As with htmlputs(), don't try and print character by character. */ void html_escfprintf(FILE *outf, char *name) { #ifdef EBCDIC extern unsigned char os_toascii[]; #endif char w1[64]; char *w = w1; int len = 0; for ( ; *name != '\0'; name++) { if (ISALNUM(*name) || *name == '/' || *name == '.' || *name == ':' || *name == '-' || *name == '~' || *name == '_' || *name == '?' || *name == '%' || *name == '=' || *name == '+' || *name == ';' || *name == '@' || *name == '$' || *name == ',') { /* All reserved and some unreserved chars from RFC 2396 Sec 2. */ /* Reserved chars are not escaped because if they are in the logfile they must have their special meanings (path delimiters etc.), and escaping them would change the semantics of the URL. */ PUTc(w, *name); len += 1; } else if (*name == '&') { PUTs(w, "&", 0); len += 5; } else { #ifdef EBCDIC sprintf(w, "%%%.2X", os_toascii[*name]); #else sprintf(w, "%%%.2X", (unsigned char)(*name)); #endif w += 3; len += 3; } if (len > 58) { *w = '\0'; fputs(w1, outf); w = w1; len = 0; } } *w = '\0'; fputs(w1, outf); } /* htmlputs(): print a string with an appropriate amount of HTML encoding. Much quicker than using html_putch(). */ /** What to convert has SECURITY IMPLICATIONS. An attacker must not be allowed ** to insert abitrary data in the output. ** ** So data is categorised according to its source, via an enum in anlghea3.h. ** In the following descriptions of the security levels, "convert" means ** converting e.g. < to < and "escape" means using \< to prevent this ** happening. "unprintable" means characters set as unprintable in init.c: ** note that this is only known unprintable characters 0x00 - 0x1F, 0x7F, ** and in ISO-8859-* also 0x80-0x9F. ** ** 1) AS_IS: Completely trusted string. Output as-is. ** 2) TRUSTED: E.g. a string from a language file. Also completely trusted. In ** single-byte mode, convert characters (for convenience not security), but ** allow any of the special characters to be escaped, even \< . ** In multibyte mode, output the string as-is. ** 3) FROM_CFG: An item read in from configuration. Unless we're in CGI mode, ** treat as case 2. In CGI mode, the input could have come from the form, ** so be more cautious to avoid cross-site scripting attacks. Specifically, ** convert all characters, allow only \& and \\ escapes, and use '?' in ** place of unprintable characters. ** 4) UNTRUSTED: E.g. data from the logfile. Do all conversions, don't allow ** any escapes, and use '?' in place of all unprintable characters. ** 5) IN_HREF: Special case for data from the config file which is being put ** inside an or . As 3), but use %nm in place of ** unprintable characters. (NB data from the logfile which is put inside ** an href uses escfprintf() instead of this function.) **/ void htmlputs(FILE *outf, Outchoices *od, char *s, choice source) { #ifdef EBCDIC extern unsigned char os_toascii[]; #endif extern logical cgi; extern logical unprintable[256]; char w1[64]; char *c; char *w = w1; int len = 0; if (source == FROM_CFG && !cgi) source = TRUSTED; if (source == TRUSTED && od->multibyte) source = AS_IS; if (source == AS_IS) { fputs(s, outf); return; } for (c = s; *c != '\0'; c++) { if (*c == '<') { PUTs(w, "<", 0); len += 4; } else if (*c == '>') { PUTs(w, ">", 0); len += 4; } else if (*c == '&') { PUTs(w, "&", 0); len += 5; } else if (*c == '"') { PUTs(w, """, 0); len += 6; } else if (*c == '\\' && /* escape these chars in these circumstances: */ ((source == TRUSTED && (*(c + 1) == '<' || *(c + 1) == '>' || *(c + 1) == '&' || *(c + 1) == '"' || *(c + 1) == '\\')) || (source == FROM_CFG && (*(c + 1) == '&' || *(c + 1) == '\\')))) { od->html = FALSE; PUTc(w, *(++c)); len += 1; } else if (unprintable[(unsigned char)(*c)] && source != TRUSTED) { /* unprintable chars */ if (source == IN_HREF) { #ifdef EBCDIC sprintf(w, "%%%.2X", os_toascii[*c]); #else sprintf(w, "%%%.2X", (unsigned char)(*c)); #endif w += 3; len += 3; } else { /* source == FROM_CFG or UNTRUSTED */ PUTc(w, '?'); len += 1; } } else { /* output non-special characters as-is */ PUTc(w, *c); len += 1; } if (len > 56) { *w = '\0'; fputs(w1, outf); w = w1; len = 0; } } *w = '\0'; fputs(w1, outf); } /* ======================================================================= */ /* Pie charts */ /* Shared by HTML and XHTML */ #ifndef NOGRAPHICS /* First some #defines and globals */ #define XSIZE (600) /* Size of whole graphic */ #define YSIZE (270) #define SHORTXSIZE (2 * (XCENTRE)) /* Size if no text on picture */ #define SHORTYSIZE (2 * (YCENTRE)) #define XCENTRE (125) /* Centre of pie */ #define YCENTRE (125) #define DIAMETER (200) /* Diameter of pie */ #define BORDER (4) /* Size of border */ #define BOXESLEFT (XCENTRE + DIAMETER / 2 + 25) /* The coloured boxes */ #define BOXESTOP (YCENTRE - DIAMETER / 2 + 16) #define BOXESSIZE (10) #define TEXTLEFT ((BOXESLEFT) + 2 * (BOXESSIZE)) /* The labels */ #define TEXTOFFSET (-1) #define TEXTGAP (16) /* Vertical period between successive boxes/labels */ #define CAPTIONLEFT (XCENTRE - DIAMETER / 2) /* Bottom caption */ #define CAPTIONTOP (YCENTRE + DIAMETER / 2 + 12) #define NO_COLOURS (10) /* Number of text strings, excluding "Other" */ #define MAXCHARS (54) /* Max length of a label, INCLUDING \0. */ #define TWOPI (6.283185) #define MINANGLE (0.01) /* Min fraction of circle we are prepared to plot */ #define PIE_EPSILON (0.0001) gdImagePtr im; gdFontPtr font; logical normalchart; int white, black, grey, lightgrey, colours[NO_COLOURS], col, boxesy; double totangle; FILE *piechart_init(char *filename) { FILE *pieoutf; int xsize, ysize, b1, b2; if ((pieoutf = FOPENWB(filename)) == NULL) { warn('F', TRUE, "Failed to open pie chart file %s for writing: " "ignoring it", filename); return(pieoutf); } debug('F', "Opening %s as pie chart file", filename); #ifdef RISCOS _swix(OS_File, _INR(0,2), 18, filename, 0xb60); /* set PNG filetype */ #endif xsize = normalchart?XSIZE:SHORTXSIZE; ysize = normalchart?YSIZE:SHORTYSIZE; im = gdImageCreate(xsize, ysize); /* The first colour allocated in a new image is the background colour. */ white = gdImageColorAllocate(im, 255, 255, 255); /* white */ black = gdImageColorAllocate(im, 0, 0, 0); /* black */ grey = gdImageColorAllocate(im, 128, 128, 128); /* grey */ lightgrey = gdImageColorAllocate(im, 217, 217, 217); /* light grey */ col = 0; /* Wedge colours. If these change, so must images/sq*. */ colours[col++] = gdImageColorAllocate(im, 255, 0, 0); /* red */ colours[col++] = gdImageColorAllocate(im, 0, 0, 255); /* mid blue */ colours[col++] = gdImageColorAllocate(im, 0, 128, 0); /* green */ colours[col++] = gdImageColorAllocate(im, 255, 128, 0); /* orange */ colours[col++] = gdImageColorAllocate(im, 0, 0, 128); /* navy blue */ colours[col++] = gdImageColorAllocate(im, 0, 255, 0); /* pale green */ colours[col++] = gdImageColorAllocate(im, 255, 128, 128); /* pink */ colours[col++] = gdImageColorAllocate(im, 0, 255, 255); /* cyan */ colours[col++] = gdImageColorAllocate(im, 128, 0, 128); /* purple */ colours[col++] = gdImageColorAllocate(im, 255, 255, 0); /* yellow */ col = 0; totangle = 0.75; /* starting at the top */ boxesy = BOXESTOP; b1 = xsize - 1 - BORDER; b2 = ysize - 1 - BORDER; /* Plot outline of pie, and border of image */ gdImageArc(im, XCENTRE, YCENTRE, DIAMETER + 2, DIAMETER + 2, 0, 360, black); gdImageRectangle(im, BORDER, BORDER, b1, b2, black); gdImageLine(im, xsize - 1, 0, b1, BORDER, black); gdImageLine(im, 0, ysize - 1, BORDER, b2, black); gdImageFill(im, 0, 0, lightgrey); gdImageFill(im, xsize - 1, ysize - 1, grey); gdImageLine(im, 0, 0, BORDER, BORDER, black); gdImageLine(im, xsize - 1, ysize - 1, b1, b2, black); return(pieoutf); } void findwedges(Wedge wedge[NO_COLOURS], choice rep, Hashindex *items, choice chartby, Strlist *expandlist, unsigned int level, Strlist *partname, unsigned long tot, double totb, double totb7) { /* Calculate which wedges we actually want, i.e. the ten with the biggest angles. But we also preserve the sort order of the "items" list. (Be careful between > and >= so as to use that order for breaking ties). Construction of name same as in printtree(). */ static double smallestangle; static int smallestwedge; char *name; double angle; Strlist *pn, s; size_t need = (size_t)level + 3; Hashindex *p; int i; if (level == 0) { /* not recursing: initialise wedges to 0 */ for (i = 0; i < NO_COLOURS; i++) { wedge[i].angle = 0.0; wedge[i].name = NULL; } smallestangle = 0.0; smallestwedge = NO_COLOURS - 1; } for (pn = partname; pn != NULL; TO_NEXT(pn)) need += strlen(pn->name); for (p = items; p != NULL; TO_NEXT(p)) { name = maketreename(partname, p, &pn, &s, need, rep, TRUE); if (incstrlist(name, expandlist) && p->other != NULL && ((Hashtable *)(p->other))->head[0] != NULL) /* then find wedges in lower level of tree instead. ->head[0] != NULL must come after p->other != NULL; o/wise it may not be a treerep */ findwedges(wedge, rep, ((Hashtable *)(p->other))->head[0], chartby, expandlist, level + 1, pn, tot, totb, totb7); else { if (chartby == BYTES) angle = p->own->bytes / totb; else if (chartby == BYTES7) angle = p->own->bytes7 / totb7; else angle = ((double)(p->own->data[chartby])) / ((double)tot); if (angle > smallestangle) {/* remove smallest, move along, put p last */ /* We probably don't do this very often so we don't bother with keeping hold of the memory and reusing it later. */ free(wedge[smallestwedge].name); for (i = smallestwedge; i < NO_COLOURS - 1; i++) { wedge[i].name = wedge[i + 1].name; wedge[i].angle = wedge[i + 1].angle; } COPYSTR(wedge[NO_COLOURS - 1].name, name); /* malloc's necessary space. Needed because next call to maketreename() will overwrite name. */ wedge[NO_COLOURS - 1].angle = angle; smallestangle = wedge[0].angle; /* Recalculate smallest */ smallestwedge = 0; for (i = 1; i < NO_COLOURS; i++) { if (wedge[i].angle <= smallestangle) { smallestangle = wedge[i].angle; smallestwedge = i; } } } } } } void piechart_caption(FILE *outf, choice rep, choice chartby, char **lngstr) { extern choice *rep2reqs, *rep2reqs7; extern unsigned int *method2sort; static char *caption = NULL; static size_t len = 0; choice requests = rep2reqs[G(rep)]; choice requests7 = rep2reqs7[G(rep)]; ENSURE_LEN(caption, len, strlen(lngstr[chartby_]) + strlen(lngstr[method2sort[requests]]) + strlen(lngstr[method2sort[requests7]]) + strlen(lngstr[method2sort[chartby]]) + 3); /* More than we need, but that's OK. */ strcpy(caption, lngstr[chartby_]); strcat(caption, " "); if (chartby == REQUESTS) strcat(caption, lngstr[method2sort[requests]]); else if (chartby == REQUESTS7) strcat(caption, lngstr[method2sort[requests7]]); else strcat(caption, lngstr[method2sort[chartby]]); strcat(caption, "."); if (normalchart) { #ifdef EBCDIC (void)strtoascii(caption); #endif gdImageString(im, font, CAPTIONLEFT, CAPTIONTOP, (unsigned char *)caption, black); } else fprintf(outf, "

%s

\n", caption); } int piechart_wedge(FILE *outf, Outchoices *od, double angle, char *s) { /* The angle is expressed between 0 and 1. Returns col if wedge was big enough to be coloured in, NO_COLOURS for grey, else -1. */ double x, y, newangle, medangle; int colour = black, rc = -1; char t[MAXCHARS]; size_t len; if (angle < 0) { angle = 1.75 - totangle; /* rest of the circle because started at 0.75 */ colour = grey; } else if (col >= NO_COLOURS) angle = 0; /* As a signal not to make a wedge. Can this happen? */ else if (angle >= MINANGLE) colour = colours[col]; if (angle >= MINANGLE || (colour == grey && angle > EPSILON)) { /* plot one edge of wedge */ x = (double)XCENTRE + (double)DIAMETER * cos(totangle * TWOPI) / 2. + PIE_EPSILON; y = (double)YCENTRE + (double)DIAMETER * sin(totangle * TWOPI) / 2. + PIE_EPSILON; gdImageLine(im, XCENTRE, YCENTRE, (int)x, (int)y, black); /* plot other edge of wedge */ newangle = totangle + angle; x = (double)XCENTRE + (double)DIAMETER * cos(newangle * TWOPI) / 2. + PIE_EPSILON; y = (double)YCENTRE + (double)DIAMETER * sin(newangle * TWOPI) / 2. + PIE_EPSILON; gdImageLine(im, XCENTRE, YCENTRE, (int)x, (int)y, black); /* Fill wedge */ medangle = totangle + angle / 2.; x = (double)XCENTRE + (double)DIAMETER * cos(medangle * TWOPI) / 2.5; y = (double)YCENTRE + (double)DIAMETER * sin(medangle * TWOPI) / 2.5; if (gdImageGetPixel(im, (int)x, (int)y) == white) { /* room to colour */ gdImageFill(im, (int)x, (int)y, colour); /* Make label for wedge. If !normalchart, this is done in piechart_key() below instead. (See long comment near bottom of piechart().) */ if (normalchart) { gdImageFilledRectangle(im, BOXESLEFT, boxesy, BOXESLEFT + BOXESSIZE, boxesy + BOXESSIZE, colour); if ((len = strlen(s)) <= MAXCHARS - 1) strcpy(t, s); else { strncpy(t, s, (MAXCHARS - 3) / 2); strcpy(t + (MAXCHARS - 3) / 2, "..."); strncpy(t + (MAXCHARS + 3) / 2, s + len - (MAXCHARS - 4) / 2, (MAXCHARS - 4) / 2); t[MAXCHARS - 1] = '\0'; } #ifdef EBCDIC strtoascii(t); #endif gdImageString(im, font, TEXTLEFT, boxesy + TEXTOFFSET, (unsigned char *)t, black); boxesy += TEXTGAP; } rc = (colour == grey)?NO_COLOURS:col; } /* end if (room to colour) */ totangle = newangle; col++; } return(rc); } void piechart_key(FILE *outf, Outchoices *od, int col, char *name, char *extension, Alias *aliashead) { extern char *workspace; /* Only called if !normalchart and wedge was included on chart */ if (od->outstyle == HTML) fputs("
outstyle == XHTML */ fputs("
imagedir, IN_HREF); if (col == NO_COLOURS) fprintf(outf, "sqg.%s", extension); else /* Above and below: '.' not EXTSEP even on RISC OS */ fprintf(outf, "sq%d.%s", col, extension); if (od->outstyle == HTML) fputs("\" alt=\"\"> ", outf); else /* od->outstyle == XHTML */ fputs("\" alt=\"\" /> ", outf); strcpy(workspace, name); do_aliasx(workspace, aliashead); htmlputs(outf, od, workspace, UNTRUSTED); fputs("\n", outf); } void piechart_write(FILE *pieoutf, char *filename, logical jpegcharts) { #ifdef HAVE_GD if (jpegcharts) gdImageJpeg(im, pieoutf, 100); else #endif gdImagePng(im, pieoutf); debug('F', "Closing %s", filename); fclose(pieoutf); gdImageDestroy(im); } void piechart_cleanup(Wedge wedge[NO_COLOURS]) { int i; /* free the wedge names allocated in findwedges() */ for (i = 0; i < NO_COLOURS; i++) free(wedge[i].name); } void piechart(FILE *outf, Outchoices *od, choice rep, Hashindex *items, choice requests, choice requests7, choice pages, choice pages7, unsigned long totr, unsigned long totr7, unsigned long totp, unsigned long totp7, double totb, double totb7) { extern unsigned int *rep2lng; extern char *repname[]; extern char *workspace; extern char *anchorname[]; static char *filename = NULL; char **lngstr = od->lngstr; choice chartby = od->chartby[G(rep)]; Strlist *expandlist = od->expandhead[G(rep)]; char gender = lngstr[rep2lng[rep] + 3][0]; char *extension = (od->jpegcharts)?"jpg":"png"; Wedge wedge[NO_COLOURS]; FILE *pieoutf; int key[NO_COLOURS], keyg; double largestangle; unsigned long tot = 1; char *otherstr; int i; /* Sort out what the chartby really means */ if (chartby == CHART_NONE) return; /* We didn't want a pie chart after all */ if (chartby == REQUESTS) { chartby = requests; tot = totr; } else if (chartby == REQUESTS7) { chartby = requests7; tot = totr7; } else if (chartby == PAGES) { chartby = pages; tot = totp; } else if (chartby == PAGES7) { chartby = pages7; tot = totp7; } if (tot == 0 || (chartby == BYTES && totb < 0.5) || (chartby == BYTES7 && totb7 < 0.5)) { warn('R', TRUE, "In %s, turning off empty pie chart", repname[rep]); return; } /* Calculate which wedges to include */ findwedges(wedge, rep, items, chartby, expandlist, 0, NULL, tot, totb, totb7); /* Check whether we still want a chart */ largestangle = wedge[0].angle; for (i = 1; i < NO_COLOURS; i++) largestangle = MAX(wedge[i].angle, largestangle); if (largestangle >= 1 - EPSILON) { warn('R', TRUE, "In %s, turning off pie chart of only one wedge", repname[rep]); return; } if (largestangle == 0.) { warn('R', TRUE, "In %s, turning off pie chart with no wedges", repname[rep]); return; } if (largestangle < MINANGLE) { warn('R', TRUE, "In %s, turning off pie chart because no wedge " "large enough", repname[rep]); return; } /* font and normalchart are the same for every chart, but calculating them here allows us to keep the variables only in this file */ normalchart = TRUE; if (strcaseeq(lngstr[charset_], "ISO-8859-2")) font = gdFontSmall; else { font = gdFontFixed; if (!strcaseeq(lngstr[charset_], "ISO-8859-1") && !strcaseeq(lngstr[charset_], "US-ASCII")) normalchart = FALSE; } if (filename == NULL) filename = (char *)xmalloc(strlen(od->localchartdir) + 13); /* max poss length = localchartdir + anchorname ( <= 8 ) + ".png\0" */ sprintf(filename, "%s%s%c%s", od->localchartdir, anchorname[rep], EXTSEP, extension); if ((pieoutf = piechart_init(filename)) == NULL) return; /* Warning message is given in piechart_init() */ /* Now we can finally get round to plotting the chart */ for (i = 0; i < NO_COLOURS; i++) { key[i] = -1; if (wedge[i].name != NULL) { strcpy(workspace, wedge[i].name); do_aliasx(workspace, od->aliashead[G(rep)]); key[i] = piechart_wedge(outf, od, wedge[i].angle, workspace); /* retain i -> colour mapping for calling piechart_key() below */ } } if (normalchart) piechart_caption(outf, rep, od->chartby[G(rep)], lngstr); /* Plot the catch-all wedge and close the file */ if (gender == 'm') otherstr = lngstr[otherm_]; else if (gender == 'f') otherstr = lngstr[otherf_]; else otherstr = lngstr[othern_]; keyg = piechart_wedge(outf, od, -1., otherstr); piechart_write(pieoutf, filename, od->jpegcharts); /* Now the text on the page. In CGI mode, this must be done _after_ the image is closed, or the browser may fail to find the image. This is why printing the caption and key must be done twice; above here if normalchart, below here otherwise. */ if (od->outstyle == HTML) fprintf(outf, "

\"\"\n", od->chartdir, anchorname[rep], extension); /* '.' not EXTSEP even on RISC OS */ else /* od->outstyle == XHTML */ fprintf(outf, "

\"\"

\n", od->chartdir, anchorname[rep], extension); if (!normalchart) { piechart_caption(outf, rep, od->chartby[G(rep)], lngstr); for (i = 0; i < NO_COLOURS; i++) { if (key[i] != -1) piechart_key(outf, od, key[i], wedge[i].name, extension, od->aliashead[G(rep)]); } if (keyg != -1) piechart_key(outf, od, keyg, otherstr, extension, NULL); } piechart_cleanup(wedge); } #endif /* NOGRAPHICS */ analog-6.0/src/outlatex.c0000644000175000017500000005407710161303542015546 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ /*** outlatex.c; LaTeX output ***/ #include "anlghea3.h" /* Supporting global variable for LaTeX */ char verbchar; /* Page width */ unsigned int latex_pagewidth(Outchoices *od) { return od->latexpagewidth; } /* The top of the output if we are in CGI mode */ void latex_cgihead(FILE *outf, Outchoices *od) { fprintf(outf, "Content-Type: text/plain\n\n"); } /* Stuff this output style needs in the page header */ void latex_stylehead(FILE *outf, Outchoices *od) { fputs("\\documentclass{article}\n", outf); if (!strcaseeq(od->lngstr[charset_], "US-ASCII")) { /* Charset US-ASCII or ISO-8859-[12] enforced in init.c */ fprintf(outf, "\\usepackage[latin%c]{inputenc}\n", od->lngstr[charset_][9]); fputs("\\usepackage[T1]{fontenc}\n", outf); } if (od->pdflatex) fputs("\\usepackage[pdftex]{color}\n", outf); else fputs("\\usepackage[dvips]{color}\n", outf); fputs("\\definecolor{barcolour}{rgb}{0.75,0.2,0.2}\n", outf); fputs("\\newsavebox{\\ttchar}\n", outf); fputs("\\sbox{\\ttchar}{\\mbox{\\tt -}}\n", outf); fputs("\\newlength{\\ttwidth}\n", outf); fputs("\\setlength{\\ttwidth}{\\wd\\ttchar}\n", outf); fputs("\\newcommand{\\barchart}[1]{{\\tt\\color{barcolour}\\rule[0.2ex]{#1\\ttwidth}{0.5ex}}}\n", outf); fputs("\\makeatletter\n", outf); fputs("\\def\\@maketitle{\\begin{center}{\\Large\\bf\\@title}\\end{center}}\n", outf); fputs("\\makeatother\n", outf); fputs("\\pagestyle{empty}\n", outf); fputs("\\setlength{\\parindent}{0pt}\n\n", outf); fputs("\\begin{document}\n", outf); } /* The title of the page, plus the user's HEADERFILE */ void latex_pagetitle(FILE *outf, Outchoices *od) { fprintf(outf, "\\title{%s ", od->lngstr[webstatsfor_]); latexputs(outf, od->hostname); fputs("}\n\\maketitle\\thispagestyle{empty}\n", outf); if (!strcaseeq(od->headerfile, "none")) latex_includefile(outf, od, od->headerfile, 'h'); } /* Program start time, and logfile start and end times */ void latex_timings(FILE *outf, Outchoices *od, Dateman *dman) { extern timecode_t starttimec; char **lngstr = od->lngstr; double t0; int t1, t2; if (od->runtime) fprintf(outf, "%s %s.\n\n", lngstr[progstart_], timesprintf(od, lngstr[datefmt2_], starttimec, UNSET)); if (dman->firsttime <= dman->lasttime) { fprintf(outf, "%s %s ", lngstr[reqstart_], timesprintf(od, lngstr[datefmt2_], dman->firsttime, UNSET)); fprintf(outf, "%s %s", lngstr[to_], timesprintf(od, lngstr[datefmt2_], dman->lasttime, UNSET)); t0 = (dman->lasttime - dman->firsttime) / 1440.0 + 0.005; t1 = (int)t0; t2 = (int)(100 * (t0 - (double)t1)); fprintf(outf, " (%d", t1); latex_putch(outf, od->decpt); fprintf(outf, "%02d %s).\n", t2, lngstr[days_]); } } /* Finishing the top of the page */ void latex_closehead(FILE *outf, Outchoices *od) { latex_hrule(outf, od); } /* Starting the bottom of the page */ void latex_pagebotstart(FILE *outf, Outchoices *od) { } /* The credit line at the bottom of the page */ void latex_credit(FILE *outf, Outchoices *od) { fprintf(outf, "\\smallskip\n%s analog %s.\n", od->lngstr[credit_], VNUMBER); } /* The program run time */ void latex_runtime(FILE *outf, Outchoices *od, long secs) { char **lngstr = od->lngstr; fprintf(outf, "\n{\\bf %s:} ", lngstr[runtime_]); if (secs == 0) fprintf(outf, "%s %s.\n", lngstr[lessone_], lngstr[second_]); else if (secs < 60) fprintf(outf, "%ld %s.\n", secs, (secs == 1)?lngstr[second_]:lngstr[seconds_]); else fprintf(outf, "%ld %s, %ld %s.\n", secs / 60, (secs < 120)?lngstr[minute_]:lngstr[minutes_], secs % 60, (secs % 60 == 1)?lngstr[second_]:lngstr[seconds_]); } /* The page footer, including the user's FOOTERFILE */ void latex_pagefoot(FILE *outf, Outchoices *od) { if (!strcaseeq(od->footerfile, "none")) latex_includefile(outf, od, od->footerfile, 'f'); } /* Footer material for this output style */ void latex_stylefoot(FILE *outf, Outchoices *od) { fputs("\\end{document}\n", outf); } /* Report title */ void latex_reporttitle(FILE *outf, Outchoices *od, choice rep) { extern unsigned int *rep2lng; fprintf(outf, "\\section*{%s}\n", od->lngstr[rep2lng[rep]]); } /* Report footer */ void latex_reportfooter(FILE *outf, Outchoices *od, choice rep) { } /* Report description */ void latex_reportdesc(FILE *outf, Outchoices *od, choice rep) { fprintf(outf, "{\\em %s}\n\n", od->descstr[rep]); if (rep != REP_SIZE && rep != REP_PROCTIME) fprintf(outf, "\\smallskip\n"); /* These two reports probably have no further header text. If this is wrong, it's corrected in latex_reportspan() later. */ } /* The time period spanned by the report */ void latex_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind) { if ((rep == REP_SIZE || rep == REP_PROCTIME) && od->descriptions && od->descstr[rep] != NULL) fputs("\\smallskip\n", outf); /* We were wrong when we assumed in latex_reportdesc() that these reports had no further header text. So correct for it now. */ /* NB Can't combine next two lines because timesprintf uses static buffer. */ fprintf(outf, "{\\em %s %s ", od->lngstr[repspan_], timesprintf(od, od->lngstr[datefmt2_], mind, UNSET)); fprintf(outf, "%s %s.}\n\n", od->lngstr[to_], timesprintf(od, od->lngstr[datefmt2_], maxd, UNSET)); if (rep != REP_SIZE && rep != REP_PROCTIME) fprintf(outf, "\\smallskip\n"); /* This time these reports really do have no further header text. */ } /* General Summary header */ void latex_gensumhead(FILE *outf, Outchoices *od) { fputs("\\begin{obeylines}\n", outf); } /* General Summary footer */ void latex_gensumfoot(FILE *outf, Outchoices *od) { fputs("\\end{obeylines}\n", outf); } /* Single General Summary line, long data */ void latex_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage) { fprintf(outf, "{\\bf %s%s} ", od->lngstr[namecode], od->lngstr[colon_]); f3printf(outf, od, (double)x, 0, od->sepchar); if (x7 != (unsigned long)UNSET) { fputs(" (", outf); f3printf(outf, od, (double)x7, 0, od->sepchar); putc(')', outf); } putc('\n', outf); } /* Single General Summary line, bytes data */ void latex_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage) { char **lngstr = od->lngstr; unsigned int bm; char *c; fprintf(outf, "{\\bf %s%s} ", lngstr[namecode], lngstr[colon_]); bm = (od->rawbytes)?0:findbmult(x, od->bytesdp); printbytes(outf, od, x, bm, 0, od->sepchar); if (bm > 0) { c = strchr(lngstr[xbytes_], '?'); *c = '\0'; fprintf(outf, " %s%s%s", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1); *c = '?'; } else fprintf(outf, " %s", lngstr[bytes_]); if (x7 != UNSET) { fputs(" (", outf); bm = (od->rawbytes)?0:findbmult(x7, od->bytesdp); printbytes(outf, od, x7, bm, 0, od->sepchar); if (bm > 0) { c = strchr(lngstr[xbytes_], '?'); *c = '\0'; fprintf(outf, " %s%s%s)", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1); *c = '?'; } else fprintf(outf, " %s)", lngstr[bytes_]); } putc('\n', outf); } /* "Last seven" explanation line */ void latex_lastseven(FILE *outf, Outchoices *od, timecode_t last7to) { fprintf(outf, "(%s %s %s).\n", od->lngstr[brackets_], od->lngstr[sevendaysto_], timesprintf(od, od->lngstr[datefmt1_], last7to, UNSET)); } /* Start of a
 section */
void latex_prestart(FILE *outf, Outchoices *od) {
  fputs("\\smallskip\n\\begin{obeylines}\n", outf);
}

/* End of a 
 section */
void latex_preend(FILE *outf, Outchoices *od) {
  fputs("\\end{obeylines}\n", outf);
}

/* A horizontal rule */
void latex_hrule(FILE *outf, Outchoices *od) {
  fputs("\\medskip\\hrule\n", outf);
}

/* An en dash */
char *latex_endash(void) {
  return "--";
}

/* putc with special characters escaped */
void latex_putch(FILE *outf, char c) {
  if (c == '&' || c == '$' || c == '%' || c == '&' || c == '#' || c == '_')
    fprintf(outf, "\\%c", c);
  else if (c == '|')
    fputs("$|$", outf);
  else if (c == '\\')
    fputs("$\\backslash$", outf);
  else if (c == '{' || c == '}')
    fprintf(outf, "$\\%c$", c);
  else if (c == '^' || c == '~')
    fprintf(outf, "\\%c{}", c);
  else
    putc(c, outf);
}

/* strlen */
size_t latex_strlength(const char *s) {
  return strlen(s);
}

/* Allow month in dates? DO NOT enable for human-readable text because of
   i18n problems. */
logical latex_allowmonth(void) {
  return FALSE;
}

/* Calculate column widths */
void latex_calcwidths(Outchoices *od, choice rep, unsigned int width[],
		      unsigned int *bmult, unsigned int *bmult7, double *unit,
		      unsigned long maxr, unsigned long maxr7,
		      unsigned long maxp, unsigned long maxp7, double maxb,
		      double maxb7, unsigned long howmany) {
  calcwidths(od, rep, width, bmult, bmult7, unit, maxr, maxr7, maxp, maxp7,
	     maxb, maxb7, howmany);
}

/* "Each unit represents" line */
void latex_declareunit(FILE *outf, Outchoices *od, char graphby, double unit,
		       unsigned int bmult) {
  char **lngstr = od->lngstr;

  char *s;

  fprintf(outf, "%s (", lngstr[eachunit_]);
  if (ISLOWER(graphby)) {
    if (od->markchar == '|')
      fprintf(outf, "\\verb+%c+", od->markchar);
    else
      fprintf(outf, "\\verb|%c|", od->markchar);
  }
  else
    fprintf(outf, "\\barchart{1}");
  fprintf(outf, ") %s ", lngstr[represents_]);

  if (graphby == 'R' || graphby == 'r') {
    f3printf(outf, od, unit, 0, od->sepchar);
    if (unit == 1.)
      fprintf(outf, " %s.", lngstr[request_]);
    else
      fprintf(outf, " %s %s.", lngstr[requests_], lngstr[partof_]);
  }
  else if (graphby == 'P' || graphby == 'p') {
    f3printf(outf, od, unit, 0, od->sepchar);
    if (unit == 1.)
      fprintf(outf, " %s.", lngstr[pagereq_]);
    else
      fprintf(outf, " %s %s.", lngstr[pagereqs_], lngstr[partof_]);
  }
  else {
    if (bmult > 0) {
      latex_printdouble(outf, od, unit);
      s = strchr(lngstr[xbytes_], '?');  /* checked in initialisation */
      *s = '\0';
      fprintf(outf, " %s%s%s %s.", lngstr[xbytes_],
	      lngstr[byteprefix_ + bmult], s + 1, lngstr[partof_]);
      *s = '?';
    }
    else {
      f3printf(outf, od, unit, 0, od->sepchar);
      fprintf(outf, " %s %s.", lngstr[bytes_], lngstr[partof_]);
    }
  }
  putc('\n', outf);
}

/* Start of column header line */
void latex_colheadstart(FILE *outf, Outchoices *od, choice rep) {
  verbchar = '|';  /* assume this never occurs in a column heading */
  /* Note no multibyte problem with this assignment of verbchar because
     LATEX output doesn't work in multibyte anyway. */
  fprintf(outf, "\\verb%c", verbchar);
}

/* Column header line: individual column */
void latex_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col,
		      unsigned int width, char *colname,
		      logical unterminated) {
  if (unterminated)
    fputs(colname, outf);
  else
    fprintf(outf, "%*s: ", width, colname);
}

/* End of column header line */
void latex_colheadend(FILE *outf, Outchoices *od, choice rep) {
  /* verbchar was set in latex_colheadstart */
  fprintf(outf, "%c\n", verbchar);
}

/* Start of column header underlining line */
void latex_colheadustart(FILE *outf, Outchoices *od, choice rep) {
  /* verbchar was set in latex_colheadstart */
  fprintf(outf, "\\verb%c", verbchar);
}

/* Underlining of one column header. */
/* If column is terminated, set width and leave name blank; and conversely. */
void latex_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col,
			    unsigned int width, char *name) {
  if (width > 0) {
    matchlengthn(outf, od, (size_t)width, '-');
    fputs(": ", outf);
  }
  else
    matchlength(outf, od, name, '-');
}

/* End of column header underlining line */
void latex_colheaduend(FILE *outf, Outchoices *od, choice rep) {
  /* verbchar was set in latex_colheadstart */
  fprintf(outf, "%c\n", verbchar);
}

/* Start of a table row */
void latex_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols,
		    int level, char *name, char *datefmt, char *timefmt) {
  /* Choice of a verbchar: can't be number, letter, colon, space, percent
     (LaTeX special characters are OK though); or the markchar, the decpt,
     or any character in a compiled date or in the name. Also we try only to
     use ASCII printable characters (32-127) for legible LaTeX code. That
     leaves the following choices, in order of preference. We return the
     verbchar at the end for the cases in which calling functions need to
     terminate the \verb */
  char *verbchars = "|+/!^#-=?_\\~'$\"()<>[]{}.,&;";
  char lastditch[] = {(char)(0xF7)};   /* the division sign in ISO-8859-[12] */
  
  for ( ;
       (*verbchars == od->markchar || *verbchars == od->decpt ||
	(name != NULL && strchr(name, *verbchars) != NULL) ||
	(datefmt != NULL && strchr(datefmt, *verbchars) != NULL) ||
	(timefmt != NULL && strchr(timefmt, *verbchars) != NULL))
	 && *verbchars != '\0';
       verbchars++)
    ;  /* Run to suitable verbchar */
  if (*verbchars == '\0')   /* no suitable char: last guess */
    verbchars = lastditch;
  verbchar = *verbchars;
  fprintf(outf, "\\verb%c", verbchar);

  /* Set the putc to plain_putch temporarily, because we are now in \verb. */
  od->outputter->putch = &plain_putch;
  od->outputter->endash = &plain_endash;
}

/* Print level in hierarchy represented by this row */
void latex_levelcell(FILE *outf, Outchoices *od, choice rep, int level) {
}

/* Name column */
void latex_namecell(FILE *outf, Outchoices *od, choice rep, char *name,
		    choice source, unsigned int width, logical name1st,
		    logical isfirst, logical rightalign, Alias *aliashead,
		    Include *linkhead, logical ispage, unsigned int spaces,
		    char *baseurl) {
  extern char *workspace;

  int i;

  if (name1st != isfirst)
    return;

  if (isfirst)
    matchlengthn(outf, od, width - strlen(name), ' ');
  /* plain strlen because in \verb */

  strcpy(workspace, name);
  do_aliasx(workspace, aliashead);

  if (!isfirst) {
    if (rightalign)
      i = (int)width - (int)strlen(workspace) - (int)spaces;
    else
      i = (int)spaces;
    matchlengthn(outf, od, i, ' ');
  }

  fputs(workspace, outf);   /* and plain puts because in \verb */

  if (isfirst)
    fputs(": ", outf);
}

/* Single cell, unsigned long argument */
void latex_ulcell(FILE *outf, Outchoices *od, choice rep, choice col,
		  unsigned long x, unsigned int width) {
  f3printf(outf, od, (double)x, width, od->repsepchar);
  fputs(": ", outf);
}

/* Single cell, TRUSTED string argument */
void latex_strcell(FILE *outf, Outchoices *od, choice rep, choice col,
		   char *s, unsigned int width) {
  matchlengthn(outf, od, width - strlen(s), ' ');  /* plain strlen: in \verb */
  fputs(s, outf);
  fputs(": ", outf);
}

/* Single cell, listing bytes */
void latex_bytescell(FILE *outf, Outchoices *od, choice rep, choice col,
		     double b, double bmult, unsigned int width) {
  printbytes(outf, od, b, bmult, width, od->repsepchar);
  fputs(": ", outf);
}

/* Single cell, listing percentage */
void latex_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n,
		  double tot, unsigned int width) {
  double pc;
  unsigned int pc1, pc2;

  matchlengthn(outf, od, width - 6, ' ');
  if (tot == 0)
    pc = 0.0;
  else
    pc = n * 10000.0 / tot;
  if (pc >= 9999.5)
    fputs("  100%", outf);
  else if (pc < 0.5)
    fputs("      ", outf);
  else {
    pc1 = ((int)(pc + 0.5)) / 100;
    pc2 = ((int)(pc + 0.5)) % 100;
    fprintf(outf, "%2d", pc1);
    putc(od->decpt, outf);       /* plain putc, because we are in \verb */
    fprintf(outf, "%02d%%", pc2);
  }
  fputs(": ", outf);
}

/* Single cell, index */
void latex_indexcell(FILE *outf, Outchoices *od, choice rep, choice col,
		    long index, unsigned int width) {
  /* If index is 0 (i.e. sub-item), just print spaces */
  if (index <= 0)
    matchlengthn(outf, od, width, ' ');
  else
    f3printf(outf, od, (double)index, width, od->repsepchar);
  fputs(": ", outf);
}

/* End of a table row */
void latex_rowend(FILE *outf, Outchoices *od, choice rep) {
  if (rep >= DATEREP_NUMBER || ISLOWER(od->graph[rep]))
    /* if timerep and u.c. graphby, closed \verb earlier */
    putc(verbchar, outf);
  putc('\n', outf);

  /* Undo temporary allocation of putc in _rowstart */
  od->outputter->putch = &latex_putch;
  od->outputter->endash = &latex_endash;
}

/* Blank line in time reports */
void latex_blankline(FILE *outf, Outchoices *od, choice *cols) {
  fputs("\\verb||\n", outf);
}

/* Barchart in time reports */
void latex_barchart(FILE *outf, Outchoices *od, int y, char graphby) {
  int i;

  if (ISLOWER(graphby)) {
    for (i = 0; i < y; i++)
      putc(od->markchar, outf);  /* plain putc, because we are in \verb */
  }
  else {
    putc(verbchar, outf);
    od->outputter->putch = &latex_putch;  /* now out of verb */
    od->outputter->endash = &latex_endash;
    fprintf(outf, "\\barchart{%d}", y);
  }
}

/* "Busiest time period" line */
void latex_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt,
		      unsigned long reqs, unsigned long pages, double bys,
		      datecode_t date, unsigned int hr, unsigned int min,
		      datecode_t newdate, unsigned int newhr,
		      unsigned int newmin, char graphby) {
  extern unsigned int *rep2busystr;

  char **lngstr = od->lngstr;
  char sepchar = od->sepchar;

  unsigned int bmult;
  char *s;

  fprintf(outf, "%s %s (", lngstr[rep2busystr[rep]],
	  datesprintf(od, datefmt, date, hr, min, newdate, newhr, newmin,
		      TRUE, UNSET));
  if (TOLOWER(graphby) == 'r') {
    f3printf(outf, od, (double)reqs, 0, sepchar);
    fprintf(outf, " %s).\n", (reqs == 1)?lngstr[request_]:lngstr[requests_]);
  }
  else if (TOLOWER(graphby) == 'p') {
    f3printf(outf, od, (double)pages, 0, sepchar);
    fprintf(outf, " %s).\n",
	    (pages == 1)?lngstr[pagereq_]:lngstr[pagereqs_]);
  }
  else /* TOLOWER(graphby) == 'b' */ {
    if (od->rawbytes)
      bmult = 0;
    else
      bmult = findbmult(bys, od->bytesdp);
    printbytes(outf, od, bys, bmult, 0, sepchar);
    putc(' ', outf);
    if (bmult >= 1) {
      s = strchr(lngstr[xbytes_], '?');  /* checked in initialisation */
      *s = '\0';
      fprintf(outf, "%s%s%s).\n", lngstr[xbytes_],
	      lngstr[byteprefix_ + bmult], s + 1);
      *s = '?';
    }
    else
      fprintf(outf, "%s).\n", lngstr[bytes_]);
  }
}

/* End of "Not listed" line. */
void latex_notlistedstr(FILE *outf, Outchoices *od, choice rep,
			unsigned long badn) {
  extern unsigned int *rep2lng, *rep2colhead;

  char **lngstr = od->lngstr;
  char *colhead = lngstr[rep2colhead[rep]];
  char *colheadp = lngstr[rep2colhead[rep] + 1];
  char gender = lngstr[rep2lng[rep] + 3][0];

  char *notlistedstr;

  if (gender == 'm')
    notlistedstr = lngstr[notlistedm_];
  else if (gender == 'f')
    notlistedstr = lngstr[notlistedf_];
  else
    notlistedstr = lngstr[notlistedn_];

  fprintf(outf, "[%s: ", notlistedstr);
  f3printf(outf, od, (double)badn, 0, od->sepchar);
  fprintf(outf, " %s]%c", (badn == 1)?colhead:colheadp, verbchar);
}

/* The line declaring the floor and sort for a report */
void latex_whatincluded(FILE *outf, Outchoices *od, choice rep,
			unsigned long n, Dateman *dman) {
  whatincluded(outf, od, rep, n, dman);
}

/* Spacing at the start of the whatincluded line */
void latex_whatinchead(FILE *outf, Outchoices *od) {
}

/* Finishing the whatincluded line */
void latex_whatincfoot(FILE *outf, Outchoices *od) {
  putc('\n', outf);
}

/* Printing part of the whatincluded line */
void latex_whatincprintstr(FILE *outf, Outchoices *od, char *s) {
  latexputs(outf, s);
}

/* Print a double to a nice number of decimal places */
void latex_printdouble(FILE *outf, Outchoices *od, double x) {
  unsigned int prec;
  double d;

  /* first calculate how many decimal places we need */

  for (prec = 0, d = x - (double)((int)(x));
       d - (double)((int)(d + 0.000005)) > 0.00001; d *= 10)
    prec++;

  /* now print it */

  if (prec > 0) {
    fprintf(outf, "%d", (int)x);
    latex_putch(outf, od->decpt);
    fprintf(outf, "%0*d", prec, (int)(d + EPSILON));
  }
  else
    fprintf(outf, "%d", (int)(x + EPSILON));
}

/* Include a header file or footer file */
void latex_includefile(FILE *outf, Outchoices *od, char *name, char type) {
  FILE *inf;
  char buffer[BLOCKSIZE];
  size_t n;

  if ((inf = my_fopen(name, (type == 'h')?"header file":"footer file")) !=
      NULL) {
    if (type == 'f') {
      latex_hrule(outf, od);
      fputs("\\smallskip\n", outf);
    }
    while ((n = fread(buffer, 1, BLOCKSIZE, inf)))  /* single equals */
      fwrite((void *)buffer, 1, n, outf);
    if (type == 'h') {
      latex_hrule(outf, od);
      fputs("\\smallskip\n", outf);
    }
    (void)my_fclose(inf, name, (type == 'h')?"header file":"footer file");
  }
}

/* Filetype for RISC OS */
unsigned int latex_riscosfiletype(void) {
  return 0xaca;
}

/* ======================================================================= */
/* Supporting functions for LaTeX */

void latexputs(FILE *outf, char *s) {
  char w1[64];
  char *c;
  char *w = w1;
  int len = 0;

  for (c = s; *c != '\0'; c++) {
    if (*c == '&' || *c == '$' || *c == '%' || *c == '&' || *c == '#' ||
	*c == '_') {
      PUTc(w, '\\');
      PUTc(w, *c);
      len += 2;
    }
    else if (*c == '|') {
      PUTs(w, "$|$", 0);
      len += 3;
    }
    else if (*c == '\\') {
      PUTs(w, "$\\backslash$", 0);
      len += 12;
    }
    else if (*c == '{' || *c == '}') {
      PUTs(w, "$\\", 0);
      PUTc(w, *c);
      PUTc(w, '$');
      len += 4;
    }
    else if (*c == '^' || *c == '~') {
      PUTc(w, '\\');
      PUTc(w, *c);
      PUTs(w, "{}", 0);
      len += 4;
    }
    else {
      PUTc(w, *c);
      len += 1;
    }
    if (len > 50) {
      *w = '\0';
      fputs(w1, outf);
      w = w1;
      len = 0;
    }
  }
  *w = '\0';
  fputs(w1, outf);
}
analog-6.0/src/outplain.c0000644000175000017500000004334010161303543015524 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** outplain.c; plain text output ***/

#include "anlghea3.h"

/* Page width */
unsigned int plain_pagewidth(Outchoices *od) {
  return od->plainpagewidth;
}

/* The top of the output if we are in CGI mode */
void plain_cgihead(FILE *outf, Outchoices *od) {
  fprintf(outf, "Content-Type: text/plain\n\n");
}

/* Stuff this output style needs in the page header */
void plain_stylehead(FILE *outf, Outchoices *od) {
}

/* The title of the page, plus the user's HEADERFILE */
void plain_pagetitle(FILE *outf, Outchoices *od) {
  fprintf(outf, "%s %s\n", od->lngstr[webstatsfor_], od->hostname);
  matchlength(outf, od, od->hostname, '=');
  matchlength(outf, od, od->lngstr[webstatsfor_], '=');
  fputs("=\n\n", outf);

  if (!strcaseeq(od->headerfile, "none"))
    plain_includefile(outf, od, od->headerfile, 'h');
}

/* Program start time, and logfile start and end times */
void plain_timings(FILE *outf, Outchoices *od, Dateman *dman) {
  extern timecode_t starttimec;

  char **lngstr = od->lngstr;

  double t0;
  int t1, t2;

  if (od->runtime)
    fprintf(outf, "%s %s.\n", lngstr[progstart_],
	    timesprintf(od, lngstr[datefmt2_], starttimec, UNSET));

  if (dman->firsttime <= dman->lasttime) {
    mprintf(outf, od->plainpagewidth, "%s %s ", lngstr[reqstart_],
	    timesprintf(od, lngstr[datefmt2_], dman->firsttime, UNSET));
    mprintf(outf, od->plainpagewidth, "%s %s", lngstr[to_],
	    timesprintf(od, lngstr[datefmt2_], dman->lasttime, UNSET));
    t0 = (dman->lasttime - dman->firsttime) / 1440.0 + 0.005;
    t1 = (int)t0;
    t2 = (int)(100 * (t0 - (double)t1));
    mprintf(outf, od->plainpagewidth, " (%d", t1);
    putc(od->decpt, outf);
    mprintf(outf, od->plainpagewidth, "%02d %s).", t2, od->lngstr[days_]);
    mprintf(outf, 0, NULL);
  }
}

/* Finishing the top of the page */
void plain_closehead(FILE *outf, Outchoices *od) {
  plain_hrule(outf, od);
}

/* Starting the bottom of the page */
void plain_pagebotstart(FILE *outf, Outchoices *od) {
}

/* The credit line at the bottom of the page */
void plain_credit(FILE *outf, Outchoices *od) {
  fprintf(outf, "%s analog %s.\n", od->lngstr[credit_], VNUMBER);
}

/* The program run time */
void plain_runtime(FILE *outf, Outchoices *od, long secs) {
  char **lngstr = od->lngstr;

  fprintf(outf, "%s: ", lngstr[runtime_]);

  if (secs == 0)
    fprintf(outf, "%s %s.\n", lngstr[lessone_], lngstr[second_]);
  else if (secs < 60)
    fprintf(outf, "%ld %s.\n", secs, 
	    (secs == 1)?lngstr[second_]:lngstr[seconds_]);
  else
    fprintf(outf, "%ld %s, %ld %s.\n", secs / 60,
	    (secs < 120)?lngstr[minute_]:lngstr[minutes_], secs % 60,
	    (secs % 60 == 1)?lngstr[second_]:lngstr[seconds_]);
}

/* The page footer, including the user's FOOTERFILE */
void plain_pagefoot(FILE *outf, Outchoices *od) {
  if (!strcaseeq(od->footerfile, "none"))
    plain_includefile(outf, od, od->footerfile, 'f');
}

/* Footer material for this output style */
void plain_stylefoot(FILE *outf, Outchoices *od) {
}

/* Report title */
void plain_reporttitle(FILE *outf, Outchoices *od, choice rep) {
  extern unsigned int *rep2lng;

  fprintf(outf, "%s\n", od->lngstr[rep2lng[rep]]);
  matchlength(outf, od, od->lngstr[rep2lng[rep]], '-');
  putc('\n', outf);
}

/* Report footer */
void plain_reportfooter(FILE *outf, Outchoices *od, choice rep) {
}

/* Report description */
void plain_reportdesc(FILE *outf, Outchoices *od, choice rep) {
  mprintf(outf, od->plainpagewidth, "%s", od->descstr[rep]);
  mprintf(outf, 0, NULL);
  if (rep != REP_SIZE && rep != REP_PROCTIME)
    putc('\n', outf);
  /* These two reports probably have no further header text.
      If this is wrong, it's corrected in plain_reportspan() later. */
}

/* The time period spanned by the report */
void plain_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd,
		      timecode_t mind) {
  if ((rep == REP_SIZE || rep == REP_PROCTIME) && od->descriptions &&
      od->descstr[rep] != NULL)
    putc('\n', outf);
  /* We were wrong when we assumed in plain_reportdesc() that these reports
     had no further header text. So correct for it now. */

  /* NB Can't combine next two lines because timesprintf uses static buffer. */
  mprintf(outf, od->plainpagewidth, "%s %s ", od->lngstr[repspan_],
	  timesprintf(od, od->lngstr[datefmt2_], mind, UNSET));
  mprintf(outf, od->plainpagewidth, "%s %s.", od->lngstr[to_],
	  timesprintf(od, od->lngstr[datefmt2_], maxd, UNSET));
  mprintf(outf, 0, NULL);

  if (rep != REP_SIZE && rep != REP_PROCTIME)
    putc('\n', outf);
  /* This time these reports really do have no further header text. */
}

/* General Summary header */
void plain_gensumhead(FILE *outf, Outchoices *od) {
}

/* General Summary footer */
void plain_gensumfoot(FILE *outf, Outchoices *od) {
}

/* Single General Summary line, long data */
void plain_gensumline(FILE *outf, Outchoices *od, int namecode,
		      unsigned long x, unsigned long x7, logical isaverage) {

  fprintf(outf, "%s%s ",  od->lngstr[namecode], od->lngstr[colon_]);

  f3printf(outf, od, (double)x, 0, od->sepchar);

  if (x7 != (unsigned long)UNSET) {
    fputs(" (", outf);
    f3printf(outf, od, (double)x7, 0, od->sepchar);
    putc(')', outf);
  }
  putc('\n', outf);
}

/* Single General Summary line, bytes data */
void plain_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x,
		       double x7, logical isaverage) {
  char **lngstr = od->lngstr;

  unsigned int bm;
  char *c;

  fprintf(outf, "%s%s ",  lngstr[namecode], lngstr[colon_]);

  bm = (od->rawbytes)?0:findbmult(x, od->bytesdp);
  printbytes(outf, od, x, bm, 0, od->sepchar);

  if (bm > 0) {
    c = strchr(lngstr[xbytes_], '?');
    *c = '\0';
    fprintf(outf, " %s%s%s", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1);
    *c = '?';
  }
  else
    fprintf(outf, " %s", lngstr[bytes_]);

  if (x7 != UNSET) {
    fputs(" (", outf);
    bm = (od->rawbytes)?0:findbmult(x7, od->bytesdp);
    printbytes(outf, od, x7, bm, 0, od->sepchar);
    if (bm > 0) {
      c = strchr(lngstr[xbytes_], '?');
      *c = '\0';
      fprintf(outf, " %s%s%s)", lngstr[xbytes_], lngstr[byteprefix_ + bm],
	      c + 1);
      *c = '?';
    }
    else
      fprintf(outf, " %s)", lngstr[bytes_]);
  }

  putc('\n', outf);
}

/* "Last seven" explanation line */
void plain_lastseven(FILE *outf, Outchoices *od, timecode_t last7to) {
  mprintf(outf, od->plainpagewidth, "(%s %s %s).\n", od->lngstr[brackets_],
	  od->lngstr[sevendaysto_],
	  timesprintf(od, od->lngstr[datefmt1_], last7to, UNSET));
  mprintf(outf, 0, NULL);
}

/* Start of a 
 section */
void plain_prestart(FILE *outf, Outchoices *od) {
  putc('\n', outf);
}

/* End of a 
 section */
void plain_preend(FILE *outf, Outchoices *od) {
}

/* A horizontal rule */
void plain_hrule(FILE *outf, Outchoices *od) {
  unsigned int i;

  for (i = 0; i < od->plainpagewidth; i++)
    putc('-', outf);
  fputs("\n\n", outf);
}

/* An en dash */
char *plain_endash(void) {
  return "-";
}

/* putc with special characters escaped */
void plain_putch(FILE *outf, char c) {
  putc(c, outf);
}

/* strlen */
size_t plain_strlength(const char *s) {
  return strlen(s);
}

/* Allow month in dates? DO NOT enable for human-readable text because of
   i18n problems. */
logical plain_allowmonth(void) {
  return FALSE;
}

/* Calculate column widths */
void plain_calcwidths(Outchoices *od, choice rep, unsigned int width[],
		      unsigned int *bmult, unsigned int *bmult7, double *unit,
		      unsigned long maxr, unsigned long maxr7,
		      unsigned long maxp, unsigned long maxp7, double maxb,
		      double maxb7, unsigned long howmany) {
  calcwidths(od, rep, width, bmult, bmult7, unit, maxr, maxr7, maxp, maxp7,
	     maxb, maxb7, howmany);
}

/* "Each unit represents" line */
void plain_declareunit(FILE *outf, Outchoices *od, char graphby, double unit,
		       unsigned int bmult) {
  /* NB Number can still overflow pagewidth, but only if pagewidth is small,
     & will wrap straight afterwards. pagewidth is never guaranteed anyway. */
  extern unsigned int ppcol;
  char **lngstr = od->lngstr;
  unsigned int pagewidth = od->plainpagewidth;

  char *s;

  mprintf(outf, pagewidth, "%s (%c) %s ", lngstr[eachunit_], od->markchar,
	  lngstr[represents_]);

  if (graphby == 'R' || graphby == 'r') {
    ppcol += f3printf(outf, od, unit, 0, od->sepchar);
    if (unit == 1.)
      mprintf(outf, pagewidth, " %s.", lngstr[request_]);
    else
      mprintf(outf, pagewidth, " %s %s.", lngstr[requests_],
	      lngstr[partof_]);
  }
  else if (graphby == 'P' || graphby == 'p') {
    ppcol += f3printf(outf, od, unit, 0, od->sepchar);
    if (unit == 1.)
      mprintf(outf, pagewidth, " %s.", lngstr[pagereq_]);
    else
      mprintf(outf, pagewidth, " %s %s.", lngstr[pagereqs_],
	      lngstr[partof_]);
  }
  else {
    if (bmult > 0) {
      plain_printdouble(outf, od, unit);
      s = strchr(lngstr[xbytes_], '?');  /* checked in initialisation */
      *s = '\0';
      mprintf(outf, pagewidth, " %s%s%s %s.", lngstr[xbytes_],
	      lngstr[byteprefix_ + bmult], s + 1, lngstr[partof_]);
      *s = '?';
    }
    else {
      ppcol += f3printf(outf, od, unit, 0, od->sepchar);
      mprintf(outf, pagewidth, " %s %s.", lngstr[bytes_], lngstr[partof_]);
    }
  }
  mprintf(outf, 0, NULL);
}

/* Start of column header line */
void plain_colheadstart(FILE *outf, Outchoices *od, choice rep) {
}

/* Column header line: individual column */
void plain_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col,
		      unsigned int width, char *colname,
		      logical unterminated) {
  if (unterminated)
    fputs(colname, outf);
  else
    fprintf(outf, "%*s: ", width, colname);
}

/* End of column header line */
void plain_colheadend(FILE *outf, Outchoices *od, choice rep) {
  putc('\n', outf);
}

/* Start of column header underlining line */
void plain_colheadustart(FILE *outf, Outchoices *od, choice rep) {
}

/* Underlining of one column header. */
/* If column is terminated, set width and leave name blank; and conversely. */
void plain_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col,
			    unsigned int width, char *name) {
  if (width > 0) {
    matchlengthn(outf, od, (size_t)width, '-');
    fputs(": ", outf);
  }
  else
    matchlength(outf, od, name, '-');
}

/* End of column header underlining line */
void plain_colheaduend(FILE *outf, Outchoices *od, choice rep) {
  putc('\n', outf);
}

/* Start of a table row */
void plain_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols,
		    int level, char *name, char *datefmt, char *timefmt) {
}

/* Print level in hierarchy represented by this row */
void plain_levelcell(FILE *outf, Outchoices *od, choice rep, int level) {
}

/* Name column */
void plain_namecell(FILE *outf, Outchoices *od, choice rep, char *name,
		    choice source, unsigned int width, logical name1st,
		    logical isfirst, logical rightalign, Alias *aliashead,
		    Include *linkhead, logical ispage, unsigned int spaces,
		    char *baseurl) {
  extern char *workspace;

  int i;

  if (name1st != isfirst)
    return;

  if (isfirst)
    matchlengthn(outf, od, width - strlen(name), ' ');

  strcpy(workspace, name);
  do_aliasx(workspace, aliashead);

  if (!isfirst) {
    if (rightalign)
      i = (int)width - (int)strlen(workspace) - (int)spaces;
    else
      i = (int)spaces;
    matchlengthn(outf, od, i, ' ');
  }
    
  fputs(workspace, outf);

  if (isfirst)
    fputs(": ", outf);
}

/* Single cell, unsigned long argument */
void plain_ulcell(FILE *outf, Outchoices *od, choice rep, choice col,
		  unsigned long x, unsigned int width) {
  f3printf(outf, od, (double)x, width, od->repsepchar);
  fputs(": ", outf);
}

/* Single cell, TRUSTED string argument */
void plain_strcell(FILE *outf, Outchoices *od, choice rep, choice col,
		   char *s, unsigned int width) {
  matchlengthn(outf, od, width - strlen(s), ' ');
  fputs(s, outf);
  fputs(": ", outf);
}

/* Single cell, listing bytes */
void plain_bytescell(FILE *outf, Outchoices *od, choice rep, choice col,
		     double b, double bmult, unsigned int width) {
  printbytes(outf, od, b, bmult, width, od->repsepchar);
  fputs(": ", outf);
}

/* Single cell, listing percentage */
void plain_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n,
		  double tot, unsigned int width) {
  double pc;
  unsigned int pc1, pc2;

  matchlengthn(outf, od, width - 6, ' ');
  if (tot == 0)
    pc = 0.0;
  else
    pc = n * 10000.0 / tot;
  if (pc >= 9999.5)
    fputs("  100%", outf);
  else if (pc < 0.5)
    fputs("      ", outf);
  else {
    pc1 = ((int)(pc + 0.5)) / 100;
    pc2 = ((int)(pc + 0.5)) % 100;
    fprintf(outf, "%2d", pc1);
    putc(od->decpt, outf);
    fprintf(outf, "%02d%%", pc2);
  }
  fputs(": ", outf);
}

/* Single cell, index */
void plain_indexcell(FILE *outf, Outchoices *od, choice rep, choice col,
		    long index, unsigned int width) {
  /* If index is 0 (i.e. sub-item), just print spaces */
  if (index <= 0)
    matchlengthn(outf, od, width, ' ');
  else
    f3printf(outf, od, (double)index, width, od->repsepchar);
  fputs(": ", outf);
}

/* End of a table row */
void plain_rowend(FILE *outf, Outchoices *od, choice rep) {
  putc('\n', outf);
}

/* Blank line in time reports */
void plain_blankline(FILE *outf, Outchoices *od, choice *cols) {
  putc('\n', outf);
}

/* Barchart in time reports */
void plain_barchart(FILE *outf, Outchoices *od, int y, char graphby) {
  int i;

  for (i = 0; i < y; i++)
    putc(od->markchar, outf);
}

/* "Busiest time period" line */
void plain_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt,
		      unsigned long reqs, unsigned long pages, double bys,
		      datecode_t date, unsigned int hr, unsigned int min,
		      datecode_t newdate, unsigned int newhr,
		      unsigned int newmin, char graphby) {
  extern unsigned int *rep2busystr;

  char **lngstr = od->lngstr;
  char sepchar = od->sepchar;

  unsigned int bmult;
  char *s;

  fprintf(outf, "\n%s %s (", lngstr[rep2busystr[rep]],
	  datesprintf(od, datefmt, date, hr, min, newdate, newhr, newmin,
		      TRUE, UNSET));
  if (TOLOWER(graphby) == 'r') {
    f3printf(outf, od, (double)reqs, 0, sepchar);
    fprintf(outf, " %s).\n", (reqs == 1)?lngstr[request_]:lngstr[requests_]);
  }
  else if (TOLOWER(graphby) == 'p') {
    f3printf(outf, od, (double)pages, 0, sepchar);
    fprintf(outf, " %s).\n",
	    (pages == 1)?lngstr[pagereq_]:lngstr[pagereqs_]);
  }
  else /* TOLOWER(graphby) == 'b' */ {
    if (od->rawbytes)
      bmult = 0;
    else
      bmult = findbmult(bys, od->bytesdp);
    printbytes(outf, od, bys, bmult, 0, sepchar);
    putc(' ', outf);
    if (bmult >= 1) {
      s = strchr(lngstr[xbytes_], '?');  /* checked in initialisation */
      *s = '\0';
      fprintf(outf, "%s%s%s).\n", lngstr[xbytes_],
	      lngstr[byteprefix_ + bmult], s + 1);
      *s = '?';
    }
    else
      fprintf(outf, "%s).\n", lngstr[bytes_]);
  }
}

/* End of "Not listed" line. */
void plain_notlistedstr(FILE *outf, Outchoices *od, choice rep,
			unsigned long badn) {
  extern unsigned int *rep2lng, *rep2colhead;

  char **lngstr = od->lngstr;
  char *colhead = lngstr[rep2colhead[rep]];
  char *colheadp = lngstr[rep2colhead[rep] + 1];
  char gender = lngstr[rep2lng[rep] + 3][0];

  char *notlistedstr;

  if (gender == 'm')
    notlistedstr = lngstr[notlistedm_];
  else if (gender == 'f')
    notlistedstr = lngstr[notlistedf_];
  else
    notlistedstr = lngstr[notlistedn_];

  fprintf(outf, "[%s: ", notlistedstr);
  f3printf(outf, od, (double)badn, 0, od->sepchar);
  fprintf(outf, " %s]", (badn == 1)?colhead:colheadp);
}

/* The line declaring the floor and sort for a report */
void plain_whatincluded(FILE *outf, Outchoices *od, choice rep,
			unsigned long n, Dateman *dman) {
  whatincluded(outf, od, rep, n, dman);
}

/* Spacing at the start of the whatincluded line */
void plain_whatinchead(FILE *outf, Outchoices *od) {
}

/* Finishing the whatincluded line */
void plain_whatincfoot(FILE *outf, Outchoices *od) {
  mprintf(outf, 0, NULL);
}

/* Printing part of the whatincluded line */
void plain_whatincprintstr(FILE *outf, Outchoices *od, char *s) {
  mprintf(outf, od->plainpagewidth, "%s", s);
}

/* Print a double to a nice number of decimal places */
/* plain_printdouble always uses mprintf */
void plain_printdouble(FILE *outf, Outchoices *od, double x) {
  unsigned int pagewidth;
  char decpt;
  unsigned int prec;
  double d;

  if (od == NULL) {
    pagewidth = 1;
    decpt = '.';
  }
  else {
    pagewidth = od->plainpagewidth;
    decpt = od->decpt;
  }

  /* first calculate how many decimal places we need */

  for (prec = 0, d = x - (double)((int)(x));
       d - (double)((int)(d + 0.000005)) > 0.00001; d *= 10)
    prec++;

  /* now print it */

  if (prec > 0)
    mprintf(outf, pagewidth, "%d%c%0*d", (int)x, decpt, prec,
	    (int)(d + EPSILON));
  else
    mprintf(outf, pagewidth, "%d", (int)(x + EPSILON));
}

/* Include a header file or footer file */
void plain_includefile(FILE *outf, Outchoices *od, char *name, char type) {
  FILE *inf;
  char buffer[BLOCKSIZE];
  size_t n;

  if ((inf = my_fopen(name, (type == 'h')?"header file":"footer file")) !=
      NULL) {
    if (type == 'f')
      plain_hrule(outf, od);
    while ((n = fread(buffer, 1, BLOCKSIZE, inf)))  /* single equals */
      fwrite((void *)buffer, 1, n, outf);
    if (type == 'h')
      plain_hrule(outf, od);
    (void)my_fclose(inf, name, (type == 'h')?"header file":"footer file");
  }
}

/* Filetype for RISC OS */
unsigned int plain_riscosfiletype(void) {
  return 0xfff;
}
analog-6.0/src/output.c0000644000175000017500000007071410161303543015236 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** output.c; controls the output, mostly calling fns from output2.c ***/

#include "anlghea3.h"

extern choice *rep2type, *rep2reqs, *rep2reqs7, *rep2date, *rep2firstd;
extern unsigned int *rep2colhead, *rep2gran, *rep2datefmt;

void pagetop(FILE *outf, Outchoices *od, Dateman *dman) {
  extern logical cgi;

  /* CGI header */
  if (cgi)
    od->outputter->cgihead(outf, od);

  /* Header material for this output style */
  od->outputter->stylehead(outf, od);

  /* The page title, plus the user's HEADERFILE */
  od->outputter->pagetitle(outf, od);

  /* Program start time, and logfile start and end times */
  od->outputter->timings(outf, od, dman);

  /* The bottom of the top of the page */
  od->outputter->closehead(outf, od);
}

void pagebot(FILE *outf, Outchoices *od) {
  extern time_t origstarttime;

  long secs;

  /* Start of the bottom of the page */
  od->outputter->pagebotstart(outf, od);

  /* The credit line */
  od->outputter->credit(outf, od);

  /* The program run time */
  if (od->runtime) {
    secs = (long)difftime(time((time_t *)NULL), origstarttime);
    od->outputter->runtime(outf, od, secs);
  }

  /* The page footer, including the user's FOOTERFILE */
  od->outputter->pagefoot(outf, od);

  /* Footer material for this output style */
  od->outputter->stylefoot(outf, od);
}

#define GENSUM_RATE(x, m) (((m) < 30 || (x) <= 1)?((unsigned long)UNSET):\
  ((unsigned long)(((double)((x) - 1) * 1440.0) / (double)(m))))
void gensum(FILE *outf, Outchoices *od,
	    unsigned long *data, double bys, double bys7,
	    Hashindex **gooditems, Hashindex **baditems, Dateman *dman,
	    choice data2cols[ITEM_NUMBER][DATA_NUMBER]) {
  timecode_t totmins, totmins7;
  logical q7 = (od->last7 && dman->firsttime < dman->last7from &&
		dman->last7from < dman->lasttime);
  unsigned long tot, tot7;

  od->outputter->gensumhead(outf, od);

  totmins = dman->lasttime - dman->firsttime;
  totmins7 = q7?MINS_IN_WEEK:0;
  if (q7)
    od->outputter->lastseven(outf, od, dman->last7to);
  gensumline(outf, od, '\0', succreqs_, data[LOGDATA_SUCC],
	     q7?data[LOGDATA_SUCC7]:(unsigned long)UNSET, FALSE);
  /* \0 above means always printed */
  gensumline(outf, od, 'B', avereqs_,
	     GENSUM_RATE(data[LOGDATA_SUCC], totmins),
	     GENSUM_RATE(data[LOGDATA_SUCC7], totmins7), TRUE);
  gensumline(outf, od, 'C', totunknown_, data[LOGDATA_UNKNOWN],
	     q7?data[LOGDATA_UNKNOWN7]:(unsigned long)UNSET, FALSE);
  gensumline(outf, od, 'D', totpages_, data[LOGDATA_PAGES],
	     q7?data[LOGDATA_PAGES7]:(unsigned long)UNSET, FALSE);
  gensumline(outf, od, 'E', avepages_,
	     GENSUM_RATE(data[LOGDATA_PAGES], totmins),
	     GENSUM_RATE(data[LOGDATA_PAGES7], totmins7), TRUE);
  gensumline(outf, od, 'F', totfails_, data[LOGDATA_FAIL],
	     q7?data[LOGDATA_FAIL7]:(unsigned long)UNSET, FALSE);
  gensumline(outf, od, 'G', totredirs_, data[LOGDATA_REDIR],
	     q7?data[LOGDATA_REDIR7]:(unsigned long)UNSET, FALSE);
  gensumline(outf, od, 'H', inforeqs_, data[LOGDATA_INFO],
	     q7?data[LOGDATA_INFO7]:(unsigned long)UNSET, FALSE);
  distcount(gooditems[ITEM_FILE], baditems[ITEM_FILE],
	    data2cols[ITEM_FILE][REQUESTS], data2cols[ITEM_FILE][REQUESTS7],
	    &tot, &tot7);
  gensumline(outf, od, 'I', distfiles_, tot, q7?tot7:(unsigned long)UNSET,
	     FALSE);
  distcount(gooditems[ITEM_HOST], baditems[ITEM_HOST],
	    data2cols[ITEM_HOST][REQUESTS], data2cols[ITEM_HOST][REQUESTS7],
	    &tot, &tot7);
  gensumline(outf, od, 'J', disthosts_, tot, q7?tot7:(unsigned long)UNSET,
	     FALSE);
  gensumline(outf, od, 'K', corrupt_, data[LOGDATA_CORRUPT],
	     (unsigned long)UNSET, FALSE);
  gensumline(outf, od, 'L', unwanted_, data[LOGDATA_UNWANTED],
	     (unsigned long)UNSET, FALSE);
  gensumlineb(outf, od, 'M', totdata_, bys, q7?bys7:UNSET, FALSE);
  gensumlineb(outf, od, 'N', avedata_,
	      (totmins < 30)?UNSET:((bys * 1440.0) / (double)totmins),
	      (q7 && totmins7 >= 30)?\
	      ((bys7 * 1440.0) / (double)totmins7):UNSET, TRUE);

  od->outputter->gensumfoot(outf, od);
}

void timerep(FILE *outf, Outchoices *od, choice rep, Dateman *dman,
	     unsigned int granularity) {
  extern unsigned int daysbefore[12];

  char **lngstr = od->lngstr;
  logical back = od->back[rep];
  unsigned int rows = od->rows[rep];
  char graphby = od->graph[rep];
  unsigned int repgran = rep2gran[rep];
  char *datefmt = od->lngstr[rep2datefmt[rep]];

  Daysdata *dp;
  Timerep *trhead, *trp, *oldtrp;
  unsigned int hr, min, newhr, newmin = 59, busytime = 0;
  datecode_t busydate = 0, i;
  int j, firsttime, lasttime;
  unsigned int k;
  unsigned int relgran = granularity / repgran; /* guaranteed to be integer */
  unsigned long reqs = 0, pages = 0, totr = 0, totp = 0;
  unsigned long maxr = 0, maxp = 0, busyr = 0, busyp = 0;
  double bys = 0.0, totb = 0.0, maxb = 0.0, busyb = 0.0, unit = 0.0;
  unsigned int width[COL_NUMBER], bmult, bmult7, date, month, year;
  unsigned int accum = 0, intlength = 0, rowsdone = 0;
  logical save, first = TRUE, leavegap;

  /* First work out what will be listed and shove them in an array */

  if (rows == 0)
    rows = INT_MAX;
  if (rep == REP_YEAR) {
    accum = 12;
    intlength = 364;
    /* The intlength is for calculating the date at the end of a time interval.
       Of course years, quarters and months differ in length, and we don't
       bother to calculate the date exactly. We assume that the language file
       only asks for the month at the end, not the precise date. */
  }
  else if (rep == REP_QUARTERLY) {
    accum = 3;
    intlength = 89;
  }
  else if (rep == REP_MONTH)
    accum = 1;
  else if (rep == REP_WEEK)
    intlength = 6;

  trhead = (Timerep *)xmalloc(sizeof(Timerep));
  trp = trhead;
  for (firsttime = 0; firsttime < (int)granularity &&
	 dman->firstdp->reqs[firsttime] == 0; firsttime++)
    ;    /* run to first time */
  for (lasttime = granularity - 1;
       lasttime >= 0 && dman->lastdp->reqs[lasttime] == 0; lasttime--)
    ;
  for (i = dman->lastdate, dp = dman->lastdp; i >= dman->firstdate;
       i--, dp = dp->prev) {
    for (j = (int)(granularity - relgran); j >= 0; j -= relgran) {
      for (k = 0; k < relgran; k++) {
	reqs += dp->reqs[j + k];
	pages += dp->pages[j + k];
	bys += dp->bytes[j + k];
      }
      if (accum > 0) {  /* REP_YEAR, REP_QUARTERLY, REP_MONTH */
	code2date(i, &date, &month, &year);
	save = (date == 1 && month % accum == 0) || (i == dman->firstdate);
      }
      else if (rep == REP_WEEK)
	save = (DAYOFWEEK(i) == od->weekbeginson) || (i == dman->firstdate);
      else  /* REP_DAYREP or below */
	save = ((dp != dman->lastdp || j <= lasttime) &&
		(dp != dman->firstdp || j + (int)relgran > firsttime));
      if (save) {
	while (rep == REP_WEEK && DAYOFWEEK(i) != od->weekbeginson && i > 1)
	  i--;  /* earliest week: account under first day of week */
	/* (i > 1 above stops us crashing by going back further than 1/1/70) */
	if (rep == REP_QUARTERLY && i == dman->firstdate)
	  i = DATE2CODE(year, (month / 3) * 3, 1);
	/* sim. first date of quarter: month, year were calculated above */
	totr += reqs;
	totp += pages;
	totb += bys;
	if (((graphby == 'R' || graphby == 'r') && reqs >= busyr) ||
	    ((graphby == 'P' || graphby == 'p') && pages >= busyp) ||
	    ((graphby == 'B' || graphby == 'b') && bys >= busyb)) {
	  busyr = reqs;
	  busyp = pages;
	  busyb = bys;
	  busydate = i;   /* busydate always set coz busyr was init. to 0 */
	  busytime = (1440 * j) / granularity;
	}
	if (rowsdone < rows) {
	  maxr = MAX(maxr, reqs);
	  maxp = MAX(maxp, pages);
	  maxb = MAX(maxb, bys);
	  trp->prev = (Timerep *)xmalloc(sizeof(Timerep));
	  trp->prev->next = trp;
	  trp = trp->prev;
	  trp->reqs = reqs;
	  trp->pages = pages;
	  trp->bytes = bys;
	  trp->date = i;
	  trp->time = (1440 * j) / granularity;
	  trp->prev = NULL;
	  rowsdone++;
	}
	reqs = 0;
	pages = 0;
	bys = 0.0;
      }
    }
  }

  /* Now print the stuff we've saved */

  width[COL_TITLE] = MAX(datefmtlen(od, datefmt),
			 od->outputter->strlength(lngstr[rep2colhead[rep]]));
  od->outputter->calcwidths(od, rep, width, &bmult, &bmult7, &unit,
			maxr, 0, maxp, 0, maxb, 0, 0);
  od->outputter->declareunit(outf, od, graphby, unit, bmult);
  od->outputter->prestart(outf, od);
  colheads(outf, od, rep, width, bmult, bmult7, TRUE);
  for (trp = back?(trhead->prev):trp; trp != (back?NULL:trhead); ) {
    hr = trp->time / 60;
    min = trp->time % 60;
    if (rep == REP_QUARTERLY || rep == REP_MONTH) {
      code2date(trp->date, &date, &month, &year);
      leavegap = (month == (unsigned int)(back?(12 - accum):0));
    }
    else if (rep == REP_DAYREP)
      leavegap = (DAYOFWEEK(trp->date) ==
		  (back?((od->weekbeginson + 6) % 7):(od->weekbeginson)));
    else if (rep == REP_HOURREP)
      leavegap = (hr == (unsigned int)(back?23:0));
    else if (rep == REP_QUARTERREP)
      leavegap = (min == (unsigned int)(back?45:0) &&
		  (hr % 4) == (unsigned int)(back?3:0));
    else if (rep == REP_FIVEREP)
      leavegap = (min == (unsigned int)(back?55:0));
    else /* REP_YEAR or REP_WEEK */
      leavegap = FALSE;
    if (leavegap && !first)
      od->outputter->blankline(outf, od, od->cols[rep]);
    first = FALSE;
    if (rep == REP_QUARTERREP)
      newmin = (min + 15) % 60;
    else if (rep == REP_FIVEREP)
      newmin = (min + 5) % 60;
    else if (rep == REP_HOURREP)
      newmin = 0;
    if (newmin == 59)  /* REP_DAYREP or above */
      newhr = 23;
    else
      newhr = (newmin == 0)?(hr + 1):(hr);
    printcols(outf, od, rep, trp->reqs, 0, trp->pages, 0, trp->bytes, 0., -1,
	      -1, totr, 0, totp, 0, totb, 0, width, bmult, bmult7, unit, TRUE,
	      FALSE, NULL, FALSE, 0, NULL, NULL, datefmt, NULL, trp->date, hr,
	      min, trp->date + intlength, newhr, newmin);
    oldtrp = trp;
    trp = back?(trp->prev):(trp->next);
    free((void *)oldtrp);
  }
  od->outputter->preend(outf, od);
  hr = busytime / 60;
  min = busytime % 60;
  if (rep == REP_QUARTERREP)
    newmin = (min + 15) % 60;
  else if (rep == REP_FIVEREP)
    newmin = (min + 5) % 60;
  else if (rep == REP_HOURREP)
    newmin = 0;
  if (newmin == 59)  /* REP_DAYREP or above */
    newhr = 23;
  else
    newhr = (newmin == 0)?(hr + 1):(hr);
  od->outputter->busyprintf(outf, od, rep, datefmt, busyr, busyp, busyb,
			    busydate, hr, min, busydate + intlength, newhr,
			    newmin, graphby);
}

void timesum(FILE *outf, Outchoices *od, choice rep, Dateman *dman,
	     unsigned int granularity) {
  unsigned int repgran = rep2gran[rep];
  unsigned int repspan = (rep == REP_DAYSUM || rep == REP_WEEKHOUR)?7:1;
  char *datefmt = od->lngstr[rep2datefmt[rep]];

  Daysdata *dp;
  unsigned int relgran = granularity / repgran; /* guaranteed to be integer */
  unsigned int bins = repspan * repgran;
  unsigned long *reqs, *pages, totr = 0, totp = 0;
  double *bys, totb = 0.0, unit = 0.0;
  unsigned int width[COL_NUMBER], bmult, bmult7;
  logical first = TRUE;
  datecode_t date;
  unsigned int weekday, offset, entry, hr, min, newmin, i, j;

  reqs = (unsigned long *)xmalloc(bins * sizeof(unsigned long));
  pages = (unsigned long *)xmalloc(bins * sizeof(unsigned long));
  bys = (double *)xmalloc(bins * sizeof(double));
  for (i = 0; i < bins; i++) {
    reqs[i] = 0;
    pages[i] = 0;
    bys[i] = 0.0;
  }
  
  for (date = dman->firstdate, dp = dman->firstdp; date <= dman->lastdate;
       date++, TO_NEXT(dp)) {
    offset = (repspan == 1)?0:(DAYOFWEEK(date) * repgran);
    for (i = 0; i < granularity; i++) {
      entry = offset + i / relgran;
      reqs[entry] += dp->reqs[i];
      totr += dp->reqs[i];
      pages[entry] += dp->pages[i];
      totp += dp->pages[i];
      bys[entry] += dp->bytes[i];
      totb += dp->bytes[i];
    }
  }

  width[COL_TITLE] = MAX(datefmtlen(od, datefmt),
			 od->outputter->strlength(od->lngstr[rep2colhead[rep]]));
  od->outputter->calcwidths(od, rep, width, &bmult, &bmult7, &unit,
			arraymaxl(reqs, bins), 0, arraymaxl(pages, bins), 0,
			arraymaxd(bys, bins), 0, 0);
  od->outputter->declareunit(outf, od, od->graph[rep], unit, bmult);
  od->outputter->prestart(outf, od);
  colheads(outf, od, rep, width, bmult, bmult7, TRUE);
  for (i = 0; i < repspan; i++) {
    weekday = ((od->weekbeginson + i) % 7); 
    offset = (repspan == 1)?0:(weekday * repgran);
    for (j = 0; j < repgran; j++) {
      entry = offset + j;
      hr = j * 24 / repgran;
      min = (j * 1440 / repgran) % 60;
      newmin = ((j + 1) * 1440 / repgran) % 60;
      if (!first && min == 0 &&
	  ((repgran == 24 && hr == 0) || (repgran == 96 && hr % 4 == 0) ||
	   repgran == 288))
	od->outputter->blankline(outf, od, od->cols[rep]);
      printcols(outf, od, rep, reqs[entry], 0, pages[entry], 0, bys[entry], 0.,
		-1, -1, totr, 0, totp, 0, totb, 0, width, bmult, bmult7, unit,
		TRUE, FALSE, NULL, FALSE, 0, NULL, NULL, datefmt, NULL,
		weekday + 4, hr, min, weekday + 4, (newmin == 0)?(hr + 1):(hr),
		newmin);
      /* weekday + 4 is an arbitrary (internal) date that is that weekday. */
      first = FALSE;
    }
  }
  od->outputter->preend(outf, od);
}

void printtree(FILE *outf, Outchoices *od, choice rep, Hashtable *tree,
	       choice requests, choice requests7, choice pages, choice pages7,
	       choice date, choice firstd, unsigned int level,
	       Strlist *partname, unsigned long totr, unsigned long totr7,
	       unsigned long totp, unsigned long totp7, double totb,
	       double totb7, unsigned int width[], logical possrightalign,
	       unsigned int bmult, unsigned int bmult7, double unit) {
  /* level is 0 at the top level in this function */
  char **lngstr = od->lngstr;
  Include *linkhead = od->link[G(rep)];
  char *baseurl = (rep2type[rep] == ITEM_FILE)?(od->baseurl):NULL;

  char *name;
  size_t need = (size_t)level + 3;
  logical rightalign;
  unsigned long datar, datar7, datap, datap7, datad, datafd;
  Hashindex *p;
  Strlist *pn, s;
  unsigned long goodn = 0;

  if (tree != NULL) {
    for (pn = partname; pn != NULL; TO_NEXT(pn))
      need += strlen(pn->name);
    for (p = tree->head[0]; p != NULL; TO_NEXT(p)) {
      name = maketreename(partname, p, &pn, &s, need, rep, TRUE);
      /* name construction also in findwedges() */
      if (STREQ(name, LNGSTR_NODOMAIN) || STREQ(name, LNGSTR_UNKDOMAIN) ||
	  ISDIGIT(name[strlen(name) - 1]))
	rightalign = FALSE;
      else
	rightalign = possrightalign;
      datar = p->own->data[requests];
      datar7 = (requests7 >= 0)?(p->own->data[requests7]):0;
      datap = (pages >= 0)?(p->own->data[pages]):0;
      datap7 = (pages7 >= 0)?(p->own->data[pages7]):0;
      datad = (date >= 0)?(p->own->data[date]):0;
      datafd = (firstd >= 0)?(p->own->data[firstd]):0;
      printcols(outf, od, rep, datar, datar7, datap, datap7, p->own->bytes,
		p->own->bytes7, (level == 0)?((long)(++goodn)):(-1),
		(int)level + 1, totr, totr7, totp, totp7, totb, totb7, width,
		bmult, bmult7, unit, FALSE, rightalign, name,
		(logical)(p->own->ispage), 2 * level, linkhead, baseurl,
		lngstr[genrepdate_], lngstr[genreptime_],
		(datecode_t)(datad / 1440),
		(unsigned int)((datad % 1440) / 60),
		(unsigned int)(datad % 60), (datecode_t)(datafd / 1440),
		(unsigned int)((datafd % 1440) / 60),
		(unsigned int)(datafd % 60));
      printtree(outf, od, rep, (Hashtable *)(p->other), requests, requests7,
		pages, pages7, date, firstd, level + 1, pn, totr, totr7, totp,
		totp7, totb, totb7, width, possrightalign, bmult, bmult7,
		unit);
    }
  }
}

void genrep(FILE *outf, Outchoices *od, choice rep, Hashindex **gooditems,
	    Hashindex **baditems,
	    choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2],
	    choice *data2cols, unsigned int data_number, Dateman *dman) {
  extern logical *repistree;
  extern char *workspace;

  logical istree = repistree[G(rep)];
  char **lngstr = od->lngstr;
  char *colhead = lngstr[rep2colhead[rep]];
  logical alphaback = (logical)(rep == REP_ORG || rep == REP_HOST ||
				rep == REP_VHOST);
  Tree *treex = od->tree[G(rep)];
  /* data2cols == NULL for arrayreps */
  choice requests = (data2cols == NULL)?REQUESTS:data2cols[rep2reqs[G(rep)]];
  choice requests7 =
    (data2cols == NULL)?REQUESTS7:data2cols[rep2reqs7[G(rep)]];
  choice pages = (data2cols == NULL)?PAGES:data2cols[PAGES];
  choice pages7 = (data2cols == NULL)?PAGES7:data2cols[PAGES7];
  choice date = (data2cols == NULL)?SUCCDATE:data2cols[rep2date[G(rep)]];
  choice firstd = (data2cols == NULL)?SUCCFIRSTD:data2cols[rep2firstd[G(rep)]];

  Hashtable *tree = NULL;  /* Just to keep compiler happy */
  Hashindex *p;
  Hashentry *badp;
  unsigned long datar, datar7, datap, datap7, datad, datafd;
  unsigned long totr, totr7, totp, totp7, i = 0;
  unsigned long maxr, maxr7, maxp, maxp7, goodn, badn;
  double totb, totb7, maxb, maxb7, unit = 1.0;
  timecode_t maxd, mind;
  unsigned int width[COL_NUMBER], bmult, bmult7, tw = 0;
  logical possrightalign = FALSE, rightalign, templ = FALSE;

  /* If istree, construct the tree. (Otherwise we shall use *gooditems.)
     (These two cases used to be separate functions, and it may still help to
     think of them that way.) */
  if (istree) {
    for (i = 0; od->alltrees[i] != REP_NUMBER; i++)
      if (rep == od->alltrees[i])
	templ = TRUE;   /* tree already constructed */
    if (!templ)
      maketree(treex, *gooditems, *baditems, datacols, data_number);
    tree = treex->tree;

  /* Apply the sort. This also sets tot*, max* and bad*. */
    tree->head[0] = sorttree(od, tree, rep, &(od->floor[G(rep)]),
			     od->sortby[G(rep)], &(od->subfloor[G(rep)]),
			     od->subsortby[G(rep)], alphaback, 0, NULL,
			     (rep == REP_DOM)?(od->aliashead[G(rep)]):NULL,
			     requests, requests7, pages, pages7, date, firstd,
			     &totr, &totr7, &totp, &totp7, &totb, &totb7,
			     &maxr, &maxr7, &maxp, &maxp7, &maxb, &maxb7,
			     &maxd, &mind, &badp, &badn, treex->space,
			     datacols);
  }  /* istree */
  else
    my_sort(gooditems, baditems, NULL, NULL, NULL, 0, -1, &(od->floor[G(rep)]),
	    od->sortby[G(rep)], alphaback, od->wanthead[G(rep)], requests,
	    requests7, pages, pages7, date, firstd, &totr, &totr7, &totp,
	    &totp7, &totb, &totb7, &maxr, &maxr7, &maxp, &maxp7, &maxb, &maxb7,
	    &maxd, &mind, FALSE, &badp, &badn,
	    (logical)(rep == REP_SIZE || rep == REP_PROCTIME));
  if (rep == REP_SIZE || rep == REP_PROCTIME) {
    /* These not sorted so as not to get rid of 0's and to preserve order */
    badp = newhashentry(DATA_NUMBER, FALSE);
    badn = 0;
  }

  /* Now calculate column sizes */
  for (p = istree?(tree->head[0]):(*gooditems), goodn = 0; p != NULL;
       TO_NEXT(p))
    goodn++;
  if (rep == REP_SIZE || rep == REP_PROCTIME) {
    width[COL_TITLE] = od->outputter->strlength(colhead);
    for (p = *gooditems; p != NULL; TO_NEXT(p))
      width[COL_TITLE] = MAX(strlen(p->name), /* no HTML codes used */
			     width[COL_TITLE]);
  }
  else
    width[COL_TITLE] = 0;
  od->outputter->calcwidths(od, rep, width, &bmult, &bmult7, &unit, maxr,
			    maxr7, maxp, maxp7, maxb, maxb7, goodn);
  if (alphaback && od->sortby[G(rep)] == ALPHABETICAL) {
    if (istree)
      tw = alphatreewidth(od, rep, tree, 0, NULL);
    else for (p = *gooditems; p != NULL; TO_NEXT(p)) {
      strcpy(workspace, p->name);
      do_aliasx(workspace, od->aliashead[G(rep)]);
      tw = MAX(tw, od->outputter->strlength(workspace));
    }
    width[COL_TITLE] = MIN(tw, width[COL_TITLE]);
    possrightalign = TRUE;
  }

  /* Print header material */
  if (od->repspan)
    reportspan(outf, od, rep, maxd, mind, dman);
#ifndef NOGRAPHICS
  if (od->outstyle == HTML || od->outstyle == XHTML)
    piechart(outf, od, rep, istree?(tree->head[0]):(*gooditems), requests,
	     requests7, pages, pages7, totr, totr7, totp, totp7, totb, totb7);
#endif
  if (rep != REP_SIZE && rep != REP_PROCTIME)
    od->outputter->whatincluded(outf, od, rep, goodn, dman);
  od->outputter->prestart(outf, od);
  colheads(outf, od, rep, width, bmult, bmult7,
	   (logical)(rep == REP_SIZE || rep == REP_PROCTIME));

  /* Print the items. Reuse goodn here. */
  if (istree)
    printtree(outf, od, rep, tree, requests, requests7, pages, pages7, date,
	      firstd, 0, NULL, totr, totr7, totp, totp7,
	      totb, totb7, width, possrightalign, bmult, bmult7, unit);
  else {
    for (goodn = 0, p = *gooditems; p != NULL; TO_NEXT(p)) {
      if (possrightalign &&
	  (!ISDIGIT(p->name[0]) || !ISDIGIT(p->name[strlen(p->name) - 1])))
	rightalign = TRUE;
      else
	rightalign = FALSE;
      datar = p->own->data[requests];
      datar7 = (requests7 >= 0)?(p->own->data[requests7]):0;
      datap = (pages >= 0)?(p->own->data[pages]):0;
      datap7 = (pages7 >= 0)?(p->own->data[pages7]):0;
      datad = (date >= 0)?(p->own->data[date]):0;
      datafd = (firstd >= 0)?(p->own->data[firstd]):0;
      printcols(outf, od, rep, datar, datar7, datap, datap7, p->own->bytes,
		p->own->bytes7, (long)(++goodn), 0, totr, totr7, totp, totp7,
		totb, totb7, width, bmult, bmult7, unit,
		(logical)(rep == REP_SIZE || rep == REP_PROCTIME),
		rightalign, p->name, p->own->ispage, 0, NULL, NULL,
		lngstr[genrepdate_], lngstr[genreptime_],
		(datecode_t)(datad / 1440),
		(unsigned int)((datad % 1440) / 60),
		(unsigned int)(datad % 60), (datecode_t)(datafd / 1440),
		(unsigned int)((datafd % 1440) / 60),
		(unsigned int)(datafd % 60));
    }
  }

  /* Print the "not listed" line and wind up. */
  if (badn > 0) {
    datar = badp->data[requests];
    datar7 = (requests7 >= 0)?(badp->data[requests7]):0;
    datap = (pages >= 0)?(badp->data[pages]):0;
    datap7 = (pages7 >= 0)?(badp->data[pages7]):0;
    datad = (date >= 0)?(badp->data[date]):0;
    datafd = (firstd >= 0)?(badp->data[firstd]):0;
    printcols(outf, od, rep, datar, datar7, datap, datap7, badp->bytes,
	      badp->bytes7, -1, istree, totr, totr7, totp, totp7, totb, totb7,
	      width, bmult, bmult7, unit,
	      (logical)(rep == REP_SIZE || rep == REP_PROCTIME), FALSE, NULL,
	      FALSE, 0, NULL, NULL, lngstr[genrepdate_], lngstr[genreptime_],
	      (datecode_t)(datad / 1440), (unsigned int)((datad % 1440) / 60),
	      (unsigned int)(datad % 60), (datecode_t)(datafd / 1440),
	      (unsigned int)((datafd % 1440) / 60),
	      (unsigned int)(datafd % 60));
    od->outputter->notlistedstr(outf, od, rep, badn);
    od->outputter->rowend(outf, od, rep);
  }
  od->outputter->preend(outf, od);
  if (istree)
    freemm(treex->space);
}

void dervrep(FILE *outf, Outchoices *od, choice rep, Hashindex *gooditems,
	     Hashindex *baditems,
	     choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2],
	     choice *data2cols, unsigned int data_number, Dateman *dman) {
  Derv *derv = od->derv[rep - FIRST_DERVREP];

  Hashindex *good = NULL, *bad = NULL;
  choice i;
  logical templ = FALSE;
  /* strategy: build list of items then hand off to genrep() */

  for(i = 0; od->alldervs[i] != REP_NUMBER; i++)
    if (rep == od->alldervs[i])
      templ = TRUE;
  if (!templ)
    makederived(derv, gooditems, baditems, od->convfloor, od->multibyte, rep,
		datacols, data_number);
  unhash(derv->table, &good, &bad);
  genrep(outf, od, rep, &good, &bad, datacols, data2cols, data_number, dman);
}

/* names for each bucket in arrayrep: see thresholds at top of defaults()...
   in globals.c. (Names for status codes and file sizes are in the language
   files). */

char *ptnames1[] =
{"0", "<= 0.01", "0.01-0.02", "0.02-0.05", "0.05-0.1 ", "0.1 -0.2 ",
 "0.2 -0.5 ", "0.5 -1   ", "1-  2 ", "2-  5 ", "5- 10 ", "10- 20 ",
 "20- 60 ", "60-120 ", "120-300 ", "300-600 ", "> 600 "};

char *ptnames2[] =
{"0", "", "", "", "", "", "", "1", "2", "3-  5", "5- 10", "10- 20", "20- 60",
 "60-120", "120-300", "300-600", "> 600"};
/* empty string signifies don't use */

void arrayrep(FILE *outf, Outchoices *od, choice rep, Arraydata *array,
	      Dateman *dman) {
  extern Memman *xmemman;

  Hashindex *good = NULL, *bad = NULL, *gp = NULL;
  char **names;
  choice i, lasti;
  logical done;
  /* strategy: construct list of (Hashindex *), and pass to genrep() */

  if (rep == REP_CODE)
    names = &(od->lngstr[code100_]);
  else if (rep == REP_SIZE)
    names = &(od->lngstr[filesize0_]);
  else if (array[1].reqs + array[2].reqs + array[3].reqs + array[4].reqs +
	   array[5].reqs + array[6].reqs == 0)  /* assume %t not %T */
    names = ptnames2;
  else
    names = ptnames1;

  /* calculate lasti */
  for (lasti = 0; array[lasti].threshold >= -0.5; lasti++)
    ;
  if (rep != REP_CODE) {
    for ( ; array[lasti].reqs == 0; lasti--)
      ;
  }
  for (i = 0, done = FALSE; !done; i++) {
    if (array[i].reqs > 0 || (rep != REP_CODE && !IS_EMPTY_STRING(names[i]))) {
      if (good == NULL) {
	gp = (Hashindex *)submalloc(xmemman, sizeof(Hashindex));
	good = gp;
      }
      else {
	gp->next = (Hashindex *)submalloc(xmemman, sizeof(Hashindex));
	TO_NEXT(gp);
      }
      gp->name = names[i];
      gp->own = newhashentry(DATA_NUMBER, FALSE);
      gp->own->data[REQUESTS] = array[i].reqs;
      gp->own->data[REQUESTS7] = array[i].reqs7;
      gp->own->data[PAGES] = array[i].pages;
      gp->own->data[PAGES7] = array[i].pages7;
      gp->own->data[SUCCDATE] = array[i].lastdate;
      gp->own->data[SUCCFIRSTD] = array[i].firstdate;
      gp->own->bytes = array[i].bytes;
      gp->own->bytes7 = array[i].bytes7;
      gp->next = NULL;
    }
    if (i == lasti)
      done = TRUE;
  }
  genrep(outf, od, rep, &good, &bad, NULL, NULL, 0, dman);
}

void output(Outchoices *od, Hashindex **gooditems, Hashindex **baditems,
	    Dateman *dman, Arraydata **arraydata, unsigned long *sumdata,
	    double totbytes, double totbytes7,
	    choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2],
	    choice data2cols[ITEM_NUMBER][DATA_NUMBER], unsigned int *no_cols,
	    unsigned int granularity) {
  char *outfile = od->outfile;

  FILE *outf;
  int ro;
  choice rep;

  /* first open output file */
  
  if (IS_STDOUT(outfile)) {
    outf = stdout;
    debug('F', "Opening stdout as output file");
  }
  else {
    if ((outf = FOPENW(outfile)) == NULL)
      error("failed to open output file %s for writing", outfile);
    else {
      debug('F', "Opening %s as output file", outfile);
#ifdef RISCOS
      _swix(OS_File, _INR(0,2), 18, outfile, od->outputter->riscosfiletype());
      /* set filetype */
#endif
    }
  }

  /* remove any reports not wanted */

  checkreps(od, dman, gooditems, arraydata, data2cols);

  /* page header */

  pagetop(outf, od, dman);
    
  /* Now the main reports */

  for (ro = 0; od->reporder[ro] != -1; ro++) {
    rep = od->reporder[ro];

    if (od->repq[rep]) {
      report_title(outf, od, rep);
      switch(rep) {
      case (REP_GENSUM):
	gensum(outf, od, sumdata, totbytes, totbytes7, gooditems, baditems,
	       dman, data2cols);
	break;
      case (REP_YEAR):
      case (REP_QUARTERLY):
      case (REP_MONTH):
      case (REP_WEEK):
      case (REP_DAYREP):
      case (REP_HOURREP):
      case (REP_QUARTERREP):
      case (REP_FIVEREP):
	timerep(outf, od, rep, dman, granularity);
	break;
      case (REP_DAYSUM):
      case (REP_HOURSUM):
      case (REP_WEEKHOUR):
      case (REP_QUARTERSUM):
      case (REP_FIVESUM):
	timesum(outf, od, rep, dman, granularity);
	break;
      case (REP_HOST):
      case (REP_REDIRHOST):
      case (REP_FAILHOST):
      case (REP_BROWREP):
      case (REP_VHOST):
      case (REP_REDIRVHOST):
      case (REP_FAILVHOST):
      case (REP_USER):
      case (REP_REDIRUSER):
      case (REP_FAILUSER):
      case (REP_REQ):
      case (REP_REDIR):
      case (REP_FAIL):
      case (REP_REF):
      case (REP_REDIRREF):
      case (REP_FAILREF):
      case (REP_TYPE):
      case (REP_DIR):
      case (REP_DOM):
      case (REP_ORG):
      case (REP_REFSITE):
	genrep(outf, od, rep, &(gooditems[rep2type[rep]]),
	       &(baditems[rep2type[rep]]), datacols[rep2type[rep]],
	       data2cols[rep2type[rep]], no_cols[rep2type[rep]], dman);
	break;
      case (REP_SEARCHREP):
      case (REP_SEARCHSUM):
      case (REP_INTSEARCHREP):
      case (REP_INTSEARCHSUM):
      case (REP_BROWSUM):
      case (REP_OS):
	dervrep(outf, od, rep, gooditems[rep2type[rep]],
		baditems[rep2type[rep]], datacols[rep2type[rep]],
		data2cols[rep2type[rep]], no_cols[rep2type[rep]], dman);
	break;
      case (REP_SIZE):
      case (REP_CODE):
      case (REP_PROCTIME):
	arrayrep(outf, od, rep, arraydata[rep - FIRST_ARRAYREP], dman);
	break;
      }  /* end switch rep */
      report_footer(outf, od, rep);
    }    /* end if rep wanted */
  }      /* end for ro */

  /*** Bit at the bottom of the page ***/

  pagebot(outf, od);
  if (!IS_STDOUT(outfile)) {
    debug('F', "Closing %s", outfile);
    fclose(outf);
  }
}
analog-6.0/src/output2.c0000644000175000017500000010764510161303543015324 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** output2.c; subsiduary output functions ***/

#include "anlghea3.h"

extern unsigned int *rep2lng;
extern choice *rep2type, *rep2reqs, *rep2reqs7, *rep2date, *rep2firstd;
extern char *repname[];

void report_title(FILE *outf, Outchoices *od, choice rep) {

  /* The actual report title */
  od->outputter->reporttitle(outf, od, rep);

  /* The report description text */
  if (od->descriptions && od->descstr[rep] != NULL)
    od->outputter->reportdesc(outf, od, rep);
}

void report_footer(FILE *outf, Outchoices *od, choice rep) {
  od->outputter->reportfooter(outf, od, rep);
  od->outputter->hrule(outf, od);
}

/* The period represented by the report. At the moment, this is a function of
   the report, not the underlying item type. Either choice makes some sense,
   though, and it would just be a matter of changing the calculation of maxd &
   min before passing them into this function. */
/* Assume od->repspan already tested. */
void reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd,
		timecode_t mind, Dateman *dman) {
  if (maxd == FIRST_TIME || mind == LAST_TIME ||
      (mind - dman->firsttime < od->rsthresh && 
       dman->lasttime - maxd < od->rsthresh))
    return;

  od->outputter->reportspan(outf, od, rep, maxd, mind);
}

void matchlength(FILE *outf, Outchoices *od, char *s, char c) {
  size_t i;

  for (i = od->outputter->strlength(s); i > 0; i--)
    od->outputter->putch(outf, c);
}

void matchlengthn(FILE *outf, Outchoices *od, int width, char c) {
  for ( ; width > 0; width--)
    od->outputter->putch(outf, c);
}

/*** Date printing routine ***/

size_t datefmtlen(Outchoices *od, char *fmt) {
  /* Page width required for formatted date. All dates should be the same,
     so just format an arbitrary one and measure it. */
  return(od->outputter->strlength(datesprintf(od, fmt, 1, 23, 59, 1, 23, 59,
					   FALSE, UNSET)));
}

char *datesprintf(Outchoices *od, char *fmt, datecode_t date, unsigned int hr,
		  unsigned int min, datecode_t newdate, unsigned int newhr,
		  unsigned int newmin, logical running, choice allowmonth) {
  /* Formats date. Allocates space as necessary, but 2nd call will overwrite */
  /* If od is NULL, must have running == TRUE and allowmonth != UNSET.
     Otherwise, if allowmonth is UNSET, follow what the od->outputter says. */
  extern char *engmonths[], *engshortdays[];
  static char *ans = NULL;
  static size_t len = 0;

  size_t (*strlenp)(const char *);
  char * (*endashp)(void);
  char **monthname, **dayname, *compsep;
  size_t monthlen, daylen, ampmlen, plainmonthlen, plaindaylen, plainampmlen;
  size_t current, increment;
  unsigned int d, m, y, d2, m2, y2, n, i;
  char *s, *c, *am, *pm;

  if (od == NULL) {   /* Not in output routine */
    strlenp = &strlen;
    endashp = &plain_endash;
    monthname = engmonths;
    dayname = engshortdays;
    compsep = NULL;
    am = "am";
    pm = "pm";
    plainmonthlen = ENGMONTHLEN;
    plaindaylen = ENGSHORTDAYLEN;
    plainampmlen = 2;
  }
  else {
    strlenp = od->outputter->strlength;
    endashp = od->outputter->endash;
    monthname = od->monthname;
    dayname = od->dayname;
    compsep = od->compsep;
    am = od->lngstr[am_];
    pm = od->lngstr[pm_];
    plainmonthlen = od->plainmonthlen;
    plaindaylen = od->plaindaylen;
    plainampmlen = od->plainampmlen;
    if (allowmonth == UNSET)
      allowmonth = od->outputter->allowmonth();
  }
  if (running) {    /* Running text: no extra spacing to line things up */
    monthlen = 0;
    daylen = 0;
    ampmlen = 0;
  }
  else {
    monthlen = od->monthlen;
    daylen = od->daylen;
    ampmlen = od->ampmlen;
  }
  increment = monthlen + plainmonthlen + daylen + plaindaylen + ampmlen +
    plainampmlen + ((compsep == NULL)?0:strlen(compsep)) + 5;
  /* A (naive) upper bound on the amount by which the length of the answer
     might grow in one step; cf comment under plainmonthlen in init.c. */

  if (date == 0 || date == LAST_DATE) {
    n = chrn(fmt, '\b');
    ENSURE_LEN(ans, len, n * ((compsep == NULL)?0:strlen(compsep)) + 1);
    s = ans;
    if (compsep != NULL) {
      for (i = 0; i < n; i++)
	PUTs(s, compsep, 0);
    }
    *s = '\0';
    return(ans);
  }
  code2date(date, &d, &m, &y);
  code2date(newdate, &d2, &m2, &y2);
  ENSURE_LEN(ans, len, 1);  /* in case fmt is "" */
  for (c = fmt, s = ans; *c != '\0'; c++) {
    current = (ans == NULL)?0:(size_t)(s - ans);
    ENSURE_LEN(ans, len, current + increment);
    s = ans + current;   /* in case ans was moved when realloc'ed */
    if (*c == '%' && *(c + 1) != '\0') {
      c++;
      switch (*c) {
      case '%':
	PUTc(s, '%');
	break;
      case 'd':
	PUT2d(s, d);
	break;
      case 'D':
	PUT02d(s, d);
	break;
      case 'e':
	PUT2d(s, d2);
	break;
      case 'E':
	PUT02d(s, d2);
	break;
      case 'l':
	if (monthname != NULL)
	  PUTs(s, monthname[m2],
	       (int)monthlen - (int)strlenp(monthname[m2]));
	break;
      case 'L':
	if (allowmonth)
	  PUT02d(s, m2 + 1);
	break;
      case 'm':
	if (monthname != NULL)
	  PUTs(s, monthname[m],
	       (int)monthlen - (int)strlenp(monthname[m]));
	break;
      case 'M':
	if (allowmonth)
	  PUT02d(s, m + 1);
	break;
      case 'q':
	PUT1d(s, (m / 3) + 1);
	break;
      case '\b':  /* \b only used internally */
	if (compsep != NULL)
	  PUTs(s, compsep, 0);
	break;
      case 'y':
	PUT02d(s, y % 100);
	break;
      case 'Y':
	PUT04d(s, y);
	break;
      case 'z':
	PUT02d(s, y2 % 100);
	break;
      case 'Z':
	PUT04d(s, y2);
	break;
      case 'X':
	PUT04d(s, y);
	PUTc(s, '-');
	PUT02d(s, m + 1);
	PUTc(s, '-');
	PUT02d(s, d);
	break;
      case 'h':
	PUT2d(s, hr);
	break;
      case 'H':
	PUT02d(s, hr);
	break;
      case 'j':
	i = hr % 12;
	if (i == 0)
	  i = 12;
	PUT2d(s, i);
	break;
      case 'a':
	if (hr < 12 || hr == 24)
	  PUTs(s, am, (int)ampmlen - (int)strlenp(am))
	else       /* no semicolon above because of definition of PUTs */
	  PUTs(s, pm, (int)ampmlen - (int)strlenp(pm));
	break;
      case 'i':
	PUT2d(s, newhr);
	break;
      case 'I':
	PUT02d(s, newhr);
	break;
      case 'k':
	i = newhr % 12;
	if (i == 0)
	  i = 12;
	PUT2d(s, i);
	break;
      case 'b':
	if (newhr < 12 || newhr == 24)
	  PUTs(s, am, (int)ampmlen - (int)strlenp(am))
	else       /* no semicolon above because of definition of PUTs */
	  PUTs(s, pm, (int)ampmlen - (int)strlenp(pm));
	break;
      case 'n':
	PUT02d(s, min);
	break;
      case 'o':
	PUT02d(s, newmin);
	break;
      case 'w':
	if (dayname != NULL)
	  PUTs(s, dayname[DAYOFWEEK(date)],
	       (int)daylen - (int)strlenp(dayname[DAYOFWEEK(date)]));
	break;
      case 'x':
	PUTs(s, endashp(), 0);
	break;
      }  /* switch *c */
    }    /* if *c == '%' */
    else
      PUTc(s, *c);
  }  /* for c */
  *s = '\0';
  return(ans);
}

char *timesprintf(Outchoices *od, char *fmt, timecode_t t, choice allowmonth) {
  /* Just a wrapper for the most common case of datesprintf(). */
  return(datesprintf(od, fmt, t / 1440, (t % 1440) / 60, t % 60, 0, 0, 0, TRUE,
		     allowmonth));
}

int f3printf(FILE *outf, Outchoices *od, double x, unsigned int width,
	     char sepchar) {
  /* Return number of characters printed, but counting e.g. & as 1. */
  /* NB The sepchar is sometimes repsepchar */
  int ans, i;

  x += EPSILON;   /* just to make sure rounding down works OK */
  if (sepchar == '\0')
    return(fprintf(outf, "%*.0f", width, x));

  for (i = 0; x >= 1000; i++)
    x /= 1000;  /* find out how big x is to get number of leading spaces */
  ans = fprintf(outf, "%*d", MAX((int)width - 4 * i, 0), (int)x);
  ans += 4 * i;
  /* now run down again, printing each clump */
  for ( ; i > 0; i--) {
    od->outputter->putch(outf, sepchar);
    x -= (int)x;
    x *= 1000;
    fprintf(outf, "%03d", (int)x);
  }
  return(ans);
}

void printbytes(FILE *outf, Outchoices *od, double bytes, unsigned int bmult,
		unsigned int width, char sepchar) {

  unsigned int dp = od->bytesdp;

  int by1;
  double by2, rounder;
  unsigned int j;

  if (bmult == 0)
    (void)f3printf(outf, od, bytes, width, sepchar);
  else {
    for (j = 0; j < bmult; j++)
      bytes /= 1024; /* divide bytes to get kilobytes, megabytes or whatever */

    /* Add some amount in order to round to the correct number of decimal
       places accurately: 0.5 for 0 d.p.s, 0.05 for 1 d.p. etc. */
    rounder = 0.5;
    for (j = 0; j < dp; j++)
      rounder /= 10.0;
    bytes += rounder;

    if (dp == 0) {  /* fractional part not wanted */
      fprintf(outf, "%*d", width, (int)bytes);
    }
    else {
      by1 = (int)bytes;    /* whole number of kilo/mega/etc. bytes */
      width -= MIN(width, dp + 1);  /* leave room for fractional part */
      fprintf(outf, "%*d", width, by1);
      by2 = (bytes - (double)by1);  /* fractional part */
      for (j = 0; j < dp; j++)
	by2 *= 10;
      od->outputter->putch(outf, od->decpt);
      fprintf(outf, "%0*d", dp, (int)by2);
    }
  }
}

double findunit(Outchoices *od, double n, unsigned int width[], choice *cols) {
  int w;
  double unit;
  int c;
  int i, j;

  w = (int)(od->outputter->pagewidth(od)) - (int)width[COL_TITLE] - 2;
  for (c = 0; cols[c] != COL_NUMBER; c++)
    w -= (int)width[cols[c]] + 2;
  w = MAX(w, (int)(od->mingraphwidth));
  /* unit must be nice amount: i.e., {1, 1.5, 2, 2.5, 3, 4, 5, 6, 8} * 10^n */
  unit = ((n - 1) / (double)w);
  j = 0;
  while (unit > 24.) {
    unit /= 10.;
    j++;
  }
  unit = (double)((int)unit);
  if (unit == 6.)
    unit = 7.;
  else if (unit == 8.)
      unit = 9.;
  else if (unit >= 20.)
    unit = 24.;
  else if (unit >= 15.)
    unit = 19.;
  else if (unit >= 10.)
    unit = 14.;
  unit += 1.;
  for (i = 0; i < j; i++) {
    unit *= 10.;
  }
  return(unit);
}

/* The widths which columns want to take. The od->outputters have their own
   version of this function, but usually they just call this one */
void calcwidths(Outchoices *od, choice rep, unsigned int width[],
		unsigned int *bmult, unsigned int *bmult7, double *unit,
		unsigned long maxr, unsigned long maxr7, unsigned long maxp,
		unsigned long maxp7, double maxb, double maxb7,
		unsigned long howmany) {
  /* width[COL_TITLE] should be set before calling this function. */
  /* width[COL_TITLE] == 0 signifies that the title is last and this function
     should calculate the remaining width. */
  /* *unit == 0 for timegraphs (and it's then set here); non-zero otherwise. */
  extern unsigned int *col2colhead;

  char repsepchar = od->repsepchar;
  char graphby = od->graph[rep];
  choice *cols = od->cols[rep];
  char **lngstr = od->lngstr;

  int w;
  unsigned int i;

  width[COL_REQS] = MAX(LEN3(log10i(maxr) + 1, repsepchar),
			od->outputter->strlength(lngstr[col2colhead[COL_REQS]]));
  width[COL_REQS7] = MAX(LEN3(log10i(maxr7) + 1, repsepchar),
			 od->outputter->strlength(lngstr[col2colhead[COL_REQS7]]));
  width[COL_PAGES] = MAX(LEN3(log10i(maxp) + 1, repsepchar),
			 od->outputter->strlength(lngstr[col2colhead[COL_PAGES]]));
  width[COL_PAGES7] = MAX(LEN3(log10i(maxp7) + 1, repsepchar),
			  od->outputter->strlength(lngstr[col2colhead[COL_PAGES7]]));
  if (od->rawbytes || maxb < 1024.0) {
    width[COL_BYTES] = MAX(LEN3(log10x(maxb) + 1, repsepchar),
			   od->outputter->strlength(lngstr[col2colhead[COL_BYTES]]));
    *bmult = 0;
  }
  else {
    *bmult = findbmult(maxb, od->bytesdp);
    width[COL_BYTES] =
      MAX(3 + od->bytesdp + (od->bytesdp != 0),
	  od->outputter->strlength(lngstr[col2colhead[COL_BYTES] + 1])
	  + od->outputter->strlength(lngstr[byteprefixabbr_ + *bmult]) - 1);
  }
  /* I have some misgivings about allowing the bmult7 to be different from
     the bmult. It's less immediately readable. But I think it's necessary,
     because maxb and maxb7 are quite often different orders of magnitude. */
  if (od->rawbytes || maxb7 < 1024.0) {
    width[COL_BYTES7] =
      MAX(LEN3(log10x(maxb7) + 1, repsepchar),
	  od->outputter->strlength(lngstr[col2colhead[COL_BYTES7]]));
    *bmult7 = 0;
  }
  else {
    *bmult7 = findbmult(maxb7, od->bytesdp);
    width[COL_BYTES7] =
      MAX(3 + od->bytesdp + (od->bytesdp != 0),
	  od->outputter->strlength(lngstr[col2colhead[COL_BYTES7] + 1])
	  + od->outputter->strlength(lngstr[byteprefixabbr_ + *bmult7]) - 1);
  }
  width[COL_PREQS] = MAX(6, od->outputter->strlength(lngstr[col2colhead[COL_PREQS]]));
  width[COL_PREQS7] =
    MAX(6, od->outputter->strlength(lngstr[col2colhead[COL_PREQS7]]));
  width[COL_PPAGES] =
    MAX(6, od->outputter->strlength(lngstr[col2colhead[COL_PPAGES]]));
  width[COL_PPAGES7] =
    MAX(6, od->outputter->strlength(lngstr[col2colhead[COL_PPAGES7]]));
  width[COL_PBYTES] =
    MAX(6, od->outputter->strlength(lngstr[col2colhead[COL_PBYTES]]));
  width[COL_PBYTES7] =
    MAX(6, od->outputter->strlength(lngstr[col2colhead[COL_PBYTES7]]));
  width[COL_DATE] = MAX(datefmtlen(od, lngstr[genrepdate_]),
			od->outputter->strlength(lngstr[col2colhead[COL_DATE]]));
  width[COL_TIME] = MAX(datefmtlen(od, lngstr[genreptime_]),
			od->outputter->strlength(lngstr[col2colhead[COL_TIME]]));
  width[COL_FIRSTD] = MAX(datefmtlen(od, lngstr[genrepdate_]),
			  od->outputter->strlength(lngstr[col2colhead[COL_FIRSTD]]));
  width[COL_FIRSTT] = MAX(datefmtlen(od, lngstr[genreptime_]),
			  od->outputter->strlength(lngstr[col2colhead[COL_FIRSTT]]));
  width[COL_INDEX] = MAX(LEN3(log10i(howmany) + 1, repsepchar),
			 od->outputter->strlength(lngstr[col2colhead[COL_INDEX]]));
  if (*unit == 0) { /* i.e. a timegraph */
    if (graphby == 'R' || graphby == 'r')
      *unit = findunit(od, (double)maxr, width, cols);
    else if (graphby == 'P' || graphby == 'p')
      *unit = findunit(od, (double)maxp, width, cols);
    else {
      for (i = 0; i < *bmult; i++)
	maxb /= 1024;
      if (*bmult > 0)
	maxb *= 1000;
      *unit = findunit(od, maxb, width, cols);
      if (*bmult > 0)
	*unit /= 1000;
    }
  }
  if (width[COL_TITLE] == 0) {
    w = (int)(od->outputter->pagewidth(od));
    for (i = 0; cols[i] != COL_NUMBER; i++)
      w -= (int)width[cols[i]] + 2;
    width[COL_TITLE] = (unsigned int)MAX(0, w);
  }

}

unsigned int alphatreewidth(Outchoices *od, choice rep, Hashtable *tree,
			    unsigned int level, Strlist *partname) {
  /* Calculate width needed for Organisation Report.
     Constructing the name is basically the same code as printtree(). */
  extern char *workspace;

  char *name;
  size_t need = (size_t)level + 3;
  Strlist *pn, s;
  Hashindex *p;
  unsigned int tw = 0, tmp;

  if (tree == NULL || tree->head[0] == NULL)
    return(0);
  for (p = tree->head[0]; p != NULL; TO_NEXT(p)) {
    name = maketreename(partname, p, &pn, &s, need, rep, TRUE);
    if (!STREQ(name, LNGSTR_NODOMAIN) && !STREQ(name, LNGSTR_UNKDOMAIN) &&
	!ISDIGIT(name[strlen(name) - 1])) { /* ignore left-aligned ones */
      strcpy(workspace, name);
      do_aliasx(workspace, od->aliashead[G(rep)]);
      tmp = od->outputter->strlength(workspace) + 2 * level;
                       /* will be printed with 2 trailing spaces per level */
      tw = MAX(tw, tmp);
      tmp = alphatreewidth(od, rep, (Hashtable *)(p->other), level + 1, pn);
      tw = MAX(tw, tmp);
      /* The second tmp will of course be bigger unless there are aliases
	 (if there are any children at all). */
    }
  }
  return(tw);
}

/* Declare the floor and sortby for a report. The od->outputters have their own
   version of this function, but most of them just call this one to sort out
   all the language strings. */
void whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n,
		  Dateman *dman) {
  extern char *byteprefix;
  extern unsigned int *method2sing, *method2pl, *method2date, *method2pc;
  extern unsigned int *method2relpc, *method2sort;

  char **lngstr = od->lngstr;
  choice sortby = od->sortby[G(rep)];
  double floormin = od->floor[G(rep)].min;
  char floorqual = od->floor[G(rep)].qual;
  choice floorby = od->floor[G(rep)].floorby;
  char *gens = lngstr[rep2lng[rep] + 1];
  char *genp = lngstr[rep2lng[rep] + 2];
  char gender = lngstr[rep2lng[rep] + 3][0];
  choice requests = rep2reqs[G(rep)];
  choice requests7 = rep2reqs7[G(rep)];
  choice date = rep2date[G(rep)];
  choice firstd = rep2firstd[G(rep)];

  int firsts, firstds, alls, sorted, alphsort, unsort, bmult;
  char *lngs, *c;
  static char *t = NULL;
  static size_t tlen = 0;
  unsigned long temp = 0;
  unsigned long temp2;
  int i;
  timecode_t tempd;

  if (gender == 'm') {
    firsts = firstsm_;
    firstds = firstdsm_;
    alls = allsm_;
    sorted = sortedm_;
    alphsort = STREQ(gens, lngstr[codegs_])?numsortm_:alphasortm_;
    unsort = unsortedm_;            /* quickest kludge for only one report */
  }
  else if (gender == 'f') {
    firsts = firstsf_;
    firstds = firstdsf_;
    alls = allsf_;
    sorted = sortedf_;
    alphsort = STREQ(gens, lngstr[codegs_])?numsortf_:alphasortf_;
    unsort = unsortedf_;
  }
  else { /* gender == 'n' */
    firsts = firstsn_;
    firstds = firstdsn_;
    alls = allsn_;
    sorted = sortedn_;
    alphsort = STREQ(gens, lngstr[codegs_])?numsortn_:alphasortn_;
    unsort = unsortedn_;
  }

  /* see also report_floor() in settings.c */
  od->outputter->whatinchead(outf, od);
  if (floormin < 0 && n < (unsigned long)(-floormin + EPSILON))
    floormin = 1;  /* not enough items for requested -ve floor */
  /* floormin = 1 will work even for date sort because it will be before
     dman->firsttime. With very high probability. :) */
  if (floormin < 0) {
    temp = (unsigned long)(-floormin + EPSILON);
    if (temp == 1) {
      ENSURE_LEN(t, tlen, strlen(lngstr[firsts]) + strlen(gens) + 1);
      sprintf(t, lngstr[firsts], gens);
      od->outputter->whatincprintstr(outf, od, t);
    }
    else {
      for (temp2 = temp, i = 1; temp2 >= 10; temp2 /= 10)
	i++;
      ENSURE_LEN(t, tlen, strlen(lngstr[firstds]) + strlen(genp) + i + 1);
      sprintf(t, lngstr[firstds], temp, genp);
      od->outputter->whatincprintstr(outf, od, t);
    }
    od->outputter->whatincprintstr(outf, od, " ");
    od->outputter->whatincprintstr(outf, od, lngstr[floorby_]);
    od->outputter->whatincprintstr(outf, od, " ");
    if (floorby == REQUESTS)
      od->outputter->whatincprintstr(outf, od, lngstr[method2sort[requests]]);
    else if (floorby == REQUESTS7)
      od->outputter->whatincprintstr(outf, od, lngstr[method2sort[requests7]]);
    else if (floorby == DATESORT)
      od->outputter->whatincprintstr(outf, od, lngstr[method2sort[date]]);
    else if (floorby == FIRSTDATE)
      od->outputter->whatincprintstr(outf, od, lngstr[method2sort[firstd]]);
    else
      od->outputter->whatincprintstr(outf, od, lngstr[method2sort[floorby]]);
  }
  else {   /* floormin >= 0 */
    ENSURE_LEN(t, tlen, strlen(lngstr[alls]) + strlen(genp) + 1);
    sprintf(t, lngstr[alls], genp);
    od->outputter->whatincprintstr(outf, od, t);
    if (floormin < 2 - EPSILON && floorqual == '\0' && floorby == REQUESTS)
      floormin = 0;  /* Report 1r as 0r */
    if (floorby == DATESORT || floorby == FIRSTDATE) {
      tempd = (timecode_t)(floormin + EPSILON);
      if (tempd > dman->firsttime) {
	od->outputter->whatincprintstr(outf, od, " ");
	od->outputter->whatincprintstr(outf, od,
		   lngstr[method2date[(floorby == DATESORT)?date:firstd]]);
	od->outputter->whatincprintstr(outf, od, " ");
	od->outputter->whatincprintstr(outf, od, timesprintf(od, lngstr[whatincfmt_],
						     tempd, UNSET));
      }
    }
    else if (floormin > EPSILON) {
      od->outputter->whatincprintstr(outf, od, " ");
      od->outputter->whatincprintstr(outf, od, lngstr[atleast_]);
      od->outputter->whatincprintstr(outf, od, " ");
      if (floorqual == '\0') {
	temp = (unsigned long)(floormin + EPSILON);
	for (temp2 = temp, i = 1; temp2 >= 10; temp2 /= 10)
	  i++;
	ENSURE_LEN(t, tlen, i + 1);
	sprintf(t, "%lu", temp);
	od->outputter->whatincprintstr(outf, od, t);
	od->outputter->whatincprintstr(outf, od, " ");
	if (floorby == REQUESTS)
	  od->outputter->whatincprintstr(outf, od, (temp == 1)?\
		  lngstr[method2sing[requests]]:lngstr[method2pl[requests]]);
	else if (floorby == REQUESTS7)
	  od->outputter->whatincprintstr(outf, od, (temp == 1)?\
		  lngstr[method2sing[requests7]]:\
		  lngstr[method2pl[requests7]]);
	else
	  od->outputter->whatincprintstr(outf, od, (temp == 1)?\
		  lngstr[method2sing[floorby]]:lngstr[method2pl[floorby]]);
      }
      else {  /* floorqual != '\0' */
	od->outputter->printdouble(outf, od, floormin);
	if (floorqual == '%') {
	  if (floorby == REQUESTS)
	    c = lngstr[method2pc[requests]];
	  else if (floorby == REQUESTS7)
	    c = lngstr[method2pc[requests7]];
	  else
	    c = lngstr[method2pc[floorby]];
	  od->outputter->whatincprintstr(outf, od, c);
	}
	else if (floorqual == ':') {
	  if (floorby == REQUESTS)
	    c = lngstr[method2relpc[requests]];
	  else if (floorby == REQUESTS7)
	    c = lngstr[method2relpc[requests7]];
	  else
	    c = lngstr[method2relpc[floorby]];
	  od->outputter->whatincprintstr(outf, od, c);
	}
	else { /* if qual is anything else, must be (k|M|G|T|etc.)bytes */
	  lngs = (floorby == BYTES)?lngstr[xbytestraffic_]:\
	    lngstr[xbytestraffic7_];
	  if (strchr(byteprefix, floorqual) == NULL)  /* shouldn't happen */
	    bmult = 1;
	  else
	    bmult = strchr(byteprefix, floorqual) - byteprefix;
	  c = strchr(lngs, '?');  /* checked during initialisation */
	  *c = '\0';
	  od->outputter->whatincprintstr(outf, od, " ");
	  od->outputter->whatincprintstr(outf, od, lngs);
	  od->outputter->whatincprintstr(outf, od,
					 lngstr[byteprefix_ + bmult]);
	  od->outputter->whatincprintstr(outf, od, c + 1);
	  *c = '?';
	}
      }   /* end floorqual != '\0' */
    }     /* end floormin > EPSILON */
  }       /* end floormin > 0 */
  /* That completes the floor; now we are just left with the sortby */
  if (floormin >= 0 || temp != 1) { /* else only one item, so no sort */
    if (floormin < 0 && sortby == RANDOM)
      sortby = floorby;
    od->outputter->whatincprintstr(outf, od, ", ");
    if (sortby == ALPHABETICAL)
      od->outputter->whatincprintstr(outf, od, lngstr[alphsort]);
    else if (sortby == RANDOM)
      od->outputter->whatincprintstr(outf, od, lngstr[unsort]);
    else {
      od->outputter->whatincprintstr(outf, od, lngstr[sorted]);
      od->outputter->whatincprintstr(outf, od, " ");
      if (sortby == REQUESTS)
	od->outputter->whatincprintstr(outf, od,
				       lngstr[method2sort[requests]]);
      else if (sortby == REQUESTS7)
	od->outputter->whatincprintstr(outf, od,
				       lngstr[method2sort[requests7]]);
      else if (sortby == DATESORT)
	od->outputter->whatincprintstr(outf, od, lngstr[method2sort[date]]);
      else if (sortby == FIRSTDATE)
	od->outputter->whatincprintstr(outf, od, lngstr[method2sort[firstd]]);
      else
	od->outputter->whatincprintstr(outf, od, lngstr[method2sort[sortby]]);
    }
  }
  od->outputter->whatincprintstr(outf, od, ".");
  od->outputter->whatincfoot(outf, od);
}

void barchart(FILE *outf, Outchoices *od, char graphby, unsigned long reqs,
	      unsigned long pages, double bys, double unit) {
  double x;
  int y;

  if (graphby == 'P' || graphby == 'p')
    x = (double)pages - 0.5;
  else if (graphby == 'R' || graphby == 'r')
    x = (double)reqs - 0.5;
  else
    x = bys;
  x /= unit;
  x += 1;
  y = (int)x;

  od->outputter->barchart(outf, od, y, graphby);
}

void colheads(FILE *outf, Outchoices *od, choice rep, unsigned int width[],
	      unsigned int bmult, unsigned int bmult7, logical name1st) {
  extern unsigned int *col2colhead, *rep2colhead;
  static char *bcolname = NULL;
  static size_t bcolnamelen = 0;

  char **lngstr = od->lngstr;
  choice *cols = od->cols[rep];

  char *colname, *d;
  unsigned int c, bm;

  /* Column headers */

  od->outputter->colheadstart(outf, od, rep);

  if (name1st)
    od->outputter->colheadcol(outf, od, rep, COL_TITLE, width[COL_TITLE],
			      lngstr[rep2colhead[rep]], FALSE);
  for (c = 0; cols[c] != COL_NUMBER; c++) {
    if (cols[c] == COL_BYTES)
      bm = bmult;
    else if (cols[c] == COL_BYTES7)
      bm = bmult7;
    else
      bm = 0;

    if (bm == 0)
      colname = lngstr[col2colhead[cols[c]]];
    else {  /* special case for bytes: insert kilo, mega, etc. */
      colname = lngstr[col2colhead[cols[c]] + 1];
      d = strchr(colname, '?');  /* checked during initialisation */
      *d = '\0';
      ENSURE_LEN(bcolname, bcolnamelen,
		 strlen(colname) + strlen(lngstr[byteprefixabbr_ + bm]) +
		 strlen(d + 1) + 1);
      sprintf(bcolname, "%s%s%s", colname, lngstr[byteprefixabbr_ + bm],
	      d + 1);
      *d = '?';
      colname = bcolname;
    }
    od->outputter->colheadcol(outf, od, rep, cols[c], width[cols[c]], colname,
			      FALSE);
  }  /* for (c = 0) */
  if (!name1st)
    od->outputter->colheadcol(outf, od, rep, COL_TITLE, width[COL_TITLE],
			      lngstr[rep2colhead[rep]], TRUE);
      
  od->outputter->colheadend(outf, od, rep);

  /* Underlinings */

  od->outputter->colheadustart(outf, od, rep);
 
  if (name1st)
    od->outputter->colheadunderline(outf, od, rep, COL_TITLE,
				width[COL_TITLE], ""); 
  for (c = 0; cols[c] != COL_NUMBER; c++)
    od->outputter->colheadunderline(outf, od, rep, cols[c], width[cols[c]],
				    ""); 
  if (!name1st)
    od->outputter->colheadunderline(outf, od, rep, COL_TITLE, 0,
				lngstr[rep2colhead[rep]]); 

  od->outputter->colheaduend(outf, od, rep);
}

void printcols(FILE *outf, Outchoices *od, choice rep, unsigned long reqs,
	       unsigned long reqs7, unsigned long pages, unsigned long pages7,
	       double bys, double bys7, long index, int level,
	       unsigned long totr, unsigned long totr7, unsigned long totp,
	       unsigned long totp7, double totb, double totb7,
	       unsigned int width[], unsigned int bmult, unsigned int bmult7,
	       double unit, logical name1st, logical rightalign, char *name,
	       logical ispage, unsigned int spaces, Include *linkhead,
	       char *baseurl, char *datefmt, char *timefmt, datecode_t date,
	       unsigned int hr, unsigned int min, datecode_t date2,
	       unsigned int hr2, unsigned int min2) {
  /* 'level' is -1 for time reports, 0 for other non-hierarchical reports,
     and starts at 1 for hierarchical reports. */
  /* For time reps, date2, hr2 & min2 carry the end of the interval; for
     genreps, date2, hr2 & min2 carry the time of first request. */

  choice *cols = od->cols[rep];
  logical timerep = (rep < DATEREP_NUMBER);
  char graphby = timerep?(od->graph[rep]):'\0';

  choice source;
  char *datestr;
  unsigned int c, i;

  od->outputter->rowstart(outf, od, rep, cols, level, name, datefmt, timefmt);

  if (timerep) {
    name = datesprintf(od, datefmt, date, hr, min, date2, hr2, min2, FALSE,
		       UNSET);
    source = AS_IS;
  }
  else if (rep == REP_SIZE || rep == REP_PROCTIME)
    source = TRUSTED;
  else 
    source = UNTRUSTED;

  od->outputter->namecell(outf, od, rep, name, source, width[COL_TITLE],
			  name1st, TRUE, FALSE, NULL, NULL, FALSE, 0, NULL);

  od->outputter->levelcell(outf, od, rep, level);

  for (c = 0; cols[c] != COL_NUMBER; c++) {
    switch(cols[c]) {
    case COL_REQS:
      od->outputter->ulcell(outf, od, rep, cols[c], reqs, width[cols[c]]);
      break;
    case COL_REQS7:
      od->outputter->ulcell(outf, od, rep, cols[c], reqs7, width[cols[c]]);
      break;
    case COL_PREQS:
      od->outputter->pccell(outf, od, rep, cols[c], (double)reqs, (double)totr,
			width[cols[c]]);
      break;
    case COL_PREQS7:
      od->outputter->pccell(outf, od, rep, cols[c], (double)reqs7,
			    (double)totr7, width[cols[c]]);
      break;
    case COL_PAGES:
      od->outputter->ulcell(outf, od, rep, cols[c], pages, width[cols[c]]);
      break;
    case COL_PAGES7: 
      od->outputter->ulcell(outf, od, rep, cols[c], pages7, width[cols[c]]);
      break;
    case COL_PPAGES:
      od->outputter->pccell(outf, od, rep, cols[c], (double)pages,
			    (double)totp, width[cols[c]]);
      break;
    case COL_PPAGES7:
      od->outputter->pccell(outf, od, rep, cols[c], (double)pages7,
			    (double)totp7, width[cols[c]]);
      break;
    case COL_BYTES:
      od->outputter->bytescell(outf, od, rep, cols[c], bys, bmult,
			       width[cols[c]]);
      break;
    case COL_BYTES7:
      od->outputter->bytescell(outf, od, rep, cols[c], bys7, bmult7,
			   width[cols[c]]);
      break;
    case COL_PBYTES:
      od->outputter->pccell(outf, od, rep, cols[c], bys, totb, width[cols[c]]);
      break;
    case COL_PBYTES7:
      od->outputter->pccell(outf, od, rep, cols[c], bys7, totb7,
			    width[cols[c]]);
      break;
    case COL_DATE:
    case COL_TIME:
    case COL_FIRSTD:
    case COL_FIRSTT:
      if (cols[c] == COL_DATE || cols[c] == COL_TIME)
	datestr = datesprintf(od, (cols[c] == COL_DATE)?datefmt:timefmt,
			      date, hr, min, 0, 0, 0, FALSE, UNSET);
      else
	datestr = datesprintf(od, (cols[c] == COL_FIRSTD)?datefmt:timefmt,
			      date2, hr2, min2, 0, 0, 0, FALSE, UNSET);
      od->outputter->strcell(outf, od, rep, cols[c], datestr, width[cols[c]]);
      break;
    case COL_INDEX:
      od->outputter->indexcell(outf, od, rep, cols[c], index, width[cols[c]]);
      break;
    }
  }

  if (timerep) {
    for (i = 0; i < (int)bmult; i++)
      bys /= 1024;
    barchart(outf, od, graphby, reqs, pages, bys, unit);
  }

  if (name == NULL)
     return;   /* calling function supplies name and newline */

  if (rep == REP_CODE)
    source = TRUSTED;
  else 
    source = UNTRUSTED;
  od->outputter->namecell(outf, od, rep, name, source, width[COL_TITLE],
			  name1st, FALSE, rightalign,
			  G(rep)>=0?od->aliashead[G(rep)]:NULL, linkhead,
			  ispage, spaces, baseurl);

  od->outputter->rowend(outf, od, rep);
}

/*** Now some stuff for the General Summary ***/

void distcount(Hashindex *gooditems, Hashindex *baditems, choice requests,
	       choice requests7, unsigned long *tot, unsigned long *tot7) {
  Hashindex *p;

  for (p = gooditems, *tot = 0, *tot7 = 0; p != NULL; TO_NEXT(p)) {
    if (p->own != NULL) {
      if (p->own->data[requests] > 0)
	(*tot)++;
      if (p->own->data[requests7] > 0)
	(*tot7)++;
    }
  }
  for (p = baditems; p != NULL; TO_NEXT(p)) {
    if (p->own != NULL) {
      if (p->own->data[requests] > 0)
	(*tot)++;
      if (p->own->data[requests7] > 0)
	(*tot7)++;
    }
  }
}

void gensumline(FILE *outf, Outchoices *od, char codeletter, int namecode,
		unsigned long x, unsigned long x7, logical isaverage) {
  if (strchr(od->gensumlines, codeletter) == NULL)
    return;

  if (x == (unsigned long)UNSET)
    return;

  if (x == 0 && namecode != succreqs_)
    return;

  od->outputter->gensumline(outf, od, namecode, x, x7, isaverage);
}

void gensumlineb(FILE *outf, Outchoices *od, char codeletter, int namecode,
		 double x, double x7, logical isaverage) {
  /* same as gensumline() but for bytes */

  if (strchr(od->gensumlines, codeletter) == NULL)
    return;

  if (x <= 0)
    return;

  od->outputter->gensumlineb(outf, od, namecode, x, x7, isaverage);
}

logical checkonerep(Outchoices *od, Hashindex *gp, choice rep, choice requests,
		    cutfnp cutfn, dcutfnp dcutfn, void *darg) {
  extern Memman *amemman;

  static char *newname = NULL, *dnewname = NULL;
  static size_t len = 0, dlen = 0;

  char *namestart, *nameend, *name;
  choice rc;

  /* Procedure: go through all the entries. If the report will use that entry
     (it has any requests, and the name is included()) turn the report on.
     To calculate the name, we have to call cutfn if the report is a tree
     report, and/or (dcutfn and alias) if it is a dervrep. */
  for ( ; gp != NULL; TO_NEXT(gp)) {
    if (gp->own != NULL && gp->own->data[requests] > 0) {
      name = gp->name;
      if (cutfn == NULL && dcutfn != NULL) {
	/* The search reports. Here dcutfn can produce zero or multiple answers
	   for each name, and we have to check them all. */
	namestart = NULL;
	for (dcutfn(&namestart, &nameend, name, darg); namestart != NULL;
	     dcutfn(&namestart, &nameend, name, darg)) {
	  ENSURE_LEN(dnewname, dlen, (size_t)(nameend - namestart + 1));
	  memcpy((void *)dnewname, (void *)namestart,
		 (size_t)(nameend - namestart));
	  dnewname[nameend - namestart] = '\0';
	  if ((rc = do_alias(dnewname, amemman, NULL, NULL, 0, FALSE,
			     od->convfloor, od->multibyte, rep)) != ERR) {
	    name = rc?((char *)(amemman->curr_pos)):dnewname;
	    if (included(name, FALSE, od->wanthead[G(rep)]))
	      return(TRUE);
	  }
	}
      }
      else {
	/* otherwise each name produces just one answer to check; the name
	   itself, or if a tree report the name at the top level of the tree */
	if (cutfn != NULL) {  /* if it's a tree report */
	  if (dcutfn != NULL) {  /* if it's also a derv report */
	    /* Here we rely on the fact that if it's both a tree rep and a derv
	       rep, then dcutfn will produce exactly one name. (See comment on
	       dcutfnp in tree.c). */
	    namestart = NULL;
	    dcutfn(&namestart, &nameend, name, darg);
	    ENSURE_LEN(dnewname, dlen, (size_t)(nameend - namestart + 1));
	    memcpy((void *)dnewname, (void *)namestart,
		   (size_t)(nameend - namestart));
	    dnewname[nameend - namestart] = '\0';
	    if ((rc = do_alias(dnewname, amemman, NULL, NULL, 0, FALSE,
			       od->convfloor, od->multibyte, rep)) == ERR)
	      name = NULL;
	    else
	      name = rc?((char *)(amemman->curr_pos)):dnewname;
	  }
	  if (name != NULL) {
	    namestart = NULL;
	    cutfn(&namestart, &nameend, name, FALSE);
	    ENSURE_LEN(newname, len, (size_t)(nameend - namestart + 1));
	    memcpy((void *)newname, (void *)namestart,
		   (size_t)(nameend - namestart));
	    newname[nameend - namestart] = '\0';
	    name = newname;
	  }
	}
	if (name != NULL &&
	    included(name, gp->own->ispage, od->wanthead[G(rep)]))
	  return(TRUE);
      }
    }
  }
  return(FALSE);  /* nothing matched, so turn the report off */
}

logical checktreerep(Outchoices *od, Hashtable *tp, choice rep,
		     choice requests, cutfnp cutfn) {
  unsigned long i;

  for (i = 0; i < tp->size; i++) {
    if (checkonerep(od, tp->head[i], rep, requests, cutfn, NULL, NULL))
      return(TRUE);
  }
  return(FALSE);
}

logical checkarrayrep(Arraydata *array) {
  choice i;

  for (i = 0; ; i++) {
    if (array[i].reqs > 0)
      return(TRUE);
    if (array[i].threshold < -0.5)
      return(FALSE);
  }
}

void checkreps(Outchoices *od, Dateman *dman, Hashindex **gooditems,
	       Arraydata **arraydata,
	       choice data2cols[ITEM_NUMBER][DATA_NUMBER]) {
  extern logical *repistree;

  logical *repq = od->repq;

  cutfnp cutfn;
  dcutfnp dcutfn;
  void *darg;
  choice rep;
  int j;
  choice ok;

  if (dman->currdp == NULL) {
    for (rep = 0; rep < DATEREP_NUMBER; rep++) {
      if (repq[rep]) {
	warn('R', TRUE, "Turning off empty time reports");
	for ( ; rep < DATEREP_NUMBER; rep++)
	  repq[rep] = FALSE;
      }
    }
  }
  for (rep = FIRST_GENREP; rep <= LAST_NORMALREP; rep++) {
    cutfn = repistree[G(rep)]?(od->tree[G(rep)]->cutfn):NULL;
    dcutfn = (rep >= FIRST_DERVREP)?(od->derv[rep - FIRST_DERVREP]->cutfn):\
      NULL;
    darg = (rep >= FIRST_DERVREP)?(od->derv[rep - FIRST_DERVREP]->arg):NULL;
    for (ok = 0, j = 0; od->alltrees[j] != REP_NUMBER; j++) {
      if (rep == od->alltrees[j])
	ok = 1;
    }
    for (j = 0; od->alldervs[j] != REP_NUMBER; j++) {
      if (rep == od->alldervs[j])
	ok = 2;
    }
    if (ok) {
      if (!checktreerep(od, (ok == 1)?(od->tree[G(rep)]->tree):\
			(od->derv[rep - FIRST_DERVREP]->table), rep,
			data2cols[rep2type[rep]][rep2reqs[G(rep)]],
			(ok == 1)?NULL:cutfn)) {
	/* If ok == 1, tree made, so done cutfn already; if ok == 2, made derv
	   but not tree, so still need cutfn. NB i in alltrees or alldervs
	   implies repq so don't have to check that. */
	warn('R', TRUE, "Turning off empty %s", repname[rep]);
	repq[rep] = FALSE;
      }
    }
    else if (repq[rep]) {
      if (!checkonerep(od, gooditems[rep2type[rep]], rep,
		       data2cols[rep2type[rep]][rep2reqs[G(rep)]], cutfn,
		       dcutfn, darg)) {
	warn('R', TRUE, "Turning off empty %s", repname[rep]);
	repq[rep] = FALSE;
      }
    }
  }
  for ( ; rep < REP_NUMBER; rep++) {
    if (repq[rep] && !checkarrayrep(arraydata[rep - FIRST_ARRAYREP])) {
      warn('R', TRUE, "Turning off empty %s", repname[rep]);
      repq[rep] = FALSE;
    }
  }
}
analog-6.0/src/outxhtml.c0000644000175000017500000006650610161303543015566 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** outxhtml.c; XHTML output ***/

#include "anlghea3.h"

/* Page width */
unsigned int xhtml_pagewidth(Outchoices *od) {
  return od->htmlpagewidth;  /* only used to guide the bar chart width */
}

/* The top of the output if we are in CGI mode */
void xhtml_cgihead(FILE *outf, Outchoices *od) {
  fprintf(outf, "Content-Type: application/xhtml+xml; charset=%s\n\n",
	  od->lngstr[charset_]);
}

/* Stuff this output style needs in the page header */
void xhtml_stylehead(FILE *outf, Outchoices *od) {
  fprintf(outf, "\n",
	  od->lngstr[charset_]);
  if (strcaseeq(od->stylesheet, "none"))
    fputs("\n",
	  outf);
  else {
    fputs("stylesheet, IN_HREF);
    fputs("\" type=\"text/css\"?>\n", outf);
  }
  fputs("\n", outf);
  fputs("\n", outf);
  fputs("\n", outf);
  fprintf(outf, "%s ", od->lngstr[webstatsfor_]);
  xhtmlputs(outf, od, od->hostname, FROM_CFG);
  fputs("\n", outf);
  fprintf(outf, "\n", od->lngstr[charset_]);
  if (od->norobots)
    fputs("\n", outf);
  fprintf(outf, "\n",
	  VERSION);
  if (!strcaseeq(od->stylesheet, "none")) {
    fputs("stylesheet, IN_HREF);
    fputs("\" rel=\"stylesheet\" />\n", outf);
  }
  else { /* default style sheet inline if no external style sheet specified */
    fprintf(outf, "\n");
  }  /* end of style sheet */
  fputs("\n", outf);
  fputs("\n", outf);
}

/* The title of the page, plus the user's HEADERFILE */
void xhtml_pagetitle(FILE *outf, Outchoices *od) {
  fprintf(outf, "
", od->cssprefix); fputs("

logourl, "none")) { fputs(" href=\"", outf); xhtmlputs(outf, od, od->logourl, IN_HREF); fputs("\"", outf); } fputs(">", outf); if (!strcaseeq(od->logo, "none")) { fputs("logo[0] != '/' && strstr(od->logo, "://") == NULL) xhtmlputs(outf, od, od->imagedir, IN_HREF); xhtmlputs(outf, od, od->logo, IN_HREF); if (STREQ(od->logo, "analogo")) fprintf(outf, ".%s", od->pngimages?"png":"gif"); /* Above: '.' not EXTSEP even on RISC OS */ fputs("\" alt=\"\" /> ", outf); /* close here if logo */ } if (strcaseeq(od->hosturl, "none")) { fprintf(outf, "%s ", od->lngstr[webstatsfor_]); xhtmlputs(outf, od, od->hostname, FROM_CFG); if (strcaseeq(od->logo, "none")) fputs("", outf); /* close here if no logo */ } else { fputs(od->lngstr[webstatsfor_], outf); if (strcaseeq(od->logo, "none")) fputs("", outf); /* close here if no logo */ fputs(" hosturl, IN_HREF); fputs("\">", outf); xhtmlputs(outf, od, od->hostname, FROM_CFG); fputs("", outf); } fputs("

\n\n", outf); if (!strcaseeq(od->headerfile, "none")) xhtml_includefile(outf, od, od->headerfile, 'h'); } /* Program start time, and logfile start and end times */ void xhtml_timings(FILE *outf, Outchoices *od, Dateman *dman) { extern timecode_t starttimec; char **lngstr = od->lngstr; double t0; int t1, t2; if (!od->runtime && dman->firsttime > dman->lasttime) return; /* Nothing to show, avoid printing

*/ fprintf(outf, "

", od->cssprefix); if (od->runtime) fprintf(outf, "%s %s.", lngstr[progstart_], timesprintf(od, lngstr[datefmt2_], starttimec, UNSET)); if (dman->firsttime <= dman->lasttime) { if (od->runtime) fputs("\n
", outf); fprintf(outf, "%s %s ", lngstr[reqstart_], timesprintf(od, lngstr[datefmt2_], dman->firsttime, UNSET)); fprintf(outf, "%s %s", lngstr[to_], timesprintf(od, lngstr[datefmt2_], dman->lasttime, UNSET)); t0 = (dman->lasttime - dman->firsttime) / 1440.0 + 0.005; t1 = (int)t0; t2 = (int)(100 * (t0 - (double)t1)); fprintf(outf, " (%d", t1); xhtml_putch(outf, od->decpt); fprintf(outf, "%02d %s).

\n", t2, lngstr[days_]); } else fputs("

\n", outf); } /* Finishing the top of the page */ void xhtml_closehead(FILE *outf, Outchoices *od) { fputs("
\n", outf); if (od->gotos == FEW) xhtml_gotos(outf, od, -1); } /* Starting the bottom of the page */ void xhtml_pagebotstart(FILE *outf, Outchoices *od) { fprintf(outf, "
", od->cssprefix); } /* The credit line at the bottom of the page */ void xhtml_credit(FILE *outf, Outchoices *od) { fprintf(outf, "

%s analog %s.\n", od->cssprefix, od->lngstr[credit_], ANALOGURL, VNUMBER); } /* The program run time */ void xhtml_runtime(FILE *outf, Outchoices *od, long secs) { char **lngstr = od->lngstr; fprintf(outf, "
%s: ", od->cssprefix, lngstr[runtime_]); if (secs == 0) fprintf(outf, "%s %s.\n", lngstr[lessone_], lngstr[second_]); else if (secs < 60) fprintf(outf, "%ld %s.\n", secs, (secs == 1)?lngstr[second_]:lngstr[seconds_]); else fprintf(outf, "%ld %s, %ld %s.\n", secs / 60, (secs < 120)?lngstr[minute_]:lngstr[minutes_], secs % 60, (secs % 60 == 1)?lngstr[second_]:lngstr[seconds_]); } /* The page footer, including the user's FOOTERFILE */ void xhtml_pagefoot(FILE *outf, Outchoices *od) { fputs("

\n", outf); if (od->gotos != FALSE) xhtml_gotos(outf, od, -1); fputs("
\n", outf); if (!strcaseeq(od->footerfile, "none")) xhtml_includefile(outf, od, od->footerfile, 'f'); } /* Footer material for this output style */ void xhtml_stylefoot(FILE *outf, Outchoices *od) { fputs("\n\n", outf); } /* Report title */ void xhtml_reporttitle(FILE *outf, Outchoices *od, choice rep) { extern char *anchorname[]; extern unsigned int *rep2lng; fprintf(outf, "
", od->cssprefix, anchorname[rep]); fprintf(outf, "

%s

\n", anchorname[rep], anchorname[rep], od->lngstr[rep2lng[rep]]); if (od->gotos == TRUE) xhtml_gotos(outf, od, rep); } /* Report footer */ void xhtml_reportfooter(FILE *outf, Outchoices *od, choice rep) { fputs("
", outf); } /* Report description */ void xhtml_reportdesc(FILE *outf, Outchoices *od, choice rep) { fprintf(outf, "

%s

\n", od->cssprefix, od->descstr[rep]); } /* The time period spanned by the report */ void xhtml_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind) { /* NB Can't combine next two lines because timesprintf uses static buffer. */ fprintf(outf, "

%s %s ", od->cssprefix, od->lngstr[repspan_], timesprintf(od, od->lngstr[datefmt2_], mind, UNSET)); fprintf(outf, "%s %s.

\n", od->lngstr[to_], timesprintf(od, od->lngstr[datefmt2_], maxd, UNSET)); } /* General Summary header */ void xhtml_gensumhead(FILE *outf, Outchoices *od) { } /* General Summary footer */ void xhtml_gensumfoot(FILE *outf, Outchoices *od) { fputs("

\n", outf); } /* Single General Summary line, long data */ void xhtml_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage) { /* If this is the first Gen Sum line, open the paragraph. (succreqs_ is always printed, and is always first). */ if (namecode == succreqs_) fprintf(outf, "

\n", od->cssprefix); /* If it isn't, then put a line break. */ else fputs("
", outf); fprintf(outf, "%s%s ", od->cssprefix, od->lngstr[namecode], od->lngstr[colon_]); f3printf(outf, od, (double)x, 0, od->sepchar); if (x7 != (unsigned long)UNSET) { fputs(" (", outf); f3printf(outf, od, (double)x7, 0, od->sepchar); putc(')', outf); } putc('\n', outf); } /* Single General Summary line, bytes data */ void xhtml_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage) { char **lngstr = od->lngstr; unsigned int bm; char *c; fprintf(outf, "
%s%s ", od->cssprefix, lngstr[namecode], lngstr[colon_]); bm = (od->rawbytes)?0:findbmult(x, od->bytesdp); printbytes(outf, od, x, bm, 0, od->sepchar); if (bm > 0) { c = strchr(lngstr[xbytes_], '?'); *c = '\0'; fprintf(outf, " %s%s%s", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1); *c = '?'; } else fprintf(outf, " %s", lngstr[bytes_]); if (x7 != UNSET) { fputs(" (", outf); bm = (od->rawbytes)?0:findbmult(x7, od->bytesdp); printbytes(outf, od, x7, bm, 0, od->sepchar); if (bm > 0) { c = strchr(lngstr[xbytes_], '?'); *c = '\0'; fprintf(outf, " %s%s%s)", lngstr[xbytes_], lngstr[byteprefix_ + bm], c + 1); *c = '?'; } else fprintf(outf, " %s)", lngstr[bytes_]); } putc('\n', outf); } /* "Last seven" explanation line */ void xhtml_lastseven(FILE *outf, Outchoices *od, timecode_t last7to) { fprintf(outf, "

", od->cssprefix); fprintf(outf, "%s %s %s.

\n", od->lngstr[brackets_], od->lngstr[sevendaysto_], timesprintf(od, od->lngstr[datefmt1_], last7to, UNSET)); } /* Start of a
 section */
void xhtml_prestart(FILE *outf, Outchoices *od) {
  fputs("\n", outf);
}

/* End of a 
 section */
void xhtml_preend(FILE *outf, Outchoices *od) {
  fputs("
\n", outf); } /* A horizontal rule */ void xhtml_hrule(FILE *outf, Outchoices *od) { } /* An en dash */ char *xhtml_endash(void) { return "–"; } /* putc with special characters escaped */ void xhtml_putch(FILE *outf, char c) { if (c == '<') fputs("<", outf); else if (c == '>') fputs(">", outf); else if (c == '&') fputs("&", outf); else if (c == '"') fputs(""", outf); else putc(c, outf); } /* strlen for XHTML strings. Assume string contains no &'s except as markup. May be switched to html_strlength_utf8 or html_strlength_jis in outhtml.c, depending on the output character set. */ size_t xhtml_strlength(const char *s) { const char *t; logical f; size_t i; for (t = s, f = TRUE, i = 0; *t != '\0'; t++) { if (*t == '&') f = FALSE; else if (*t == ';') f = TRUE; if (f) i++; } return(f?i:strlen(s)); /* If !f, something went wrong (eg multibyte). Maybe the & wasn't markup. */ } /* Allow month in dates? DO NOT enable for human-readable text because of i18n problems. */ logical xhtml_allowmonth(void) { return FALSE; } /* Calculate column widths */ void xhtml_calcwidths(Outchoices *od, choice rep, unsigned int width[], unsigned int *bmult, unsigned int *bmult7, double *unit, unsigned long maxr, unsigned long maxr7, unsigned long maxp, unsigned long maxp7, double maxb, double maxb7, unsigned long howmany) { /* widths don't really have much meaning, but they will still be used for the bar charts, and it's easier just to call the existing function. */ calcwidths(od, rep, width, bmult, bmult7, unit, maxr, maxr7, maxp, maxp7, maxb, maxb7, howmany); } /* "Each unit represents" line */ void xhtml_declareunit(FILE *outf, Outchoices *od, char graphby, double unit, unsigned int bmult) { char **lngstr = od->lngstr; char *s; fprintf(outf, "

", od->cssprefix); fprintf(outf, "%s (", lngstr[eachunit_]); if (ISLOWER(graphby)) fprintf(outf, "%c", od->markchar); else { fprintf(outf, "imagedir, IN_HREF); fprintf(outf, "bar%c1.%s\" alt=\"%c\" />", od->barstyle, od->pngimages?"png":"gif", od->markchar); /* Above: '.' not EXTSEP even on RISC OS */ } fprintf(outf, ") %s ", lngstr[represents_]); if (graphby == 'R' || graphby == 'r') { f3printf(outf, od, unit, 0, od->sepchar); if (unit == 1.) fprintf(outf, " %s.", lngstr[request_]); else fprintf(outf, " %s %s.", lngstr[requests_], lngstr[partof_]); } else if (graphby == 'P' || graphby == 'p') { f3printf(outf, od, unit, 0, od->sepchar); if (unit == 1.) fprintf(outf, " %s.", lngstr[pagereq_]); else fprintf(outf, " %s %s.", lngstr[pagereqs_], lngstr[partof_]); } else { if (bmult > 0) { xhtml_printdouble(outf, od, unit); s = strchr(lngstr[xbytes_], '?'); /* checked in initialisation */ *s = '\0'; fprintf(outf, " %s%s%s %s.", lngstr[xbytes_], lngstr[byteprefix_ + bmult], s + 1, lngstr[partof_]); *s = '?'; } else { f3printf(outf, od, unit, 0, od->sepchar); fprintf(outf, " %s %s.", lngstr[bytes_], lngstr[partof_]); } } fputs("

\n", outf); } /* Start of column header line */ void xhtml_colheadstart(FILE *outf, Outchoices *od, choice rep) { fputs("", outf); } /* Column header line: individual column */ void xhtml_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated) { extern char colcodes[]; char code[3]; code[0] = colcodes[col]; if (unterminated) { code[1] = 'l'; /* i.e. "xl" */ code[2] = '\0'; } else code[1] = '\0'; fprintf(outf, "%s", od->cssprefix, code, colname); } /* End of column header line */ void xhtml_colheadend(FILE *outf, Outchoices *od, choice rep) { if (rep < DATEREP_NUMBER) /* time report: extra col for bar chart */ fprintf(outf, " ", od->cssprefix); fputs("\n", outf); } /* Start of column header underlining line */ void xhtml_colheadustart(FILE *outf, Outchoices *od, choice rep) { } /* Underlining of one column header. */ void xhtml_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name) { } /* End of column header underlining line */ void xhtml_colheaduend(FILE *outf, Outchoices *od, choice rep) { fputs("", outf); } /* Start of a table row */ void xhtml_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols, int level, char *name, char *datefmt, char *timefmt) { if (level >= 2) fprintf(outf, "", od->cssprefix, od->cssprefix, level); else fprintf(outf, ""); } /* Print level in hierarchy represented by this row */ void xhtml_levelcell(FILE *outf, Outchoices *od, choice rep, int level) { } /* Name column */ void xhtml_namecell(FILE *outf, Outchoices *od, choice rep, char *name, choice source, unsigned int width, logical name1st, logical isfirst, logical rightalign, Alias *aliashead, Include *linkhead, logical ispage, unsigned int spaces, char *baseurl) { extern char *workspace; choice savemultibyte; logical linked; int i; if (name1st != isfirst) return; savemultibyte = od->multibyte; if (rep == REP_SIZE || rep == REP_PROCTIME) /* Kludge: for these two reports, we know the texts are things like "< 1" and we want to convert > and < */ od->multibyte = FALSE; if (isfirst) fprintf(outf, "", od->cssprefix); else if (rightalign) fprintf(outf, "", od->cssprefix); else fprintf(outf, "", od->cssprefix); strcpy(workspace, name); do_aliasx(workspace, aliashead); if (!isfirst && !rightalign) { for (i = 0; i < spaces; i++) fputs(" ", outf); } linked = (linkhead != NULL && included(name, ispage, linkhead)); if (linked) { /* We link to the unaliased name, because the OUTPUTALIAS is usually in the nature of an annotation. */ fputs("", outf); } xhtmlputs(outf, od, workspace, source); if (linked) fputs("", outf); if (!isfirst && rightalign) { for (i = 0; i < spaces; i++) fputs(" ", outf); } fputs("", outf); od->multibyte = savemultibyte; /* restore multibyte */ } /* Single cell, unsigned long argument */ void xhtml_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width) { extern char colcodes[]; fprintf(outf, "", od->cssprefix, colcodes[col]); f3printf(outf, od, (double)x, 0, od->repsepchar); fprintf(outf, ""); } /* Single cell, TRUSTED string argument */ void xhtml_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width) { extern char colcodes[]; fprintf(outf, "", od->cssprefix, colcodes[col]); xhtmlputs(outf, od, s, TRUSTED); fprintf(outf, ""); } /* Single cell, listing bytes */ void xhtml_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width) { extern char colcodes[]; fprintf(outf, "", od->cssprefix, colcodes[col]); printbytes(outf, od, b, bmult, 0, od->repsepchar); fprintf(outf, ""); } /* Single cell, listing percentage */ void xhtml_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width) { double pc; unsigned int pc1, pc2; extern char colcodes[]; fprintf(outf, "", od->cssprefix, colcodes[col]); if (tot == 0) pc = 0.0; else pc = n * 10000.0 / tot; if (pc >= 9999.5) fputs("100%", outf); else if (pc < 0.5) fputs(" ", outf); else { pc1 = ((int)(pc + 0.5)) / 100; pc2 = ((int)(pc + 0.5)) % 100; fprintf(outf, "%2d", pc1); xhtml_putch(outf, od->decpt); fprintf(outf, "%02d%%", pc2); } fputs("", outf); } /* Single cell, index */ void xhtml_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width) { extern char colcodes[]; fprintf(outf, "", od->cssprefix, colcodes[col]); /* If index is 0 (i.e. sub-item), just print space */ if (index <= 0) fputs(" ", outf); else f3printf(outf, od, (double)index, 0, od->repsepchar); fputs("", outf); } /* End of a table row */ void xhtml_rowend(FILE *outf, Outchoices *od, choice rep) { fputs("\n", outf); } /* Blank line in time reports */ void xhtml_blankline(FILE *outf, Outchoices *od, choice *cols) { extern char colcodes[]; unsigned int c; fputs("", outf); fprintf(outf, " ", od->cssprefix); for (c = 0; cols[c] != COL_NUMBER; c++) fprintf(outf, " ", od->cssprefix, colcodes[cols[c]]); fprintf(outf, " ", od->cssprefix); fputs("\n", outf); } /* Barchart in time reports */ void xhtml_barchart(FILE *outf, Outchoices *od, int y, char graphby) { int i, j; logical first = TRUE; fprintf(outf, "", od->cssprefix); if (ISLOWER(graphby)) { for (i = 0; i < y; i++) xhtml_putch(outf, od->markchar); } else { for (j = 32; j >= 1; j /= 2) { while (y >= j) { fputs("imagedir, IN_HREF); fprintf(outf, "bar%c%d.%s\" alt=\"", od->barstyle, j, od->pngimages?"png":"gif");/* '.' not EXTSEP even on RISC OS */ if (first) { for (i = 0; i < y; i++) xhtml_putch(outf, od->markchar); first = FALSE; } fputs("\" />", outf); y -= j; } } } fputs("", outf); } /* "Busiest time period" line */ void xhtml_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt, unsigned long reqs, unsigned long pages, double bys, datecode_t date, unsigned int hr, unsigned int min, datecode_t newdate, unsigned int newhr, unsigned int newmin, char graphby) { extern unsigned int *rep2busystr; char **lngstr = od->lngstr; char sepchar = od->sepchar; unsigned int bmult; char *s; fprintf(outf, "

%s %s (", od->cssprefix, lngstr[rep2busystr[rep]], datesprintf(od, datefmt, date, hr, min, newdate, newhr, newmin, TRUE, UNSET)); if (TOLOWER(graphby) == 'r') { f3printf(outf, od, (double)reqs, 0, sepchar); fprintf(outf, " %s", (reqs == 1)?lngstr[request_]:lngstr[requests_]); } else if (TOLOWER(graphby) == 'p') { f3printf(outf, od, (double)pages, 0, sepchar); fprintf(outf, " %s", (pages == 1)?lngstr[pagereq_]:lngstr[pagereqs_]); } else /* TOLOWER(graphby) == 'b' */ { if (od->rawbytes) bmult = 0; else bmult = findbmult(bys, od->bytesdp); printbytes(outf, od, bys, bmult, 0, sepchar); putc(' ', outf); if (bmult >= 1) { s = strchr(lngstr[xbytes_], '?'); /* checked in initialisation */ *s = '\0'; fprintf(outf, "%s%s%s", lngstr[xbytes_], lngstr[byteprefix_ + bmult], s + 1); *s = '?'; } else fprintf(outf, "%s", lngstr[bytes_]); } fputs(").

\n", outf); } /* End of "Not listed" line. */ void xhtml_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn) { extern unsigned int *rep2lng, *rep2colhead; char **lngstr = od->lngstr; char *colhead = lngstr[rep2colhead[rep]]; char *colheadp = lngstr[rep2colhead[rep] + 1]; char gender = lngstr[rep2lng[rep] + 3][0]; char *notlistedstr; if (gender == 'm') notlistedstr = lngstr[notlistedm_]; else if (gender == 'f') notlistedstr = lngstr[notlistedf_]; else notlistedstr = lngstr[notlistedn_]; fprintf(outf, "[%s: ", od->cssprefix, notlistedstr); f3printf(outf, od, (double)badn, 0, od->sepchar); fprintf(outf, " %s]", (badn == 1)?colhead:colheadp); } /* The line declaring the floor and sort for a report */ void xhtml_whatincluded(FILE *outf, Outchoices *od, choice rep, unsigned long n, Dateman *dman) { whatincluded(outf, od, rep, n, dman); } /* Spacing at the start of the whatincluded line */ void xhtml_whatinchead(FILE *outf, Outchoices *od) { fprintf(outf, "

\n", od->cssprefix); } /* Finishing the whatincluded line */ void xhtml_whatincfoot(FILE *outf, Outchoices *od) { fputs("

\n", outf); } /* Printing part of the whatincluded line */ void xhtml_whatincprintstr(FILE *outf, Outchoices *od, char *s) { xhtmlputs(outf, od, s, TRUSTED); } /* Print a double to a nice number of decimal places */ void xhtml_printdouble(FILE *outf, Outchoices *od, double x) { unsigned int prec; double d; /* first calculate how many decimal places we need */ for (prec = 0, d = x - (double)((int)(x)); d - (double)((int)(d + 0.000005)) > 0.00001; d *= 10) prec++; /* now print it */ if (prec > 0) { fprintf(outf, "%d", (int)x); xhtml_putch(outf, od->decpt); fprintf(outf, "%0*d", prec, (int)(d + EPSILON)); } else fprintf(outf, "%d", (int)(x + EPSILON)); } /* Include a header file or footer file */ void xhtml_includefile(FILE *outf, Outchoices *od, char *name, char type) { FILE *inf; char buffer[BLOCKSIZE]; size_t n; if ((inf = my_fopen(name, (type == 'h')?"header file":"footer file")) != NULL) { while ((n = fread(buffer, 1, BLOCKSIZE, inf))) /* single equals */ fwrite((void *)buffer, 1, n, outf); (void)my_fclose(inf, name, (type == 'h')?"header file":"footer file"); } } /* Filetype for RISC OS */ unsigned int xhtml_riscosfiletype(void) { return 0xfaf; } /* ======================================================================= */ /* Supporting functions for XHTML */ /* Print "goto"s. Assume we've checked that we want gotos here. */ void xhtml_gotos(FILE *outf, Outchoices *od, choice rep) { extern unsigned int *rep2lng; extern char *anchorname[]; choice *reporder = od->reporder; char **lngstr = od->lngstr; int i; fprintf(outf, "

(%s", od->cssprefix, od->cssprefix, lngstr[goto_]); fprintf(outf, "%s %s", lngstr[colon_], lngstr[top_]); for (i = 0; reporder[i] != -1; i++) { if (reporder[i] == rep) fprintf(outf, " | %s", lngstr[rep2lng[reporder[i]]]); else if (od->repq[reporder[i]]) fprintf(outf, " | %s", anchorname[reporder[i]], lngstr[rep2lng[reporder[i]]]); } fputs(")

\n", outf); } /* Escape names for use in hyperlinks. */ void xhtml_escfprintf(FILE *outf, char *name) { html_escfprintf(outf, name); } /* Print a string with an appropriate amount of HTML encoding. */ void xhtmlputs(FILE *outf, Outchoices *od, char *s, choice source) { htmlputs(outf, od, s, source); } analog-6.0/src/outxml.c0000644000175000017500000007345510161303543015233 0ustar sret1sret100000000000000/*** analog 6.0 http://www.analog.cx/ ***/ /*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as *** stated otherwise. *** *** This program is free software. You can redistribute it and/or modify it *** under the terms of version 2 of the GNU General Public License, which you *** should have received with it. *** *** This program is distributed in the hope that it will be useful, but *** without any warranty, expressed or implied. ***/ // outxml.c - XML output module for analog (http://www.analog.cx) // written by and copyright Per Jessen, per@computer.org, February 2003. #define _GNU_SOURCE #define NDEBUG #include #include #include #include #include #include #include "anlghea3.h" #include "outxml.h" // we use this to borrow a copy of 'outf' such that function that // don't have an 'outf' argument can use XML_TRACE() anyway. static FILE *outf = 0; static FILE **outfp = &outf; static choice this_report; static Options *opts; static int array_index; // ================================================================================== /* Page width */ unsigned int xml_pagewidth(Outchoices *od) { XML_TRACE(0); return 0; } /* The top of the output if we are in CGI mode */ void xml_cgihead(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* Stuff this output style needs in the page header */ void xml_stylehead(FILE *outf, Outchoices *od) { extern timecode_t starttimec; unsigned int year, month, day, i; struct tm temptime; char *xmlversion = "1.0"; char *encoding = "UTF-8"; time_t t; char buffer[256]; // borrow a copy of the outfile handle *outfp=outf; // KLUDGE!!!! opts=(Options*)((int)od-offsetof(Options,outopts)); t=time(0); strftime( buffer, 256, "%Y%m%d%H%M%S", gmtime(&t) ); XML_OUT("" XMLDBG "" XMLDBG "" XMLDBG "", xmlversion, encoding, VNUMBER, // VERSION instead? VERSION includes platform it was built. buffer ); // set up appropriate defaults for XML output. xml_defaults( opts ); // extract a build timestamp from __DATE__ and __TIME__ -- locale dependent?! need to force "C" locale ? strptime( __DATE__" "__TIME__, "%b%n%d%n%Y%n%T", &temptime ); sprintf( buffer, "%04d%02d%02d%02d%02d", temptime.tm_year+1900, temptime.tm_mon+1, temptime.tm_mday, temptime.tm_hour, temptime.tm_min ); code2date( starttimec/1440, &day, &month, &year); XML_OUT( XMLDBG "", VERSION ); XML_OUT( XMLDBG "", buffer ); XML_OUT( XMLDBG " ", year, month+1, day, (int)((starttimec%1440)/60), (int)(starttimec%60) ); // XML_OUT( XMLDBG "", opts.succ304?"yes":"no" ); // XML_OUT( XMLDBG "", stz ); i=i; // mustn't upset the compiler :-) } /* The title of the page, plus the user's HEADERFILE */ void xml_pagetitle(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* Program start time, and logfile start and end times */ void xml_timings(FILE *outf, Outchoices *od, Dateman *dman) { unsigned int year, month, day; XML_TRACE(0); code2date( dman->firsttime/1440, &day, &month, &year); XML_OUT( XMLDBG"firsttime%1440)/60), (int)(dman->firsttime%60) ); code2date( dman->lasttime/1440, &day, &month, &year); XML_OUT( "to=\"%04d%02d%02d%02d%02d\" days=\"%f\"/>", year, month+1, day, (int)((dman->lasttime%1440)/60), (int)(dman->lasttime%60), (dman->lasttime-dman->firsttime)/1440.0+0.005 ); } /* Finishing the top of the page */ void xml_closehead(FILE *outf, Outchoices *od) { XML_TRACE(0); XML_OUT(XMLDBG""); } /* Starting the bottom of the page */ void xml_pagebotstart(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* The credit line at the bottom of the page */ void xml_credit(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* The program run time */ void xml_runtime(FILE *outf, Outchoices *od, long secs) { XML_TRACE(0); // XML_OUT( XMLDBG"", // "processingtime", secs); } /* The page footer, including the user's FOOTERFILE */ void xml_pagefoot(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* Footer material for this output style */ void xml_stylefoot(FILE *outf, Outchoices *od) { XML_TRACE(0); XML_OUT( XMLDBG"" ); } /* Report title */ void xml_reporttitle(FILE *outf, Outchoices *od, choice rep) { char *dir; XML_TRACE(0); assert( ((char*)od-(char*)opts)==offsetof(Options,outopts) ); array_index=0; XML_OUT( XMLDBG"", strtolower(report_name[rep]) ); this_report=rep; switch (rep) { case REP_GENSUM: break; case REP_YEAR: case REP_QUARTERLY: case REP_MONTH: case REP_WEEK: case REP_DAYREP: case REP_HOURREP: case REP_QUARTERREP: case REP_FIVEREP: XML_OUT( XMLDBG "", opts->outopts.rows[rep] ); case REP_DAYSUM: case REP_HOURSUM: case REP_WEEKHOUR: case REP_QUARTERSUM: case REP_FIVESUM: // only time reports (for the time being) have a 'back' setting to set their sort-order. XML_OUT( XMLDBG "", od->back[rep]? "descending" : "ascending" ); break; case REP_SIZE: case REP_PROCTIME: case REP_HOST: case REP_REDIRHOST: case REP_FAILHOST: case REP_VHOST: case REP_REDIRVHOST: case REP_FAILVHOST: case REP_USER: case REP_REDIRUSER: case REP_FAILUSER: case REP_SEARCHREP: case REP_SEARCHSUM: case REP_INTSEARCHREP: case REP_INTSEARCHSUM: case REP_BROWSUM: case REP_CODE: od->subsortby[rep]= od->subfloor[rep].floorby=UNSET; case REP_TYPE: // the following reports can also have subfloor/sort setting case REP_DIR: case REP_REQ: case REP_REDIR: case REP_FAIL: case REP_DOM: case REP_REF: case REP_BROWREP: case REP_OS: case REP_REDIRREF: case REP_FAILREF: case REP_ORG: case REP_REFSITE: dir="ascending"; // analog will sort all of these in ascending order. XML_OUT( XMLDBG "", dir, od->sortby[rep]==UNSET?"":criteria[od->sortby[rep]] ); // 5.90b1 there's something funky going on with subsortby // 5.90b2 ? assert( od->subsortby[rep]==UNSET || (od->subsortby[rep]>=REQUESTS && od->subsortby[rep]<=METHOD_NUMBER) ); if ( od->sortby[rep]!=UNSET ) if ( od->subsortby[rep]!=UNSET ) // is this dependable ?? // XML_OUT( XMLDBG "", dir, criteria[od->subsortby[rep]] ); XML_OUT( XMLDBG "", dir, od->subsortby[rep] ); // the *FLOOR setting XML_OUT( XMLDBG "floor[rep].min ); if ( od->floor[rep].qual ) XML_OUT( "qual=\"%c\" ", od->floor[rep].qual ); XML_OUT( "by=\"%s\"/>", od->floor[rep].floorby==UNSET?"":criteria[od->floor[rep].floorby] ); if ( od->subfloor[rep].floorby!=UNSET ) { XML_OUT( XMLDBG "subfloor[rep].min ); // if ( od->subfloor[rep].qual ) XML_OUT( "qual=\"%c\" ", od->subfloor[rep].qual ) XML_OUT( "by=\"%s\"/>", criteria[od->floor[rep].floorby] ); } break; default: puts(report_name[rep]); assert(0); break; } } /* Report footer */ void xml_reportfooter(FILE *outf, Outchoices *od, choice rep) { XML_TRACE(0); } /* Report description */ void xml_reportdesc(FILE *outf, Outchoices *od, choice rep) { XML_TRACE(0); } /* The time period spanned by the report */ void xml_reportspan(FILE *outf, Outchoices *od, choice rep, timecode_t maxd, timecode_t mind) { unsigned int year, month, day; XML_TRACE(0); code2date( mind/1440, &day, &month, &year); XML_OUT( XMLDBG"", year, month+1, day, (int)((maxd%1440)/60), (int)(maxd%60), (maxd-mind)/1440.0+0.005 ); } /* General Summary header */ void xml_gensumhead(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* General Summary footer */ void xml_gensumfoot(FILE *outf, Outchoices *od) { XML_TRACE(0); } /* Single General Summary line, long data */ void xml_gensumline(FILE *outf, Outchoices *od, int namecode, unsigned long x, unsigned long x7, logical isaverage) { if ( x7==(unsigned long)UNSET ) x7=0; xml_gensumlineb(outf,od,namecode,(double)x,(double)x7,isaverage); } /* Single General Summary line, bytes data */ void xml_gensumlineb(FILE *outf, Outchoices *od, int namecode, double x, double x7, logical isaverage) { char *name; switch( namecode ) { case succreqs_: name="succreqs_"; break; case avereqs_: name="avereqs_"; break; case totpages_: name="totpages_"; break; case avepages_: name="avepages_"; break; case totunknown_: name="totunknown_"; break; case totfails_: name="totfails_"; break; case totredirs_: name="totredirs_"; break; case inforeqs_: name="inforeqs_"; break; case distfiles_: name="distfiles_"; break; case disthosts_: name="disthosts_"; break; case corrupt_: name="corrupt_"; break; case unwanted_: name="unwanted_"; break; case totdata_: name="totdata_"; break; case avedata_: name="avedata_"; break; default: name="__unknown__"; break; } XML_OUT( XMLDBG"" "", name ); XML_OUT( XMLDBG"%f", strtolower(column_name[COL_REQS]), x ); XML_OUT( XMLDBG"%f", strtolower(column_name[COL_REQS7]), x7 ); XML_OUT( XMLDBG"" ); } /* "Last seven" explanation line */ void xml_lastseven(FILE *outf, Outchoices *od, timecode_t last7to) { unsigned int year, month, day; XML_TRACE(0); code2date( last7to/1440, &day, &month, &year); XML_OUT( XMLDBG "", year, month+1, day, (int)((last7to%1440)/60), (int)(last7to%60) ); } /* Start of a
 section */
void xml_prestart(FILE *outf, Outchoices *od) { XML_TRACE(0); }

/* strlen */
size_t xml_strlength(const char *s) { XML_TRACE(0); return strlen(s); }

/* End of a 
 section */
void xml_preend(FILE *outf, Outchoices *od) { XML_TRACE(0); }

/* A horizontal rule */
void xml_hrule(FILE *outf, Outchoices *od)
{
	// an odd place to place this, but the only option.
	XML_OUT( XMLDBG"", strtolower(report_name[this_report]) );
}

/* An en dash */
char *xml_endash(void) { XML_TRACE(0); return "-"; }

/* putc with special characters escaped */
void xml_putch(FILE *outf, char c) { XML_TRACE(0); }

/* Allow month in dates? DO NOT enable for human-readable text because of
   i18n problems. */
logical xml_allowmonth(void) { XML_TRACE(0); return TRUE; }

/* Calculate column widths */
void xml_calcwidths(Outchoices *od, choice rep, unsigned int width[],
		     unsigned int *bmult, unsigned int *bmult7, double *unit,
		     unsigned long maxr, unsigned long maxr7,
		     unsigned long maxp, unsigned long maxp7, double maxb,
		     double maxb7, unsigned long howmany)
{
	XML_TRACE(0);
	// outxml has no need to do this, but analog will segfault otherwise.
	calcwidths(od, rep, width, bmult, bmult7, unit, maxr, maxr7, maxp, maxp7,
		maxb, maxb7, howmany);
}

/* "Each unit represents" line */
void xml_declareunit(FILE *outf, Outchoices *od, char graphby, double unit,
		      unsigned int bmult) { XML_TRACE(0); }

/* Start of column header line */
void xml_colheadstart(FILE *outf, Outchoices *od, choice rep) { XML_TRACE(0); }


/* Column header line: individual column */
void xml_colheadcol(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *colname, logical unterminated) {XML_TRACE(0);}

/* End of column header line */
void xml_colheadend(FILE *outf, Outchoices *od, choice rep) {XML_TRACE(0);}

/* Start of column header underlining line */
void xml_colheadustart(FILE *outf, Outchoices *od, choice rep) {XML_TRACE(0);}

/* Underlining of one column header. */
/* If column is terminated, set width and leave name blank; and conversely. */
void xml_colheadunderline(FILE *outf, Outchoices *od, choice rep, choice col, unsigned int width, char *name) {XML_TRACE(0);}

/* End of column header underlining line */
void xml_colheaduend(FILE *outf, Outchoices *od, choice rep) { XML_TRACE(0); }

/* Start of a table row */
void xml_rowstart(FILE *outf, Outchoices *od, choice rep, choice *cols,
		   int level, char *name, char *datefmt, char *timefmt)
{
	XML_TRACE(0);

	if ( level!=UNSET )
	XML_OUT( XMLDBG"", level );
	else
	XML_OUT( XMLDBG"" );
}

/* Print level in hierarchy represented by this row */
void xml_levelcell(FILE *outf, Outchoices *od, choice rep, int level)
{
	XML_TRACE(0);

//	XML_OUT( XMLDBG"%d", level );
}

/* Name column */
void xml_namecell(FILE *outf, Outchoices *od, choice rep, char *name,
  choice source, unsigned int width, logical name1st, logical isfirst,
  logical rightalign, Alias *aliashead, Include *linkhead, logical ispage,
  unsigned int spaces, char *baseurl)
{
	char *p, *q;
	int n;

	XML_TRACE(0); 

	// no output aliasing is done yet. not sure it will be done either.


	// we don't care, but by testing it we avoid printing the column twice.
	if ( !isfirst && name )
	{
		XML_OUT( XMLDBG "" );

		switch( rep) {
		case REP_MONTH:
		case REP_YEAR:
		case REP_WEEK:
		case REP_QUARTERLY:
		case REP_DAYREP:
		case REP_HOURREP:
		case REP_QUARTERREP:
		case REP_FIVEREP:
		case REP_DAYSUM:
		case REP_HOURSUM:
		case REP_QUARTERSUM:
		case REP_FIVESUM:
		case REP_WEEKHOUR:	
			// this is split because strtok needs to be called in the right order.
			XML_OUT( "", strtok( NULL," ") );
				break;
			case REP_HOURSUM:
				XML_OUT( "hour=\"%s\" />", strtok( NULL," ") );
				break;
			case REP_QUARTERSUM:
				XML_OUT( "minute=\"%s\" />", strtok( NULL," ") );
				break;
			case REP_FIVESUM:
				XML_OUT( "minute=\"%s\" />", strtok( NULL," ") );
				break;
			case REP_WEEKHOUR:
				XML_OUT( "dayofweek=\"%s\" ", strtok( NULL," ") );
				XML_OUT( "hour=\"%s\" />", strtok( NULL," ") );
				break;
			default:
				XML_OUT( "/>" );
			}
			break;
		case REP_CODE:
			strtok(name, " ");	// assumption: name = "nnn text"
			XML_OUT( name );
			break;
//			n=array_index++;
//			XML_OUT( "%d", (int)(opts->arraydata[rep-FIRST_ARRAYREP][n].threshold) );
//			break;
		case REP_OS:
			// kludge: the hardcoded OS names from tree.c are turned into i18n
			// keys - hardly a well thought out interface, but the best we can do
			// for the moment.
			p=strtolower(name);			// all lowercase
			while ( (q=strchr(p,' ')) ) *q='-';	// replace ' ' with '-'
			while ( (q=strchr(p,'/')) ) *q='-';
			
			XML_OUT( "", p );
			break;
		case REP_SIZE:
		case REP_PROCTIME:
			n=array_index++;
			XML_OUT( "%f", opts->arraydata[rep-FIRST_ARRAYREP][n].threshold );
			break; 
		case REP_DOM:
		case REP_TYPE:
			// kludge: if the string supplied is delimited by square brackets, 
			// we turn it into an i18n key.
			if ( *name=='[' && *(name+strlen(name)-1)==']' )
			{
				p=strtolower(name+1); 
				*(p+strlen(p)-1)=0;
				while ( (q=strchr(p,' ')) ) *q='-';
				XML_OUT( "", rep==REP_DOM?"domain":"type", p );
				break;
			}
			// this is a delibrate fall-thru.
		default:
			XML_OUT( "", cleanprint(name) );
			break;
		}
		XML_OUT( "" );
	}

#if 0
extern char *workspace;

  choice savemultibyte;
  logical linked;
  int i;

  if (name1st != isfirst)
    return;

  if (isfirst)
    matchlengthn(outf, od, width - od->outputter->strlen(name), ' ');
  savemultibyte = od->multibyte;
  if (rep == REP_SIZE || rep == REP_PROCTIME)
    /* Kludge: for these two reports, we know the texts are things like
       "< 1" and we want to convert > and < */
    od->multibyte = FALSE;

  strcpy(workspace, name);
  do_aliasx(workspace, aliashead);

  if (!isfirst) {
    if (rightalign)
      i = (int)width - (int)od->outputter->strlen(workspace) - (int)spaces;
    else
      i = (int)spaces;
    matchlengthn(outf, od, i, ' ');
  }

  linked = (linkhead != NULL && included(name, ispage, linkhead));
  if (linked) {
    /* We link to the unaliased name, because the OUTPUTALIAS is usually in
       the nature of an annotation. */
    fputs("", outf);
  }

  htmlputs(outf, od, workspace, UNTRUSTED);

  if (linked)
    fputs("", outf);

  if (isfirst)
    fputs(": ", outf);

  od->multibyte = savemultibyte;  /* restore multibyte */
#endif
}


/* Single cell, unsigned long argument */
void xml_ulcell(FILE *outf, Outchoices *od, choice rep, choice col, unsigned long x, unsigned int width)
{
	XML_TRACE(0);
	XML_OUT( XMLDBG"%lu", strtolower(column_name[col]), x ); 
}

/* Single cell, TRUSTED string argument */
void xml_strcell(FILE *outf, Outchoices *od, choice rep, choice col, char *s, unsigned int width)
{
	XML_TRACE(0);

	XML_OUT( XMLDBG "", strtolower(column_name[col]) );
	switch( col )
	{
	case COL_TIME:
	case COL_FIRSTT:
	case COL_DATE:
	case COL_FIRSTD:
		if ( strlen(s) )
		XML_OUT( "", strtok(s, " ") );	
		break;
	default:
		XML_OUT( s );
		break;
	}
	XML_OUT( "" );

}

/* Single cell, listing bytes */
void xml_bytescell(FILE *outf, Outchoices *od, choice rep, choice col, double b, double bmult, unsigned int width)
{
	XML_TRACE(0);
	XML_OUT( XMLDBG"%f", strtolower(column_name[col]), b );
}

/* Single cell, listing percentage */
void xml_pccell(FILE *outf, Outchoices *od, choice rep, choice col, double n, double tot, unsigned int width)
{
	XML_TRACE(0);
	XML_OUT( XMLDBG"%f", strtolower(column_name[col]),
	tot>0 ? 100*n/tot : 0.0 );
}

/* Single cell, index */
void xml_indexcell(FILE *outf, Outchoices *od, choice rep, choice col, long index, unsigned int width)
{
	XML_TRACE(0);
	XML_OUT( XMLDBG"%ld", strtolower(column_name[col]), index );
}

/* End of a table row */
void xml_rowend(FILE *outf, Outchoices *od, choice rep) { XML_TRACE(0); XML_OUT(XMLDBG""); }

/* Blank line in time reports */
void xml_blankline(FILE *outf, Outchoices *od, choice *cols) { XML_TRACE(0); }

/* Barchart in time reports */
void xml_barchart(FILE *outf, Outchoices *od, int y, char graphby) { XML_TRACE(0); }

/* "Busiest time period" line */
void xml_busyprintf(FILE *outf, Outchoices *od, choice rep, char *datefmt,
		     unsigned long reqs, unsigned long pages, double bys,
		     datecode_t date, unsigned int hr, unsigned int min,
		     datecode_t newdate, unsigned int newhr,
		     unsigned int newmin, char graphby)
{
	unsigned int year, month, day;

	XML_TRACE(0);

	code2date( date, &day, &month, &year);
	XML_OUT( XMLDBG"" );

#if 0
  extern unsigned int *rep2busystr;

  char **lngstr = od->lngstr;
  char sepchar = od->sepchar;

  unsigned int bmult;
  char *s;

  fprintf(outf, "%s %s (", lngstr[rep2busystr[rep]],
	  datesprintf(od, datefmt, date, hr, min, newdate, newhr, newmin,
		      TRUE, UNSET));

  if (TOLOWER(graphby) == 'r') {
    f3printf(outf, od, (double)reqs, 0, sepchar);
    fprintf(outf, " %s).\n", (reqs == 1)?lngstr[request_]:lngstr[requests_]);
  }
  else if (TOLOWER(graphby) == 'p') {
    f3printf(outf, od, (double)pages, 0, sepchar);
    fprintf(outf, " %s).\n",
	    (pages == 1)?lngstr[pagereq_]:lngstr[pagereqs_]);
  }
  else /* TOLOWER(graphby) == 'b' */ {
    if (od->rawbytes)
      bmult = 0;
    else
      bmult = findbmult(bys, od->bytesdp);
    printbytes(outf, od, bys, bmult, 0, sepchar);
    putc(' ', outf);
    if (bmult >= 1) {
      s = strchr(lngstr[xbytes_], '?');  /* checked in initialisation */
      *s = '\0';
      fprintf(outf, "%s%s%s).\n", lngstr[xbytes_],
	      lngstr[byteprefix_ + bmult], s + 1);
      *s = '?';
    }
    else
      fprintf(outf, "%s).\n", lngstr[bytes_]);
  }
#endif
}

/* End of "Not listed" line. */
void xml_notlistedstr(FILE *outf, Outchoices *od, choice rep, unsigned long badn)
{
	XML_TRACE(0);
	XML_OUT( XMLDBG "", strtolower(report_name[rep]), badn );
#if 0
  extern unsigned int *rep2lng, *rep2colhead;

  char **lngstr = od->lngstr;
  char *colhead = lngstr[rep2colhead[rep]];
  char *colheadp = lngstr[rep2colhead[rep] + 1];
  char gender = lngstr[rep2lng[rep] + 3][0];

  char *notlistedstr;

  if (gender == 'm')
    notlistedstr = lngstr[notlistedm_];
  else if (gender == 'f')
    notlistedstr = lngstr[notlistedf_];
  else
    notlistedstr = lngstr[notlistedn_];

  fprintf(outf, "[%s: ", notlistedstr);
  f3printf(outf, od, (double)badn, 0, od->sepchar);
  fprintf(outf, " %s]\n", (badn == 1)?colhead:colheadp);
#endif
}

/* The line declaring the floor and sort for a report */
void xml_whatincluded(FILE *outf, Outchoices *od, choice rep,
		       unsigned long n, Dateman *dman) { 
	XML_TRACE(0);

//	floor_element( outf, od, rep );

	#ifndef NDEBUG
	XML_OUT( XMLDBG "" );
	whatincluded(outf, od, rep, n, dman);
	#endif
}

/* Spacing at the start of the whatincluded line */
void xml_whatinchead(FILE *outf, Outchoices *od)
{
	XML_TRACE(0); XML_OUT( "\n" );
}

/* Printing part of the whatincluded line */
void xml_whatincprintstr(FILE *outf, Outchoices *od, char *s)
{ 
	XML_TRACE(0); XML_OUT( s );
}

/* Print a double */
void xml_printdouble(FILE *outf, Outchoices *od, double x)
{
	XML_OUT( "%g", x );
}

/* Include a header file or footer file */
void xml_includefile(FILE *outf, Outchoices *od, char *name, char type) { XML_TRACE(0); }

/* Filetype for RISC OS */
unsigned int xml_riscosfiletype(void) {
  return 0xf80;
}

// ======= miscellaneous helper functions ===============================================

#ifdef _NEED_XML_PRINTF
static int xml_printf( char *format, ... )
{
	va_list v;
	int r;

	va_start( v, format );

	r=vfprintf( outf, format, v );

	va_end( v );

	return r;
}
#endif

static char* strtolower( const char *s )
{
        static char *buffer=0;
        char *p;

        // buffer is freed upon program termination.
        buffer=realloc(buffer, max(strlen(s)+1,1024));

        for( p=buffer; *s; p++, s++ )
        {
                *p=tolower(*s);
        }
        *p=0;

        return buffer;
}

// converts a null-terminated array of null-terminated strings to lower case.
static void all2lower( char** strings )
{
	char *p;

	while( *strings )
	{
		for ( p=*strings; *p; p++ )
		{
			*p=tolower(*p);
		}
		strings++;
	}
}

// this function sets the output options as they are required for XML output. 
// it's a bit of a kludge, but will have to do till Stephen implements a method for
// letting an output module set its own defaults. 
static void xml_defaults( Options *op)
{
	extern logical cgi;
	Outchoices *od=&(opts->outopts);

	choice timerepcols[] = { COL_REQS, COL_PREQS, COL_PAGES, COL_PPAGES, COL_BYTES, COL_PBYTES, COL_NUMBER };
	choice genrepcols[] = { COL_REQS, COL_PREQS, COL_REQS7, COL_PREQS7, 
				COL_PAGES, COL_PPAGES, COL_PAGES7, COL_PPAGES7, 
				COL_BYTES, COL_PBYTES, COL_BYTES7, COL_PBYTES7,
				COL_TIME, COL_FIRSTT, 
				COL_INDEX, COL_NUMBER };
	int i;
	static char *numbers[]={"0","1","2","3","4","5","6","7","8","9","10","11","12",0};


	od->rawbytes=TRUE;				// we always want bytes listed as raw numbers.
	od->gensumlines="BCDEFGHIJKLMN";		// we always want all the general summary lines
							// always select english as output language ??

	for( i=REP_YEAR; icols[i], timerepcols, sizeof(timerepcols) );


	for( i=REP_REQ; icols[i], genrepcols, sizeof(genrepcols) );

	for( i=0; i<7; i++ )				// ignore i18n daynames, just use 0..6
	od->dayname[i]=numbers[i];	

        od->lngstr[genreptime_]=
        od->lngstr[genrepdate_]=
        od->lngstr[datefmt1_]=
        od->lngstr[datefmt2_]=
        od->lngstr[weekfmt_]=
        od->lngstr[yearfmt_]=
        od->lngstr[dayrepfmt_]=
        od->lngstr[quarterlyfmt_]=
        od->lngstr[hourrepfmt_]=
        od->lngstr[quarterrepfmt_]=
        od->lngstr[monthfmt_]="%Y%M%D%H%n %Z%L%E%I%o";

	od->lngstr[quartersumfmt_]="%Y%M%D%H%n %Z%L%E%I%o %n";
	od->lngstr[hoursumfmt_]="%Y%M%D%H%n %Z%L%E%I%o %h";
        od->lngstr[daysumfmt_]="%Y%M%D%H%n %Z%L%E%I%o %w";
	od->lngstr[weekhoursumfmt_]="%Y%M%D%H%n %Z%L%E%I%o %w %h";

	for( i=0; i<11; i++ )
	od->lngstr[filesize0_+i]=numbers[i];


	cgi=FALSE;					// not possible 

	for( i=0; ireporder[i]=i;			// (depends on ALL ON in analog.cfg)


        // override reports settings ??
//	opts.outopts.repspan=
//	od->repspan=TRUE;				// analogs manual says this could be memory consuming?
//	opts.outopts.rsthresh=-1;			// list reportspan on all reports

	od->last7=TRUE;

}

#if 0
static char* utf8( char* in )
{
        static char *out=NULL;
        static size_t outsz=4;

        size_t inlen, outlen; 
	char *inptr, *outptr;
	int rc, i;


	if ( out==NULL ) out=malloc(outsz);		// initial output buffer
	iconv( cd, NULL, NULL, NULL, NULL);		// reset conversion state

	outlen=outsz;					// initial outbuffer size
	inlen=strlen(in);				// input buffer length
	inptr=in;
	outptr=out;

	while( inlen )
	{
//		fprintf(stderr, "inlen=%d, string=\"%s\"\n", inlen, in);
		rc=iconv( cd, &inptr, &inlen, &outptr, &outlen );
		if ( rc==-1 )
		switch( errno ) {
		case E2BIG:	// buffer not big enough?
			outlen+=outsz;			// adding this much space to output buffer
			out=realloc( out, outsz+=outsz );	// allocate bigger buffer
//			fprintf(stderr, "outsz=%d, inlen=%d, outlen=%d\n", outsz, inlen, outlen);
			break;
		case EILSEQ:	// An  invalid  multibyte  sequence is encountered in the input.
//			fprintf( stderr, "%s:%d: error %d: %s\n", __FILE__, __LINE__, errno, strerror(errno) );
//			inptr++; inlen--;               // try just skipping one input char
//			break;
		case EINVAL:	// An incomplete multibyte sequence is encountered in the input.
			fprintf( stderr, "%s:%d: error %d: %s\n", __FILE__, __LINE__, errno, strerror(errno) );
			fprintf( stderr, "%s:%d: string=\"%s\"\n", __FILE__, __LINE__, in, strerror(errno) );
			inlen=0;			//terminate conversion here.
			break;
		default:
			fprintf( stderr, "%s:%d: error %d: %s\n", __FILE__, __LINE__, errno, strerror(errno) );
			my_exit(8);
		}
	}
	// the majority of conversions will be one-to-one, so don't bother telling us about them
	if ( strlen(in)!=(outptr-out) )
	fprintf( stderr, "%d chars in converted to %d chars out\n", strlen(in), outptr-out );

	*outptr=0;		// terminate output buffer

	return out;
}
#endif

char *cleanprint( char *name )
{
	static char *out=NULL;
	static size_t outsz=4;
	char *outptr, c; 


	if ( out==NULL ) out=malloc(outsz);
	outptr=out;

	// cleanprint: printable characters are printed straight, unprintable as hexadecimal codes.

	while( (c=*name++) )
	{
		if ( (outsz-(int)(outptr-out))<6 )
		{
			outptr=(char*)(outptr-out);	// save old
			out=realloc(out, outsz*=2); 	// reallocate buffer
			outptr=out+(int)outptr;		// repoint		
		}
		if ( isprint( c ) ) *outptr++=c;
		else outptr+=sprintf( outptr, "[0x%02X]", (unsigned char)c );
	}
	*outptr=0;

	return out;
}

// I am keeping the name constants below in upper case to make comparison with anlghea3.h easier.
// Before they're used in the output, they're converted to lower case.
// It would be better to convert them prior to use, but this will do for now.


// this is text representation of the column name enumeration from anlghea3.h
static const char *column_name[] = {
"COL_TITLE",
"COL_REQS",
"COL_REQS7",
"COL_PAGES",
"COL_PAGES7",
"COL_BYTES",
"COL_BYTES7",
"COL_PREQS",
"COL_PREQS7",
"COL_PPAGES",
"COL_PPAGES7",
"COL_PBYTES",
"COL_PBYTES7",
"COL_DATE",
"COL_TIME",
"COL_FIRSTD",
"COL_FIRSTT",
"COL_INDEX" };

// this is a text representation of the report name enumeration from anlghea3.h
static const char *report_name[] = {
"REP_YEAR",
"REP_QUARTERLY",
"REP_MONTH",
"REP_WEEK",
"REP_DAYREP",
"REP_HOURREP",
"REP_QUARTERREP",
"REP_FIVEREP",
"REP_DAYSUM",
"REP_HOURSUM",
"REP_WEEKHOUR",
"REP_QUARTERSUM",
"REP_FIVESUM",
"REP_GENSUM",
"REP_REQ",
"REP_REDIR",
"REP_FAIL",
"REP_TYPE",
"REP_DIR",
"REP_HOST",
"REP_REDIRHOST",
"REP_FAILHOST",
"REP_DOMAIN",		// "REP_DOM",
"REP_REF",
"REP_REFSITE",
"REP_REDIRREF",
"REP_FAILREF",
"REP_BROWREP",
"REP_VHOST",
"REP_REDIRVHOST",
"REP_FAILVHOST",
"REP_USER",
"REP_REDIRUSER",
"REP_FAILUSER",
"REP_ORG",
"REP_SEARCHREP",
"REP_SEARCHSUM",
"REP_INTSEARCHREP",
"REP_INTSEARCHSUM",
"REP_BROWSUM",
"REP_OS",
"REP_SIZE",
"REP_CODE",
"REP_PROCTIME" };

// this is a text representation of floor and sort settings .....
static const char *criteria[] = {
"REQUESTS", "REQUESTS7", "PAGES", "PAGES7", "REDIR", "REDIR7", "FAIL", "FAIL7", "SUCCDATE",
"REDIRDATE", "FAILDATE", "SUCCFIRSTD", "REDIRFIRSTD", "FAILFIRSTD", "BYTES", "BYTES7",
"ALPHABETICAL", "RANDOM" };


analog-6.0/src/outxml.h0000644000175000017500000000361610161303543015230 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

// outxml.h - XML output module for analog (http://www.analog.cx)
// written by and copyright Per Jessen, per@computer.org, February 2003. 


// leave this to build nicely readable xml output.
#define XMLDBG "\n"


#define max(a,b) ((a)>(b)?(a):(b))

//#ifdef __USE_ISOC99
#if 0
	#define XML_OUT( f... )	fprintf( outf, f )
#else
	#define XML_OUT	xml_printf
	#define _NEED_XML_PRINTF
	#define __func__ ""
	static int xml_printf( char*, ... );
#endif


#define XML_TRACE(x) if ( x ) if ( outf ) XML_OUT( XMLDBG "", __FILE__, __LINE__, __func__ )


// we only need this when we don't have strptime().
#ifndef __USE_GNU
extern char *engmonths[12];

// note: when defined like this, strptime() provides no return value. 
// also, this is obviously not! a complete replacement for strptime()  
#define strptime( bfr, format, tm ) 								\
        sscanf( (bfr), "%s %d %d %d:%d:%*d", 							\
	buffer, &((tm)->tm_mday), &((tm)->tm_year), &((tm)->tm_hour), &((tm)->tm_min) );	\
        (tm)->tm_year-=1900;									\
        for( i=0; i<12 && strcmp(engmonths[i],buffer); i++) ;		\
        (tm)->tm_mon=i;	
#endif


static void all2lower( char** );
static char* strtolower( const char* );

static void xml_defaults( Options *opts );
static char* cleanprint( char* );

//#define OFFSET(s,m) (int)(&(((s*)0)->m))

static const char *column_name[COL_NUMBER], *report_name[REP_NUMBER], *criteria[METHOD_NUMBER];

analog-6.0/src/process.c0000644000175000017500000003230610161303543015347 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** process.c; process some data ***/

#include "anlghea3.h"

void process_data(Logfile *logfilep, Hashtable **hash,
		  Arraydata **arraydata, choice *count, choice *code2type,
		  choice datacols[ITEM_NUMBER][OUTCOME_NUMBER][DATACOLS_NUMBER][2],
		  choice data2cols[ITEM_NUMBER][DATA_NUMBER],
		  unsigned int *no_cols, Include **wanthead,
		  Include *ispagehead, Alias **aliashead, Include *argshead,
		  Include *refargshead, Dateman *dman, Tree **tree,
		  Derv **derv, choice *alltrees, choice *alldervs,
		  choice *lowmem, logical case_insensitive,
		  logical usercase_insensitive, unsigned char convfloor,
		  logical multibyte, char *dirsuffix,
		  unsigned int dirsufflength, unsigned int granularity) {
  extern unsigned int year, month, date, hour, minute, code;
  extern unsigned long unixtime, proctime;
  extern char am;
  extern double bytes;
  extern Memman mm[], mmq, mms, *amemman;
  extern choice *rep2type;
  extern Hashentry *unwanted_entry, *blank_entry;
  extern Hashindex *dummy_item;

  static Hashindex *gp[ITEM_NUMBER];
  unsigned long data[DATA2_NUMBER];
  Hashentry *item[ITEM_NUMBER];
  logical wanttree[ITEM_NUMBER];
  logical isitpage, last7;
  choice ispage = UNSET;
  choice wanted = TRUE, rc, outcome;
  timecode_t timecode = FIRST_TIME;
  char *name, *namestart, *nameend;
  size_t len;
  choice i, j, k;

  /*** check whether this line is wanted ***/

  if (count[INP_CODE] != 0) {
    if (code == IGNORE_CODE) {
      for (j = 0; j < ITEM_NUMBER; j++) {   /* reset strings */
	if (count[j] != 0)
	  mm[j].next_pos = mm[j].curr_pos;
      }
      mmq.next_pos = mmq.curr_pos;
      mms.next_pos = mms.curr_pos;
      logfilep->data[LOGDATA_UNKNOWN]++;
      return;
    }
    else if (code2type[code] == UNWANTED)
      wanted = FALSE;
  }
  if (wanted && count[INP_DATE] > 0) {
    if (count[INP_UNIXTIME])
      wanted = wantunixtime(&timecode, dman, unixtime, logfilep->tz);
    else {
      if (count[INP_AM]) {
	if (hour > 12) {
	  corrupt_line(logfilep, "Hour greater than 12", -1);
	  return;
	}
	else if (hour == 12)
	  hour = 0;
	if (am == 'p')
	  hour += 12;
      }
      wanted = wantdate(&timecode, dman, hour, minute, date, month, year,
			logfilep->tz);
    }
    if (wanted == ERR) { /* corrupt date */
      corrupt_line(logfilep, "Corrupt date or time", -1);
      return;
    }
  }  /* end count[INP_DATE] > 0 */
  for (i = 0; i < ITEM_NUMBER; i++) {
    wanttree[i] = FALSE;
    if (!wanted) {
      for (j = i; j < ITEM_NUMBER; j++) {  /* reset not-yet-hashed strings */
	if (count[j] != 0)                 /* NB i is now (unwanted i) + 1 */
	  mm[j].next_pos = mm[j].curr_pos;
      }
      mmq.next_pos = mmq.curr_pos;
      mms.next_pos = mms.curr_pos;
      logfilep->data[LOGDATA_UNWANTED]++;
      return;
    }
    if (i == ITEM_HOST)
      prealiasS(&(mm[ITEM_HOST]), &mms);
    name = (char *)(mm[i].curr_pos);
    if (count[i] == 0 || IS_EMPTY_STRING(name) ||
	(name[0] == '-' && name[1] == '\0')) {
      item[i] = blank_entry; /* or unwanted_; but we get wanted right anyway */
      wanted = (wanthead[i] == NULL || included("", FALSE, wanthead[i]));
      /* wanthead[i] == NULL is tested again in included() but it often saves
	 a call to that function, because blankness is common. */
    }
    else {
      if (i == ITEM_FILE || i == ITEM_REFERRER) {
	if ((j = prealias(&(mm[i]), &(mm[ITEM_VHOST]), item[ITEM_VHOST], &mmq,
			  (logical)((i == ITEM_FILE)?case_insensitive:FALSE),
			  (i == ITEM_FILE)?(logfilep->prefix):NULL,
			  logfilep->prefixlen, logfilep->pvpos,
			  (i == ITEM_FILE)?argshead:refargshead)) < 0) {
	  if (j == -1)
	    corrupt_line(logfilep,
			 "%v in file prefix but no VHOST in line", -1);
	  else
	    corrupt_line(logfilep, "Filename too long", -1);
	  return;
	}
      }
      if (lowmem[i] == 0) {
	if (gp[i] == NULL || !STREQ(name, gp[i]->name)) {
	  gp[i] = hashfind(&mm[i], &(hash[i]), no_cols[i], wanthead[i], UNSET,
			   ispagehead, aliashead[i], dirsuffix, dirsufflength,
			   usercase_insensitive, 0, FALSE, i, FALSE);
	}     /* if name the same as last time, don't need */
	else  /* to hashfind again, or save the name */
	  mm[i].next_pos = mm[i].curr_pos;
	item[i] = (Hashentry *)(gp[i]->other);	  
	wanted = (choice)(ENTRY_WANTED(item[i]));
      }

      else if (lowmem[i] == 1) {
	if ((rc = do_alias(name, amemman, aliashead[i], dirsuffix,
			   dirsufflength, usercase_insensitive, 0, FALSE, i))
	    == FALSE) {
	  item[i] = hashfind(&mm[i], &(hash[i]), no_cols[i], wanthead[i],
			     UNSET, ispagehead, NULL, dirsuffix, dirsufflength,
			     usercase_insensitive, 0, FALSE, i, TRUE)->own;
	}
	else if (rc == TRUE) {
	  mm[i].next_pos = mm[i].curr_pos;  /* don't save string */
	  item[i] = hashfind(amemman, &(hash[i]), no_cols[i], wanthead[i],
			     UNSET, ispagehead, NULL, dirsuffix, dirsufflength,
			     usercase_insensitive, 0, FALSE, i, TRUE)->own;
	}
	else { /* rc == ERR */
	  mm[i].next_pos = mm[i].curr_pos;
	  if (included("", FALSE, wanthead[i]))
	    item[i] = blank_entry;
	  else
	    item[i] = unwanted_entry;
	}
	wanted = (choice)(ENTRY_WANTED(item[i]));
      }

      else { /* lowmem[i] >= 2 */
	if ((rc = do_alias(name, amemman, aliashead[i], dirsuffix,
			   dirsufflength, usercase_insensitive, 0, FALSE, i))
	    == TRUE) {
	  mm[i].next_pos = mm[i].curr_pos;  /* don't save old string */
	  len = strlen((char *)(amemman->curr_pos));
	  memcpy(submalloc(&(mm[i]), len + 1), amemman->curr_pos, len + 1);
	  name = (char *)(mm[i].curr_pos); /* which might have changed */
	  amemman->next_pos = amemman->curr_pos;
	}
	if (rc == ERR) {
	  if (included("", FALSE, wanthead[i])) {
	    item[i] = blank_entry;
	    if (i == ITEM_FILE)
	      ispage = FALSE;
	  }
	  else
	    wanted = FALSE;
	  mm[i].next_pos = mm[i].curr_pos;
	}
	else {
	  isitpage = pageq(name, ispagehead, i);
	  if (i == ITEM_FILE)
	    ispage = (choice)isitpage;
	  if (included(name, isitpage, wanthead[i])) {
	    if (lowmem[i] == 2) {
	      item[i] = hashfind(&(mm[i]), &(hash[i]), no_cols[i], wanthead[i],
				 isitpage, ispagehead, NULL, dirsuffix,
				 dirsufflength, usercase_insensitive, 0, FALSE,
				 i, TRUE)->own;
	    }
	    else {
	      item[i] = blank_entry;
	      wanttree[i] = TRUE;
	      mm[i].next_pos = mm[i].curr_pos;
	    }
	  }
	  else {
	    wanted = FALSE;
	    mm[i].next_pos = mm[i].curr_pos;
	  }
	}
      }  /* end lowmem[i] >= 2 */
    }
  }      /* end for i */
  if (!wanted) {
    logfilep->data[LOGDATA_UNWANTED]++;
    return;
  }

  /*** now add it to the hash tables ***/

  /* add to logfile from and to if wanted, whatever status code */
  if (timecode != FIRST_TIME)
    logfilep->from = MIN(logfilep->from, timecode);
  logfilep->to = MAX(logfilep->to, timecode);
  last7 = (timecode > dman->last7from && timecode <= dman->last7to);
  if (ispage == UNSET)            /* NB blank_entry has ispage FALSE */
    ispage = (choice)(item[ITEM_FILE]->ispage);
  if (count[INP_BYTES] == 0)
    bytes = 0;
  if (count[INP_CODE] == 0) {
    outcome = SUCCESS;
    if (count[ITEM_FILE] == 2) {
      logfilep->data[LOGDATA_SUCC]++;
      logfilep->data[LOGDATA_SUCC7] += (unsigned long)last7;
      logfilep->data[LOGDATA_PAGES] += (unsigned long)ispage;
      logfilep->data[LOGDATA_PAGES7] +=
	(unsigned long)((logical)ispage && last7);
    }
    else {
      logfilep->data[LOGDATA_UNKNOWN]++;
      logfilep->data[LOGDATA_UNKNOWN7] += (unsigned long)last7;
    }
  }
  else if (code <= 199) {
    outcome = INFO;
    logfilep->data[LOGDATA_INFO]++;
    logfilep->data[LOGDATA_INFO7] += (unsigned long)last7;
  }
  else switch (outcome = code2type[code]) {
  case SUCCESS:
    logfilep->data[LOGDATA_SUCC]++;
    logfilep->data[LOGDATA_SUCC7] += (unsigned long)last7;
    logfilep->data[LOGDATA_PAGES] += (unsigned long)ispage;
    logfilep->data[LOGDATA_PAGES7] +=
      (unsigned long)((logical)ispage && last7);
    break;
  case FAILURE:
    logfilep->data[LOGDATA_FAIL]++;
    logfilep->data[LOGDATA_FAIL7] += (unsigned long)last7;
    break;
  case REDIRECT:
    logfilep->data[LOGDATA_REDIR]++;
    logfilep->data[LOGDATA_REDIR7] += (unsigned long)last7;
    break;
  case INFO:
    logfilep->data[LOGDATA_INFO]++;
    logfilep->data[LOGDATA_INFO7] += (unsigned long)last7;
    break;
  }

  /* NB any change in what to count when will require corresponding change to
     end of strtoinfmt() and to fmt munching in correct() */
  if (count[INP_CODE] == 2)
    arrayscore(arraydata[REP_CODE - FIRST_ARRAYREP], code, 1,
	       (unsigned long)last7, 0, 0, 0., 0., timecode);
  if (outcome != INFO) {
    if (outcome == SUCCESS) {
      if (count[INP_DATE] == 2)  /* only if file present: see strtoinfmt() */
	datehash(timecode, dman, 1, (unsigned long)ispage, bytes, granularity);
      if (count[INP_BYTES] == 2) {
	arrayscore(arraydata[REP_SIZE - FIRST_ARRAYREP], bytes, 1,
		   (unsigned long)last7, (unsigned long)ispage,
		   (unsigned long)((logical)ispage && last7), bytes,
		   last7?bytes:0., timecode);
	logfilep->bytes += bytes;
	if (last7)
	  logfilep->bytes7 += bytes;
      }
      if (count[INP_PROCTIME] == 2)
	arrayscore(arraydata[REP_PROCTIME - FIRST_ARRAYREP], proctime, 1,
		   (unsigned long)last7, (unsigned long)ispage,
		   (unsigned long)((logical)ispage && last7), bytes,
		   last7?bytes:0., timecode);

      if (alltrees[0] != REP_NUMBER || alldervs[0] != REP_NUMBER) {
	/* for LOWMEM 3, run through alltrees then alldervs */
	/* NB these (POSSTREE/POSSDERV in init.c) only count successes */
	for (k = 0; k <= 1; k++) {
	  for (i = 0; (k?(alldervs[i]):(alltrees[i])) != REP_NUMBER; i++) {
	    j = rep2type[k?(alldervs[i]):(alltrees[i])];
	    if (wanttree[j]) {
	      dummy_item->name = mm[j].curr_pos;
	      /* mm.curr_pos is marked for deletion, but still intact at
		 present */
	      dummy_item->own->data[data2cols[j][REQUESTS]] = 1;
	      if (data2cols[j][REQUESTS7] >= 0)  /* see comment in genrep() */
		dummy_item->own->data[data2cols[j][REQUESTS7]] =
		  (unsigned long)last7;
	      if (data2cols[j][PAGES] >= 0)
		dummy_item->own->data[data2cols[j][PAGES]] =
		  (unsigned long)ispage;
	      if (data2cols[j][PAGES7] >= 0)
		dummy_item->own->data[data2cols[j][PAGES7]] =
		  (unsigned long)((logical)ispage && last7);
	      if (data2cols[j][SUCCDATE] >= 0)
		dummy_item->own->data[data2cols[j][SUCCDATE]] = timecode;
	      if (data2cols[j][SUCCFIRSTD] >= 0)
		dummy_item->own->data[data2cols[j][SUCCFIRSTD]] = timecode;
	      dummy_item->own->bytes = bytes;
	      dummy_item->own->bytes7 = last7?bytes:0.;
	      if (k)
		makederived(derv[alldervs[i] - FIRST_DERVREP], dummy_item,
			    NULL, convfloor, multibyte, alldervs[i],
			    datacols[j], no_cols[j]);
	      else {
		namestart = NULL;
		tree[G(alltrees[i])]->cutfn(&namestart, &nameend,
					    dummy_item->name, FALSE);
		(void)treefind(namestart, nameend,
			       &(tree[G(alltrees[i])]->tree), dummy_item,
			       tree[G(alltrees[i])]->cutfn, FALSE, TRUE, FALSE,
			       tree[G(alltrees[i])]->space, datacols[j],
			       no_cols[j]);
	      }
	    }
	  }
	}
      }  /* there are trees or dervs */
    }    /* outcome == SUCCESS */
    data[REQUESTS2] = 1;
    data[REQUESTS72] = (unsigned long)last7;
    data[PAGES2] = (unsigned long)ispage;
    data[PAGES72] = (unsigned long)((logical)ispage && last7);
    data[DATE2] = timecode;
    data[FIRSTD2] = timecode;
    for (i = 0; i < ITEM_NUMBER; i++) {
      if (count[i] == 2 && !ENTRY_BLANK(item[i]))
	hashscore(item[i], data, datacols[i][outcome], outcome, bytes);
    }
  }      /* end if outcome != INFO */
}

void corrupt_line(Logfile *logfilep, char *message, ptrdiff_t n) {
  extern FILE *errfile;
  extern char *debug_args, *record_start, *pos;

  pos = record_start;
  parsenonnewline(logfilep);  /* skip to after next newline */
  *pos = '\0';
  if (pos - record_start > 500)  /* debug might only handle 509 chars */
    *(record_start + 500) = '\0';
  debug('C', "%s", record_start);
  if (n < 0)
    debug('C', "  (%s)", message);
  else if (strchr(debug_args, 'C')) {
    fprintf(errfile, "C: ");
    for ( ; n >= 10; n -= 10)
      fprintf(errfile, "          ");
    for ( ; n > 0; n--)
      fputc(' ', errfile);
    fprintf(errfile, "*\n");
  }
  logfilep->data[LOGDATA_CORRUPT]++;
  *pos = '\n';
  (void)parsenewline(logfilep, NULL, '\0');
}

void arrayscore(Arraydata *array, double amount, unsigned long reqs,
		unsigned long reqs7, unsigned long pages, unsigned long pages7,
		double bytes, double bytes7, timecode_t timecode) {
  choice i;
  
  for (i = 0; ; i++) {  /* last threshold must be -1 to ensure termination */
    if (amount <= array[i].threshold || array[i].threshold < -0.5) {
      array[i].reqs += reqs;
      array[i].reqs7 += reqs7;
      array[i].pages += pages;
      array[i].pages7 += pages7;
      array[i].bytes += bytes;
      array[i].bytes7 += bytes7;
      array[i].lastdate = MAX(array[i].lastdate, timecode);
      array[i].firstdate = MIN(array[i].firstdate, timecode);
      return;
    }
  }
}
analog-6.0/src/settings.c0000644000175000017500000006525410161303543015541 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** settings.c; report variable settings */

#include "anlghea3.h"

void report_vbles(Options *op) {
  extern char *item_type[];
  extern int stz;
  extern char *debug_args, *warn_args;
  extern unsigned long progressfreq;
  extern logical cgi, anywarns;
#ifndef NOPIPES
  extern Strpairlist *uncompresshead;
#endif
  int i;

  if (cgi)
    printf("Content-Type: text/plain\n\n");

  printf("This is analog version %s\n", VERSION);
  printf("For more information on analog see docs/Readme.html or %s\n\n",
	 ANALOGURL);

  anywarns = TRUE;
  report_compile();
  report_conffiles(op->conffilelist);
  report_debug("Warning types", warn_args, "CDEFLMR");
  report_debug("Debugging types", debug_args, "CDFSUV");
  if (progressfreq == 1)
    printf("Reporting progress every line\n");
  else if (progressfreq > 0)
    printf("Reporting progress every %lu lines\n", progressfreq);
  report_logfiles(op->miscopts.logfile[1], TRUE);
  report_logfiles(op->miscopts.logfile[0], FALSE);
#ifndef NOPIPES
  report_strpairlist(uncompresshead, "Uncompressing files", "by ");
#endif
  report_fromto(&(op->dman));
  if (stz != 0)
    printf("Local computer time offset by %s%d minutes\n", (stz > 0)?"+":"",
	   stz);
  for (i = 0; i < ITEM_NUMBER; i++)
    report_want(op->wanthead[i], item_type[i], "");
  report_scwant(op->code2type);
  report_want(op->ispagehead, "as pages", "");
  report_want(op->argshead, "search arguments", "");
  report_want(op->refargshead, "referrer search arguments", "");
  if (op->outopts.repq[REP_OS])
    report_want(op->robots, "as robots", "");
  if (op->outopts.repq[REP_SEARCHREP] || op->outopts.repq[REP_SEARCHSUM])
    report_strpairlist(op->searchengines, "Search engines", "arg=");
  if (op->outopts.repq[REP_INTSEARCHREP] || op->outopts.repq[REP_INTSEARCHSUM])
    report_strpairlist(op->intsearchengines, "Internal search engines",
		       "arg=");
  for (i = 0; i < ITEM_NUMBER; i++)
    report_alias(op->aliashead[i], item_type[i], "");
  report_lowmem(op->miscopts.lowmem);
#ifndef NODNS
  report_dns();
#endif
  printf("Filenames are case %s\n",
	 (op->miscopts.case_insensitive)?"insensitive":"sensitive");
  if (op->miscopts.dirsuffix[0] == '\0')
    printf("No DIRSUFFIX\n");
  else
    printf("DIRSUFFIX %s\n", op->miscopts.dirsuffix);
  report_outopts(&(op->outopts));
}

void report_compile(void) {
  char *temps;

  printf("Compile-time optional code:\n");
#ifdef NOGRAPHICS
  printf("  No pie charts\n");
#else
#ifdef HAVE_GD
  printf("  Pie chart code included -- using your libgd\n");
#else
  printf("  Pie chart code included\n");
#endif  /* HAVE_GD */
#endif  /* NOGRAPHICS */
#ifdef NOPIPES
  printf("  No pipes [so no UNCOMPRESS command]\n");
#else
  printf("  Pipes included\n");
#endif
#ifdef NODNS
  printf("  No DNS lookups\n");
#else
  printf("  DNS lookup code included\n");
#ifdef NOALARM
  printf("  No DNS timeouts\n");
#else
  printf("  DNS timeouts possible\n");
#endif
#endif /* !NODNS */
#ifdef NODIRENT
  printf("  No dirent [so no wildcards in logfile names]\n");
#else
#ifdef MACDIRENT
  printf("  Mac dirent included\n");
#else
#ifdef VMSDIRENT
  printf("  VMS dirent included\n");
#else
#ifdef WIN32DIRENT
  printf("  Win32 dirent included\n");
#else
#ifdef RISCOSDIRENT
  printf("  RISC OS dirent included\n");
#else
#ifdef NOGLOB
  printf("  POSIX.1 dirent included\n");
#else
  printf("  POSIX.2 globbing included\n");
#endif
#endif
#endif
#endif
#endif
#endif
#ifdef NOOPEN
  printf("  No open() function\n");
#else
  printf("  Using open() function\n");
#endif
#ifdef EBCDIC
  printf("  EBCDIC character set on ");
#if defined(BS2000)
  printf("BS2000/OSD\n");
#elif defined(AS400)
  printf("AS/400\n");
#elif defined(OS390)
  printf("OS/390\n");
#else
  printf("unknown platform\n");
#endif
#endif
#ifdef NEED_STRCMP
  printf("  My strcmp()\n");
#endif
#ifdef NEED_MEMMOVE
  printf("  My memmove()\n");
#endif
#ifdef NEED_STRTOUL
  printf("  My strtoul()\n");
#endif
#ifdef NEED_DIFFTIME
  printf("  My difftime()\n");
#endif
#ifdef NEED_FLOATINGPOINT_H
  printf("   header file\n");
#endif
  printf("Compile-time variables:\n");
  if (strcaseeq(DEFAULTCONFIGFILE, "none") || IS_STDIN(DEFAULTCONFIGFILE))
    temps = DEFAULTCONFIGFILE;
  else
    temps = buildfilename(CONFIGDIR, "", DEFAULTCONFIGFILE);
  printf("  Default configuration file: %s\n", temps);
  if (!strcaseeq(DEFAULTCONFIGFILE, "none"))
    check_file(temps);
  if (strcaseeq(MANDATORYCONFIGFILE, "none") || IS_STDIN(MANDATORYCONFIGFILE))
    temps = MANDATORYCONFIGFILE;
  else
    temps = buildfilename(CONFIGDIR, "", MANDATORYCONFIGFILE);
  printf("  Madatory configuration file: %s\n", temps);
  if (!strcaseeq(MANDATORYCONFIGFILE, "none"))
    check_file(temps);
}

void report_conffiles(Strlist *list) {
  printf("Configuration files read:\n");
  if (list == NULL)
    printf("  none\n");
  for ( ; list != NULL; TO_NEXT(list)) {
    if (IS_STDIN(list->name))
      printf("  standard input\n");
    else
      printf("  %s\n", list->name);
  }
}

void report_debug(char *type, char *arg, char *fullset) {
  printf("%s on: ", type);
  if (strpbrk(fullset, arg) == NULL)
    printf("none\n");
  else if (STREQ(arg, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
    printf("all\n");
  /* See configdebug() in init2.c. 'All' should really mean 'including the
     whole of fullset' so it can still sometimes fail this test and be spelled
     out below instead, but that's not a problem. */
  else {
    for ( ; *arg != '\0'; arg++) {
      if (strchr(fullset, *arg) != NULL)
	printf("%c", *arg);
    }
    putchar('\n');
  }
}

void report_logfiles(Logfile *logfile, logical cache) {
  Logfile *lf;

  printf("Reading %sfiles:\n", cache?"cache ":"log");
  if (logfile == NULL)
    printf("  none\n");
  for (lf = logfile; lf != NULL; TO_NEXT(lf)) {
    printf("  %s\n", lf->name);
    check_file(lf->name);
    if (!cache) {
      report_logformat(stdout, lf->format, FALSE);
      if (lf->tz != 0)
	printf("    Times in logfile offset by %s%d minutes\n",
		     (lf->tz > 0)?"+":"", lf->tz);
    }
  }
}

void report_logformat(FILE *outf, Inputformatlist *format, logical inwarn) {
  Inputformatlist *fp;
  Inputformat *p;

  if (inwarn)
    fprintf(outf, "    Current logfile format:\n");
  else
    fprintf(outf, "    Logfile format:\n");
  for (fp = format; fp != NULL; TO_NEXT(fp)) {
    fprintf(outf, "      ");
    for (p = fp->form; p->inpfns != NULL; TO_NEXT(p)) {
      if (p->inpfns->code == 'x') {
	if (p->sep == '0' || p->sep == '1')
	  fprintf(outf, "");
	else if (p->sep == '2')
	  fprintf(outf, "");
	else if (p->sep == '3')
	  fprintf(outf, "");
	else if (p->sep == '4')
	  fprintf(outf, "");
      }
      else if (p->inpfns->code == '\n')
	fprintf(outf, "\\n");
      else if (p->inpfns->code != '\0')
	fprintf(outf, "%%%c", p->inpfns->code);
      if (p->inpfns->code == 'r' || p->inpfns->code == 'R' ||
	  p->inpfns->code == 'u' || p->inpfns->code == 'f' ||
	  p->inpfns->code == 'B' || p->inpfns->code == 'S' ||
	  p->inpfns->code == 'F' || p->inpfns->code == 'q' ||
	  p->inpfns->code == 'A' || p->inpfns->code == 's' ||
	  p->inpfns->code == 'C' || p->inpfns->code == 'j' ||
	  p->inpfns->code == 'v' || p->inpfns->code == '\0') {
	if (p->sep == '\t')
	  fprintf(outf, "\\t");
	else if (p->sep == '\n')
	  fprintf(outf, "\\n");
	else if (p->sep == '\\')
	  fprintf(outf, "\\\\");
	else if (p->sep == '%')
	  fprintf(outf, "%%%%");
	else if (p->sep != WHITESPACE)   /* whitespace has following %w */
	  putc(p->sep, outf);
      }
    }
    putc('\n', outf);
  }
}

void report_fromto(Dateman *dman) {
  extern char *engmonths[];

  unsigned int date, month, year;
  if (dman->from == FIRST_TIME && dman->to == LAST_TIME)
    printf("Analysing all dates\n");
  else {
    printf("Analysing dates");
    if (dman->from != FIRST_TIME) {
      code2date(dman->from / 1440, &date, &month, &year);
      printf(" from %02d/%s/%d at %02d:%02d", date, engmonths[month], year,
	     (int)((dman->from % 1440) / 60), (int)(dman->from % 60));
    }
    if (dman->to != LAST_TIME) {
      code2date(dman->to / 1440, &date, &month, &year);
      printf(" to %02d/%s/%d at %02d:%02d", date, engmonths[month], year,
	     (int)((dman->to % 1440) / 60), (int)(dman->to % 60));
    }
    putchar('\n');
  }
}

void report_want(Include *wanthead, char *type, char *indent) {
  static char *pre0 = "";
  static char *pre1 = "REGEXP:";
  static char *pre2 = "REGEXPI:";
  static char *blanks = "[blanks]";

  char *pre, *name;
  Include *wp, *lwp, *nextwp;

  if (wanthead != NULL) {
    /* We first have to turn all the links round to get the list in the right
       order. But we won't use them again. */
    for (wp = wanthead, lwp = NULL; wp != NULL; wp = nextwp) {
      nextwp = wp->next;
      wp->next = lwp;
      lwp = wp;
    }
    /* after this, lwp is the new head */
    printf("%sIncluding (+) and excluding (-) the following %s:\n",
	   indent, type);
    printf("%s  All %scluded, then\n", indent, IS_INC(lwp->type)?"ex":"in");
    for (wp = lwp; wp != NULL; TO_NEXT(wp)) {
      name = wp->name;
      pre = pre0;
      if (IS_REGEXT(wp->type)) {
	if (name[6] == ':') {
	  pre = pre1;
	  name += 7;
	}
	else {
	  pre = pre2;
	  name += 8;
	}
      }
      else if (IS_EMPTY_STRING(name))
	name = blanks;
      printf("%s  %c %s%s\n", indent, IS_INC(wp->type)?'+':'-', pre, name);
    }
  }
}

void report_scwant(choice *code2type) {
  int i, j;
  logical f;

  for (i = MIN_SC, f = FALSE; i < SC_NUMBER && !f; i++) {
    if (code2type[i] == UNWANTED)
      f = TRUE;
  }
  if (f) {
    printf("Including only the following status codes:\n  ");
    for (i = MIN_SC, j = 0; i <= SC_NUMBER; i++) {
      if (j != 0 && (i == SC_NUMBER || code2type[i] == UNWANTED)) {
	if (f)  /* reusing f for first printing */
	  f = FALSE;
	else
	  printf(",");
	if (i == j + 1)
	  printf("%d", j);
	else
	  printf("%d-%d", j, i - 1);
	j = 0;
      }
      else if (j == 0 && i != SC_NUMBER && code2type[i] != UNWANTED)
	j = i;
    }
    if (f)
      printf("none");
    printf("\n");
  }
}

void report_alias(Alias *aliashead, char *type, char *indent) {
  static char *pre0 = "";
  static char *pre1 = "REGEXP:";
  static char *pre2 = "REGEXPI:";

  char *pre, *from;
  Alias *ap;
  AliasTo *tp;

  if (aliashead != NULL) {
    printf("%sAliasing %s as follows:\n", indent, type);
    for (ap = aliashead; ap != NULL; TO_NEXT(ap)) {
      from = ap->from;
      pre = pre0;
      if (ap->isregex) {
	if (from[6] == ':') {
	  pre = pre1;
	  from += 7;
	}
	else {
	  pre = pre2;
	  from += 8;
	}
      }
      printf("%s  %s%s -> ", indent, pre, from);
      for (tp = ap->to; tp != NULL; TO_NEXT(tp)) {
	printf("%s", tp->string);
	if (tp->after >= 0)
	  printf("$%d", (tp->after) / 2 + !(ap->isregex));
	/* internal representation for !regex is one out */
      }
      putchar('\n');
    }
  }
}

void report_strpairlist(Strpairlist *head, char *type, char *connector) {
  Strpairlist *ap;

  if (head != NULL) {
    printf("%s as follows:\n", type);
    for (ap = head; ap != NULL; TO_NEXT(ap))
      printf("  %s %s%s\n", ap->name, connector, ap->data);
  }
}

void report_lowmem(choice lowmem[]) {
  extern char *item_type[];
  int i, j = 0;

  for (i = 0; i < ITEM_NUMBER; i++)
    j += (int)(lowmem[i]);
  if (j == 0)
    printf("No LOWMEM commands in operation\n");
  else {
    printf("LOWMEM settings are:\n");
    for (i = 0; i < ITEM_NUMBER; i++)
      printf("  %s: %d\n", item_type[i], lowmem[i]);
  }
}

#ifndef NODNS
void report_dns(void) {
  extern choice dnslevel;
  extern char *dnsfile, *dnslockfile;
  extern unsigned int dnsgoodhrs, dnsbadhrs;
#ifndef NOALARM
  extern unsigned int dnstimeout;
#endif

  printf("DNS level is ");
  if (dnslevel == DNS_NONE)
    printf("NONE\n");
  else if (dnslevel == DNS_READ)
    printf("READ\n");
  else if (dnslevel == DNS_LOOKUP)
    printf("LOOKUP\n");
  else
    printf("WRITE\n");
  if (dnslevel != DNS_NONE) {
    printf("DNS file is %s\n", dnsfile);
    if (dnslevel == DNS_WRITE)
      printf("DNS lock file is %s\n", dnslockfile);
    printf("Resolved DNS entries rechecked if older than %u hours\n",
	   dnsgoodhrs);
    printf("Unresolved DNS entries rechecked if older than %u hours\n",
	   dnsbadhrs);
#ifndef NOALARM
    if (dnslevel >= DNS_LOOKUP) {
      if (dnstimeout > 0)
	printf("Abort DNS lookups after %u seconds\n", dnstimeout);
      else
	printf("No timeout on DNS lookups\n");
    }
#endif
  }
}
#endif

void report_outopts(Outchoices *od) {
  extern char *repname[];
  extern char *englongdays[];
  extern logical cgi;

#ifndef NOGRAPHICS
  unsigned int numcharts = 0;
#endif
  int i;
  choice j;

  if (od->outstyle == OUT_NONE) {
    printf("Output style is NONE\n");
    if (strcaseeq(od->cacheoutfile, "none")) { /* same as below */
      printf("No cache output file\n");
      printf("NB OUTPUT NONE and no cache output file is an error!\n");
    }
    else
      printf("Cache output file is %s\n",
	     IS_STDOUT(od->cacheoutfile)?"stdout":(od->cacheoutfile));
  }
  else {
    printf("Report order is as follows:\n");
    for (i = 0; od->reporder[i] != -1; i++) {
      j = od->reporder[i];
      printf("  %s [%s]\n", repname[j], (od->repq[j])?"ON":"OFF");
      if (od->repq[j]) {
	if (j < DATEREP_NUMBER)
	  report_daterep(od, j);
	else if (j == REP_GENSUM)
	  report_debug("    General Summary lines", od->gensumlines,
		       "BCDEFGHIJKLMN");
	else if (j <= LAST_NORMALREP || j == REP_CODE) {
	  report_genrep(od, j);
#ifndef NOGRAPHICS
	  numcharts += (od->chartby[G(j)] != CHART_NONE);
#endif
	}
	else { /* REP_SIZE || REP_PROCTIME */
	  report_cols(od->cols[j]);
#ifndef NOGRAPHICS
	  if (od->outstyle == HTML || od->outstyle == XHTML)
	    report_chart(od->chartby[G(j)]);
	  numcharts += (od->chartby[G(j)] != CHART_NONE);
#endif
	}
      }
    }

    printf("Output file is %s\n",
	   IS_STDOUT(od->outfile)?"stdout":(od->outfile));
    if (strcaseeq(od->cacheoutfile, "none"))  /* same as above */
      printf("No cache output file\n");
    else
      printf("Cache output file is %s\n",
	     IS_STDOUT(od->cacheoutfile)?"stdout":(od->cacheoutfile));
    /* Don't check writeability because would overwrite */
    printf("Language file is %s\n", od->lang.file);
    check_file(od->lang.file);
    printf("Domains file is %s\n", od->domainsfile);
    check_file(od->domainsfile);
    if (od->outstyle == HTML || od->outstyle == XHTML)
      printf("Go To lines are %s\n",
	     (od->gotos == TRUE)?"on":((od->gotos == FALSE)?"off":
				       "on at top and bottom only"));
    if (!od->descriptions)
      puts("Report descriptions are off");
    else if (od->descfile == NULL)
      puts("Report descriptions are off (no descriptions file)");
    else {
      printf("Report descriptions file is %s\n", od->descfile);
      check_file(od->descfile);
    }
    printf("Report spans are %s\n", (od->repspan)?"ON":"OFF");
    if (od->repspan)
      printf("Report span threshold is %u minutes\n", od->rsthresh);
    printf("Output style is ");
    if (od->outstyle == HTML) {
      printf("HTML\n");
      if (strcaseeq(od->stylesheet, "none"))
	printf("No style sheet\n");
      else
	printf("Style sheet is %s\n", od->stylesheet);
    }
    else if (od->outstyle == XHTML) {
      printf("XHTML\n");
      if (strcaseeq(od->stylesheet, "none"))
	printf("Default (inline) style sheet\n");
      else
	printf("Style sheet is %s\n", od->stylesheet);
      if (strcaseeq(od->stylesheet, "none"))
	printf("No CSS prefix\n");
      else
	printf("CSS prefix is %s\n", od->cssprefix);
    }
    else if (od->outstyle == ASCII)
      printf("ASCII\n");
    else if (od->outstyle == PLAIN)
      printf("PLAIN\n");
    else if (od->outstyle == LATEX)
      printf("LATEX (and PDFLATEX is %s)\n", (od->pdflatex)?"ON":"OFF");
    else {  /* OUT_NONE is reported above */
      printf("COMPUTER\n");
      printf("The field separator is \"%s\"\n", od->compsep);
    }
    if (cgi)
      printf("Including CGI header lines\n");
    if (strcaseeq(od->headerfile, "none"))
      printf("No header file\n");
    else {
      printf("Header file is %s\n", od->headerfile);
      check_file(od->headerfile);
    }
    if (strcaseeq(od->footerfile, "none"))
      printf("No footer file\n");
    else {
      printf("Footer file is %s\n", od->footerfile);
      check_file(od->footerfile);
    }
    printf("Host name for title is %s\n", od->hostname);
    if (od->outstyle == HTML || od->outstyle == XHTML) {
      if (strcaseeq(od->hosturl, "none"))
	printf("Host name unlinked\n");
      else
	printf("Host name linked to %s\n", od->hosturl);
      if (strcaseeq(od->logo, "none"))
	printf("No logo for title line\n");
      else {
	printf("Logo for title line is %s", od->logo);
	if (STREQ(od->logo, "analogo"))
	  printf(".%s", od->pngimages?"png":"gif");
	putchar('\n');
	if (od->outstyle == XHTML) {
	  if (strcaseeq(od->logourl, "none"))
	    printf("Logo unlinked\n");
	  else
	    printf("Logo linked to %s\n", od->logourl);
	}
      }
      printf("URL of image directory is %s\n", od->imagedir);
      printf("Using %s images\n", od->pngimages?"PNG":"GIF");
#ifndef NOGRAPHICS
      if (numcharts != 0) {
	if (!IS_EMPTY_STRING(od->chartdir))  /* Should never be NULL: init.c */
	  printf("URL of pie chart directory is %s\n", od->chartdir);
	printf("Local location of pie chart directory is %s\n",
	       od->localchartdir);
#ifdef HAVE_GD
	printf("Charts in %s format\n", (od->jpegcharts)?"JPEG":"PNG");
#endif
      }
#endif
    }
    else if (od->outstyle == COMPUTER) {
      if (strcaseeq(od->hosturl, "none"))
	printf("No host URL\n");
      else
	printf("Host URL is %s\n", od->hosturl);
    }
    if (od->rawbytes)
      printf("Displaying exact bytes\n");
    else
      printf("Displaying bytes rounded to %u decimal places\n", od->bytesdp);
    if (od->outstyle != COMPUTER) {
      printf("The character for graph plotting is: %c\n", od->markchar);
      report_sep(od->sepchar, "thousands separator");
      report_sep(od->repsepchar, "thousands separator in tables");
      report_sep(od->decpt, "decimal point");
      printf("The page width is %d\n", od->outputter->pagewidth(od));
      printf("The minimum graph width is %d\n", od->mingraphwidth);
    }
    printf("Weeks begin on %s\n", englongdays[od->weekbeginson]);
  }
}

void report_sep(char c, char *type) {
  if (c == (char)UNSET)
    printf("The %s is: [from language file]\n", type);
  else if (c == ' ')
    printf("The %s is: [space]\n", type);
  else if (c == '\0')
    printf("The %s is: [none]\n", type);
  else
    printf("The %s is: %c\n", type, c);
}

void report_daterep(Outchoices *od, choice j) {
  report_cols(od->cols[j]);
  if (j < DATEREPORTS_NUMBER) {
    printf("    Maximum number of rows: ");
    if (od->rows[j] == 0)
      printf("unlimited\n");
    else
      printf("%u\n", od->rows[j]);
  }
  printf("    Graphing by ");
  if (od->graph[j] == 'R' || od->graph[j] == 'r')
    printf("requests\n");
  else if (od->graph[j] == 'P' || od->graph[j] == 'p')
    printf("requests for pages\n");
  else
    printf("bytes\n");
  if (j < DATEREPORTS_NUMBER)
    printf("    Displaying %s dates at top\n",
	   (od->back[j])?"latest":"earliest");
}

void report_genrep(Outchoices *od, choice j) {
  report_cols(od->cols[j]);
  report_sortby(od->sortby[G(j)], FALSE);
  report_floor(&(od->floor[G(j)]), FALSE);
  if (od->subsortby[G(j)] != UNSET) {  /* report is hierarchical */
    report_sortby(od->subsortby[G(j)], TRUE);
    report_floor(&(od->subfloor[G(j)]), TRUE);
  }
#ifndef NOGRAPHICS
  if (od->outstyle == HTML || od->outstyle == XHTML)
    report_chart(od->chartby[G(j)]);
#endif
  report_want(od->wanthead[G(j)], "in the report", "    ");
  report_alias(od->aliashead[G(j)], "in the report", "    ");
  report_want(od->link[G(j)], "links in the report", "    ");
}

void report_cols(choice *cols) {
  choice c;

  printf("    Columns:");
  if (cols[0] == COL_NUMBER)
    printf(" \n");
  else for (c = 0; cols[c] != COL_NUMBER; c++) {
    switch (cols[c]) {
    case COL_REQS:
      printf(" #requests");
      break;
    case COL_REQS7:
      printf(" #7-day-requests");
      break;
    case COL_PREQS:
      printf(" %%requests");
      break;
    case COL_PREQS7:
      printf(" %%7-day-requests");
      break;
    case COL_PAGES:
      printf(" #pages");
      break;
    case COL_PAGES7:
      printf(" #7-day-pages");
      break;
    case COL_PPAGES:
      printf(" %%pages");
      break;
    case COL_PPAGES7:
      printf(" %%7-day-pages");
      break;
    case COL_BYTES:
      printf(" #bytes");
      break;
    case COL_BYTES7:
      printf(" #7-day-bytes");
      break;
    case COL_PBYTES:
      printf(" %%bytes");
      break;
    case COL_PBYTES7:
      printf(" %%7-day-bytes");
      break;
    case COL_DATE:
      printf(" last-date");
      break;
    case COL_FIRSTD:
      printf(" first-date");
      break;
    case COL_TIME:
      printf(" last-time");
      break;
    case COL_FIRSTT:
      printf(" first-time");
      break;
    case COL_INDEX:
      printf(" number");
      break;
    }
  }
  putchar('\n');
}

void report_sortby(choice sortby, logical sub) {
  if (sub)
    printf("    Sorting sub-items ");
  else
    printf("    Sorting ");
  if (sortby == ALPHABETICAL)
    printf("alphabetically\n");
  else if (sortby == RANDOM)
    printf("randomly\n");
  else if (sortby == REQUESTS)
    printf("by number of requests\n");
  else if (sortby == REQUESTS7)
    printf("by number of requests in the last 7 days\n");
  else if (sortby == PAGES)
    printf("by number of requests for pages\n");
  else if (sortby == PAGES7)
    printf("by number of requests for pages in the last 7 days\n");
  else if (sortby == DATESORT)
    printf("by date of last request\n");
  else if (sortby == FIRSTDATE)
    printf("by date of first request\n");
  else if (sortby == BYTES)
    printf("by number of bytes\n");
  else /* sortby == BYTES7 */
    printf("by number of bytes in the last 7 days\n");
}

void report_floor(Floor *floor, logical sub) {
  /* this is copied (simplified) from whatincluded() in output2.c */
  unsigned long temp;
  timecode_t tempd;
  char *datefmt = "%d/%m/%y at %H:%n";

  if (sub)
    printf("    Floor for sub-items is: ");
  else
    printf("    Floor is: ");

  if (floor->min < 0) {
    temp = (unsigned long)(-floor->min + EPSILON);
    printf("Top %lu item%s by ", temp, (temp == 1)?"":"s");
    if (floor->floorby == REQUESTS)
      printf("number of requests\n");
    else if (floor->floorby == REQUESTS7)
      printf("number of requests in the last 7 days\n");
    else if (floor->floorby == DATESORT)
      printf("date of last request\n");
    else if (floor->floorby == FIRSTDATE)
      printf("date of first request\n");
    else if (floor->floorby == PAGES)
      printf("number of requests for pages\n");
    else if (floor->floorby == PAGES7)
      printf("number of requests for pages in the last 7 days\n");
    else if (floor->floorby == BYTES)
      printf("number of bytes\n");
    else /* floor->floorby == BYTES7 */
      printf("number of bytes in the last 7 days\n");
  }
  else {   /* floor->min >= 0 */
    if (floor->floorby == DATESORT || floor->floorby == FIRSTDATE) {
      tempd = (timecode_t)(floor->min + EPSILON);
      if (floor->floorby == DATESORT)
	printf("items with requests since ");
      else
	printf("items with first request since ");
      printf("%s", timesprintf(NULL, datefmt, tempd, FALSE));
    }
    else if (floor->min > EPSILON) {
      if (floor->qual == '\0') {
	temp = (unsigned long)(floor->min + EPSILON);
	printf("%lu ", temp);
	if (floor->floorby == REQUESTS)
	  printf((temp == 1)?"request\n":"requests\n");
	else if (floor->floorby == REQUESTS7)
	  printf("%s in the last 7 days\n", (temp == 1)?"request":"requests");
	else if (floor->floorby == PAGES)
	  printf((temp == 1)?"request for a page\n":"requests for pages\n");
	else if (floor->floorby == PAGES7)
	  printf("%s in the last 7 days\n",
		 (temp == 1)?"request for a page":"requests for pages");
	else if (floor->floorby == BYTES)
	  printf((temp == 1)?"byte\n":"bytes\n");
	else /* floor->floorby == BYTES7 */
	  printf("%s in the last 7 days\n", (temp == 1)?"byte":"bytes");
      }
      else {  /* floor->qual != '\0' */
	plain_printdouble(stdout, NULL, floor->min);
	if (floor->qual == '%') {
	  if (floor->floorby == REQUESTS)
	    printf("%% of the requests\n");
	  else if (floor->floorby == REQUESTS7)
	    printf("%% of the requests in the last 7 days\n");
	  else if (floor->floorby == PAGES)
	    printf("%% of the requests for pages\n");
	  else if (floor->floorby == PAGES7)
	    printf("%% of the requests for pages in the last 7 days\n");
	  else if (floor->floorby == BYTES)
	    printf("%% of the bytes\n");
	  else /* floor->floorby == BYTES7 */
	    printf("%% of the bytes in the last 7 days\n");
	}
	else if (floor->qual == ':') {
	  if (floor->floorby == REQUESTS)
	    printf("%% of the maximum number of requests\n");
	  else if (floor->floorby == REQUESTS7)
	    printf("%% of the maximum number of requests in the last 7 days\n");
	  else if (floor->floorby == PAGES)
	    printf("%% of the maximum number of requests for pages\n");
	  else if (floor->floorby == PAGES7)
	    printf("%% of the maximum number of requests for pages in the last 7 days\n");
	  else if (floor->floorby == BYTES)
	    printf("%% of the maximum number of bytes\n");
	  else if (floor->floorby == BYTES7)
	    printf("%% of the maximum number of bytes in the last 7 days\n");
	}
	else /* if qual is anything else, must be (k|M|G|T)bytes[7] */
	  printf(" %cbytes%s\n", floor->qual,
		 (floor->floorby == BYTES)?"":" in the last 7 days");
      }   /* end floor->qual != '\0' */
    }     /* end floor->min > EPSILON */
    else
      printf("[all items]\n");
  }       /* end floor->min > 0 */
}

#ifndef NOGRAPHICS
void report_chart(choice chartby) {
  if (chartby == CHART_NONE) {
    printf("    No pie chart\n");
    return;
  }
  printf("    Plotting pie chart ");
  if (chartby == REQUESTS)
    printf("by number of requests\n");
  else if (chartby == REQUESTS7)
    printf("by number of requests in the last 7 days\n");
  else if (chartby == PAGES)
    printf("by number of requests for pages\n");
  else if (chartby == PAGES7)
    printf("by number of requests for pages in the last 7 days\n");
  else if (chartby == BYTES)
    printf("by number of bytes\n");
  else /* chartby == BYTES7 */
    printf("by number of bytes in the last 7 days\n");
}
#endif

void check_file(char *name) {
  FILE *f = NULL;

  if (!IS_STDIN(name) && (f = FOPENR(name)) == NULL)
    printf("    Warning: cannot open that file\n");
  if (f != NULL)
    fclose(f);
}
analog-6.0/src/sort.c0000644000175000017500000004532310161303543014663 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** sort.c; sort a hashindex tree into a list by some criterion ***/

#include "anlghea3.h"

#define FINDNAME(p) ((rep >= 0)?(maketreename(partname, (p), newpn, space, need, rep, FALSE)):((p)->name))

/* See commentary in my_sort() below */
void calctotmax(Hashindex **gooditems, Hashindex **baditems, Strlist *partname,
		Strlist **newpn, Strlist *space, size_t need, choice rep,
		Include *wanthead, choice requests, choice requests7,
		choice pages, choice pages7, choice date, choice firstd,
		unsigned long *totr, unsigned long *totr7, unsigned long *totp,
		unsigned long *totp7, double *totb, double *totb7,
		unsigned long *maxr, unsigned long *maxr7, unsigned long *maxp,
		unsigned long *maxp7, double *maxb, double *maxb7,
		timecode_t *maxd, timecode_t *mind, logical donetots,
		logical nosort, Hashindex **ans3) {
  Hashindex *p, *nextp, *goods = NULL;
  logical done;

  if (!donetots) {
    *totr = *totr7 = *totp = *totp7 = *maxr = *maxr7 = *maxp = *maxp7 = 0;
    *totb = *totb7 = *maxb = *maxb7 = 0.;
    *maxd = FIRST_TIME;
    *mind = LAST_TIME;
  }
  if (*gooditems != NULL) {
    p = *gooditems;
    done = FALSE;
  }
  else {
    p = *baditems;
    done = TRUE;
  }

  for ( ; p != NULL; p = nextp) {
    /* Calculate the next p immediately because we will mess with p->next */
    nextp = p->next;
    if (nextp == NULL && !done) {
      nextp = *baditems;
      done = TRUE;
    }

    /* Is this item wanted? */
    if (!nosort &&
	(p->own == NULL || p->own->data[requests] == 0 ||
	 !included(FINDNAME(p), p->own->ispage, wanthead))) {
      /* not wanted; add to ans3 */
      p->next = *ans3;
      *ans3 = p;
    }
    else {
      /* wanted; add to goods, and include in tot and max */
      if (!nosort) {
	p->next = goods;
	goods = p;
      }
      if (!donetots) {
	*totr += p->own->data[requests];
	*maxr = MAX(*maxr, p->own->data[requests]);
	if (pages >= 0) {
	  /* This caution is probably unnecessary: if pages == -1, totp will
	     not be used. But technically, data[-1] is undefined behaviour, and
	     the program is then within its rights to crash. :)
	     'requests' is never -1, by the way: see wantcol[] in init.c. */
	  *totp += p->own->data[pages];
	  *maxp = MAX(*maxp, p->own->data[pages]);
	}
	if (requests7 >= 0) {
	  *totr7 += p->own->data[requests7];
	  *maxr7 = MAX(*maxr7, p->own->data[requests7]);
	}
	if (pages7 >= 0) {
	  *totp7 += p->own->data[pages7];
	  *maxp7 = MAX(*maxp7, p->own->data[pages7]);
	}
	*totb += p->own->bytes;
	*totb7 += p->own->bytes7;
	*maxb = MAX(*maxb, p->own->bytes);
	*maxb7 = MAX(*maxb7, p->own->bytes7);
	if (date >= 0)
	  *maxd = MAX(*maxd, p->own->data[date]);
	if (firstd >= 0 && p->own->data[firstd] != 0)
	  *mind = MIN(*mind, p->own->data[firstd]);
      }  /* !donetots */
    }  /* item wanted */
  }  /* p loop */

  /* Make gooditems into the resultant list of wanted things */
  if (!nosort) {
    *gooditems = goods;
    *baditems = NULL;
  }
}

/* See commentary in my_sort() below */
void calcfloor(unsigned long *min, double *dmin, choice *filterby,
	       Floor *floor, choice requests, choice requests7, choice pages,
	       choice pages7, choice date, choice firstd, unsigned long totr,
	       unsigned long totr7, unsigned long totp, unsigned long totp7,
	       double totb, double totb7, unsigned long maxr,
	       unsigned long maxr7, unsigned long maxp, unsigned long maxp7,
	       double maxb, double maxb7) {
  extern char *byteprefix;
  char *b;

  *min = 0;
  *dmin = floor->min;
  *filterby = floor->floorby;
  if (*filterby == REQUESTS) {
    *filterby = requests;
    if (floor->qual == '%')
      *dmin *= (double)totr / 100.0;  /* NB dmin < 0 => qual == '\0' */
    else if (floor->qual == ':')
      *dmin *= (double)maxr / 100.0;
    /* negative doubles may not convertable to unsigned integral types --
       C spec 6.2.1.3 */
    *min = (*dmin >= 0)?(unsigned long)(*dmin + 1 - EPSILON):0;
  }
  else if (*filterby == REQUESTS7) {
    *filterby = requests7;
    if (floor->qual == '%')
      *dmin *= (double)totr7 / 100.0;
    else if (floor->qual == ':')
      *dmin *= (double)maxr7 / 100.0;
    *min = (*dmin >= 0)?(unsigned long)(*dmin + 1 - EPSILON):0;
  }
  else if (*filterby == PAGES) {
    *filterby = pages;
    if (floor->qual == '%')
      *dmin *= (double)totp / 100.0;
    else if (floor->qual == ':')
      *dmin *= (double)maxp / 100.0;
    *min = (*dmin >= 0)?(unsigned long)(*dmin + 1 - EPSILON):0;
  }
  else if (*filterby == PAGES7) {
    *filterby = pages7;
    if (floor->qual == '%')
      *dmin *= (double)totp7 / 100.0;
    else if (floor->qual == ':')
      *dmin *= (double)maxp7 / 100.0;
    *min = (*dmin >= 0)?(unsigned long)(*dmin + 1 - EPSILON):0;
  }
  else if (*filterby == BYTES) {
    if (floor->qual == '%')
      *dmin *= totb / 100.0;
    else if (floor->qual == ':')
      *dmin *= maxb / 100.0;
    else if (floor->qual != '\0' &&
	     strchr(byteprefix + 1, floor->qual) != NULL) {
      for (b = byteprefix; *b != floor->qual; b++)
	*dmin *= 1024.0;
    }
  }
  else if (*filterby == BYTES7) {
    if (floor->qual == '%')
      *dmin *= totb7 / 100.0;
    else if (floor->qual == ':')
      *dmin *= maxb7 / 100.0;
    else if (floor->qual != '\0' &&
	     strchr(byteprefix + 1, floor->qual) != NULL) {
      for (b = byteprefix; *b != floor->qual; b++)
	*dmin *= 1024.0;
    }
  }
  else if (*filterby == DATESORT) {
    *filterby = date;
    *min = (*dmin >= 0)?(unsigned long)(*dmin + 1 - EPSILON):0;
  }
  else { /* *filterby == FIRSTDATE */
    *filterby = firstd;
    *min = (*dmin >= 0)?(unsigned long)(*dmin + 1 - EPSILON):0;
  }
}

/* See commentary in my_sort() below */
void makebadpn(Hashentry **badp, unsigned long *badn, Hashindex *ans2,
	       choice requests, choice requests7, choice pages, choice pages7,
	       choice date, choice firstd, unsigned long *maxr,
	       unsigned long *maxr7, unsigned long *maxp, unsigned long *maxp7,
	       double *maxb, double *maxb7, logical donetots) {
  /* Assume already tested badp != NULL */
  Hashindex *p;

  *badp = newhashentry(DATA_NUMBER, FALSE);
  *badn = 0;
  for (p = ans2; p != NULL; TO_NEXT(p)) {
    (*badp)->data[requests] += p->own->data[requests];
    if (pages >= 0)  /* see comment in calctotmax() */
      (*badp)->data[pages] += p->own->data[pages];
    if (requests7 >= 0)
      (*badp)->data[requests7] += p->own->data[requests7];
    if (pages7 >= 0)
      (*badp)->data[pages7] += p->own->data[pages7];
    (*badp)->bytes += p->own->bytes;
    (*badp)->bytes7 += p->own->bytes7;
    if (date >= 0)
      (*badp)->data[date] = MAX((*badp)->data[date], p->own->data[date]);
    if (firstd >= 0) {
      if ((*badp)->data[firstd] == 0)
	(*badp)->data[firstd] = p->own->data[firstd];
      else
	(*badp)->data[firstd] =
	  MIN((*badp)->data[firstd], p->own->data[firstd]);
    }
    (*badn)++;
  }
  if (!donetots) {
    *maxr = MAX(*maxr, (*badp)->data[requests]);
    *maxp = (pages >= 0)?(MAX(*maxp, (*badp)->data[pages])):0;
    *maxr7 = (requests7 >= 0)?(MAX(*maxr7, (*badp)->data[requests7])):0;
    *maxp7 = (pages7 >= 0)?(MAX(*maxp7, (*badp)->data[pages7])):0;
    *maxb = MAX(*maxb, (*badp)->bytes);
    *maxb7 = MAX(*maxb7, (*badp)->bytes7);
  }
}

/* Sorting routine. We do a different sort depending whether the floor is +ve
   (merge sort) or -ve (insertion sort) */
void my_sort(Hashindex **gooditems, Hashindex **baditems, Strlist *partname,
	     Strlist **newpn, Strlist *space, size_t need, choice rep,
	     Floor *floor, choice sortby, logical alphaback, Include *wanthead,
	     choice requests, choice requests7, choice pages, choice pages7,
	     choice date, choice firstd, unsigned long *totr,
	     unsigned long *totr7, unsigned long *totp, unsigned long *totp7,
	     double *totb, double *totb7, unsigned long *maxr,
	     unsigned long *maxr7, unsigned long *maxp, unsigned long *maxp7,
	     double *maxb, double *maxb7, timecode_t *maxd, timecode_t *mind,
	     logical donetots, Hashentry **badp, unsigned long *badn,
	     logical nosort) {
  /* NB floor and sortby could be a SUBFLOOR and SUBSORTBY (see sorttree()) */
  /* Call with rep set to -1 for a flat report, only >= 0 for tree (see
     FINDNAME() above) */
  Hashindex *ans = NULL, *ans2 = NULL, *ans3 = NULL;
  /* wanted items; items below floor; items not wanted even as "not listed" */
  Hashindex *p, *nextp, *q, *lastq = NULL;
  unsigned long min;
  double dmin;
  choice filterby;
  unsigned long count;

  /* Run through all the items discarding unwanted ones into ans3; putting all
     the rest into gooditems; and (if !donetots) finding totals and maxima of
     the gooditems for calculating floors. */
  calctotmax(gooditems, baditems, partname, newpn, space, need, rep, wanthead,
	     requests, requests7, pages, pages7, date, firstd, totr, totr7,
	     totp, totp7, totb, totb7, maxr, maxr7, maxp, maxp7, maxb, maxb7,
	     maxd, mind, donetots, nosort, &ans3);

  if (nosort)
    return;

  /* Calculate the value of the floor (min, dmin and filterby) */
  calcfloor(&min, &dmin, &filterby, floor, requests, requests7, pages, pages7,
	    date, firstd, *totr, *totr7, *totp, *totp7, *totb, *totb7, *maxr,
	    *maxr7, *maxp, *maxp7, *maxb, *maxb7);

  /* Now do the actual flooring and sorting. */
  /* Case I; -ve floor; insertion sort (small end first for speed) */
  if (dmin < 0) {

    /* First work out which items wanted; count represents the remaining number
       of items we want to find */
    count = (unsigned long)(-dmin + EPSILON);

    for (p = *gooditems; p != NULL; p = nextp) {
      nextp = p->next;  /* need this because will overwrite p->next */

      if ((filterby != BYTES && filterby != BYTES7 &&
	   p->own->data[filterby] == 0) ||
	  (filterby == BYTES && p->own->bytes == 0) ||
	  (filterby == BYTES7 && p->own->bytes7 == 0)) {
	/* if it scored 0 we don't want it even if it is in the top n */
	p->next = ans2;
	ans2 = p;
      }
      else {   /* provisionally wanted; check if in top n */
	if (filterby == BYTES) {
	  for (q = ans; q != NULL && p->own->bytes > q->own->bytes;
	       TO_NEXT(q))
	    lastq = q;   /* run to right place in emerging list */
	}
	else if (filterby == BYTES7) {
	  for (q = ans; q != NULL && p->own->bytes7 > q->own->bytes7;
	       TO_NEXT(q))
	    lastq = q;
	}
	else {
	  for (q = ans; q != NULL &&
	       p->own->data[filterby] > q->own->data[filterby];
	       TO_NEXT(q))
	    lastq = q;
	}
	if (q == ans) {  /* at beginning of list */
	  if (count > 0) {     /* list still not big enough */
	    p->next = ans;
	    ans = p;
	    count--;
	  }
	  else {    /* not in top n */
	    p->next = ans2;
	    ans2 = p;
	  }
	}
	else {  /* not at beginning of list, so in top n */
	  p->next = lastq->next;
	  lastq->next = p;
	  if (count == 0) { /* list already full, so shunt smallest item off */
	    lastq = ans; /* temporarily re-using lastq for old ans */
	    ans = ans->next;
	    lastq->next = ans2;
	    ans2 = lastq;
	  }
	  else
	    count--;
	}
      }
    }

    /* Then sort them */
    if (sortby == floor->floorby || sortby == RANDOM) {
      /* easy case; swap the list round so that the largest item is first */
      q = NULL;  /* q is last p */
      for (p = ans; p != NULL; p = nextp) {
	nextp = p->next;
	p->next = q;
	q = p;
      }
      ans = q;
    }
    else {  /* sortby != floorby, so have to sort properly */
      count = 0;
      for (p = ans; p != NULL; TO_NEXT(p))
	count++;
      if (count > 0) {
	if (sortby == BYTES)
	  ans = my_mergesort(ans, count, sortby, &mergeb);
	else if (sortby == BYTES7)
	  ans = my_mergesort(ans, count, sortby, &mergeb7);
	else if (sortby == ALPHABETICAL) {
	  if (alphaback)
	    reversenames(ans);
	  ans = my_mergesort(ans, count, sortby, &mergea);
	}
	else if (sortby == REQUESTS)
	  ans = my_mergesort(ans, count, requests, &merge);
	else if (sortby == REQUESTS7)
	  ans = my_mergesort(ans, count, requests7, &merge);
	else if (sortby == PAGES)
	  ans = my_mergesort(ans, count, pages, &merge);
	else if (sortby == PAGES7)
	  ans = my_mergesort(ans, count, pages7, &merge);
	else if (sortby == DATESORT)
	  ans = my_mergesort(ans, count, date, &merge);
	else /* sortby == FIRSTDATE */
	  ans = my_mergesort(ans, count, firstd, &merge);
	/* it's possible that the list has acquired some trailing junk which
	   we have to lop off */
	for (p = ans; count > 1; TO_NEXT(p))
	  count--;
	p->next = NULL;
	if (alphaback && sortby == ALPHABETICAL)
	  reversenames(ans);
      }
    }
  }

  /* Case II; +ve floor; mergesort */
  else {   /* dmin >= 0 */

    /* First find the wanted ones */
    count = 0;
    if (dmin <= 0.5) {
      filterby = requests;
      min = 1;  /* so as to include exactly those items with any requests */
    }
    for (p = *gooditems ; p != NULL; p = nextp) {
      nextp = p->next;
      if ((filterby != BYTES && filterby != BYTES7 &&
	   p->own->data[filterby] < min) ||
	  (filterby == BYTES && p->own->bytes < dmin) ||
	  (filterby == BYTES7 && p->own->bytes7 < dmin)) {
	p->next = ans2;   /* below floor */
	ans2 = p;
      }
      else {  /* wanted */
	p->next = ans;
	ans = p;
	count++;
      }
    }

    /* Then sort them */
    if (sortby == RANDOM)
      ;  /* do nothing: we're done */
    else if (count > 0) {
      if (sortby == BYTES)
	ans = my_mergesort(ans, count, sortby, &mergeb);
      else if (sortby == BYTES7)
	ans = my_mergesort(ans, count, sortby, &mergeb7);
      else if (sortby == ALPHABETICAL) {
	if (alphaback)
	  reversenames(ans);
	ans = my_mergesort(ans, count, sortby, &mergea);
      }
      else if (sortby == REQUESTS)
	ans = my_mergesort(ans, count, requests, &merge);
      else if (sortby == REQUESTS7)
	ans = my_mergesort(ans, count, requests7, &merge);
      else if (sortby == PAGES)
	ans = my_mergesort(ans, count, pages, &merge);
      else if (sortby == PAGES7)
	ans = my_mergesort(ans, count, pages7, &merge);
      else if (sortby == DATESORT)
	ans = my_mergesort(ans, count, date, &merge);
      else /* sortby == FIRSTDATE */
	ans = my_mergesort(ans, count, firstd, &merge);
      /* it's possible that the list has acquired some trailing junk which
	 we have to lop off */
      for (p = ans; count > 1; TO_NEXT(p))
	count--;
      p->next = NULL;
      if (alphaback && sortby == ALPHABETICAL)
	reversenames(ans);
    }
    else
      ans = NULL;
  }

  /* Accumulate all unwanted items into a single entry. Also recalculate maxima
     to take this one big item into account. */
  if (badp != NULL)
    makebadpn(badp, badn, ans2, requests, requests7, pages, pages7, date,
	      firstd, maxr, maxr7, maxp, maxp7, maxb, maxb7, donetots);

  /* Tack ans3 onto the end of ans2 */
  if (ans2 == NULL)
    ans2 = ans3;
  else if (ans3 != NULL) {
    for (p = ans2; p->next != NULL; TO_NEXT(p))
      ;  /* run to end of ans2 */
    p->next = ans3;
  }

  /* Assign the lists of wanted and unwanted items to be returned */
  *gooditems = ans;
  *baditems = ans2;
}

Hashindex *my_mergesort(Hashindex *list, unsigned long length, choice sortby,
			mergefnp mergefn) {

  Hashindex *ans, *p, *p1, *p2;
  unsigned long a, count;

  if (length <= 1)
    return(list);

  a = length / 2;
  count = a;
  for (p = list; count > 0; TO_NEXT(p))
    count--;    /* find the halfway point of the list */
  p1 = my_mergesort(list, a, sortby, mergefn);
  p2 = my_mergesort(p, length - a, sortby, mergefn);
  ans = mergefn(p1, p2, a, length - a, sortby);
  return(ans);
  /* NB may have trailing junk, but we can lop that off when we've returned,
     so as not to do it for each sub-sort */
}

Hashindex *merge(Hashindex *list1, Hashindex *list2, unsigned long length1,
		 unsigned long length2, choice sortby) {
  Hashindex *ans, *p1, *p2, *p3;

  if (list1->own->data[sortby] > list2->own->data[sortby]) {
    ans = list1;
    p1 = list1->next;
    p2 = list2;
    length1--;
  }
  else {
    ans = list2;
    p2 = list2->next;
    p1 = list1;
    length2--;
  }
  p3 = ans;

  while (length1 > 0 && length2 > 0) {
    if (p1->own->data[sortby] > p2->own->data[sortby]) {
      p3->next = p1;
      TO_NEXT(p3);
      TO_NEXT(p1);
      length1--;
    }
    else {
      p3->next = p2;
      TO_NEXT(p3);
      TO_NEXT(p2);
      length2--;
    }
  }

  if (length1 > 0)
    p3->next = p1;
  else
    p3->next = p2;

  return(ans);
}

Hashindex *mergea(Hashindex *list1, Hashindex *list2, unsigned long length1,
		  unsigned long length2, choice sortby) {
  Hashindex *ans, *p1, *p2, *p3;

  if (strcmp(list1->name, list2->name) < 0) {
    ans = list1;
    p1 = list1->next;
    p2 = list2;
    length1--;
  }
  else {
    ans = list2;
    p2 = list2->next;
    p1 = list1;
    length2--;
  }
  p3 = ans;

  while (length1 > 0 && length2 > 0) {
    if (strcmp(p1->name, p2->name) < 0) {
      p3->next = p1;
      TO_NEXT(p3);
      TO_NEXT(p1);
      length1--;
    }
    else {
      p3->next = p2;
      TO_NEXT(p3);
      TO_NEXT(p2);
      length2--;
    }
  }

  if (length1 > 0)
    p3->next = p1;
  else
    p3->next = p2;

  return(ans);
}

Hashindex *mergeb(Hashindex *list1, Hashindex *list2, unsigned long length1,
		  unsigned long length2, choice sortby) {
  /* see also mergeb7() below */
  Hashindex *ans, *p1, *p2, *p3;

  if (list1->own->bytes > list2->own->bytes) {
    ans = list1;
    p1 = list1->next;
    p2 = list2;
    length1--;
  }
  else {
    ans = list2;
    p2 = list2->next;
    p1 = list1;
    length2--;
  }
  p3 = ans;

  while (length1 > 0 && length2 > 0) {
    if (p1->own->bytes > p2->own->bytes) {
      p3->next = p1;
      TO_NEXT(p3);
      TO_NEXT(p1);
      length1--;
    }
    else {
      p3->next = p2;
      TO_NEXT(p3);
      TO_NEXT(p2);
      length2--;
    }
  }

  if (length1 > 0)
    p3->next = p1;
  else
    p3->next = p2;

  return(ans);
}

Hashindex *mergeb7(Hashindex *list1, Hashindex *list2, unsigned long length1,
		   unsigned long length2, choice sortby) {
  /* This is exactly the same as mergeb() above, except it sorts by bytes7
     instead of bytes. It's just implemented as a second function for speed. */
  Hashindex *ans, *p1, *p2, *p3;

  if (list1->own->bytes7 > list2->own->bytes7) {
    ans = list1;
    p1 = list1->next;
    p2 = list2;
    length1--;
  }
  else {
    ans = list2;
    p2 = list2->next;
    p1 = list1;
    length2--;
  }
  p3 = ans;

  while (length1 > 0 && length2 > 0) {
    if (p1->own->bytes7 > p2->own->bytes7) {
      p3->next = p1;
      TO_NEXT(p3);
      TO_NEXT(p1);
      length1--;
    }
    else {
      p3->next = p2;
      TO_NEXT(p3);
      TO_NEXT(p2);
      length2--;
    }
  }

  if (length1 > 0)
    p3->next = p1;
  else
    p3->next = p2;

  return(ans);
}
analog-6.0/src/tree.c0000644000175000017500000007727410161303543014645 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

#include "anlghea3.h"

/*** tree.c; functions for tree construction and processing. ***/

/* first, treefind(), analogous to hashfind() */
/* NB Don't really need as much data as Hashindex *, but allows us to use
   previous sort routines etc. */
Hashindex *treefind(char *name, char *nameend, Hashtable **tree,
		    Hashindex *item, cutfnp cutfn, logical build,
		    logical transient, logical reuse, Memman *space,
		    choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2],
		    unsigned int data_number) {
  /* datacols == NULL means we guarantee that item->own is all zero's */
  Hashindex *lp, *lastlp, *newone;   /* not called new because of C++ */
  unsigned long magic;

  if (*tree == NULL && !build)
    return(NULL);
  else if (*tree == NULL)
    *tree = rehash(NULL, TREEHASHSIZE, space);
  else if (TOO_FULL_TREE((*tree)->n, (*tree)->size))
    *tree = rehash(*tree, NEW_SIZE_TREE((*tree)->size), space);
  if (build && (strchr(name, '*') != NULL || strchr(name, '?') != NULL))
    magic = 0;
  else
    MAGICNOTREE(magic, name, nameend, (*tree)->size);

  lp = (*tree)->head[magic];
  lastlp = NULL;

  while (TRUE) {
    if (lp == NULL) { /* not found */
      if (build) {
	newone = newtreeentry(name, nameend, item, transient, reuse, space,
			      data_number);
	if (lastlp == NULL)
	  (*tree)->head[magic] = newone;
	else
	  lastlp->next = newone;
	((*tree)->n)++;
	if (cutfn != NULL) {
	  cutfn(&name, &nameend, item->name, build);
	  if (name != NULL)
	    (void)treefind(name, nameend, (Hashtable **)&(newone->other),
			   item, cutfn, build, transient, reuse, space,
			   datacols, data_number);
	}
      }
      else {  /* !build */
	for (newone = NULL, lp = (*tree)->head[0]; lp != NULL; TO_NEXT(lp)) {
	  if (genwildmatch(name, nameend, lp->name)) {
	    if (newone == NULL) {
	      newone = newtreeentry(name, nameend, item, transient, reuse,
				    space, data_number);
	      if (lastlp == NULL)
		(*tree)->head[magic] = newone;
	      else
		lastlp->next = newone;
	      ((*tree)->n)++;
	    }
	    graft((Hashtable **)&(newone->other), (Hashtable *)(lp->other),
		  space, data_number);
	  }
	}
	if (newone != NULL) {
	  if (cutfn != NULL) {
	    cutfn(&name, &nameend, item->name, build);
	    if (name != NULL)
	      (void)treefind(name, nameend, (Hashtable **)&(newone->other),
			     item, cutfn, build, transient, reuse, space,
			     datacols, data_number);
	  }
	}
      }
      return(newone);
    }
    else if (genstreq(name, nameend, lp->name)) {  /* found it */
      if (lp->own->reused)
	lp->own = newtreedata(lp->own, space, data_number);
      treescore(lp->own, item->own, datacols);
      if (cutfn != NULL) {
	cutfn(&name, &nameend, item->name, build);
	if (name != NULL)
	  (void)treefind(name, nameend, (Hashtable **)&(lp->other),
			 item, cutfn, build, transient, reuse, space,
			 datacols, data_number);
      }
      return(lp);
    }
    else {
      lastlp = lp;
      TO_NEXT(lp);
    }
  }
}

void graft(Hashtable **newone, Hashtable *old, Memman *space,
	   unsigned int data_number) {
  Hashindex *lp, *found;
  unsigned long magic;
  if (old != NULL) {
    for (magic = 0; magic < old->size; magic++) {
      for (lp = old->head[magic]; lp != NULL; TO_NEXT(lp)) {
	found = treefind(lp->name, strchr(lp->name, '\0'), newone, lp,
			 NULL, TRUE, FALSE, FALSE, space, NULL, data_number);
	graft((Hashtable **)&(found->other), (Hashtable *)(lp->other), space,
	      data_number);
      }
    }
  }
}

void allgraft(Hashtable *t, Memman *space, unsigned int data_number) {
  Hashindex *lp, *lp0;
  unsigned long magic;

  if (t != NULL) {
    for (magic = 1; magic < t->size; magic++) {
      for (lp = t->head[magic]; lp != NULL; TO_NEXT(lp)) {
	for (lp0 = t->head[0]; lp0 != NULL; TO_NEXT(lp0)) {
	  if (MATCHES(lp->name, lp0->name)) {
	    graft((Hashtable **)&(lp->other), (Hashtable *)(lp0->other),
		  space, data_number);
	  }
	}
	allgraft((Hashtable *)(lp->other), space, data_number);
      }
    }
  }
}

Hashindex *newtreeentry(char *name, char *nameend, Hashindex *item,
			logical transient, logical reuse, Memman *space,
			unsigned int data_number) {
  Hashindex *ans = (Hashindex *)submalloc(space, sizeof(Hashindex));

  if (*nameend == '\0' && !transient)
    ans->name = name;
  else {
    ans->name = (char *)submalloc(space, (size_t)(nameend - name + 1));
    memcpy((void *)(ans->name), (void *)name, (size_t)(nameend - name));
    ans->name[(size_t)(nameend - name)] = '\0';
  }
  if (reuse)
    ans->own = item->own;  /* will get newtreedata if hit a 2nd time */
  else
    ans->own = newtreedata(item->own, space, data_number);
  ans->other = NULL;
  ans->next = NULL;
  return(ans);
}

Hashentry *newtreedata(Hashentry *from, Memman *space,
		       unsigned int data_number) {
  Hashentry *ans;
  unsigned int i;

  ans = (Hashentry *)submalloc(space, sizeof(Hashentry));
  ans->data = (unsigned long *)submalloc(space,
					 data_number * sizeof(unsigned long));
  for (i = 0; i < data_number; i++)
    ans->data[i] = from->data[i];
  ans->bytes = from->bytes;
  ans->bytes7 = from->bytes7;
  ans->ispage = from->ispage;    /* this is good enough */
  ans->reused = FALSE;
  /* Basically, when we first create a node on the tree, we just store as its
     data a pointer to the data of the item which caused it to be created. But
     we can't accumulate more data there (that would change the original item),
     so if we hit it again, we call this function to create new space. Setting
     the "reused" flag to FALSE is a signal that we can safely accumulate in it
     on future hits. */
  return(ans);
}

void treescore(Hashentry *to, Hashentry *from,
	       choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2]) {
  choice i, j, k;

  if (datacols != NULL) {
    for (i = 0; i < OUTCOME_NUMBER; i++) {
      for (j = 0; (k = datacols[i][j][0]) >= 0; j++) {
	if (datacols[i][j][1] == DATE2)
	  to->data[k] = MAX(to->data[k], from->data[k]);
	else if (datacols[i][j][1] == FIRSTD2 && to->data[k] != 0 &&
		 from->data[k] != 0)
	  /* kludge for first entry */
	  to->data[k] = MIN(to->data[k], from->data[k]);
	else
	  to->data[k] += from->data[k];
      }
    }
    to->bytes += from->bytes;
    to->bytes7 += from->bytes7;
  }
}

Hashindex *sorttree(Outchoices *od, Hashtable *tree, choice rep, Floor *floor,
		    choice sortby, Floor *subfloor, choice subsortby,
		    logical alphaback, unsigned int level, Strlist *partname,
		    Alias *notcorrupt, choice requests, choice requests7,
		    choice pages, choice pages7, choice date, choice firstd,
		    unsigned long *totr, unsigned long *totr7,
		    unsigned long *totp, unsigned long *totp7,
		    double *totb, double *totb7, unsigned long *maxr,
		    unsigned long *maxr7, unsigned long *maxp,
		    unsigned long *maxp7, double *maxb, double *maxb7,
		    timecode_t *maxd, timecode_t *mind, Hashentry **badp,
		    unsigned long *badn, Memman *space,
		    choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2]) {
  Hashindex *gooditems, *baditems, *p, *np;
  Strlist *pn, sp;
  size_t need = (size_t)level + 3;
  Alias *ap;
  unsigned long i;
  logical ok;

  unhash(tree, &gooditems, &baditems);
  if (notcorrupt != NULL) {    /* NB notcorrupt only used for doms */
    baditems = (Hashindex *)submalloc(space, sizeof(Hashindex));
    baditems->name = LNGSTR_UNKDOMAIN;
    baditems->own = newhashentry(DATA_NUMBER, FALSE);
    baditems->other = NULL;
    baditems->next = NULL;
    for (p = gooditems, np = NULL; p != NULL; TO_NEXT(p)) {
      for (ok = FALSE, ap = notcorrupt; !ok && ap != NULL; TO_NEXT(ap)) {
	if (STREQ(p->name, ap->from))
	  ok = TRUE;
      }
      if (ok)
	np = p;
      else {   /* erase p from list */
	if (strchr(p->name, '*') == NULL && strchr(p->name, '?') == NULL)
	  debug('U', "%s", p->name);
	treescore(baditems->own, p->own, datacols);
	if (np == NULL)
	  gooditems = p->next;
	else
	  np->next = p->next;
      }
    }
  }   /* end notcorrupt != NULL */
  for (i = 0; i < tree->size; i++)
    tree->head[i] = NULL;
  for (pn = partname; pn != NULL; TO_NEXT(pn))
    need += strlen(pn->name);
  my_sort(&gooditems, &baditems, partname, &pn, &sp, need, rep, floor,
	  sortby, alphaback, od->wanthead[G(rep)], requests, requests7, pages,
	  pages7, date, firstd, totr, totr7, totp, totp7, totb, totb7, maxr,
	  maxr7, maxp, maxp7, maxb, maxb7, maxd, mind, (logical)(level != 0),
	  badp, badn, FALSE);
  for (p = gooditems; p != NULL; TO_NEXT(p)) {
    if (p->other != NULL) {
      (void)maketreename(partname, p, &pn, &sp, need, rep, FALSE);
      ((Hashtable *)(p->other))->head[0] =
	sorttree(od, (Hashtable *)(p->other), rep, subfloor, subsortby,
		 subfloor, subsortby, alphaback, level + 1, pn, NULL, requests,
		 requests7, pages, pages7, date, firstd, totr, totr7, totp,
		 totp7, totb, totb7, maxr, maxr7, maxp, maxp7, maxb, maxb7,
		 maxd, mind, NULL, NULL, space, datacols);
    }
  }
  return(gooditems);
}

void maketree(Tree *treex, Hashindex *gooditems, Hashindex *baditems,
	      choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2],
	      unsigned int data_number) {
  Hashindex *p;
  char *name, *nameend;

  for (p = gooditems; p != NULL; TO_NEXT(p)) {
    if (p->own != NULL) {
      name = NULL;
      treex->cutfn(&name, &nameend, p->name, FALSE);
      (void)treefind(name, nameend, &(treex->tree), p, treex->cutfn, FALSE,
		     FALSE, TRUE, treex->space, datacols, data_number);
    }
  }
  for (p = baditems; p != NULL; TO_NEXT(p)) {
    if (p->own != NULL) {
      name = NULL;
      treex->cutfn(&name, &nameend, p->name, FALSE);
      (void)treefind(name, nameend, &(treex->tree), p, treex->cutfn, FALSE,
		     FALSE, TRUE, treex->space, datacols, data_number);
    }
  }
}

void makederived(Derv *derv, Hashindex *gooditems, Hashindex *baditems,
		 unsigned char convfloor, logical multibyte, choice rep,
		 choice datacols[OUTCOME_NUMBER][DATACOLS_NUMBER][2],
		 unsigned int data_number) {
  extern Hashentry *blank_entry;

  Hashindex *p;
  Hashentry *f;
  char *name, *nameend;
  size_t len;
  logical donegood;

  for (p = gooditems, donegood = FALSE; p != NULL || !donegood; ) {
    if (p == NULL) {
      donegood = TRUE;
      p = baditems;
    }
    else {
      if (p->own != NULL) {
	name = NULL;
	for (derv->cutfn(&name, &nameend, p->name, derv->arg);
	     name != NULL;
	     derv->cutfn(&name, &nameend, p->name, derv->arg)) {
	  len = nameend - name;
	  memcpy(submalloc(derv->space, len + 1), (void *)name, len);
	  *((char *)(derv->space->next_pos) - 1) = '\0';
	                       /* = curr_pos + len */
	  f = (Hashentry *)(hashfind(derv->space, &(derv->table), data_number,
				     NULL, UNSET, NULL, NULL, "", 0, FALSE,
				     convfloor, multibyte, rep, FALSE)->other);
	  if (!ENTRY_BLANK(f))
	    treescore(f, p->own, datacols);
	}
      }
      TO_NEXT(p);
    }
  }
}

char *maketreename(Strlist *pn, Hashindex *p, Strlist **newpn, Strlist *space,
		   size_t need, choice rep, logical delims) {
  /* Compile name from strlist. We end up doing the most-significant portion
     several times, but it really is the best way, at least if the name is
     little-endian, otherwise we have to try and work out which portion we
     want when we go back down a level. Further calls will overwrite name. */
  static char *name = NULL;
  static size_t len = 0;
  logical back;
  char glue;
  char *t;
  Strlist *sp;
  size_t l;

  if (rep == REP_OS)    /* just use last component of name */
    return(p->name);

  if (rep == REP_TYPE || rep == REP_DOM || rep == REP_ORG) {
    glue = '.';
    /* back = TRUE unless numerical subdomains */
    if (rep == REP_DOM && pn != NULL && STREQ(pn->name, LNGSTR_UNRESOLVED))
      back = FALSE;
    else if (rep == REP_ORG && pn != NULL &&
	     ISDIGIT(pn->name[strlen(pn->name) - 1]))
      back = FALSE;
    else
      back = TRUE;
  }
  else {
    back = FALSE;
    if (rep == REP_DIR || rep == REP_REFSITE)
      glue = '/';
    else if (rep == REP_BROWSUM)
      glue = '.';  /* see below */
    else
      glue = '?';
  }

  /* make newpn */
  space->name = p->name;
  space->next = NULL;
  ENSURE_LEN(name, len, need + strlen(p->name));
  if (back || pn == NULL) {
    space->next = pn;
    *newpn = space;
  }
  else {
    for (sp = pn; sp->next != NULL; TO_NEXT(sp))
      ;
    sp->next = space;
    space->next = NULL;
    *newpn = pn;
  }

  /* assemble newpn */
  sp = *newpn;
  if (rep == REP_DOM && !back) /* i.e. numerical subdomain: special case */
    TO_NEXT(sp);
  t = name;
  if (rep == REP_TYPE && delims && !STREQ(p->name, LNGSTR_NOEXT) &&
      !STREQ(p->name, LNGSTR_BRKDIRS))
    *(t++) = glue;      /* delimiter at start */
  if (rep == REP_BROWSUM && sp != NULL) {
    /* special case to enable two different delimiters */
    l = strlen(sp->name);
    memcpy(t, sp->name, l);
    t += l;
    if (sp->next != NULL)
      *(t++) = '/';
    TO_NEXT(sp);
  }
  for ( ; sp != NULL; TO_NEXT(sp)) {
    l = strlen(sp->name);
    memcpy(t, sp->name, l);
    t += l;
    if (sp->next != NULL)
      *(t++) = glue;
  }
  if (delims && (rep == REP_REFSITE || rep == REP_DIR) &&
      !STREQ(p->name, LNGSTR_NODIR) && !STREQ(p->name, LNGSTR_ROOTDIR))
    *(t++) = glue;      /* delimiter at end */
  *t = '\0';

  return(name);
}

/* genstreq is like streq but takes double-pointer strings */
logical genstreq(char *a, char *b, char *t) {
  for ( ; *a == *t && a < b; a++)
    t++;
  if (a == b && *t == '\0')
    return(TRUE);
  else
    return(FALSE);
}

/* Now the various nextname functions, which vary by type of item. There are
   two patterns, cutfnp and dcutfnp. The former is used in building a tree
   report, the latter in building a dervrep.

   Pattern for cutfnp (up to pnextname) is
   void ?nextname(char **name, char **nameend, char *whole, logical build).
   whole is whole name; [*name, *nameend) is last chunk (*name == NULL if
   none); build is because behaviour of leading/trailing delimiters may be
   different if building tree; return new [*name, *nameend), or *name = NULL
   if no more; never return NULL if given NULL.

   From Bnextname onwards, the functions follow dcutfnp. They look like
   void ?nextname(char **name, char **nameend, char *whole, void *arg).
   Otherwise they are the same, except Nnextname and nnextname can return NULL
   if given NULL. Bnextname and Pnextname return NULL if _and only if_ they
   are not given NULL, and we make use of this fact in checkonerep(). */

void rnextname(char **name, char **nameend, char *whole, logical build) {
  if (*name == NULL) {
    *name = whole;
    if ((*nameend = strchr(whole + 1, '?')) == NULL)
      *nameend = strchr(whole, '\0');
  }
  else if (IS_EMPTY_STRING(*nameend))
    *name = NULL;
  else {
    *name = *nameend + 1;
    *nameend = strchr(*name, '\0');
  }
}

void inextname(char **name, char **nameend, char *whole, logical build) {
  static char *s0 = LNGSTR_NODIR;
  static char *s1 = LNGSTR_ROOTDIR;
  logical first = FALSE;

  if (*name == NULL) {
    *name = whole;
    first = TRUE;
  }
  else if (IS_EMPTY_STRING(*nameend) || IS_EMPTY_STRING((*nameend) + 1) ||
	   **nameend == '?' || *((*nameend) + 1) == '?') {
    /* including s0 and s1 */
    *name = NULL;
    return;
  }
  else
    *name = *nameend + 1;

  for (*nameend = *name + (ptrdiff_t)(first && **name != '\0');
       **nameend != '/' && **nameend != '\0' && **nameend != '?'; (*nameend)++)
    ;  /* run nameend to next '/', '\0' or '?' */
  if (**nameend == '/') {
    for ( ; *((*nameend) + 1) == '/'; (*nameend)++)
      ;  /* run to last consecutive '/' */
  }
  if ((**nameend == '\0' || **nameend == '?') && !build) {
    if (first) {
      if (**name != '/')
	*name = s0;
      else
	*name = s1;
      *nameend = strchr(*name, '\0');
    }
    else
      *name = NULL;
  }
}

static logical isnum = FALSE;  /* used in onextname() and Znextname() */

void onextname(char **name, char **nameend, char *whole, logical build) {
  static char *s0 = LNGSTR_UNRESOLVED;
  static char *s1 = LNGSTR_NODOMAIN;

  if (*name == NULL) {
    isnum = FALSE;
    *nameend = strchr(whole, '\0');
    if (!build) {
      if (strchr(whole, '.') == NULL) {
	*name = s1;
	*nameend = strchr(*name, '\0');
	debug('V', "%s", whole);
	return;
      }
      if (ISDIGIT(*(*nameend - 1))) {
	*name = s0;
	*nameend = strchr(*name, '\0');
	isnum = TRUE;
	return;
      }
    }
    else if (ISDIGIT(*whole) &&  /* test for num. more subtle while building */
	     (ISDIGIT(*(*nameend - 1)) || *(*nameend - 1) == '*')) {
      *name = s0;
      *nameend = strchr(*name, '\0');
      isnum = TRUE;
      return;
    }
    for (*name = *nameend - 1; **name != '.' && *name != whole; (*name)--)
      ;
    if (**name == '.')
      (*name)++;
  }
  else if (isnum) {
    if (*name == s0)
      *name = whole;
    else if (IS_EMPTY_STRING(*nameend) || IS_EMPTY_STRING((*nameend) + 1)) {
      *name = NULL;
      return;
    }
    else
      *name = *nameend + 1;
    for (*nameend = *name; **nameend != '.' && **nameend != '\0'; (*nameend)++)
      ;   /* run to first '.' or '\0' */
  }
  else if (*name == s1 || *name - whole < 2)
    *name = NULL;
  else {
    *nameend = *name - 1;
    for (*name -= 2; **name != '.' && *name != whole; (*name)--)
      ;
    if (**name == '.')
      (*name)++;
  }
}

void tnextname(char **name, char **nameend, char *whole, logical build) {
  static char *s0 = LNGSTR_NOEXT;
  static char *s1 = LNGSTR_BRKDIRS;

  logical first = FALSE;

  if (*name == NULL) {
    if ((*nameend = strchr(whole, '?')) == NULL)
      *nameend = strchr(whole, '\0');
    first = TRUE;
  }
  else if (*name == s0 || *name == s1 || *name == whole ||
	   *name == whole + 1 || **name == '/') {
    *name = NULL;
    return;
  }
  else
    *nameend = *name - 1;

  *name = *nameend - 1;
  if (**name == '/' && first) {
    *name = s1;
    *nameend = strchr(*name, '\0');
    return;
  }
  for ( ; **name != '.' && **name != '/' && *name != whole; (*name)--)
    ;
  if (**name == '.' && (*name) + 1 != *nameend)
    (*name)++;
  else if (build)
    return;
  else if (first) {
    *name = s0;
    *nameend = strchr(*name, '\0');
  }
  else
    *name = NULL;
}

void snextname(char **name, char **nameend, char *whole, logical build) {
  if (*name == NULL) {
    *name = whole;
    for (*nameend = *name; **nameend != ':' && **nameend != '\0'; (*nameend)++)
      ;
    if (*nameend == '\0') {
      *nameend = *name;
      return;
    }
    (*nameend)++;
    if (**nameend == '/')
      (*nameend)++;
    if (**nameend == '/')
      (*nameend)++;
    for ( ; **nameend != '/' && **nameend != '\0'; (*nameend)++)
      ;
  }
  else
    inextname(name, nameend, whole, build);
}

void Znextname(char **name, char **nameend, char *whole, logical build) {
  static char *s1 = LNGSTR_NODOMAIN;
  static char *s2 = LNGSTR_UNKDOMAIN;
  extern Strpairlist **domlevels;

  Strpairlist *ap;
  unsigned int c;

  if (*name == NULL) {
    isnum = FALSE;
    *nameend = strchr(whole, '\0');
    if (ISDIGIT(*(*nameend - 1)) ||
	(build && ISDIGIT(*whole) && *(*nameend - 1) == '*')) { /* num. addr */
      *name = whole;
      for (c = 0, *nameend = *name;
	   *nameend - *name <= 3 && ISDIGIT(**nameend); (*nameend)++) {
	c *= 10;
	c += **nameend - '0';
      }   /* c is now first component of IP address */
      if (**nameend != '.' || *nameend == *name || c > 255) {
	/* coz of this check, Org Rep can get more s1's & s2's than Dom Rep */
	if (strchr(*name, '.') == NULL)
	  *name = s1;
	else
	  *name = s2;
	*nameend = strchr(*name, '\0');
	return;
      }
      /* change c to be number of components required */
      if (c >= 128 || (c >= 61 && c <= 68) || c == 24 || c == 80 || c == 81)
	c = 2;
      else
	c = 1;
      for ( ; c > 1; c--) {
	(*nameend)++;
	while (ISDIGIT(**nameend))
	  (*nameend)++;
	if (**nameend != '.' && !build) {
	  *name = s2;
	  *nameend = strchr(*name, '\0');
	  return;
	}
      }
      isnum = TRUE;
      return;
    }
    /* non-numerical addresses */
    for (*name = *nameend; **name != '.' && *name != whole; (*name)--)
      ;
    if (*name == whole) {
      if (!build) {
	*name = s1;
	*nameend = strchr(*name, '\0');
      }
      return;
    }
    (*name)++;
    c = 26 * ((int)(**name - 'a'));
    if (**name != '\0')
      c += (int)(*((*name) + 1) - 'a');
    if (c >= DOMLEVEL_NUMBER)
      c = DOMLEVEL_NUMBER - 1;
    for (ap = domlevels[c]; ap != NULL && !STREQ(*name, ap->name);
	 TO_NEXT(ap))
      ;
    if (ap == NULL) {  /* domain not found */
      *name = s2;
      *nameend = strchr(*name, '\0');
      return;
    }
    /* otherwise we've now found the right number of levels */
    (*name)--;
    for (c = (unsigned int)(*(ap->data) - '0'); c > 1 && *name != whole;
	 c--) {
      for((*name)--; **name != '.' && *name != whole; (*name)--)
	;
    }
    if (*name == whole && (unsigned int)(*(ap->data) - '0') - c >= 2) {
      /* don't use whole name even if <= levels (but don't just use domain) */
      for ( ; **name != '.'; (*name)++)
	;
    }
    if (**name == '.')
    (*name)++;
  }
  else
    onextname(name, nameend, whole, build);
}

void bnextname(char **name, char **nameend, char *whole, logical build) {
  /* See Bnextname() below for annotation */

  if (*name == NULL) {
    *name = whole;
    for (*nameend = *name; **nameend != '/' && **nameend != '\0';
	 (*nameend)++)
      ;
  }
  else if (**nameend == '/') {
    *name = *nameend + 1;
    for (*nameend = *name; **nameend != '.' && **nameend != ' ' &&
	   **nameend != '\0'; (*nameend)++)
      ;
  }
  else if (**nameend == '.') {
    *name = *nameend + 1;
    for (*nameend = *name; **nameend != ' ' && **nameend != '\0'; (*nameend)++)
      ;
  }
  else
    *name = NULL;
}

void pnextname(char **name, char **nameend, char *whole, logical build) {

  if (*name == NULL) {
    *name = whole;
    for (*nameend = *name; **nameend != ':' && **nameend != '\0';
	 (*nameend)++)
      ;
  }
  else if (**nameend == ':') {
    *name = *nameend + 1;
    for (*nameend = *name; **nameend != '\0'; (*nameend)++)
      ;
  }
  else
    *name = NULL;
}

/* When compiling the Browser Summary, browser names go through three
   functions. First Bnextname() locates the bit corresponding to the browser
   name and version (this is most of the work). Then do_aliasb() makes slight
   adjustments to get it into canonical form (Name/v.v). Then bnextname()
   does the actual tree-ification of this canonical form.                    */
void Bnextname(char **name, char **nameend, char *whole, void *arg) {
  /* NB "arg" is ignored */
  static char *s1 = "Netscape (compatible)";
  size_t len;

  if (*name == NULL) {
    /* First recognise some strings anywhere in the name (mostly claiming to be
       "Mozilla (compatible)"). The order may matter, for example if some
       browsers claim to both be Mozilla (compatible) and MSIE (compatible).
       Note that "len =" is simple assignment and will always return true; it's
       just a way of setting len. */
    if (((*name = strstr(whole, "Mosaic")) != NULL && (len = 6)) ||
	((*name = strstr(whole, "mosaic")) != NULL && (len = 6)) ||
	((*name = strstr(whole, "Konqueror")) != NULL && (len = 9)) ||
	((*name = strstr(whole, "Galeon")) != NULL && (len = 6)) ||
	((*name = strstr(whole, "Phoenix")) != NULL && (len = 7)) ||
	((*name = strstr(whole, "Firebird")) != NULL && (len = 8)) ||
	((*name = strstr(whole, "Firefox")) != NULL && (len = 7)) ||
	((*name = strstr(whole, "Chimera")) != NULL && (len = 7)) ||
	((*name = strstr(whole, "Camino")) != NULL && (len = 6)) ||
	((*name = strstr(whole, "Safari")) != NULL && (len = 6)) ||
	((*name = strstr(whole, "WebTV")) != NULL && (len = 5)) ||
	((*name = strstr(whole, "Opera")) != NULL && (len = 5)) ||
	((*name = strstr(whole, "MSIE")) != NULL && (len = 4))) {
      *nameend = *name + len;
      if (**nameend == '/' || **nameend == ' ') {
	for ((*nameend)++; ISALNUM(**nameend) || **nameend == '.' ||
	       **nameend == '-' || **nameend == '+'; (*nameend)++)
	  ;  /* run to end of version number */
      }
      else if (headmatch(*name, "Galeon") /* Galeon uses "Galeon; v.vv" */ &&
	       **nameend == ';' && *(*nameend + 1) == ' ' &&
	       ISDIGIT(*(*nameend + 2))) {
	for ((*nameend) += 2; ISALNUM(**nameend) || **nameend == '.' ||
	       **nameend == '-' || **nameend == '+'; (*nameend)++)
	  ;
      }
    }
    else if (headmatch(whole, "Mozilla")) {
      if (strstr(whole + 9, "compatible") || strstr(whole + 9, "Compatible")) {
	*name = s1;
	*nameend = s1 + 21;
      }
      else {  /* probably genuine Netscape/Mozilla */
	*name = whole;
	/* Mozilla has version number much later so keep the whole string */
	if (*(*name + 8) == '5' ||
	    (*nameend = strchr(whole + 7, ' ')) == NULL)
	  *nameend = strchr(whole + 7, '\0');
      }
    }
    else {
      *name = whole;
      *nameend = strchr(whole, '\0');
    }
  }
  else
    *name = NULL;
}

void Pnextname(char **name, char **nameend, char *whole, void *arg) {
  char *c, *d;

  if (*name == NULL) {
    if (arg != NULL && included(whole, FALSE, (Include *)arg)) {
      *name = "Robots";
      *nameend = strchr(*name, '\0');
      return;
    }
    if (headmatch(whole, "Mozilla"))
	whole += 7;  /* just to save searching time */

    /* First find Windows versions, starting with "Windows" or "WinNT" or
       "Win9" */
    if ((c = strstr(whole, "Windows")) != NULL) {
      c += 7;
      if (*c == ';') {
	/* Mozilla/5 uses strings like "Windows; U; Win98" so we have to look
	   for the second Windows or Win. */
	if ((d = strstr(c + 1, "Windows")) != NULL)
	  c = d + 7;
	else if ((d = strstr(c + 1, "WinNT")) != NULL ||
		 (d = strstr(c + 1, "Win9")) != NULL)
	  c = d + 3;
      }
      if (*c == ' ')
	c++;
    }
    else if ((c = strstr(whole, "WinNT")) != NULL ||
	     (c = strstr(whole, "Win9")) != NULL)
      c += 3;

    if (c != NULL) {  /* We did find "Windows" or "Win" */
      if (*c == '9' && *(c + 1) == '5')
	  *name = "Windows:Windows 95";
      else if (*c == '9' && *(c + 1) == '8') {
	if (strstr(c, "Win 9x 4.9"))
	  *name = "Windows:Windows ME";
	else
	  *name = "Windows:Windows 98";
      }
      else if (*c == 'N' && *(c + 1) == 'T') {
	/* advance to NT version number, which corresponds to advertised OS */
	c += 2;
	if (*c == ' ')
	  c++;
	if (*c == '5') {
	  if (*(c + 1) == '.' && (*(c + 2) == '0'))
	    *name = "Windows:Windows 2000";
	  else if (*(c + 1) == '.' && (*(c + 2) == '1'))
	    *name = "Windows:Windows XP";
	  else if (*(c + 1) == '.' && (*(c + 2) == '2'))
	    *name = "Windows:Windows Server 2003";
	  else
	    *name = "Windows:Unknown Windows";
	}
	else if (*c >= '6' && *c <= '9')
	  *name = "Windows:Unknown Windows";
	else
	  *name = "Windows:Windows NT";
      }
      else if (*c == 'C' && *(c + 1) == 'E')
	*name = "Windows:Windows CE";
      /* next three not MSIE, but some other vendor might use them */
      else if (*c == 'X' && *(c + 1) == 'P')
	*name = "Windows:Windows XP";
      else if (*c == '2' && *(c + 1) == '0' && *(c + 2) == '0' &&
	       *(c + 3) == '0')
	*name = "Windows:Windows 2000";
      else if (*c == 'M' && (*(c + 1) == 'E' || (*(c + 1) == 'e') ||
			     headmatch(c + 1, "illennium")))
	*name = "Windows:Windows ME";
      else if (*c == '3' && *(c + 1) == '.' && *(c + 2) == '1')
	*name = "Windows:Windows 3.1";
      else if ((*c == '1' && *(c + 1) == '6') || strstr(c + 1, "16bit") ||
	       strstr(c + 1, "16-bit"))
	*name = "Windows:Windows 16-bit";
      else if ((*c == '3' && *(c + 1) == '2') || strstr(c + 1, "32bit") ||
	       strstr(c + 1, "32-bit"))
	*name = "Windows:Windows 32-bit";
      else
	*name = "Windows:Unknown Windows";
    }

    /* Now non-Windows operating systems */
    else if ((c = strstr(whole, "Mac")) != NULL)
	*name = "Macintosh";
    else if (strstr(whole, "Linux") != NULL || strstr(whole, "linux") != NULL)
      *name = "Unix:Linux";
    else if (strstr(whole, "BSD") != NULL)
      *name = "Unix:BSD";
    else if (strstr(whole, "SunOS") != NULL || strstr(whole, "sunos") != NULL)
      *name = "Unix:SunOS";
    else if (strstr(whole, "HP-UX") != NULL || strstr(whole, "HPUX") != NULL ||
	     strstr(whole, "hp-ux") != NULL || strstr(whole, "hpux") != NULL)
      *name = "Unix:HP-UX";
    else if (strstr(whole, "IRIX") != NULL || strstr(whole, "irix") != NULL)
      *name = "Unix:IRIX";
    else if (strstr(whole, "AIX") != NULL || strstr(whole, "aix") != NULL)
      *name = "Unix:AIX";
    else if (strstr(whole, "OSF1") != NULL)
      *name = "Unix:OSF1";
    else if (strstr(whole, "VMS") != NULL)
      *name = "OpenVMS";
    else if (strstr(whole, "X11") != NULL)
      *name = "Unix:Other Unix";
    else if (strstr(whole, "WebTV") != NULL)
      *name = "WebTV";
    else if (strstr(whole, "OS/2") != NULL)
      *name = "OS/2";
    else if (strstr(whole, "BeOS") != NULL)
      *name = "BeOS";
    else if (strstr(whole, "RISC OS") != NULL)
      *name = "RISC OS";
    else if (strstr(whole, "Amiga") != NULL)
      *name = "Amiga";
    else if (strstr(whole, "Symbian") != NULL)
      *name = "Symbian OS";
    else if (strstr(whole, "PalmOS") != NULL ||
	     strstr(whole, "PalmSource") != NULL)
      *name = "Palm OS";
    else if (strstr(whole, "Atari") != NULL)
      *name = "Atari";
    else
      *name = "OS unknown";
    *nameend = strchr(*name, '\0');
  }
  else
    *name = NULL;
}

void Nnextname(char **name, char **nameend, char *whole, void *arg) {
  /* NB Quite a lot is held over to do_aliasN(), which is called from
     hashfind(), from makederived() */
  Strpairlist *al;
  char *c, *d;
  logical done;

  if (*name == NULL) {
    if ((d = strchr(whole, '?')) != NULL && *(d + 1) != '\0') {
      *d = '\0';
      for (al = (Strpairlist *)arg, done = FALSE; al != NULL && !done;
	   TO_NEXT(al)) {
	if (MATCHES(whole, al->name)) {  /* find right engine in list */
	  for (c = d; c != NULL && !done; c = strpbrk(c, "&;")) {
	    c++;                            /* find right arg */
	    if (headmatch(c, al->data) && *(c + strlen(al->data)) == '=') {
	      done = TRUE;
	      *name = c + strlen(al->data) + 1;
	      for (*nameend = *name; **nameend != '&' && **nameend != ';' &&
		     **nameend != '\0'; (*nameend)++)
		;  /* run nameend to next & or ; */
	      if (*name == *nameend)
		name = NULL;
	    }    /* if headmatch */
	  }    /* for c */
	}    /* if MATCHES */
      }    /* for al */
      *d = '?';
    }    /* if d = strchr */
  }    /* if *name == NULL */
  else
    *name = NULL;
}

void nnextname(char **name, char **nameend, char *whole, void *arg) {

  if (*name == NULL)
    Nnextname(name, nameend, whole, arg);   /* to find right CGI arg etc. */
  else if (**nameend == '&' || **nameend == ';' || **nameend == '\0')
    *name = NULL;
  else
    *name = *nameend + 1;

  if (*name == NULL)
    return;

  for ( ; **name == '+' || **name == ',' || **name == ';' || **name == '"' ||
	  **name == '(' || **name == ')' || **name == '.' || ISSPACE(**name) ||
	  (**name == '-' && (*(*name + 1) == '+' || *(*name + 1) == ',' ||
			     *(*name + 1) == ';' || *(*name + 1) == '"' ||
			     *(*name + 1) == '(' || *(*name + 1) == ')' ||
			     *(*name + 1) == '.' || *(*name + 1) == '-' ||
			     *(*name + 1) == '&' || *(*name + 1) == '\0' ||
			     ISSPACE(*(*name + 1))));
	(*name)++)
    ;  /* run to first wanted character; cf list in do_aliasN() and below */
       /* NB 'good' dots never occur at beginning of word */
  if (**name == '&' || **name == ';' || **name == '\0')
    *name = NULL;
  else for (*nameend = *name; **nameend != '+' && **nameend != '&' &&
	      **nameend != '\0' && **nameend != '"' && **nameend != ',' &&
	      **nameend != ';' && **nameend != '(' && **nameend != ')' &&
	      (**nameend != '.' || (ISALNUM(*(*nameend - 1)) &&
				    ISALNUM(*(*nameend + 1)))) &&
	      (**nameend != '-' || *nameend == *name) && !ISSPACE(**nameend);
	    (*nameend)++)
      ;  /* run to first unwanted character; see above */
}
analog-6.0/src/utils.c0000644000175000017500000005362610161303543015041 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** utils.c; lots of little functions to do odd little things ***/

#include "anlghea3.h"

void my_exit(int status) {
  extern FILE *errfile;
#ifndef NODNS
  extern FILE *dnslock;
  extern char *dnslockfile;
#endif

#ifdef MAC_EVENTS
  MacFini();
#endif
#ifdef WIN32
  Win32Cleanup();
#endif
#ifndef NODNS
  if (dnslock != NULL) {
    fclose(dnslock);
    if (remove(dnslockfile) != 0)
      warn('F', TRUE, "Trouble deleting DNS lock file %s", dnslockfile);
    else
      debug('F', "Deleting DNS lock file %s", dnslockfile);
  }
#endif
  if (errfile != stderr)
    fclose(errfile);
  exit(status);
}

void sighandler(int sig) {
  extern FILE *errfile;
  extern logical anywarns;
  extern char *commandname;

#ifndef NOALARM
  extern JMP_BUF jumpbuf;
  if (sig == SIGALRM)
    LONGJMP(jumpbuf, 1);
#endif
  fprintf(errfile, "%s: Received ", commandname);
  if (sig == SIGTERM)
    fprintf(errfile, "termination");
  else if (sig == SIGINT)
    fprintf(errfile, "interrupt");
#ifdef SIGHUP
  else if (sig == SIGHUP)
    fprintf(errfile, "HUP");
#endif
#ifdef SIGQUIT
  else if (sig == SIGQUIT)
    fprintf(errfile, "quit");
#endif
  fprintf(errfile, " signal: exiting\n");

  if (errfile != stderr) {
    fprintf(stderr, "Received ");
    if (sig == SIGTERM)
      fprintf(stderr, "termination");
    else if (sig == SIGINT)
      fprintf(stderr, "interrupt");
#ifdef SIGHUP
    else if (sig == SIGHUP)
      fprintf(stderr, "HUP");
#endif
#ifdef SIGQUIT
    else if (sig == SIGQUIT)
      fprintf(stderr, "quit");
#endif
    fprintf(stderr, " signal: exiting\n");
  }

  anywarns = TRUE;
  my_exit(EXIT_SIGNAL);
}

logical substrcaseeq(char *s, char *t) {
  /* match the beginning of s case insensitively against lower case t */
  for ( ; TOLOWER(*s) == *t && *t != '\0'; s++, t++)
    ;       /* *s != '\0' covered by above two cases */
  if (*t == '\0')
    return(TRUE);
  else
    return(FALSE);
}

char *strtoupper(char *n) {
  /* convert a string to upper case UP TO the first line break */
  char *c;
  for (c = n; *c != '\0' && *c != '\n' && *c != '\r'; c++)
    if (ISLOWER(*c))   /* needed to stop (known u.c.) const char *n crashing */
      *c = TOUPPER(*c);
  return(n);
}

void strtolowerx(char *n) { /* lower-case filename: only used in next 3 fns. */
  for ( ; *n != '\0' && *n != '?'; n++)
    *n = TOLOWER(*n);
}

void toloweralias(Alias *ap, logical both) {
  AliasTo *tp;
  char *errstr;
  int erroffset;

  for ( ; ap != NULL; TO_NEXT(ap)) {
    if (headcasematch(ap->from, "REGEXP:"))
      ap->pattern = pcre_compile(ap->from + 7, PCRE_CASELESS | PCRE_DOTALL,
				 (const char **)(&errstr), &erroffset, NULL);
    /* if original regcomp succeeded, this one should too */
    else if (!headcasematch(ap->from, "REGEXPI:"))
      /* nothing to do for REGEXPI: */
      strtolowerx(ap->from);
    if (both) {
      for (tp = ap->to; tp != NULL; TO_NEXT(tp))
	strtolowerx(tp->string);
    }
  }
}

void tolowerinc(Include *ip) {
  /* see comments in previous function */
  char *errstr;
  int erroffset;

  for ( ; ip != NULL; TO_NEXT(ip)) {
    if (headcasematch(ip->name, "REGEXP:"))
      ip->pattern = pcre_compile(ip->name + 7, PCRE_CASELESS | PCRE_DOTALL,
				 (const char **)(&errstr), &erroffset, NULL);
    else if (!headcasematch(ip->name, "REGEXPI:"))
      strtolowerx((char *)(ip->name));
  }
}

void tolowerse(Strpairlist *sp) {  /* for (internal) search engines */
  for ( ; sp != NULL; TO_NEXT(sp))
    strtolowerx(sp->name);
}

void reversealias(Alias **head) {
  /* aliases are first collated in reverse order */
  Alias *ap, *lastap = NULL, *nextap;

  for (ap = *head; ap != NULL; ap = nextap) {
    nextap = ap->next;
    ap->next = lastap;
    lastap = ap;
  }
  *head = lastap;
}

/* Swap an strpairlist round. Same as reversealias. Who needs templates?? */
void reversestrpairlist(Strpairlist **head) {
  Strpairlist *sp, *lastsp = NULL, *nextsp;

  for (sp = *head; sp != NULL; sp = nextsp) {
    nextsp = sp->next;
    sp->next = lastsp;
    lastsp = sp;
  }
  *head = lastsp;
}

logical strcaseeq(char *s, char *t) {
  for ( ; TOUPPER(*s) == TOUPPER(*t) && *s != '\0'; s++, t++)
    ;
  if (TOUPPER(*s) != TOUPPER(*t))
    return(FALSE);
  else
    return(TRUE);
}

char *strrpbrk(char *s, char *t) {
  /* locate the last occurence in s of any character in t */
  char *u;

  for (u = strchr(s, '\0') - 1; u >= s; u--) {
    if (strchr(t, *u) != NULL)
      return(u);
  }
  return(NULL);
}

#ifdef EBCDIC
char *strtoascii(char *s) {
  extern unsigned char os_toascii[];
  char *t;

  for (t = s; *t != '\0'; t++)
    *t = (char)os_toascii[(unsigned char)(*t)];
  return(s);
}
#endif

char *buildfilename(char *old, char *sub, char *name) {
  /* Here's how we construct many filenames. If the "name" contains one of the
     PATHSEPS, then just use the "name" (i.e., relative to the working dir).
     Otherwise, put it in the same directory as "old". If "old" is NULL, then
     use the subdirectory "sub" of the location of the analog binary as "old".
     We always malloc new space to hold the name. */
  /* The calling routine should check any special cases appropriate to that
     type of file, e.g., "none", "-", "stdin" or "stdout". */
  extern char *commandpath;
  size_t t = 0, u;
  /* t is the length of sub, u of the directory of old */
  char *s, *ans;

  if (strpbrk(name, PATHSEPS) != NULL) {
    ans = (char *)xmalloc(strlen(name) + 1);
    strcpy(ans, name);
    return(ans);
  }
  if (old == NULL) {
    old = commandpath;
    t = strlen(sub);
  }
  if ((s = strrpbrk(old, PATHSEPS)) == NULL)
    u = 0;
  else
    u = ((s - old) + 1);
  ans = (char *)xmalloc(t + u + strlen(name) + 2);
  if (u != 0)
    strncpy(ans, old, u);
  if (t != 0) {
    sprintf(ans + u, "%s%c", sub, DIRSEP);
    t++;
  }
  strcpy(ans + t + u, name);
  return(ans);
}

#ifdef NEED_STRCMP
int my_strcmp(char *s, char *t) {
  for ( ; *s == *t && *s != '\0'; s++, t++)
    ;
  if (*s < *t)
    return(-1);
  else if (*s > *t)
    return(1);
  else
    return(0);
}
#endif

unsigned int chrn(char *s, char c) {  /* no. of occurrences of c in s */
  unsigned int n = 0;
  for ( ; *s != '\0'; s++)
    n += (*s == c);
  return(n);
}

unsigned int chrdistn(char *s, char c) {/* ditto but consec c's count only 1 */
  unsigned int n = 0;
  for ( ; *s != '\0'; s++)
    n += (*s == c && *(s + 1) != c);
  return(n);
}

unsigned int log10i(unsigned long i) {
  unsigned int j;

  for (j = 0; i >= 10; i /= 10)
    j++;
  return(j);
}

unsigned int log10x(double d) {
  unsigned int j;

  for (j = 0; d >= 10; d /= 10)
    j++;
  return(j);
}

/* If 'd' bytes are displayed to 'dp' decimal places, should they be written
   as kilobytes, megabytes, or what? */
unsigned int findbmult(double d, unsigned int dp) {
  unsigned int j;
  double threshold;

  if (d < 1024)
    return(0);  /* see also in calcsizes() */

  /* Bytes will be rounded to 'dp' decimal places. So the theshold at which
     we move to a new multiplier is 999.5 if dp = 0, 999.95 if dp = 1 etc. */
  threshold = 0.5;
  for (j = 0; j < dp; j++)
    threshold /= 10.0;
  threshold = 1000.0 - threshold;

  /* Now we can find the multiplier */
  for (j = 0; d >= threshold; d /= 1024.0)
    j++;
  return(j);
}

/* Convert a string to integer between 0 and 255, with some error checking
   built in. Returns -1 if string empty, or not all digits, or greater than
   255. */
int atoi255(const char *s) {
  int ans;

  if (*s == '\0')
    return(-1);
  for (ans = 0; ISDIGIT(*s); s++) {
    ans *= 10;
    ans += *s - '0';
    if (ans > 255)
      return(-1);
  }
  if (*s != '\0')
    return(-1);
  return(ans);
}

unsigned long arraymaxl(unsigned long *x, unsigned int size) {
  unsigned long y;
  unsigned int i;

  y = 0;
  for (i = 0; i < size; i++)
    y = MAX(y, x[i]);
  return(y);
}

double arraymaxd(double *x, unsigned int size) {
  double y;       /* assuming doubles in x all positive */
  unsigned int i;

  y = 0.0;
  for (i = 0; i < size; i++)
    y = MAX(y, x[i]);
  return(y);
}

size_t arraymaxlen(char **s, unsigned int size, Outchoices *od) {
  unsigned int i;
  size_t y = 0;

  size_t (*strlenp)(const char *);

  if (od == NULL)
    strlenp = &strlen;
  else
    strlenp = od->outputter->strlength;

  for (i = 0; i < size; i++)
    y = MAX(strlenp(s[i]), y);

  return(y);
}

void prettyprintf(FILE *outf, unsigned int pagewidth, char *fmt, va_list ap) {
  /* NB Calling function must call mprintf with pagewidth = 0 after message. */
  char m[511];  /* longer than any message we want to produce */
  extern unsigned int ppcol;
  static logical spacedone = FALSE;
  char *m1, *m2;

  if (pagewidth == 0) {
    putc('\n', outf);
    ppcol = 0;
    spacedone = FALSE;
    return;
  }
  vsprintf(m, fmt, ap);
  for (m1 = m, m2 = m; *m1 != '\0'; m2++) {
    if (*m2 == ' ' || *m2 == '\0' || *m2 == '\n') {
      if ((m2 - m1) + ppcol > pagewidth && (*m1 == ' ' || spacedone)) {
	fputs("\n  ", outf);
	if (*m1 == ' ')
	  m1++;
	spacedone = FALSE;
	ppcol = 1;
      }
      while (m1 < m2) {
	putc(*m1, outf);
	spacedone = (*(m1++) == ' ');
	ppcol++;
      }
      if (*m1 == '\n') {
	fputs("\n  ", outf);
	m1++;
	spacedone = FALSE;
	ppcol = 2;
      }
    }
  }
}

void mprintf(FILE *outf, unsigned int pagewidth, char *fmt, ...) {
  /* wrapper to prettyprintf(): see note there */
  va_list ap;

  va_start(ap, fmt);
  prettyprintf(outf, pagewidth, fmt, ap);
  va_end(ap);
}

void print_progversion(FILE *f) {
  extern char *commandname, *starttimestr;
  extern logical cgi;
  static logical done = FALSE;

  if (!done) {
    if (cgi)
      fprintf(f, "[%s] ", starttimestr);
    fprintf(f, "%s: analog version %s\n", commandname, VERSION);
    done = TRUE;
  }
}

void warn(char c, choice domess, char *s, ...) {
  extern FILE *errfile;
  extern char *warn_args;
  extern logical anywarns, errmess, cgi;
  extern unsigned int errwidth;
  extern char *commandname, *starttimestr;

  va_list ap;

  if (strchr(warn_args, c) != NULL) {
    if (errwidth == 0)
      errwidth = UINT_MAX;
    print_progversion(errfile);
    va_start(ap, s);
    if (cgi)
      mprintf(errfile, errwidth, "[%s] ", starttimestr);
    if (domess == CONTINUATION)
      mprintf(errfile, errwidth, "%s: ...cont..: ", commandname, c);
    else
      mprintf(errfile, errwidth, "%s: Warning %c: ", commandname, c);
    prettyprintf(errfile, errwidth, s, ap);
    mprintf(errfile, 0, NULL);
    if (!errmess && domess) {
      fputs("  (For help on all errors and warnings,", errfile);
      fputs(" see docs/errors.html)\n", errfile);
      errmess = TRUE;
    }
    va_end(ap);
    anywarns = TRUE;
  }
}

void error(char *s, ...) {
  extern FILE *errfile;
  extern logical anywarns, errmess, cgi;
  extern unsigned int errwidth;
  extern char *commandname, *starttimestr;

  va_list ap;

  if (errwidth == 0)
    errwidth = UINT_MAX;
  print_progversion(errfile);
  va_start(ap, s);
  if (cgi)
    mprintf(errfile, errwidth, "[%s] ", starttimestr);
  mprintf(errfile, errwidth, "%s: Fatal error: ", commandname);
  prettyprintf(errfile, errwidth, s, ap);
  mprintf(errfile, errwidth, ": exiting");
  mprintf(errfile, 0, NULL);
  if (!errmess) {
    fputs("  (For help on all errors and warnings,", errfile);
    fputs(" see docs/errors.html)\n", errfile);
    errmess = TRUE;
  }
  if (errfile != stderr) {
    if (cgi)
      mprintf(stderr, STDERRWIDTH, "[%s] ", starttimestr);
    mprintf(stderr, STDERRWIDTH, "%s: Fatal error: ", commandname);
    prettyprintf(stderr, STDERRWIDTH, s, ap);
    mprintf(stderr, STDERRWIDTH, ": exiting");
    mprintf(stderr, 0, NULL);
  }
  va_end(ap);
  anywarns = TRUE;

  my_exit(EXIT_FAILURE);
}

void debug(char c, char *s, ...) {
  extern FILE *errfile;
  extern char *debug_args;
  extern logical anywarns, cgi;
  extern char *commandname, *starttimestr;

  va_list ap;

  if (strchr(debug_args, c) != NULL) {
    print_progversion(errfile);
    va_start(ap, s);
    if (cgi)
      fprintf(errfile, "[%s] %s: Debug ", starttimestr, commandname);
    fprintf(errfile, "%c: ", c);
    vfprintf(errfile, s, ap);
    fputc('\n', errfile);
    va_end(ap);
    if (c != 'D')
      anywarns = TRUE;
  }
}

char *delimit(char *s) {
  /* This function delimits an argument s so that it could appear in a config
     command. It malloc's as necessary: only used in warning messages */
  char *ans;
  size_t len;

  if (*s != '\'' && *s != '"' && *s != '(' && strchr(s, ' ') == NULL &&
      strchr(s, '#') == NULL)
    return(s);

  len = strlen(s);
  ans = (char *)xmalloc(len + 3);
  strcpy(ans + 1, s);
  if (strchr(s, '"') == NULL) {
    *ans = '"';
    ans[len + 1] = '"';
  }
  else if (strchr(s, ')') == NULL) {
    *ans = '(';
    ans[len + 1] = ')';
  }
  else {
    *ans = '\'';
    ans[len + 1] = '\'';
  }
  ans[len + 2] = '\0';
  return(ans);
}

void *xmalloc(size_t size) {
  /* the same as malloc, only checks for out of memory */
  void *answer;

  if ((answer = malloc(size)) == NULL)
    error("Ran out of memory: cannot continue");

  /* Enable this for debugging: memset(answer, 35, size); */
  return(answer);
}

void *xrealloc(void *ptr, size_t size) {

  if (ptr == NULL)  /* Some broken systems don't allow realloc(NULL, ...) */
    ptr = malloc(size);
  else
    ptr = realloc(ptr, size);
  if (ptr == NULL)
    error("Ran out of memory: cannot continue");

  return(ptr);
}

void *submalloc(Memman *m, size_t size) {
  Mmlist *l;
  /* so memmans are initialised with curr_pos, first = NULL & alignment set */

  size = ((size + m->alignment - 1) / m->alignment) * m->alignment;
  if (m->curr_pos != NULL &&
      (size_t)((char *)(m->block_end) - (char *)(m->next_pos)) >= size)
    m->curr_pos = m->next_pos;
  else {
    m->curr_pos = xmalloc(BLOCKSIZE);
    m->block_end = (void *)((char *)(m->curr_pos) + BLOCKSIZE);
    if (m->first == NULL) {  /* initialisation only */
      m->first = (Mmlist *)xmalloc(sizeof(Mmlist));
      m->first->pos = m->curr_pos;
      m->first->next = NULL;
      m->last = m->first;
    }
    else {
      l = (Mmlist *)xmalloc(sizeof(Mmlist));
      l->pos = m->curr_pos;
      l->next = NULL;
      m->last->next = l;
      TO_NEXT(m->last);
    }
  }
  m->next_pos = (void *)((char *)(m->curr_pos) + size);
  return(m->curr_pos);
}

void freemm(Memman *m) {
  Mmlist *p;

  for (p = m->first; p != NULL; TO_NEXT(p))
    free(p->pos);
}

/* The next function is derived from the FreeBSD 2.2.6 source, and is subject
   to the copyright notice in docs/LicBSD.txt within the analog distribution.
 */

#ifdef NEED_MEMMOVE
/*
 * sizeof(word) MUST BE A POWER OF TWO
 * SO THAT wmask BELOW IS ALL ONES
 */
typedef	int word;		/* "word" used for optimal copy speed */
#define	wsize	sizeof(word)
#define	wmask	(wsize - 1)

void *memmove(void *dst0, const void *src0, size_t length) {
  char *dst = dst0;
  const char *src = src0;
  size_t t;

  if (length == 0 || dst == src)		/* nothing to do */
    goto done;

  /*
   * Macros: loop-t-times; and loop-t-times, t>0
   */
#define	TLOOP(s) if (t) TLOOP1(s)
#define	TLOOP1(s) do { s; } while (--t)

  if ((unsigned long)dst < (unsigned long)src) {
    /*
     * Copy forward.
     */
    t = (int)src;	/* only need low bits */
    if ((t | (int)dst) & wmask) {
      /*
       * Try to align operands.  This cannot be done
       * unless the low bits match.
       */
      if ((t ^ (int)dst) & wmask || length < wsize)
	t = length;
      else
	t = wsize - (t & wmask);
      length -= t;
      TLOOP1(*dst++ = *src++);
    }
    /*
     * Copy whole words, then mop up any trailing bytes.
     */
    t = length / wsize;
    TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
    t = length & wmask;
    TLOOP(*dst++ = *src++);
  } else {
    /*
     * Copy backwards.  Otherwise essentially the same.
     * Alignment works as before, except that it takes
     * (t&wmask) bytes to align, not wsize-(t&wmask).
     */
    src += length;
    dst += length;
    t = (int)src;
    if ((t | (int)dst) & wmask) {
      if ((t ^ (int)dst) & wmask || length <= wsize)
	t = length;
      else
	t &= wmask;
      length -= t;
      TLOOP1(*--dst = *--src);
    }
    t = length / wsize;
    TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
    t = length & wmask;
    TLOOP(*--dst = *--src);
  }
 done:
  return (dst0);
}
#endif

#define SETPMATCH(ptr1, ptr2) \
  if (nmatch > 0) { \
    pmatch[0] = (int)(ptr1 - whole); \
    pmatch[1] = (int)(ptr2 - whole); \
  }

/* match string s against pattern p */
logical wildmatch(char *s, char *p, char *whole, int nmatch, int *pmatch) {
  char *ss, *pp;

  /* First match head portions */
  while ((*s == *p || *p == '?') && *s != '\0' && *p != '*') {
    s++;        /* *p != '\0' is covered by (*s == *p) && (*s != '\0') */
    p++;
  }
  /* Unless we've reached a pattern *, we've finished now */
  if (*p != '*') {
    if (*s == '\0' && *p == '\0')
      return(TRUE);
    else
      return(FALSE);
  }
  /* Otherwise, match the tail portions. This is purely for speed reasons,
     so that patterns with only one star don't have to go through the loop
     below. */
  ss = strchr(s, '\0');
  pp = strchr(p, '\0');
  while ((*ss == *pp || *pp == '?') && ss >= s && *pp != '*') {
    ss--;       /* pp != p is covered because *p == '*' */
    pp--;
  }
  /* Again, we might have finished now */
  if (pp == p) {
    SETPMATCH(s, ss + 1);
    return(TRUE);
  }
  else if (*pp != '*')
    return(FALSE);
  for (p++; *p == '*' && p != pp; p++)
    ;
  if (p == pp) {    /* there was really only one *, disguised as several */
    SETPMATCH(s, ss + 1);
    return(TRUE);
  }
  if (ss < s)
    return(FALSE);
  /* this leaves only the difficult case, where p contains >= 2 *'s. Try and
     match ANY tail substring of s against the bit of the pattern after the
     first * (or consec. *'s) (reducing *'s in p, guaranteeing termination).
     (p was incremented above). We choose to match tail portion afresh each
     time (cheap), rather than insert null bytes into (poss. const) s and p */
  for (ss = s; *ss != '\0'; ss++) {   /* reuse ss */
    if (wildmatch(ss, p, whole, nmatch - 2, pmatch + 2)) {
      SETPMATCH(s, ss);
      return(TRUE);
    }
  }
  return(FALSE);
}

logical matchq(char *s, void *p, logical is_regex, int *pmatch) {
  if (is_regex)
    return(pcre_exec((pcre *)p, NULL, s, (int)strlen(s), 0, 0, pmatch,
		     (pmatch == NULL)?0:PMATCH_SIZE) >= 0);
  else
    return(wildmatch(s, (char *)p, s, (pmatch == NULL)?0:PMATCH_SIZE, pmatch));
}

logical genwildmatch(char *s, char *s2, char *p) {
  /* Exactly the same as wildmatch, except with doubly delimited strings,
     and we don't need to know the matched portions. */
  char *ss, *pp;

  while ((*s == *p || *p == '?') && s < s2 && *p != '*' && *p != '\0') {
    s++;
    p++;
  }
  if (*p != '*') {
    if (s == s2 && *p == '\0')
      return(TRUE);
    else
      return(FALSE);
  }
  ss = s2;
  pp = strchr(p, '\0');
  while ((*ss == *pp || *pp == '?' || ss == s2) && ss >= s && *pp != '*') {
    ss--;
    pp--;
  }
  if (pp == p)
    return(TRUE);
  else if (*pp != '*')
    return(FALSE);
  for (p++; *p == '*' && p != pp; p++)
    ;
  if (p == pp)
    return(TRUE);
  if (ss < s)
    return(FALSE);
  for ( ; s < s2; s++) {
    if (genwildmatch(s, s2, p))
      return(TRUE);
  }
  return(FALSE);
}

logical headmatch(char *s, char *p) {  /* does s start with p? */

  for ( ; *p != '\0'; s++, p++) {
    if (*s != *p)
      return(FALSE);
  }
  return(TRUE);
}

logical headcasematch(char *s, char *p) {  /* same, only case insensitive */

  for ( ; *p != '\0'; s++, p++) {
    if (TOLOWER(*s) != TOLOWER(*p))
      return(FALSE);
  }
  return(TRUE);
}

/* Does a hostname match an IP address range? */
logical matchiprange(char *s, unsigned long minaddr, unsigned long maxaddr)
{
  unsigned long addr;
  int n, octet;

  /* Turn this host into a long. This is basically just the simple case from
     parseiprange() (including atoi255()), but a much faster version. */

  for (addr = 0, octet = 0; octet < 4; octet++) {
    if (!ISDIGIT(*s))
      return(FALSE);
    for (n = 0; ISDIGIT(*s); s++) {
      n *= 10;
      n += *s - '0';
      if (n > 255)
	return(FALSE);
    }
    if (octet < 3) {
      if (*s == '.')
	s++;
      else
	return(FALSE);
    }
    addr <<= 8;
    addr += n;
  }

  if (*s != '\0')
    return(FALSE);

  /* Is it in the right range? */
  return (minaddr <= addr && addr <= maxaddr);
}

/* Is an item included according to an INCLUDE/EXCLUDE list? */
logical included(char *name, logical ispage, Include *listhead) {
  logical is_ipaddr, is_regex, matches;
  Include *lp, *lastlp;

  if (listhead == NULL)
    return(TRUE);

  for (lp = listhead; lp != NULL; TO_NEXT(lp)) {
    is_ipaddr = IS_IPADDRT(lp->type);
    is_regex = IS_REGEXT(lp->type);
    if (!is_regex && !is_ipaddr && STREQ((char *)(lp->name), "pages"))
      /* 'pages' is made case insensitive at config time */
      matches = ispage;
    else if (is_ipaddr)
      matches = matchiprange(name, lp->minaddr, lp->maxaddr);
    else
      matches = matchq(name,
		       is_regex?((void *)(lp->pattern)):((void *)(lp->name)),
		       is_regex, NULL);
    if (matches)
      return(IS_INC(lp->type));
    lastlp = lp;
  }

  /* not listed: return opposite of first inc/exc */
  return(!IS_INC(lastlp->type));
}

/* Is an item included in an Strlist? */
logical incstrlist(char *name, Strlist *listhead) {
  Strlist *lp;

  for (lp = listhead; lp != NULL; TO_NEXT(lp)) {
    if (STREQ(name, lp->name))
      return(TRUE);
  }
  return(FALSE);
}

logical pageq(char *name, Include *ispagehead, choice type) {
  char *c;
  logical ans;

  if (type == ITEM_REFERRER)
    return(TRUE);
  if (type != ITEM_FILE)
    return(FALSE);

  if ((c = strchr(name, '?')) != NULL) {
    *c = '\0';
    ans = (choice)included(name, FALSE, ispagehead);
    *c = '?';
  }
  else
    ans = (choice)included(name, FALSE, ispagehead);
  return(ans);
}
analog-6.0/src/win32.c0000644000175000017500000000212510161303543014627 0ustar  sret1sret100000000000000/***             analog 6.0             http://www.analog.cx/             ***/
/*** This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as
 *** stated otherwise.
 ***
 *** This program is free software. You can redistribute it and/or modify it
 *** under the terms of version 2 of the GNU General Public License, which you
 *** should have received with it.
 ***
 *** This program is distributed in the hope that it will be useful, but
 *** without any warranty, expressed or implied.   ***/

/*** win32.c; stuff only required for the Win32 port ***/
/* This stuff is due to Magnus Hagander (mha@edu.sollentuna.se) */
#include "anlghea3.h"
#ifdef WIN32

/*
 * Initialize the required Win32 structures and routines
 */

void Win32Init(void) {
#ifndef NODNS
  WSADATA wsaData;

  if (WSAStartup(MAKEWORD(1,1),&wsaData))
    error("unable to initialise winsock.dll");
#endif
#ifndef NOPRIORITY
  SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL);
#endif
}

/*
 * Cleanup Win32 structures and routines
 */
void Win32Cleanup(void) {
#ifndef NODNS
  WSACleanup();
#endif
}
#endif
analog-6.0/how-to/0000755000175000017500000000000010161303533014146 5ustar  sret1sret100000000000000analog-6.0/how-to/batch/0000755000175000017500000000000010161303533015227 5ustar  sret1sret100000000000000analog-6.0/how-to/batch/index.html0000644000175000017500000001266410161303533017235 0ustar  sret1sret100000000000000
 
   
	 
	 
	  
         
	 Using Analog with Windows® 2000 Batch Files 
   
   
	 

HOW-TO
Automate Analog with Batch Files and
Windows® 2000 Task Scheduler 

This HOW-TO written by Rick McGuinness MCSE + I, MCT of Rix-Web.com
version 1.0, April 12, 2001

Purpose

Analog is claimed as the most popular web log file analyzer in the world. (Details). Whether running multiple virtual hosts or a single root web server, a useful feature is to run Analog at pre-determined times automatically. This can be accomplished with a batch file and the Windows® 2000 Task Scheduler.

System

This example was developed and tested using a Windows® 2000 Advanced Server (Service Pack 1), Internet Information Server 5.0 and Analog 4.90 beta 4.

Batch File Example

Each Windows® batch file contains:

To create a Windows® batch file:

  • Open Notepad
  • Type "call analog.exe"
  • Save as "mybatchfile.bat"
  • Save in the same directory as Analog.exe

A Windows® Batch file might look like.

# rix.bat
#

call analog.exe +g"rix.cfg" -G

The " +g"rix.cfg" -G " tells Analog to use the "rix.cfg" config file and to ignore the default analog.cfg file. You may use any of the command line switches in your batch file.

Analog will expect to find the config file (rix.cfg) in the same directory as analog.exe and rix.bat. The batch file can be executed via the command line, double-clicking on a shortcut or double-clicking on the batch file in Windows® Explorer.

If this batch file were executed, it would open a DOS window, run the program and close the window. If you were to add a second line to the batch file "@Pause", it would open a DOS window, run the program and leave the window open saying "Press any key to continue..." at the prompt. Pressing any key would close the window.

You could also go to http://www.rix-web.com/analyzer/, fill in your choices on a web form, and have a configuration file and / or Windows® BAT file emailed back to you (free service). Simply save the .cfg and .bat files in your analog directory and execute.

Method

Using Task Scheduler
To use the scheduling service, in Control Panel double-click the Scheduled Tasks folder. You can schedule new tasks by double-clicking Add Scheduled Task, which starts the Scheduled Task wizard. You can add tasks by dragging scripts, programs, or documents from Windows Explorer or the desktop to the Scheduled Tasks window. You can also use Task Scheduler to modify, delete, disable, or stop the tasks that you have scheduled, to view a log of past scheduled tasks, or to view tasks that are scheduled on a remote computer.


Double-click "Add Scheduled Task."


Click Next.


Click Browse.


Select your batch file and click Open.


Name your task - Select when to perform the task - Click Next.


Select Time, Day and Interval - Click Next.


Enter account information - Click Next.


Confirm Scheduled Task - Click Next.

Conclusion

You can easily use Windows® 2000 Task Scheduler to run any number of Analog jobs at predetermined intervals simply by creating and scheduling batch files.

 


Rick McGuinness
RixWeb
Back to index of How-To's

analog-6.0/how-to/batch/rixwebsm.jpg0000644000175000017500000000371710161303533017601 0ustar sret1sret100000000000000JFIF,,C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222:U" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ͳqg}>-W6Iw8r1qdz+-!Y4jѿPG V\@Qae^X}}Q>N*3yl?h8ϳIm2,ס jx Eynin&@!O L]VR~\D}zS[ wtǭQfI 3"2f@{)Ol 쑦в*z h"\#Ө ( |I6xqMrUFyOH-&(Zy%  d('ׁ@tkma|;wai2bvqq2'q2oŻi/>ŬŞk[#*J8 W{iCk} ܖqNɆJ6O +| $Voq[y䴛o==k#Tk]Lh..tHBwM،N5m;Ywn:}>)WHi7O"IɜGQgֻivzUBBH}npW|T +RA BQ@b:?>;V<ǟc|E 76B3d[wm?-o;HÑ#혙É$'?wqcqE].iVW7By dGGE' zqq,QI"n22ßsXii+y*ά@P;+]'F,d|[k}ǽZEiQZJ2r8?CW+gGgWI.f$v8 ?Z+T FVNES$(yi[[IPVNf!*;j[ -! ©'aX]&teP ǩ 2N&Sp8z0| VU2,YFr}ԭ-ҲYzUc pq%K'r<ޠgw>^AڽqGFΣ`sʅ=zaL.1DF*yWhWoaDttO˻r*BH'X @?YEo#[H[Ns[ױUVW1 7A׍x/Zk)&g0®Q?81T[  T$>L><`cb7khE((H>c__Ҧ(0`L*t!RZڭ +HNxV( ׶ Kῦ?C R$>(analog-6.0/how-to/batch/task0.jpg0000644000175000017500000005126710161303533016766 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"R !1T"QSU2ARa#Bq5br$346cstD&C"Q!1A"a ?QefhATTA-kz SkYc8L[w"E:ʩ#kY/!mULkLUQn"hEZkj#??!uPw]TpFJmem5li; nYTr]%@E%txg^koheC.8#/]TpF!>Nַ%ٙ-!4ۊo)u/P CU:6Y+,/p7G= 򈱒CU:6Y#*/p7S3]qDk ~#{?ԹC,s+Z!^8u{B5oȣ*H$iQޭ4Bbֳ&^eG/T|IW۩+mO~هnhۣhFR)aF"AЋZiX-D,kza .cPUQ}hYIխ{B44@UUh$sa(M U`'o DgH{D|4ZFQQƽ* ׫Zk_llfϷ9^Vr B*Vz>H{ gzCXu|e!!tJmEiiЈta[}2U?=oW>H{ gzCX p̍9w+y_[Wk(әg6|C|QgzCXސ,|,Yqz,ψo>H{ gzCXr\=3s<ψo>H{ gzCXrlj͒ǝ Gwgo>H{ gzCXrlj3D~{g={􇼰w=&ƨ|4{橿u8x􇼱̓cyEItҫDOU7߇{>H{ gzCXrljϳd3=qGk)8dq;?^U'<]qgQ"8nV-w+YHerK;9[M F^I73: U\yBIm,C|/rk_V) *N~zrqiL(w.Tj xEo~"L'fgRFS 'K?|[Omm,2mwm?Gб++YHerK;Jزk!,O=-.2*pS؜dk u):ډ 8bV~z>}.&Jim٫_V״UIJ5xUk*s-M3҃)B (9v[JiHZXl23" ͋mMd5(]z^+YHerK;ύig PWBd(*h(MI>)d%4"WDZִfW-嶖wtTE)-3&LK *`D' b+YH43w1fnVSd־{`+ݛr^Yv_f^DDeP/ /roTB Ͽ2Ԩ98rM5A;4oBT}cJWXvN]h&Du+*̮[ig} +}vo(ƙ n6]kBѢZSFn#NW-嶖wBܫlN<,`AJ*iZr-H̾ıҸdFex?TNEm,2m􀡱+.H h@q()]]Ԉl;4:"/* 8ٽ-W 7EB5Z\Fݓd9A-j *O>ےsvKK2XhؑƈATC(Z+R'%޼t+!y/] *t[=aDIKSdW\YwW5Z~#+YH ]K8NblϦ/#NW-嶖w /Ŗ6۹Z'M]"m(sD)$^FX(."Uk[QR:)ivjUE#T6E~ś'us_%ϳ>ZN6r<(3-1EU=bд^x^~Ζze7h TETM1;"S0 b&%ET2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2mӕm,2ml>{Yq"W!hl3=yEZz.Z]R(K~~跚u&ݘbP2%Wy#i>+"^Qƭg? F+ V}-T Pܡ(\Ҕ>|X9+M9IAVGIMuҏTDHF}!Kn+3¢.ۂQ08tmˉ^d_ڟlFߌH{ DtZ"y*/&2oԢ^ARJ颮ҴұC+hY6luElRʭ+]5c;ސ9G*?E+ka6L!%EK"ȓRR«s- JD/ UUt%j4Z48DGDMj;1i?aΜ m GԑքFEg4TM }Zzծ]w=3!,Wګh2:PEiTTu~Q&RU)}b_UW٪V3!,ybi<3ĭ=ꢜժVbǹZTP+怿w=3!,`TBTWBƚL"I/J*ܚtN3!,h) 8j$HB$(Kk'??Y~0M* RVt*WB{t(􇼱:b UU~UNA2j"VDe/Gn'U'4j36DJn|U}6"iE%h5J讈jUP]FlZ;Z^kDK=$ Yځ: O84qZ~ѡy%c;wVVQ_zpkjH+!:q4BdE UyĽUTR;ʈUM3!,1yc+Rm,CX'JLBuZERZ hQZ'jZ6kLҍ 8uZd] JP:t%tG\B!kEཋ;&KYao- E94_: aOUUDDB֪Dfi 'Ei)!hE(=#Tћm#o8 (DhJ'"=jʼ"` 6H.ꩠ/<IƟSD!!:"TXޔ*dnJfVlnUU FJZW)lG,GvfN|ԕRUTR)֬#ھ"*J?H DtZ"y*/SX66jҜ*qn=4\Z,iIze$VJ]ɢ"uB$iAA-kסj3!,1yc HaZVDpp&#[*-ڦ](-fi'hO_$rU94*Q`,1ycKӮ4+ (]+F>n\dHԛfh@)ZꈈQEM$MMl "$uU%(]i^d׭+7ސ>uVXLZ-ADCJJUWN76Nĸ0EЯ&u􇼰w=UAel]bY[GIr B*Zkrk*͖z)fG%hUD[DaT֊:,]H{ gzCX&mY;*pTUTR*tR}ɩb2OtDiNOd}PpjKI`)pȈEMQ*1l1}T@ @WA*CEА0$H*.ֺ4/=n}M5xq\E_W) (O#ePPWHΑ6ΛmQɺW*%=ej7:촩x4^T4Ks.c%%CUԉ3`e Q*i-Z! ν5 17QB / ﹆+*Fә64JuDYG'\PQi4iMhhnl]1UTQZVhx+64:_Vɶ.м5M/^T;{3,UeaЄεWMukX DɅR:DKIؒ'ɛB'"\E$JrSr-ڂJG.⨕+·P !%)V@&BN#c\:az˭S,ˎ82:UE]*Jb?Oa妒h*U-S""鏼('Nd7XLg~mZbDêN%OiSWADְF26OL<;y%$MKDgzCXeIg'zTY60fNm\G"|iVR%"k$nsUUj_aH{ gzCXf3!,1yc\ 6c;ސ5f3!,1yc\ 6c;ސ5f3!,1yc\ 6c;ސ5f3!,1yc\ 6c;ސ5f3!,1Oyc\ 6c;Ҟޔ5f3),ky ToB#5{HOzswE%-[qUǜuqW\t]BMz9a𨪢˥>௻L6rr`\F#1$d0$kxyKDJ>D"f3!,`3$dbD?UhEШ+YHerK;ۙ'Z}L PꄋQca>ኊ,6ٜvz`%!\jTU=,fY]hh ļ}wkw }wkw+YH~Ǟpl o+B^ӦMk4'#'v|<0'v|<10(Y%%mf>R)E%-#iJNH嶖w$[f[`F嶖w\D]0v|<0£erK; [ig}"Nasnxa\[`F嶖w M2Æn>hںDOh90]0]Yµw LW"*EW-'0]0]6W-嶖w$:λ+YHerK;s wkw ]6W-WhJ32N*]1:SJWkvX'v|<0'v|<09 &Iu"P@WشR%UM?jJW-'0]0]6W-嶖w$:λ age}iP1DQS\l嶖w$:λCUIy.-M5!"em,I.uݭ 3 wkw ن镫k)" &flLr.JU90]0]Dl[ig}#[ɼ('4}GJ*.bnasnxa\[UtYff^0xU)T^d3(*$TMQ/0]0]E|IdDJn8n"ȗڿ#`J c2_RD&f[f[mW-'0v|<0.uݭ 0 fwr_$h[]5UMz׶6$Զ=aTWļ}wkw }wkw "fNmA ( Qt&X;hx9\4IV*sa>a>*]^JiIoB %Oyb^W-'0]0]m,2m9λasnxaF嶖w\D]0v|<0m,2m9λasnxa+YHerK;s wkw ]6W-嶖w$:λl[ig}!m,I.uݭ 3 wkw \C+YH\[f:mW-'0v|<1!ƋݫJ'+\C+YH՛ϯ-}SSSaMa :u[5m嶖w\DgzCX3:Hp֨J=mW-Řei -4**.T] 6;E嶖w 2MРmEH*2ȯҸdk 9.roy.ܳ- 6$*fEEԄKZQ4%68m& ᠔@sI* 'UQQzL[ig}!m,m8\A`iKEsનjI?rm3$>ҳ0 \@4PBuB#p<۵peR]eV*y/aҔWV*(,zOik[OD|1"M65JCyLUAkOY{c4zOK3h2:.̢Ίf3 䪪*M Z@r,%\L\Ƌ}lL`Ii&ِja:BgUԑj]0;J2L%h5Һt{;2џyؐR(6^S Zkrc>S=K(JдHʊ弨5{"N|YX 6\L+ͅ.BQWBs"6-g B5WPd%_muUZm2.9,.J"KUDUButTkDJ)jZO֑h]kB\dkkNRRK#`04ĵd$$ /".s@96Z)V0Ҁ(5.X _2au͗BtiJtFbјV֜6fdUtRT*VD5JjԋcYy.IY\\.Ҵ4R5Nh\ِí|#]tԐ6ͣ:9/4yn4hZ%PU/%tiYwHVxM`pQ$7iUҀudv#F̀.:Cfy tT]5oؙ~_!mUkGod{ul"uKhg8 YKhg8gY-<&!gY-*g>BDDIcD"&Eu DA"`vO,ĜK7,ۮ'ծ)"*AU'V_luk1(ك8wxWH"U4ҢкR{YҶVfYqprĥQ%Ш5M^ }ծƸZk+yɒ|l#rQ$δi m 6ʭ}QhTкQtSV |c\P펭w5D펭w5 |c\Q.2c]qC/:KL|c\P펭w5/:2c]qD@D펭w5 |c\Q.2c]qC/:KL|c\P펭w5/:2c]qD@D펭w5 |c\Q.2c]qC/:KL|c\P펭w5/:2c]qD@D펭w5 |c\Q.2c]qC/:KmC}FuM4ִ_y}ծƸ /֧q_7mL=k6feVOOQ'gZk}ծƸ A$r-^qS0דR$DѯJU1lJ0T/2T:QE/WV֊c]qC/:Da'dy ]""r^6 ˼ѱ&nM"tJ\-t@o펭w5 |c\Q^mieh mӹu*PS%҉_z|m%zY%lݡ0JhMM԰c]qC/:@&j˦b$6]DSZZhT+zKf2l:M&UPַJ WJZ7/:`vۭ4vs%U}ȱ: ڲ(+<|c\P펭w52cjʢ Xu_mDDZQbޑ<2lԯh@%4䢮DJ|c\P펭w5vvM™llP.rUWU4ڶv6˃Ͱ઻2Jo&J&ZE_luk1(eVez0ܹhM$w(WX'L138>4UR-)xu_m펭w5 |c\Qjz~Vj~['h2ħEĢYE\l+ySl)qպ+M(K펭w5 |c\Q~EUlohÔCZ[KEF)[H,Ïg *DY[kD2V-2""zC s?.?_u!Knu:#LWR&?0/=egue@DUj'?jq@g_(R(U#6D1EY JפMMx".R/JQt鮈䴻8[(.70T\TEkUU4ܮ^䘔$M:S.**>֕5]w*MDj˴UJ~Qq.Ŕ|Ӹrh ٢\$nZB*i\1)IvuT\TT%}+:kκB8V~ Km?q| &ˋQ>Ur{bSx4LKDZWtםu**3umĺg7+&%7.NˊO~My]q[:A li]$I U}~5W**3umĺgSYPSNZHAAfJnJiRx%Iri 8_fBZא5E*V&q.8V~ ehmIp(5-TgZ}brHY|rmmPTtOzUh[Ą%ն8gOu0gO3um:C%ն8gOu0gOGXa>SWeE\%Og2v08BgT&DfrUPF"/(tծDظLK[oԾN)EҔJOǹQ+M3g'm؊1 T}jZUBS^NL8<ջB SSQu{6[/n$o#'(JKtj=X&Y]Mf䩪]_hMH%ն8gOu0gO3um:C%ն8gOu0-Km?p%ն8a [8V~ Km?qq.8V~ 㩄09l][i3q.S`rĺg ][i3峉umĺgL!gO3um:C%ն8gOu0-Km?p%ն8a [8V~ Km?qq.8V~ 㩄09l][i3q.StˍLh{ 2C%ϊvYf'vBq# RB V*#Ew *ۦM1n6bʭ2'&hJUա)4 2v7 mFX[:(%Z!-kZkUUa>O YvhP)2Q!5Z49ad·GYV!7ʠʕֵҪcMRϵaɁZHF_7SKgZl %_g'|!IKɋԅÂޕ-*t{~J0hK[^i% "-5iZp峉um#;4㖔g" bVP'B fYmjYր : EU/L\mq NH"T~-U*;E$ K:/3'l!8'EvIvZ"/']Uk!eu2%yl%4%J%QjUtQ)H88n $L.ЋT4MtGgKu-"4|㵄35bYer.%K@)_-(4k!lkIR?gSGw)W𯓂LWUIt VUTӫBRfq.S`qvӖdĻ6mPoJ?Hb{I9sCKuM=')OEvK?V5j̾ JD]Ht*VlXyv쬳}v$JT i>.)ZY`G B~an`%FRUR >iζe_z[UlYGEo*%UT"-WZ#&ۀrr`FV١U?$Y 9M)YUu->}/xIyIy 9yΗ9^Em=]thD; E%Iر\2$ѲTC-ACҕqu]R'R!v3ɥ+2껮OB>u0AvRb`L^Dp bBp\ [⋣fIߖu, !i ^BԁjOj-: d.y4f\]WuԴԽ$ 9M)YUu->}/xOO:L8QromPѴ#Wo"S\bKBF))v Ƀ @QA;֩:@d.y4f\]WuԴԽ$ 9M)YUu->}/xv3J>.L* 5VShѣJ$g=aLN 5(.$R)8Zm5a ]iJ̸i{PH2hsȰ,E@rUQz &ˋQ>U!v3ɥ+2껮OC'YY)@%t[IIlhbEZ̔.mbEJ G..Tkɍ ]iJ̸i{\N̕61mFrt*)iE}bM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!H0{O >S!Kn??tQy,X袡BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB='ꑜ`?@|ۧB?Mv9%OJJ5n!۞9fZtb<!-}WZ*GXS ͢QM4+ c5҆G96fv|_Xw=E3](o$1Cy"ޔʬCy!Jw=E3](o$1Cy"ޔȳk 3](o$Vc;Ҟޔxtk gzSXc;Ҟ"7tYJ{ gzSXdY5҆C7+1OyaJ{ ?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?_x{~~ğp?q@N>?r|bK5"|h?qCk ‫rvQ٦f'YR^iؚ|&VvܲɹYŧIL`,'.(͢'NeTO=/? ;{C E}6bw]V.dЩijANUhIJEJeBnM* ܺ+_oǹTM΁ʦ{&OkjAy R2baDȘxE fzե@ hR`vkfe9FR ˈJIkZ&^z%u$4̱,J'Z0$%KBVP̑ڦOWS/m.TЉhU!hF̘dzd 4J*iEjd&mKBh]FGYiݡ"+TU(Y9eIL~V̙dzd PtNtԩcfU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>p0ʤ68eR`vp2 ;GT# ClU!hg*|Hm>pVU2 n(~ҮSڿ 63kg-I9k9kM$<:ДUtS=,1;lɲB )!EBanalog-6.0/how-to/batch/task1.jpg0000644000175000017500000003670310161303533016765 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"O !1"AQ2STadq4BRUrs#35b6c$t%u$1Q!2A"#aq ?g LN*ZHi]!2GssRv}wB}hueN|/gzFf6<tkp-txdTIY#3kvh}oz"3S3R CP6)o{XvywB}ʎeu X* kHM!Qap0mCuLNgp9n|L'(i 2Em;e73fl44e;N fCGIRf 2PR: /isZ< ~+<0b-}M?ԝCПj2ƤIYEH袶_'Ȱ8eЉ]I@n-!CCGM6Sw;.A&:_ ͻhCПj8mwB}. c[:ٰlFۚ[x+)%,uQ 8f]r.ZyͧcGnc .'c٦']p2gdT2FOq ÎR/6r%='R<3jOTSmͱ.ʥvl`G+]ʿa3nѳ8|tq;u"DzGQ_ޮbM=vMɱ[z)K~kGWwN\Ytλ:ªI~eUƓUYڧFv좿tK=wqYڧFv욻RK-orYڧFv쒷KduʗTdڧFv"T8CYܩ5NA6Ѯݮ+;7FStj,mS][ukj?F&:5۵_*?FWsXYڧFvOs_zS¬ z5۵*{YuڣхZA6ѮݬzQJFxY6Ѯݷ?Ї \ahMkm޸! ]ZAdnw1ta}~]ZadnoetaeՒ0BۧFv>}_zOYۯFvێY$7 YxY)?EdMuQ zCc5y˛e]y"2ꪫjg9 mESgyͿwqV*YiӱH}O <ꓰ\SnWMۏPQWcHޏw#~ߢבsnp'~ՐV'=7{E"y6U!b0:@sjTH|ز-OӇ}~T}fqyϱ}=GӋ}~Tiqyϱ}MGӋ}~T >s(حMUU 6цbD߹U`Qϱ} ~<ج7mU_2&yޢ3η7mU(L󯢒Nvy&,󯢙[h6j 8[6BpzZ4Ud@>֩4XU?!K3t6:ꕟ"^Vlpq[ sKOVMFGin}GnR7ph%?QXħ#8MHV 5lK.vڷ-Ƅkkjd;祩Letg% ׏+pLYiaih0YR9:9K7w=nuކLen~r~.[jV^0^gzdL, 6wp:]y|L tG SL#{AlvjFk6ZN.ۛz -Ekæ.q#f$2 Z`GkǎSMDr94Ih:˝8]A(pUVITM4|4V4FŸ~k~R-ʣfYIG-7`7r߲&AېZGP"s-sA-u`_.$h{,ad'\#ݦܵGQ l!;.˺H*LrM(-k36ѺQk<(7摑6G#Y,Ovv) m8}FL{NS|ń u֋*llsÓhpÅIE;G=8$Mpvw 汵/krNZ8 Ĉvb]MAk[)*,jQ+jf9#f8ص {71eT/k-#l3=g$4:ƣeEieyqklHJnA1j-]0sH7A w;P>i*f *'vϩH6n$kI[3qpP: `} = 1z54:ѻ󺒦5FT=o25uA5ƭ%$npc#.,CmUS,BI[3Me >fO/gHSH [)k]#ĹO 9+dou0m7n8 ISG ,h&/qXߑѱG_^%Rs8fʋ Mwd>,7kˡFg|ÛynZo3i|v82W qgsZF2j-}IY^) jw9#Y$p$5y[o"`ώ~:2&JY|K[0&Pok+&Y:jg5[I^nTbNsf$ Hp,qqNRɈKnHP6cSiSfcQ UUQx(Z#@q7NU[YQK3͌H\:;#uۉAU{6l簸$- ;iTgmNhw.cr$80L#5#{ k/zZODs}׈\sT>jـd8i6h$.m`5G)M-8Ǵ;MohDŽGU%kk\i2dsr9o`76 \6G 3̶ctbz&A6c+r8vlmmeΦH&OB&P,]}Z7Ʊ-V " ""k>E?ݻԼzgȧz=zn}>p&o*~~G9f[uxvճ,vzr+:mbZ  pPe#۹V[;siz ILdx~>92[<_r!Kjw/_lo?!K7v~aۙml+0rL :~6z7ݦlg>=66X~F\_W꓁./+]¿|Áe) \kC#R\SUKL,qc}öߦFctrckpwmeSO j2PM ̢e+YRigvwg涆My<7Z0㘬JimxFHK}iX]xS+m\Ɨ3fʑqGI+-A)'2: lrd(`iQc}@*Ɨt6O]MAGQzH%9~G ]NClcϟ>l志.~ ]3T̀5uԌhe%326!esy" """ """ """ """ """ """ ""k>E?ݻԼzgȧz=zn}·exCj7yBG)<<[1(-Wfl1x\+?s7-DžY7]Ur몴 oR-ﯗKrTL2Ó/KΙ4D£ דen: =^y0e o%25 M2Fv".&ڀf`-=G>j2f˿[fSG__5s>08;EWUaΚDS%ٞalj-豋f$Ag˝|>ܨ:DU}qa=V[x62feڝ9Iv3X*S}Iv3)`s^"{ʈ oHeχ3S O N;λ'+P\"یk"n.Y2\m_}q)=E-s 3u ;iK :Uxof!I V39h9tmEDPI%\M]J$KFx-6Ӌ+ ?67YKM%d@126f;!).."˚5cS>8#l5s{B;atHVf{.lql䑲/cmtM+S,f.oi͌\mlCΜ[*ZʚlZe#K6k |=9G-G50axl_Q}AUp%Wfo*O εki]Vl|>U0ܽ0~ 9<͌S0 ܭ,.>oV"8_C__2l4\r2I:MTA\yWYǭ߯儱wʄUnTmnM:K:#cc}ܿipBǁ0F0|-7zJ $d $A⏏E,=,Kc )ηD|:7* 4 y %k=p8:$jU rYwX/ SIKԲSpvN`,2G4|@ƽ\nxT8fV4VLle`!,lָ͐UUAO FF[OvM9Ga}| ]SBblφH^X~F<_}ڋ*87VRU9Ѹl󴸜!l.J%d9Ĭ`5xpEA GPQifu$YWwu MeSO j2PM ̹WN2CWl$ +82N ͗*hpz:7>4Œ\qׂl n.c$E?##kFab ._Xh06B$6ť0 ͔9u$ha2X0^ӻx\fut1N 6VbT5--U,T '2+@w[yU#Ĝ.Qe Q-Hr/i}as'dAI{ qf~q7nls~ԑF#.8HYPA$Om-11hǓ?7r7tԸEL6Fi-y_ot&Zk0%83-㐇f/|5T1TҺ3Bv4mN[cROIMQ$RTS+9sXy;2h'mK]Q!:k26}εp1TM "T8[0ܜr;{cJ IL*P)9L1  !+' M1j̒]nq:xJvRdT:6q n͐f9˙Xe[xۄaspΤh`AO)Ys2zH$;dmŎSfb ,mvۛA*V&1E;䧨fu8 t `P$iI9YSi3BH׵mv 8Lֿ#ե0C n򣠅앎2ٿz E\!UuYf͌EM)B{b;Rte.v5ԳT ؗ0IpЌPԽPi{Xm>\yx<'εi"*\6s.XFp^__æehN ^,m`g&|gQDrS # # =۲fH27M0<b))p:eͦ.vlbSñ vevcsZc`UL*c vFf,l٭n7A6Aa,}1vmq6))Xe9&XwkrE/}Ps|(ie=Y 3N&4+a5"^VRS۽K7n>}ATL (m7n>}AT]RxpkuӦ|U_ |ߏcxv^0 ʕ[w Jo|.-ϟؾ7ƫ9wU7[ȾۈOQ:`Ѩet٣çDcê.ܭ*q# bVu/JI1‘}ųOI6D4R?jbGEk0s. 3rڕT,\#{gx[U]mᶄo*żV5OL׵5e: lں-[C7 Yվ'^}`EO X'@N IZŨfyݡX\ W6ȣ:jij'vXa{krT`h $ug,.hE?ݻԼzgȧz=zn}' ݸ-Q?5z_G#:ʶcZ: zaa;jVM}z-F9:_U-ͻ->m޿/6ЭWAs@`q!\B{p%:o&:ewSP0;kf%ٵ|^PG6Ԓ.0դ$Nxph f$9r}s#yDG -|J̍/$r{TuQv{}e3dQpx$)#[mrcY xw f=yn_ƢnhDl>5d]KƋ:+`FY:~[ğxOTᣌF CEVJ:×FU]DK_{p&e3\ģ{1־:<~xvk7mVӇs<ŜX[.mo|DCUHy:Yy:"܁vZ:Fb́}E[fVO /6Dx4 ĤlWӆB?ܗ)ӕkӒʦ׶U>QNe';.B[.SugZpuv6ݛg2:ٻe;7|2kl{ɿ\Dm#.0=T=+c"l@.guSAOSU. -ff;up= i13G*buTJ\B$#xnITW>zdq6P) h8mche6WD""" """ """ """ """ S۽KתV|wyZצo*ݸ-S$520iq i55"k<6DžvJ<.7 UH tr˳sMw'ȖDB }Bllyye cÎ)Z}BƙDآ}2uro<zrJѸ5;ybS#u>un|kȤ6&|~ j-mE|&Әp]~~|nӛ~{iE8wlqӟyV7iUj!l wÿUpc9Kiw",(!vRꕟ"^Vq[ *|ݸ-U_dz .6 ZI<7fy FGStEF\sM*Y)-dT+R| ph9˻sLpkoh vKWqإdW6F Y>>4R6=|||sbanodԘ|x~5_y?/_yF3cJX;Fܛ )ӺqFɩ: ;qVpp;yˤp""ʈϑOn/+^Y)ޥj^e|a n}v8;_ Xq[ugMJ2Ӈmoʕ܁gYĩqYpՊx寏}n?$[}&oSoȭ6b\F:[ @)!o7ekydVLj?%3><}y>)L&Au;)=2@9E+;ֵ&k\-WGmE4`ۊgwfvoˆjXZD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA gȧzTvRGMۏPU-ݶ􂱛ea|>@~?$r)cսܦhob4 e kɰ ٢|RF  H<݅NG,q-ӑGo4e9ry.F0Ah Fpods}Z<$kɆV3|sj1zG]n+]-E즒$ј>]s[11U$sCӔɼ,mʸW> a6nw47-\76s3ǐʚfV <\ :9Ilp>̺9fh$ۈRaaזdXǕKg[7U+"5n(0WzY@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD|wyZJϑOn/+Tzݸ-mݸ- ё{qٯa W(ˤ6hau*[c%<+bb-UM] Urs.좬袻X\(Ur6] &f` vƫ2;V*|SlΩ¥:y,_Nĸ?7ַluʴS),+t/sXwd9@B [rG9vJj,Ȗ9pHWxg$/h<7C.u}T4Յ#PtFLɰ6en8Xkv ߀EOK+ퟵqsokZdwuLp浙 }˝øo%DWE(OuUwrtHAd/S.ʼnQD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA gȧzTvRGMۏPZ ߛe`G"wX  ɜf>e쪋k/Cs[̻`g5ֵvK[ld)?D s9MmM,. 0 Ii\sDMVUƫ7j-<*ǃ{א4>_S)$Y1΍ #®}aY3ٹXbҼd#U\ԉ N O034PsYW+ fTDECY)ޥk+>E?ݻԼQvOXVvOwd#tN_t4"0>?%/v-Zp˪Dx-PUSke}Ulclq EZ`f.mFzѫ7-;p} Of?s3Q9F@VM#tr syQuYytQUb_^UЩ}G2iul)7/;'F%DDP5"^VRS۽K7n>}ASpx7\hq[ ?}AF""" """ """ """ """ "")\Zɧ ]>Zs2+o{SwfC^tB3.k]>˚3ŽOݛ {C .oRb+O3&lV0XF.7A]")\Zɧ E?ݻԼMۏPQ&o(D@DDD@DDD@DDD@DDD@DDDA$ݸ-QS%k[pwUw>TI##s9o ?dnvw}n R>3TB֝\S8ld(xE .$~U7Lk sfqnm9/"œP7Fژ;{3D|_L%p2^G qٳ&l(M]+i7l{:a 7?ȕUw>\DTFȝ@Z]9s>d{͛4L9fN`Mc2 :Vۍ#AM5k~3HU^TWvž.eٗJKZZ=$-:\R y\-:95vSG%\bnPn.aq;ͳۆl]6!K} 7XokᦻR|U h%#hɯ5Aە\bM'f%:~F8Xk^fIahn9\HZAS,pEA&nYƱ㘁y󠯥1Z젂vDc^Fml6b m[: pZg~2fr<&J(-7}+|Ù%E3YD%"x  N(]]KLV Ln@Ŧq~m4XuKEc|Lt0y:ߝlu]7|*O؏؇t &7id6-79gȧzTvR7n>}AF8kLݴsZp ̩_L&NʟveOra0:t\fT/*~ Ӣ;29}0SL1ٕ?yʟ`t蹎̩_L'fT/EveOra;29}0:.c*~ ٕ?ysSN̩_L&NʟveOra0:t\fT/*~ Ӣ;29}0SL =} 3rDI/jþ[T}SN̩_L V}/BbuoQeOra;29}0Xw }֬;^Gٕ?yʟ εaW-'ZzfT/*~/:Շ}_Kзذ~ ImDnOTݙSN̩_L  Ef{X7USN̩_L  Ef{X7USN̩_L  Ef{X7USN̩_L  Ef{X7USN̩_L ¢EQ1ps\v7l1ٕ?yʟ`^ {i:&O|V}/BbʟveOraZzXw }*~ ٕ?yjþ[NaW-*>̩_L'fT/^uo:Շ}_Kзب29}0SAy֬;^,ٺ(so=ٕ?yʟS۽K_7 u$;Koiu"?analog-6.0/how-to/batch/task2.jpg0000644000175000017500000006073610161303533016771 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"R !1"A2Qa#RSTUq34drs5Bbt$6cC%&1Q!"2A#aq ?g&6[NN|j|ZП5J~7MI"yvxs }){Z+Ky`duR*0q sνT)ωG Ć9XFn>8#kB~wLTHxT?}'DMk:!d9Ǔ=zRK4[t —ݴ >~LRf DPY#rD?OMO^M,&{8% \$>D'9 vd-:Ǿܷy'Ko1Rv0L#R /E-K,ҥ &Ie4p3ggDv)''iCj:"Ap3eg4A_g޽ߨzwY5  Z) 2${ˀsY2ݖl aOd vm<)^'--8,OG,8lmf+[}mSOrNݎuR&֏փnmzz/ :g]Uz/}_ zMtkkmi=*Mtkklk-Z*Mtkklklwk誔RMtkk[z*xCyVގ(SjxAyVގ~୽T P:5۵oѮJڧFvr+ٻuV)BTn~\fb(TگFv+kъMkke>F+e.=>Ux TnC{F* mף]MFoy{ȽB)^v7bbȽb)^v/"b%z1QEz*mӣ]Jr{zԞ?*0 mף]KY$ s qO/R?[?agRtBXQݻ?q,cy"2]_d#!x̉d` SV.6j W6۪-!3'-R{E>ᮍ7?U~M֫ޱIKOi^5OkEk\۫< ?k{EOqsnO>~x|=o[*uaG}v4v֟] n(V x5o^P~᭵MCC~~W-C~~S\۫<[o߆ _-o[).mՏY (x-Y kVKڽ}f5ﵛkYE=nfm~fUE=jr Wτ7Z).mU^|$Yx?w}cV{UfH>RH~V{Ugu'Fu'߹U.~ԡ~U߹U>/=_Ioڪ؛~i7/sE7mUN4Ib'z*oڪiWMG(ͪ7?u{%>KS~PE>ZIOMUCyWEVMUFZ@QR(R#h\:KD >AbR/:+y2W Ho&7EiH'8uĶ}6ɧ7?U~U>-y44r${`o ?es6\Q?xU3u)PNC^0NZ%[e)Rkxҟ]<{kz\[fhJlvyigo?35-k wk35ek_([J+\5gkl7MDGGߌwDD*Di%ncЪ@kAYd?GZ:hĺGt.Gn8gAcOhQ݁apDR9n$ ̭a$dPM3"e`̹Q[-[2L(DG9s53Q`0>VMFIP܉N@9|!9MF `r VͤIkwdl/C &w6x\3-z~Xy`wq*#wFrCpQ. @s"P,qPLlsPH<\ ̶+dU^x8q\GvpkEmPYzbI ;G<hj^A":7D|m)ִ)trH|*w;p)64o q&],x!` ɌZv, E蠌=8q SZ} /йL` #<څ ?Leu^.Iɫع3J-(}$vYx^Gԯ&=9{@V1ڑii+ (īm3mWu|1<<;O:Ot;vgIƣ$FYG$@ Fx8Č tɚA(Ic3H۽qJq˷Mx?uiVm:;RU7>"u ֠!`Y=TWχdm5a}i^ݺ1 }dnclwL7R̳nRY^E֋77 'G,z)S×cF+-P[$at95 ]i1#X$2 c9@7kď(ntX6K Vhw'9qK5 onIv>u R5#b9<; ;Yg(F;!Kr򊐚Ǝ]"u;O+m?G~* Cl.@mkǏA=_k~FR ۱9ǿ Kk^Mq2& 8kMcks/Ivoex 8T>KND@{ N`kbQڭ4K.ӑ$ Aay0226l"XVsn&!ۅĒĝ#)RRekfUq&̐||="sG]^+!*^ʸIx@eBۑ xiʋcji$fUti$v0AyU@QEQ@QEQ@S;u/?2mW+:8USO&*_z)TɔUn ˃^Y^6kÕyYqqN3HC#aGv}}Etɍw`}+Ǔ/':x XR{}s뚩q'__-23%HC( q< zzW_GGEم__7ץ'ˏ%J}M!w['=t|y9jl tCaKJUyoznnahnahHjJ=K[Ԍ1苖*Ns݊S/im%U/D `rypk}pD gY y8)nd ު@[xX N nq3I_t~lmv,c{ 77@[cSc/䠭/½,jB gac</ ـcl,h[HȜFE{‡~} ձf5=19^J{#mig$t+4JT۵.K4lrI?Y&[H# D𪖎%:B#y9c"7 s)r0:qk ); mHj:\<+^J-'Fe(F揢O20n}kP)Ӹ©`u1~L!A{W2t$1J$ʃx>Q<<{ 77@[cSc/䠑E%#HlhŒq'$ITQ@QEQ@QEQ@QE ~e?W]R)ferM_UG7*;~(G)<9Gݎ~UxW_㣩+CN=Cu~::?*S>W_㣩+CN=Cu~::?*[{yWE,qd;,nlmN}VxWU%}E#5~-Ek.穉OUWg_s6O>tsPLƵ;FڼÕHQ|?iI8 m=y)=)cqjĤiu`/?וU4pG3U~~ukzk7OkB#o`I`;𦓫ƪa88Ƨᔖ:[\52cq8ϟ ZͧhӬYb+sFnmFa*6ʐ0APS!VUWso"neyg)IhZ03 o2G f&ɩ{ӥNclvDLM}#Wvv{MU.w x*##6^l]8gi(ljK:~dt"G@um#h;({;<{9/jʹ7/R#|)Ď#.Aqg8 NmTitS,vd^Xc8R5ydi%ўGd<ԝ嵤ת hEEUYmA 6VW7-{=؇|q01g9q>o_m567 5 wg͏Ӫ=yz< uX}IqWD9 c'м?z'4^UB1WFy?`ǯ6Ip%XRil-w\BD+O>怜^laTXQtykx B!{V8[eJ[DMU8KW'M&&cħv+z|p'>zJQTp 7gǐqEn< c8c+c:hg:a?+S}uOO=4􈭯珢ܳ!M0+`o*FxVzEbI[{iayd$ ֏FBH8oZ&k-6!O&gk9TtY[ăp@=ա6Z6d֓In%\cFH]287*57S5z^ot`)C+Uh 8ceh`87uDx1kS^t-tֱ]QvУ3v*9qq-r CEX"DbP I8N.j=:Cځ,$pw3v[#x`~->[e8ʗ%>|dʦGnŧfT[U#W'DX`Ig2g9SI;qj??C+~|#mY#wVdEGG+lAwTN>8NWqZܪz}VDn9#zsqp0+QY"dbtmrW##zFRj7֋3nE[_UG7|3QHs>&>ꌧr>__z7s BbUqx (ZtA<|]w'Ntj_A@u!)!<8r ~zy7VC,#՚XWnlm#Ǜ7M5M\aHY:Ψ,yWr3{q'+gyFAIZF;8'v1,@~GLGq̯>__Q7\)演ıY\:sZۿصe^/S/U8A}?)zkx(WQ#{9OAbh\%ܚ "lU9e3VTS MzdV[/7.FLVPgP93+>Yeg7tz -ųx]ΑQex̪;Y#14籲[QH-"34j3LjURy K@!VV1##N'ruOKRiyM(-!;Gl ws= xQcj(PI6'&'/TbD(XHX1&]x dc#p (( (( (WmJ 8Y#` .ryhL[,W&+[n6t q dqNB[]IZ%lQUJǥA;}xOǖ [ƼY6b,}.N7n!;Mp۽;w>m==g2%*ٶ\6+{o/kFא۴,f#]Wv8ݐ QvM{\ʗZ-ՙV7mw7%9Ű%Q^ "(BBy͘J\="  ڼXrI}}6\Kqwwk,Y P.IGOrKj=J3 I\7ztZD!I#(K(v)Rx8'#hH-xՔڲ& &.AKxۼcW^6c- J egWBC*+\J}J#<)*]]YsX *#q>/5?O 5 (? (?󟯯s~cFs>xTĶ}^~e?WAצ*?hiq T){@i8dwyJh8*EF3y_=vIPg"9cøUaqe9%}y=5-3>GuhP]ޘ#|p$p^rIɢG4ԋ Egx{l΄݄>=H;6C*jYYE.:&$$vN[2)G#-I"m&ĎI!QǴG a|c}h.˩Gvw#wdOIϿ樉ϫGSt2.V<7H@<{5 ~FvFch9V0PKIp5QK[Ynsi=$ FT$HI6wa$dGZ!q{iKtwHLB.I$g8;콡*.]lk+H.yEAޖ7xi-nvopg  s<-4^ۦ{iXt|<?&g-p%HHъxE  p):q"[G?9NO q^\{-iolwUcnF{1x9+Khd>DWۖ- ,G*I#XrvpB?Gi2ktg;G "V6d5]mAY,{GHٙ$+!!*kI;tqj. qveeG Á\Z^Cx3,R,J2pԚu+gߺy1ϏݻPQEEPUukw5 @n#,8Af#kvPmj_eRUcٙ㏆VB_Tt=>]ʲ!c0='eH#a#ĆpyT5KȓZ1!EPQEEP (? (?󟯯s~cFs>xTĶ}^~e?WAצ*K}f*KhK $'Kmq~BH<1cni-cf?Tz nWiYDCm,s UI]ZEs$Gh8p]+8;_SJY q#⢻cn+!CC_ˡ Ga6O^H8sFkU{]r,0h%.:b gA4Dgrqlgw>MգeckH.ј"]wP,tOJ*m#-;G8N#nb7pqxzf4-4 [#p;}zZ\ mR6gFPyv)M$N !vk9#wJz^]uըH<.iԓX%qc2V B`H?F  /k.9BUe< ӧQoMUͼxqѯx^ 8Cc2Ѩ('>)öf=?SIE&ZB.˸tLdAs&ڎn:^Ӭ9S8qC떽gH+8#erQSRW GNIK7k #x !t/  GSGRM;MUv& ;y\6ÃconMׯm"x໳7Q#&{trtrZ^٭MٷTVXse&K)t%WYbz,y=4x58MNӦs$\3#(Pdd%[EQ@T'|o'|o~_ߞyڏ91QQ/?2mW+yo]^`|gE>VxWYL;RC0;+P  xjʕalw _@N\yZ\x-gO*Oy&9C3l#Scn.|MQ*c|BT /<`3YmTGM?ѻ HߏL#<iMVoF|+;+Sņ88kh_0EuSvu榨GDnK{P>+7xGg;IǐO#}&$ <*YH08ya&QL:xd;1q7  Y/&4n#{{';ǩcw}ktg|\6h/z̎Y]v > ZMtQHR$/.#8xv%M;\F,3 iHo-v5Iu>&E\*A?KOV_M&;b(sEwtLd#8Wq&ईآڬr0 _(sy"<["GfoeW89ge(F sF"<[#,6#75Wa #ky)5$tV/잖؁Q88!C=2[n"+0VOH%prjq^Wě#bǒj$|(Yg97x\Bwn54Yh qϒ30t7^#uyO:To& ۰d1Z GWe0x Eu܍%˳CfIwdS.s}s#+2fCH3;6P$.1Y;_ m ?֗IdrpK6H'{6UM}hey9 1" dU ɞ p~NVrMXa0 wdTNuS.k(P:8-AnJJgEёu2T2qH$IEGVhk9*pS:Bk"ⲇ+ܸaN<=-XZKio|Syqt%TPog;AYu2FU.q@`6TqO]iQYHx׳*w`c#APV+ٝn⏤SːEq\j"xA}PNw%08 uqPJ%P"V@ zo[EE:oUBV"rj6tX(P<'#uUo4::*N@c "!gvp`-/m-e+!vI S!Ax^ZKײKZ5u8􊩿[d:r'f:N.?×m>wNˆ:^ f,w$&@!yմV:́wer*Ktx"Γ] Pr8p^Komuu Uླྀto:G( x0 >Q6unHkxГ:m<5v;w=̑P"OyMJ~"26nUꇗS[YZ +`1QM~e?W]R)fer7?U~P5C?O>o~)\8)`y}|?l,Tx'KX=z3@@Lk&35*gcu=p8~緐dϊqslޥy s;!sk,.RHʜr3H E4@YSd8Jˍ:T)#?=Qc~\ #LĞtfPiRons_O:E$[ns_O:E$[ns_Oas%̷&Ɗ_~e?W]R)fer7?U~U>pЮG*o~|#nE#\)׍eQ p9j /%vye n|<|mA&@__H31s..4܀?uysUSUˏW].* n༶[hf3ܸnEہǝguϳɾz`}6@>h05+#"Γ8h+mckSmrßr rgšR(yBı T8,Ԅ9<RI={,sA#/?2mW+yo]^`o ow?ήf*Ÿj_A4u U|.9;85S^)Og5w :w(u'6õ™xJFro~ >oCrא8R-yӾi?{KF[d;"g-w-o[Af=wU<U]JCmtM,[ ">" 5ˢX$+Cgx qǂ[l .v3c8JwծU'_ d=^# `p[:۳qlwv1xsWSi?X0xC7':zu;`hzݷa⎷m~K{Գvh9ǔ`~QXbXccؒq^Y,1Oi֠vZ pЫ.w1>p?(NH7pmiPc?^]% JʖBXSdNeO ?e/mbKi9P@ؿv08v5UIxW!PO>Z3UuRݷaXI,JC#o?2mW+yo]^`3'[9  ەz+1rqG+04VcەnV`iǷ+ܭ'/YnV=[N_)ܭ'/{r\SOEf=[N_(o9~{r\QrqL =o9~ەz+1rqG+04VcەnV`iǷ+ܭ'/FeLwv,K̓OZ7'Uܭ'/{r\P[|a2}{|a2}QrqG+Z7'GZ7'Uܭ'/{r\P[|a2}{|a2}QrqG+Z7'JMJ=dTܭ'/{r\P^{|kWح;_BuQr\QrqAyV}_b} GrqG+Zw~=ӾO+U+ܭ'/i'+N>ЯT~ܭ'/{r\P^aX~YnV=[N_)zm6rYRI+b} GrqG+Zw~=ӾO+U+ܭ'/i'+N>ЯT~ܭ'/{r\P^{|kWح;_BuQr\QrqAyV}_wV \o9~ەCyo]kh^.(ޥspd(analog-6.0/how-to/batch/task3.jpg0000644000175000017500000011240010161303533016754 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO[3"Q !1"Q2ATa#35RrBSUqs4$bt%C6Dc(!Q1A"2a#q ?3P,q28] )ϕPCoIQ*Cl ״9uXK5/.L<;ǕF7 ԚwTdmYd) N2GW p(~?ߪWZzCrlQRq ι\Le ">.v*PTvֺ^|3ߪS ??FRh"C %;_gg<aoL#(Qʳeߗ-?~p߫.BGgjn"ePE¨=;PIJZ\CNX)#Dž1å S3n߫᯿?~M"Xk+v"+%— 22}GDz>l܆u,Nɶy՞ޟy{u[7qk~Ox;X5̗ג#X|Vc9zr;=aB#%H$1Y7~Z7qk~OkIIǗ˗MsMRn411JI୓˝Mt۟ɿW_,[᪼ʉ4$j+۸yZ)Ç5d?>P¾8z92L>OT@8z92K=9oGO`$WN=%|pގW7>SKɒS/_|lߠOb+L~5oЧ~xѿBTp$)_ɿDSG&N޼ߣO_*+!N,=:U[oȿurSG&N1?}ձdpHq =+?/op}L1nF,ۺo+LWFi%!4- p>_*G MNkLq8Lh7q_K,JCJ}@HX( { O*^Ex}i6gLNyy@ ѝr'IR;~˹pwym1hBK׌'إ|\e+ VOHY+e#.UG<]VE\FVSvq϶"_,} ºcָH[ͣxYpfUpjۀ9g.t:gp9}u4|'y.c}OgI38ϚG1$1ۺ.:DY+Oyw;}:݌gyl'ۥ<Ǎʲ48x\Kn,RGtY)ܑ}-+]5_RuqCO"I2 o( [h/qgFHL52(JH6z1a{\8wV-x@=fHi3lG;۲ƌp2O}t_]>F^t g9'}:/>}:/zVBvKrĖfI'z/q~I辺xI辺'?Ij_T_e}t}t98Oѿѡj~_~>}:/>}:/'?GW|Gz7_m~xI辺xI辺|QMGѾh{OEOE/>ﯾ&=S>}:/>}:/G=_Fm~}t}t8kѤ~R>}:/>}:/#/GD&m~WkԧN맏NK_m~}t}tz8;ŗKѦ~/R>}:/>}:/#/Gp 6?ikӮEwxI辺xI辺|Q}_Fu/+OEm]@'}1 09dqD@X\ OFhWޥs?T)28 Y\~+J|(sO?T)287>_z3#J|(|ϬWo/wҜQX7S#9:>o_D2|߮N|(uFJsqFMz[[AAy$z/V٫tCG4GylˎA|p;Y_[Ap"{a9r]ުc_vgV?YEX~*[XݮwW)3,f0- T)ݯ÷_r\EzlX+M叢Z*RRW:\fَ(ݞ{ˌcճ뮊Yn %8Ȗv̍/[g{Tnx8q+sk'^)C"67y!ߤ&(`O;y ]h:^0ʯRJ392R⨘{4RB!Md°b|;]fvȧnF;'+1&$vSP܅>zӧSXGi%@ PY28q䀒?]6+kƝ!dRmP\kSզx7c2o;GVk9}m58?2YA*2>`ԄvrF兦FMUYAǴ>/WgOR]3 ;جEli$f>t/WYo_RinkHR[rBdq)JWΰ$U!GTNr·JDz%w1k+\^ilA X5(٢f*p_kOqh$kr#d,v[_V;mFړ#<g>U|:13$mu$̪du݂mp8mK,W-.xiXW="D? ?7Oo5nӢ!Bw$HUx?i;WI H)P9eN9y*k/zMMi%Ex+ :4:Cj1Jy2aq;Ak7r`:3$DlH}9ijVXᙶ4P*#Dgor8gkSBJQ{_o=}[u<{=M %*GxQ{_oJUoǺ;}ղ gP8 UKchOH$mk]Lu$0}^kxHq,k b@8BR1Ou>u>ꇴ]f.mN$R IAr<uh;xA4iԼ gd4=q>uh;xA4iԼ gd4=q>uh;xA4iԼ gd4=q>uh;xA4iԼ gd4=q>uh;xA4iԼ gd4=q>uh;xA4k(wEaf˸MH$~A9>.lE(rȓN1%1xVɢY"S3 M'?=vC mk$HI9fY? V?'RiՓC}+GRiՓөxA4ixA4iԼ gd4JԼ gd4^|3~hoh^|3~kQ]%NLj8?M JTQK1s$O+u˛xoK&|jV?'RiՓC}+GRiՓөxA4ixA4iԼ gd4JԼ gd4^|3~hoh^|3~u/>fY? 47ҹŦ2.qb9 zB9)"5/?xiMUG叢UWۯպo,} .}ƤVRHbjľ؅8gꨯZ7<vjgv++lXjZ%Ž{S ruLզ㲅n.gB#c' dc"|3.R+63+8}fwu0dcz)hm0psXԇuS ~=ԳT`Mn]h&> Gx9bcTwS\V*Ŏuf6eFH܄9<~O:Y[#Hu xd%E r# ROzK{Ic0p0,617<>Ij6L3\G9=Gw4Y`C;A9l2w7yDh)H)%8`[<χ]IRRRRP}ʈ$,[O eːa5Ur^"MHaڱ's' *a5 2SMhCI6q$紽>w[/Io`3Lc1?DŽ}ߌuK: =9d$q<1 <<&RlZcnqwFH{-ÉsAnm;6+{@r݂{}_[MKqx1`s35Oh +x:k2h `';WOXd p*HlY$9ѵtKK.'Xi ~C3H9$g]5{X X¬uS HYy\Ait1)M4\I!A,ħSS O z^dg-,[%HDʓpA%JRJRJR\'>ꌟGRsDD2}J2\5/?xiU7>Tu_n~V鼱W*u#Z)JV-ASڌi:HP!v91T\[!VF!NF8}uSgXgk>NfkMƥexR*;{0F9 9wq\~[b;ĉ;]6U@ yp9 \\%PDcNͻ$_]+Cw|l_}i`-Zռr_sF2Cp~?/ͤگ썞m o*Ihde%APAK^5 R#~ ‹{kv[qI.Q ;uK1 mr3_>l/',Q2q*.2n&^9,޾ڣ\\p0e*X>I|+;\i-̝#h 7,rp 2z35&kngA(]PK ۸JB1¥(((S/- N΁mIS$qɼÏeUKo3]Y0A%>HP 68fioo-ē<1sf>QǑ$TWR>udBq[*>]vP--GGK$5N+$xwl' K˦zW01DHFREFbܤ-Ag 3حC;[n\**D$]峵Cy@dVY[[y'iDbevpf1ݞv۪Gqs ـG;wW p= OwR/H+ C6H8@5 u~'o,3GIդxKkMof`Do@@^c=̑\·X2lfFqIU FbD1K@DTrR *R R*jW|ka*Fn.Ggx3qUS5Ik{ 9[kE's=H}GR٨[5*k:vs;G%.1`?>RS Qqp3?dV#FmBHm/5ML|>o=X/:Hj-dGcw;qrT0A)YJH b0rx_ntKC2,2[Jc6yh]Ȓ5Ie`@Lc.{<2OϻǩtW6b?Cc`0{_eIԦկg0^.OhqX%O"Ao,Cqr3W69r&Fxz<`/'9exBbZAN۶HGFIPuu,.,-.ANl<3٧^h.)!Gndr 5Ǫi-<}h/"n B J8\qSxm?MH.%f/$?)ݜ8-g* R R*#QLT}Jp]dq29qUzh>-\8arX.s"p !NFYYV۷ y8X͵Ya!,7aÇ<8r=0fNG eh_ $B8<뎁[֚g6/jw_kVmփe,;A{Hx28rZ"Ѭ 0#+Kp#' !7709&+Z Ķ)0ɀ2vcH]WqX,QI+njመ#pNa\ٵ&p Wu'>k}>:.sڳ/<ᮆ9?c쥂YYV,#ٙI²eb.w8|ﴉ'ñX?1۸R\d\1VK=*smi.̊v xvN8e5נԬc+ݨKu+6[h nɁ q%?ˇ/]1O-cCj*̯r0*S`ϒw o4Eif"9mI @Bv8°эݙ=PeNnySQKI(U%P0Ys3:.Z,IL6p *$܍`bzŕѶEPHB쑡$gjq$r5&o.4knú(,,{RqOW7Wyӡۘ(r`0A"X8L$mnGcK,Pt$J588p2;-˺.|ln\WGMϏˍ48uF//X6(E=!'I>19)@)Ano"dyaF8G="J igAX!a"Ј{ K4{{2 .#"8;\C9p1O[uZi1َ'h'vsŰ8T{7GoѴmgXࣗNJ=S]jk4ph+; P1xCLO µ<6 c8:A6m+m71p8A4YmӒ edlNA1e'3d=V2omkwFcnxPNIC(|_ұa1r(&2A9.bfJewhՄ/ѳIQ&6mlsin4dD_hqLJ,z~hӭ蠳HdIJx^h;.55,)oU)f1v8<{ƵG]Ao$aq\ppqƋYu(n&۷ ]`u˨%n&/I|+ZnH61TyAb+m71p8AeiԷ:(Wzy`yz(5}>O}'?IO'>Ԫ-S_rQyc诸UGUvG5nE}ª:˷_B?qh  r\5I9yy唓˫Ffki>%Sd_<8'rs][Cv[m RH~psˊwAjV.oRAR:{=VI"32l2:EAsAk] _մŖQY.Z32Fx:6un*<ʯx;{ۻ$xPt Vi'~Ӱx8?(a]K}׳ݵ$^,SaO qvVR R R R NuSK$e[uTT/q)?%spʨv%<^9%}9Sǎyǜ6YݱK^Geg,vLJmGP7i#9Fp SݳD#d}1`7|*cwRsvM#)ZE&G%$D$˩1"K$^+|BDPp8G(,sqy`1BO1|ϥ3\2oRIpFvEcaݽ)eD۹e'+\68cϞFFҧ;ETYd.BP'ݕ -^{[khvԗBpg*6Iw+!&9:4Bm6JJRVuM6K[.nfAWvC[ |oe[[t[+/Ge1[׏׏4^SjJk %GFIv%>I®Myf9n!36c<

ꌟGRsDD2}J2\5/?xiU7>Tu_n~V鼱W*u#Z)JV?,[V??ޕG%0jHxwc#<_ VMX䔦7pxh ϧ9paFf{u;Ϋo,@@z TO-ܲ\mRU.썝-;vw3[IX@n1m`+~&+r8с[w_WMk8g3Ǻl_}i`6jw_k 4+cTdOueMS[KKu[tVrȤ7haH<yߩر%%敥>"$qcv=`gKK"ኢ!T}BZ/tKh,u6[wEOd@MwkZ<ovΐHI$Bf@Ng8O1ŧCwcq>laXHaI#,b37PpY."I;mVtf y VꣶMu+K`eQ%Xn$Y/2jVN g'҄uEf:Tሷss̆}keo A}$CE0 a#d^ܥ:K;E%ygpNmKSԯӢ { '| ;0znagaux0$ҬTg :L3Ě餗FYn* mqw\Ď\295q4;jRv)JP)JP|eƒxZ{QRHܜڧyU-n nCm%ȷwX$sl<|s.ʞu I:(v2ح|rKx#(Y@s>ΩN$݅;5 6vC`Gw ִyogK~qq1i廔ɯ?*WwBoJ>VF\tIZσK{VXAм9]ZFyC:N˒V+;ռyQH"bVIV 3 qՑƺK}6X#W4JԜ'>ꌟGR̵/?xiMUG叢UWۯպo,} .}ƤVRiDQzXwAJʃ#ȩcxᑺ&%#do>q":`#F- ^ۀ Øݖ vc,Epۘj:2OH9q?ej{c'7 q?S#Ya!HAAq+A2¹Ym18 G9RxdU0N&In”#)$GpꃠiN'oz<J.Q#8tj+g9imj']nZku?xjw_kVKb{u(Ǽ={XOnUmmX=XnxG.'3,X<,sksZZè*^\[Vdt2cq<S;m$)iKSv7Z4i麶e$ P!e;(!+LjA4$"4mœ8ElMvje$3,`E{Tl`ږ㽇QJo R-39ax/A?\r xH"FIlW`zy%6(2$L 8q^3 >K۫_\huKhњ}!Ѩjsϖyy c=,H/,ҹ0$`|ъEz։kw:[>s+۷I۸`Yݓv  B"ald) l/vt;Y29~0omg81hvc-u-n:^;~wGfwy*5ƫk=ZV F*씳 Uj5Z=O-FX펁*N7/lᗇ,ĕiQA+elip+6tXT[Cg!{'ф;@vF6qSI$i$ZDrX$7M$JTRʪ=Yliwk̡=羭UO'ul0y<hVɸzVۦNv0C4pd/ϞH+b7GUgE'-%M~h%Y5 aM!7q37OKo-i`$,Zb&m;Bzn{fՒWzCuot]Of>.ߙ^m{Vע5$Xer\?3´Jǯح w% c01v9Ԫ-S_rQyc诸UGUvG5nE}ª:˷_B?qh)J}@t@Fru\Nkg?G5*nDms(-ߴ8Eͼ E;c]5l̥b$aDab=c8Ɣ[֚g6/jw_k7F i202GήOnT 姳wF!3:*`rowiZ#Q~2D />$ncQ̄4:U&\[][UquTM8c,H;b/n/}RUU^q7h@7D,d`-n]u~"꧲@*RJRJRJRJRJRJRJR\'>ꌟGRsDD2}J2\5/?xiU7>Tu_n~V鼱W*u#Z)JVkynX`]6p2>zEmHˤ$D]b,x|8u յ;y P7m%x5ucׇ\zY6Sy`ŴH9p{Em&yMlu@V_lqĜ+ 轋Ih-)0܁dq՚^-+[ZFHx eve{gc~Zv|q.s.@=J.uoB[nW0mHXN2xV#SkD X Nx)J)JU5Nu&2jG- >ʵbG-/n4د.yV=O&$ $d@O "noi-'R)F'% e]cLSƲ&F2=TmloK̈́`AC4nLrU*WylEsV*xG lRCdoo(cTs gg+6mdգ:ƿ+\ر xXqB9*+gkVi㺶# :4Y}a&UIv|k<9ڵFb`Zie.r#*6XiP^8#ktyBfF3%wCǝoVv5t` ;yB0(;sVUe im&^՚+]b]rjz7YAqjntO""ۍI&L<<וAc+o]ItE'bUh=7NKufKx-H<$7lÌqsP|j#x,~v3 YB2Oi=KC*c&)Z6 MGX[e/H13+A7<V m5(DduD rq+>l[[ims$NI$$ONMn>Ʒv7KA m h(((((((5}>O}'?IO'>Ԫ-S_rQyc诸UGUvG5nE}ª:˷_B?qԶm&ec(8ap@Vw:{C%7fuǫhqU uy[abQet y>p~m}k):fHJVaFrqy5ëѝO-%v$y«w]'ٌxۜ3=l^I#7F,Syܭ_mrW/H&U`L]7 𬫡A;8880 <谹;Eڸ􋳎pwgGνXcیŋv`cL1E,]b c,f,LO [yX3,0Gv' lӴM6-P!VUb7 `r }f+a-PvN䘈e/q 7|q^'>)[i!s3tVu:3%Nx!ڿ;C.5(n' tq͸‚@ۏ|NyNp>%P# 嗤 ےx{57 gQX#*30P6#)|!%W<JRJRV_KYPQg;a@wgRקtl.&缸 qU.܎s̮M #zJ:E%iq9F8Ņzd6wU [.0>'M w[Ǝ[RJ@lmO |g#S$lV:XcP āUT8 1ͷf=Eccl凬l}jӬ--m%U,!0@w+jBOog,*ˀ7R8%O|ˮ^wlm{#EsºU28dzZe'oX[]uocmĹ%H]rr@Zt$lt#pKKy͒q0B pz''$(X]cU.|FBz km{wlDApte ckE* Hǯw A@qo#(R#$8rJWЭ;H:NtQƲ 613ʹZii:N=,kDݖl Bz^9."^ͥYHn RU>l4 ]>c&jJS.ris*U-z{NhZ{ˀ R>Oq>o> m-=;KKma XpPD0 ʬB+KA3%AY:8|eB[Ǝ[RJ@lmO |g#S$̬V:XRE@URcF3@4+fݘ/H)-`x3lhl8;=}k}'L{8NkXr@`Rx Ms˪ ^KTiX1h lT0U;bקE*,'Ӯ{ YnpƝaswōcVt##'Ӭ.mc,tqI&*O 1G&9MbYBn?G|/g6 # ^5$QG!R!XwSl.v]=z6gtfIn88cU_Td'>$'Q|HUy )yJټW*u#M叢UWۯԊ #`s?8(^;|wQ >$?v1yj>oc>]as|g"F! $cw3c%`ۇ]qkEwɨBw/_[Jfe;n3] XI۫Ʋ0F%7<ƹ@C#,qqq$]qc.pҵ dKFQ_ (X-WAiis%gHn'DĎHݿ/7B6rEj̗ q<}0a7yV%p̽e&FiI`W HQ'#p@ gg >bOjU|nf#'< L:=XrHM;Įv$I x/α"ز&IH r5X5- JD7>vH0O0*"o^'[i J4S ۸*$$ E*]|C7C6|F`LGa#S̸#256ծ ,1DlRNd9c8s zR*wx<07Fuu;=x'U]kR[ R6=#'3nM>r֖ܽ]M,GHiƟksLnP&1n#s}1[{;%pNz<JO7+NH{ h'Fǧ H d?dU[w.ݓh|"Ko:FH6-F9 m\-$UW7޲K3e$~y3k64cv8xJ N;@ryIoS5v4貐Jo,g8ψ]EnK (KF˾C#$+N]B\,RCG&9kJRJRJRJRJRJRJRJR\'>ꌟGRsDD2}J2\5/?xiU7>Tu_n~V鼱W*u#Z)JV#42֪(:1VW nw ;RygqqDdXn:> c ʪ[$` =י%⼂Y8r+éLuW?۱q4YzK~[_+u?x[USPD.  5Ƀq*$kSZllm{eWq\O#@߆osqI -PPي8=WERmυw+cۈ~V/*֭/-$0q @òpwy[7FEWlD2=l@i5;.:N#g*9H[sx9=%Ek(bZX\cʜ?<"Oј[E9E6T11[9=ƳԼ#K,@rX=*_{n$qy:L×¶?`xuxm7ӳJYl" 3dƼ 2o4݉ܬPI!OFAmAiitp8,YA!u}Bmf<-Q u8bV8]6Z.'FA>R088'xEk%1sKlbb s{AcvgV7HnS"*6?aAas<N;oʦj< A{ O9[kE's=$p>Ǎ]*k7T6k 2хvꌟGRsDD2}J2\5/?xiU7>Tu_n~V鼱W*u#Z)_UYQ1d@!FN!ʴ9L>>Dpe/KiaȁY12xme{ ZNz1:"~"/ԙ(dk\` r>pu$LL>>m{驢]V^{mn1Qs3=DVt `F03Uu`MnPZ5?/]"A[ bkh aA`&~K)wngGi-*=#NJ=;㮓mI&ۧ xjq oJ6=ofgGY17MvÇP ۗc=Q3Ĥ9evy/1,Q[[hĆp9#{=ߑt/g t5-q,hmmtCO#ύp~O^XE &{ǁL~m.<mRRU7W([ȤL/ aHǼnTfD5;jJ,8[`n@u>οd-jJ~JO$eNGwkZ}N F)."u'T@f9s0f=SC"JڒM)HդqJ`HR R R k]:_V .m 8XmV#{bIdyM >b.w8|5[B)m2 HAmpxeN*^ae3]{6Yz>N۳~p-y %Kʭs]DF `H +q^#'v ã.% űg%ʻeڟ!F;B8p^g5Jޡr^Kx%!l;zAI9yҬe8G Cq9nH=»i@)@)@)@)@)@)@)@)@)AuFO}#9"O}?􏾥Wk.^~Қ˗4ME}ª:˷_B?qtX+Q~]Hϕ-?~]6WP$`?Qw ݶWVʜ!@;[-}RY%d/'Tl4szcQ㷒y9U n@9l6Pqt 5wmhボ.FEuSkzAA*|R\"Ep7 !ĸ~k%{@Ұ3p["1p;PԪ@&+Ų[gZ֚g6/jw_kftcH %Z?/~ Z[s%Y*C9DĚifAnCW bdӭn&hB8 U}/!ctK LӐ{LAjSLMJ*[z׽cJ^W (;{?\4޿u_up҃z׽cJ^W (;{?\4޿u_up҃z׽cJ^W (;{?\4޿u_up҃z׽cJ^W (;{?\4޿u_up҃z׽cJ^W (;]^K-2{]LeϯcQy?ւӷpӷpW/wd;wn;wn5r͎˗}^lvCoNۇNۍ\c}WӷpӷpW/wd6?t?6;._y ;wn;wn5r͎˗}^lvCc\8 p8~jbG$Q8x 'g]:Uޯ g v9#s5MUUc4 ܸcy>O})Kkginnqy>O}Gk.^~Қ˗4=6o,} .}ƭyc诸UGUvG5"R C˹]WR%mm >T%HF8 Ѯ鐲'iexs5dtТs'9dan?aN.cN{kn~VK:ۥ@6ұlAUCKi$FJH$p0sh|im.,lK+i#v c[}<1wQjE$d_kJ&擢`HB(Tb1{|۪een2ɪV?~}Yהּ^F%3[h}˜g#HVԕ#PCIO}#*єjڑF*FA@*WƧO)_>WƧO)_>WƧO)_>WƧO)_>WƧO)_>vXѝFITN+SOOڟua'Ӣ'Ӣ3JS+SXxI辺xI辺 R5?j}JV>}:/>}:/?Oڟu}:/>}:/?Oڟu}:/>}:/?Oڟux/EԿO躗q(|O j ?JT ~"kU_:A,짺1H#i/2r4W PT6Uq?/>]]"EYhɎ&pvΠon.5(.KIcX\Cq;o.`]J^/kJ%]xp-cY1{{~ DWvu&Cbu J>5T2i? F P,6&3ܣ3J͖l2#8AWCk?"W~B_|Ik.^~Қ˗4ME}ª:˷_B?qtX+Q~]H4QQ_>V8?ED.Ʌ2r?8d}U4WV F?`H p#+WAÕ^~`hlO"$2q?g֘,&HCaVFPNJ@s#;4$`JȄٸzEf5YDqc-+Jz>1?VUک!ݷ?Y=܀$޹́0xumƑTCq3(I*vvr1ϴqk",>]Ā0*ByX+U d:O=]Cޭcww.?_vAYv-g* Xn5'椀JX)g6/hܬOMm޽o739-|H }q>aUn 茪'ۜȬVg7Ê0a9z?@+$]ѺW*s"*R R Rȋ$mk]Lu$0uhĺ똿ɏO꿮b&?w\nq>./cSĺ똿ɏA\n|KT./cPwuh꿮b&?uhĺ똿ɏO꿮b&?w\nq>./cSĺ똿ɏA\n|KT./cPwuh꿮b&?uhĺ똿ɏO꿮b&?w\nq>./cSĺ똿ɏA\n|KT./cPwuh꿮b&?uhĺ똿ɏO꿮b&?w\no,VKvQvP./cVtV&aiߟTI=[k[(H{nN1^(~Ji" 0MOAJRWŖ.$KJHBRE~8[!$Ioq+=ߥ:? K;~ tӦƂ]]/S_۽Ml D#9 Ǘ[ 70 8A<6>9&[܆"\>M͌n9j M~`mIfU27s9g}s&7+Vx' O4 0Rt$]mn"+wH3co6'>j";hz.)H1$vCP6xߝSQ@Y@ֻQLNm.r{D^'}6pXFn0,sGq$G7rnm Va+c െv=4rH:HY7ڙBY< )JS/Ni~ e;)JS/Ni~ e;)JS/Ni~ e;)JS/Ni~ e;)JS/Ni~ e;)Q]f\e|#9)悔Q $Qaql{ t[?'}cTYmDF;\4o#T? lG]ۦZ\Z[I=Kpn?ҢiJT ~{k2Sٍ 1*'Z8OA?ʵܑЬLQ434dvT1;vHH63TuO'Z2HX{I.[UQ1){ nXǼ KdWiw m$&<8u'CS :VKɞUHnI0I<3jjpjx=P*w{V=<[yc[+o8=:m  (={~.^~Қ˗4ME}µכ3krO}|{ji^Joj7<}:om4=&<}:om36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"Q  !1"AQ2RSaq#4TUdrs3B56b$ct%u$1Q!2A"#aq ?`TҺ7SBd?5R}ѮU9hnH3_M[@k/ū" JS^֐X@3}Mrwd1% #b7>eoѨ:VTtT<+ZPkZFgly(V V>Z72]I@n=֣oe 1!fP:(xq ]}xL͆YsVhh1JQLaJ*\Z.q}[k]g`Pb$A %ؼ_x6>'o8z[,jHdT+m q u|/ Xk*-K9(#-纝PAd 1T rrO5W3n O'ھbGOcVLkgU;6 YC{t_EJ IfIc쌿fLnW}EauQ&Id1qh#[ g4]^m꿺Y1 EOm 9.vg 0JǶsjQP .U< v⯉2l}<۱Gu:,-6Zcq 7&Sm T-MCRu_}4W\Ytλ:ªIuIu@A6Ѯݯh4R8O]izDA6Ѯݯ{fTR8K[zFA6Ѯݮd4Ro(Y6ѮݮG<7Tx*nSMtkk MկTZ TnݞtZ1ڿOժ NviʯOլ7UVA6Ѯݬ5S8:)^vd1V]puaVMkkTx8zR ,Tn'?yVOCՅ,mף]M=X_{!7yV ^v7ՅKEՅ ,mף]Kuae%bŠЦ:5۴7'{V5'{` ^v.9d85gOYfdq)ӈU/lsf6Yslkmb!ڞ.殙a|PsZ^^☷?m] 7[bTN6"G8yTwn}ֵ_BM"^|8xz?M˴SnW~^EͺOnVCX.mzOM8xzOM_&\(n#=7{!GRznWp\۫|5/u}CԾ"yMCRNV]bw4SȹW8'_i'{ȹWڭ-7uuȞEͪ.-7u}fNWX]vk|-?u}nN.ȺmUVxH='{ bs]&ͪ S!b`=>sW65Oуwyϱ]oڪ5^s_FQ>rsjq>sϱ[6l~s_F7}&ͪ7}!/|9+$MUW{y%/|:sj"NuRI:cjbNLh6)@"oXګ@!e>%zQ*ie ȁp|j?bһobo3ZV0) dƢY$Vs :WTRdӇMݏPU<#Z|h$tr2<{M7Vwc7 ?u߇VZG쵳Xħ Fr6 3Dnh==.رO 6;sl86#7;`%?BȾMS;a#?|://' ̧vÍ}c?1g9']S1glS ۬i)g31j<&D 8US[IQY4\?.sc/djF5щt3p8t/z*Yk\nhf|kS4F4.&",xDK=c>::yi6aO0ف+PjX^#ʢ ưȥd/ ^FPHst&n)j1#ѹHƣQq 9灯 %YɆ*f7M^K$nߦ;26^l9qbmg3لZ a|t:(mW)W˘5)6t hR%6g孷rlϳ \Z 1ѐ L7-9t:B7s^vE rq \@:bJMlMYm,r^Gj|KuGQd5getYKl}@,pN&nU_t7Ѽ:7]bn-n X>hW\'Fqfߔސk0Z=#TǴ)lisr4Y'k[䪑¡i㨑;-g^|n,y@lZ1PI`H{nlǺכz9оv1nϵ[!f\rdt.E]zaSZ3lQ(͵]5T)/#/~I69NXm{ xqhK$C8I ,qq{rC]QP2㸐4l9Sc S$k;1s ;50q;l1h(9&ǡtn!f[^uݪxϲva <ݧ8#x*q.)Ǭ# :F]uգWl=+]VPn؋/7kMځ\)9y# O-QVWI3lsr9f%ieKH=`1-p$ki 8-Il r8a$g64e7'Ap%,Eaysxik8+]n!8 oMw* q~6*iMcc&mZ3-Ad^4n6,r:]ڭԕVgl̖'FhuݡPk06VijwJؐ{xaXcpHI`E-(.I:{n6EϟdӖ7j!kv5 2ɴ6X/\dkױVai6 6ZEnRPAwH8VQ_iPS31<$Wl2T˔&:R[{hmգKеqŮȻ99VSVUFpd"FnYx59ҽ]5+d#Y6ﱸ_""Mģ7zTRGMݏPT'׃ n}/zHySvj eWn=[2Wkǧ*!n^Ԭ(.|d|z԰G )6βۣM/>5YGm@ˋۡH 6ra>>5Io9~Ef?/OM`ގ}4yg}o+sc= ,as(jv| p W꓁.+._>faK@r`.5_PcĪp2S!Ip mc~eI%ƽkÁX!n[C=qTT&ig04٭$=w]tEn-Tg`uThdMϘsC4EM-%5f:Jx`a9b`h'b 7,.3loA 8FbHdlqm;ᾏ;.7:KbEm=$rqV9ӻH{v`쉿.ky1ᤧ-.gGAG#|=<2KMo҂=uE`i E$Vrf/Z7ƽLN5,Nܣ.[ $aц#\6[!cK C(h,2:o6AOGZ,,k"st)[n#+뤍T6H rt/\ AILֵ5c@ ~GQАRSS,iF΂lbJ`|\z\>8Yq$ ݦ+뤍T6H rt/\ FRSG:xZ˵Zl,EBAIMO$S9s^zI: :fjqgUQf_eoߦVG4ΧtTsr@ ,{*3C+K4j50 C)Tʧ gh@y~1kkd4b$-~],,v-,̉4 #79u[GRSUTM(o:FJ >gH\E&yA+64TqWs vmW-ӭ\F',Z{X~Gac%K\l!m61ϟ6Q|r˗Kh]sw$r-b|c+uDQGI!6_(re\kRcS>BfBI~`.Z=Ҹn@;(i+gD76הS9k-s^ TA( CݘNZ`kOO B61A7 [unPiRꕟ2^V黱[ 5so7v>}ATr7yBG)<<[Uv3M@6UVs]e. 9Ƭg|r몴 oRі%kyoM/?k Xs~/-D(o3鷝oppF͝y5Ty%&%p9yiӌa`Ofkޥ+>SLFjx͍3"B@% dVOpIUf>*G Gi(m9{46i#p:=\ 0ζOulQXi2k)Hc36FGr2e^b g'poI`.ep wQ#p:=\ 0ζOuD)ZMIY ,y! soNXNCtkI1iehk)bW^]nr\lK!p:=\ 0ζOuDgI)*84ML{$sCslo{.]5u% aχAULva]IFl6yu{ĸAal¯|pIK[)_r;QlSml0M.ecnA{A p:=\ 0ζOuDxei9!%df:`nZ-ܛJāM9iSݲF˃]+rݓmy!p:=\ 0ζOuUpv2bga&Iwf81vgh59tVuxbHeq[.ӌGp7$߹1C}\ 0ζOu8;3Sjݰu1-I|q mFVsKyu{E;ĸAalq.wg['$A.wg['KsKyu{Dyu{ĸAal;ĸAalq.wg['$A.wg['KsKyu{EE ث%plV?smqJRTDEϙOn/+^Y) ޥj^uA UG+Y[ WG$rÃnh>?*Ÿn^舘y?UtxQ랅fyq;oŐeDG 9EMCE9/)ԓ_FʾZ'Jlz[]|nXK7ot&QXmnksnYYGM?$#lsPT #$4OL&b$|E_(@fbR0ٸ0q;T>ʯM&b7csǽZi:7 i?f²wX/#IRM_Wfu-7*вI-qsy,ЗypwhuL0Da6x]rMnqYvX"~ٛ93d9ٯ$* &F0X"L*Ûe79G5ʓRik }=\M 9r9"LTl4阮8^͛c# s.NR:.iұ 3aԒTH/p#)"y4Z2%:=P0Q=9k (0m|Cߖ2wkkAb&FQa,u#fٟ 0'y9>P ʦ cWCM;^#+#ps˘ߞ_FD:6VCiX,PASKתV|wyZצo*iUXVwcOޏXH' RZt߯ʫvCo*loYy濊[Z7|ZXwn k\I9|[Ⱥ#f[k?} oV9~suU7[Ⱦۈo-N4j-Ykbr4x(uTu[ѻ%N4$alC1;ΥչYI&1QxR4[1LIB!zn8]Bh" 7;UOo7Iq)6wZX;hO[cZ4{ZQ[Cm-mo9@;ZXkh]5LwGͼij#2RTC;]À= >pֈֿ.;fZu,nT=8n8h% p, /F%{X9o$'-Emd'ѼLZK 1)ԁbC*[2K`2B20Xq ݨA"̵u?dg uX$Wh\Ñ6KltV~Gl,`ѥпMo`\ޞPAp'ɄˑXUrt5uXf ښx]@ eϫd7$uw+J0$ۖ>t܇rorA26kI &~dU8g [b=ͨ\@d%ťeDچia-afg?u|fh KTT4iH `Mֆ i6al3 wIiQtz,Z̪Rj嫥V:K]9A)A.ck:,pF*Zѱ aŁ|M4|wyZJϙOn/+TzS?=a[MݏPUPGUl *TXI6+wX?pFLA ,>9ǽnlD>N eN~X;CݧAUS|)V+EUsV+U>^Ee đmTD9a.n'Ph-6,:Z־RM\+0ZfP34h;6=;Ƣxpq 䴻y7imdNfOʵN/tǓ^( I[ IysJe"h\E.@X&,3DǗn$[EvRmvA!]6'e'Zקxߗ:wcɯzlmdNfOʵN/tǓ^$"ȝ̟k^~_ݏ&PUCP62 qc8. oAϙOn/+^Y) ޥj^uA Sfo*U}82ܸ(H?p\ݙǸ-.J 4EF\sM+lo}h: 39Ge4QeJsLp4Z_[E?7E{to[aI%}=E t||t&^'}>?Po'Ys͍-'chv6[Ӻg~P9#S~Oa%Vpp;yˤp,8]D&V⣿Y7\҇S785Ί9nۿ.[(84Uto,J#-\ۍmot*#*iJfGL8=ᡣۦۮCA'DPϙOn/+^Y) ޥj^u| n}v8;_ ķl,9-hhq`n4[[Ļ2l.0Yq+n+5NzOU <ܵQc8~ ~0 |P9  #1x7TؠcEW80-_hSHQekyd,@6~^3>><~=}Ԉ)L&'Dw+FS7XZ3^ח4mB;o(Fupaq݇vgfx~Z<(oZV'Ib?tJɈs9#Ŝve?ԼQwcv1~mm fo*X_9Ksn[Xsl y67]a3[4OHcicxhyKtpGĽNg\k \ g|zLD8l7U{9rpP+E:5U #xn+]ME cM%5KI#1T3,|#u*bcH0)jxX=F۝qx'1}d2ATm}2hopQpzs!ꚡfV <\ :9Ilp>к9fh$Raa,* CXǕ*Kg[7U+"z-{rަ2J3[^7v*fmW0e;)9{4A4xk}4pI6 PY9fi$lmH܂G$fuЭt8-U-.Q ]͠lAd4|wyZJϙOn/+Tz6q[?)wc^<{@?HTNaaZXlkQQrsw20.u oY@2|-M dyd9&׶ ,. 0 됩Ii\s9-DmVUUaOB_ʨA^50 Wd{;Lsvv8t9xϬ#&{7+ VzW sꫛz8^@,xET䁱nQޑ岊ԓ̠vb&,[;l-s\y4fwKl߮mm4B셏|0\84 /+p7)7s|k^wAQH꼮`l֓0ts`:}xesѽ\ nk(= bɈWX-d/7?[lΔ+Z /ܭڝ'ɄˑXTp\<8H5 iv=::NYk m (Z 8S sK \n{[dAK.Snڪ ̊ͼ6isrNrK35SB(^qCl țJR0=5cL ч9΋ {{rVj'SH"٧l.lڒ$a_"-8v=J .9˦n~A'gTRHMh nHQ`/~q:@*@DDD@DDD@DDD@DDDASKתV|wyZצo*iUXVwcOwd#tNt4"0TgFF9^ icsLI8i]l>3hm:\DA NSYXdR1}n]mI=UbqɈTtLX~Lmw<uJb54EٲؼѐZ:'aVd3$fQ: ū skvegM/7o2wa]u3)fhDLpo yD5Wڈ]́c>H!cMK ,eXs^I:5s muLRbfIU7/`-F+*y*(LdŚ. Kۛi~1@DDD@DDD@DDD@DDD@DDD@DDk>e?Լzģ7z=zn}CnW3wc/ UPy8yemhf`n]8ح2MZ}Ak[&o-G59s?@TQaiֿKOn4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu4XZu`83YIASKתV|wyZ^uwcmqk&H7$yWͣ|<5ٴog73jZ-F&yM|<֋fѾ w{Sh;5ٴogC-MU_ U--; }  rB䧕>2װ$0_AmV)n-|,˚ֽ^!U~-Tϑk'glr~xmdݚ9׻V-b|c+u}&L ܨiϵ?+7M}0]KOj樍:8BsǠ|:dUݞ~Ꝟ~\%E~wl) 2I}KAg$¨!l`W8 N{rwgoݦä}DX9 "6En1N 4sTT2K/F[4k n4WbJX]/dDm54sBy)2Ŀ'_'׽)'9k-s^ 7n:X9K C E]'~'~+U~/jW)uX@d\7ը6MݏPZʊ.W\ۇ<-\n0aQ`X{)s\blAZf#|pAMQ#207hK݀S.HmNtI ,`PDɛFhx o|+qLV;( Q+f'ב[[?aV ճAN _#{Sr7L eӕaЍf٢̑<]`yD}u]+bJi7h mGG rr:c|Lt0zH:ߥHtI7*OGCr龓*LoslZn?yϙOn/+^Y) ޥh=zn}ֹ8kLݴsZp ܩ/EvO9}0S_L&Nʟra;rL1ە?vO9}0:.c*ʟra0:t\nTC ە?`t蹎ܩ/*sS_L'nTC Ӣ;rNܩ/EvO9}0S_L&Nʟra;rL1ە?vO9}0h${g9Ή_;}_KԷبrNܩ/^v+o;}_KԷبrNܩ/^v+o;}_KԷبrNܩ/^v+o;}_KԷبrNܩ/^v+o` L2ݚ詻rNܩ/[ ٞ E=*ʟra`o(?N`TP3ت;rNܩ/[ ٞ E=*ʟra`o(?N`T3ت;rNܩ/\ǃaQH"(89m;i6S1ە?vO9}0h${g9Ή_;}_KԷبrNܩ/^v+o;}_KԷبrNܩ/^v+o;}_KԷبrNܩ/^v+o;}_KԷبrNܩ/^v+om706evO9}0S_L k>e?Լuph_gim .Ganalog-6.0/how-to/batch/task5.jpg0000644000175000017500000004305310161303533016765 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"S!1"AQ2STadq#4RUrs35Bb6t$cӳ%Cu$1Q!2A"#aq ?g LN*ZHi]!2Gss~yRuw5>yOhq*ʜ^47$my>ZKjȩ)傒G:f׵:6 zSDDfg>c9lRfSCc}ljB}ʎeu X* kHM1Qap0mCq#/k%Ԝ͔ksj6OQ&e #Gw.o8gii%ۘw8/l6fdu^/9նx -RHd_^ȵ7k3oRu=>#8eI Em!s}.O`p eCq#su'3eZe[؅ = 6J@SM1r 7')Ux68ow=>pzB}. c[:ٰlFۢ[x+)%,q2?(p&/͔K=.1J O.*%AGK,@\O ǯLOW8nGG3Ųl{ *#')@ln<3jO<ۛc]J3hV#xh_}~Ic쌿fLnW}EauZ$2wOk{bsZ8Գ~#8h_}~zK&!RbȩmtR'%22<ݠ2{ڽGjF@C|z 8fݣg qWILw e]؏h_oWQEc1RLb;}A&yrAj uۈvOE޺I迺-SuWOE޺M',mS]_u_i=8O]i} Tn׽sWv_D_D&:5۵\/q_DB)Nvr8EYک8CYک Tnѯ_TލTMtkknUFv5TA6Ѯݭ:U˫u]Ѫ Nvgժ_zSaVSjc=F]Vpz0B&z5۵U;\>/T0)Nv9>/RC un۽QC ^- ^v1z0~^-0 ^vez0Z} mӣ]mq>~/jOYۯFvێY$7 YwY)QC>}EqJn1}nٯM\,ֶ|EOqUU]sWL0(s9epmcm//^֘v+ן>pnbm;Dp7ҩ:;}uz4ݘ-~{1 4y>){.1NG]-y6q>GYb}wSȹW^'<{f%<{E|upoI]'sn p?Ծ{ GRWl]6qK;Yuv_9O"\hmwO"\Zws"y6׮sO;]b'u۫sO;غO"W,89Y _Gk;dsD.mU̎Vv<{}D.mUA>ŗPjd>S]'sjx`U])/Ot6%Ol}!8|دQ7mUGjу}8خ7mUKԚф}8خQ7mUN0~S_z?ҏ}߹UPgQO}lJ?)+DMUV >o!/g&IUK[6r}&yWI'K娮cLj%Eg:R nyJϙOn/+IM8zݘ-S9+&GG##״؃um7f>}ASp7]eyM4~lV8q)iHBn19tM6)ز)WF}5U.yoÍb3yS n߬,Ne73WθgMy|1xe5T ƾʴr&N 1g\SVm[4 5U o*ț>{[4Az'kpI*+&Yx˙CZ@Ȯsx; $k\mH᫉TF3p4@u0b ej*j`kߖ9)~cqc'FnN$͆]=9moUu'fJyQҟ4%=d{~#q8ܭ.H:@lIеqŮȻ99VSU{5U1, F02ߐ卅, '[AMHZh1i=f@fvk[VoRk2ᣭm̱`W-kc{$ XjkWBa2g4HIvu>%i|0Ը; dz~ϧKPئ)j1#ѹL$YQtr|tAMb咶0Z@W7@)ar^1MblostԸF n2`y̎WySG10ۜ:5 .k(vYQ! H]5T5Q]`racz HhAטΪ8>ʈ$ 3;+_;f`sw-L1tg͙q @$߽`kkY#.x`d$@ "6R,.tPX=6=E;,1)8hrv.6We^zHlZrV3~WW5ll㬒9/3%9 lOه׶enbnF2={[fa}{{Z^Xw9~VL;J-kmAa u4/Kߒ@uS:^Ce-dHg: "8!%"6߸/u%5TT:;%̺$ k4p=aJydScGf7nawf"z 1 j *)fI|]ax׾]wj!9의Fm=i Kq3B]uho:ąiIKsot~mF.;I5 -LHW7fqnl]u5N1&LlnhV UDV˚+70nSqgy ll7-BJ͎ʣbc~kG};l H(#O$3D~Kwo/ N\1ŭ,ݸ:k`F6Y$luTXQٍۘ]٬yޔ Xkv,";A;$opm}g4e\ʲPCY)ޥk+>e?ݻԼQvc? hBeK9T]lzUeۺOV̳ʼ鵈k/OVt=>=kl4s_.9AknYlѦ`/>5Yk6|teж2x>>.C-}_ '٧ƿlo?!K7vuzmжz|Cz9Qd??̛=wyS63@ś},?e Nρ#./+Ip+.ጒ2($k\84 䕍<٩h8mk̍{̲ZDzA!n`ׇni}FR&uTSm!Hf`ls}EEtHKTala F$-7rʧppF;j/kysS##]{ZLKs&ӧw1^*.ð׽K|iz)^:8$ٞ%p. x?.e-}[E&y X| s&cgt"$T񸾉)lO+u!ٸ1*y_)kbQIı=G:, \ەpXq6ḩ 8$|ee}[oAQW ,Xb1^-ڍםugmk+pHMO"'>G :7W FꋾzuEVn2Z7\C۬FVӆ$ei6:I sMxeTcLzNQAũDK3g9NmɈa}S.cP06V7}@l$]qMqL(`t5SV5DdD́.#\{ߣNZDX} m/mSm/mS#RوGW cTj47'({s+M]pUi{ki{k{hkOthXI$BRU&փo#?dD@DQUIA9A**:ZI"âǫY][ dl \Hn[]g~+=p>|Eb1|L yl<{ArWB~wHAlGνYU[6W\6-DPn62^=?* CY)ޥk+>e?ݻԼQvcG ?PV_Po*9w_u72i?4oo  Rkh c(}Wh6|$7z}O[ϡZ4B##x&+X2JtMZu-@,pUf׻eD,m%{%5M\aII,gvM;W5h>>'FړUUϩyE?ؓrlMΙQf,4$w{-H>?E|Ւu.7,댮dwoI?~SU|iz· {#fl:;$QY]2ZI&w to9+sr\r7 JjutsMƒ?=lk3[uYiS̒&vd R;24][rvW,K[%m4aҸe{Loֲ2tGq{|6FlA"S۽Jea|dim{]4?c9 -  ~!t VRRCMY mԀ-n;")Tk'coT,J&&-??1*gkjio}Z3xuԖqYPcG"܁PQC4:ivt^2\4XΑ&d\~Yh\r0G9I56i%7imXRCMh*f. nƹ.i$>E:ASkvO8fiks6å"!vRꕟ2^V1[ jm7f>}AT`u@- Lt\swtMfjZ/].R9k t>Cw9ܬ*2r]i%g(e$y7~jadp Vedt6(9yj@o}owQ4R{zNIZ7vqWO,B v}nʶvy0&|0ٚ/VXI6+wX?pFLAKdަlD>N e+<#ưvŻNQfS;XW?SwZz"i.s H鮩K;#.t@lJ ~OFB¦E jXi@vxdY!m3h2|;MNBCߡiYAR娍~spA2"zA-e?ݻԼQvcW?RT+Y1[ *m\l=+7fy FGStEF\sM*Y)-dT+R{ph9˻sLpkoh vKcR+ۣzޣ EzO|,k)>>>:1pAGBjL>_uoWa{ {5Q=:҄~?-ѷ&g49.s3(BjkF0ǒl88֝f8kǵ ?!67仙xjxjp YLY- rl-m@EɂV59NxBӜ\6zgE$-b+ JԮ|4sɃl􈂝d([qTwF6C\ 6k?a523I-#"H'*vt-:I169Q+*m&hZ1ugї$_D4RMc,rN'@orfj*=La{[}%sٕ""(!vRꕟ2^V1[ j@&o*la3`8Qn};m%Vtԭ ,)8q.̩[ {J X[nZ_(?`kO%ߥ "lf}kRf.iڅq$v4ZFepaqGvgf~Z<(ohbC,q$[j.ao߭?JuASM_M`vLK)oyOZ o.vp|6E5W,1>,/p8X:WCR΍R 5Z "65XN'Y'4B]oAu./C Lݐ5ֳAAИ@ ln.}bƁw"V^&5Mm;όlm| maaͮUo69ah-qq{O8~1>5BHfhpcY!h/ӑn}[VM+bKK @T\}U#▦GC-&pьs|[]Q5\gabkskֶܹ"(LSe[qHsaFáX,&: |F{H< #/$Y͏fK\*B*jX&mCaTvåWur \-ipzz{ ѸG6l5Q#gh ǕghKs$ ѿ.ZkZ7[巗;<o˖ִm8tZeV#aFj&ǕG/e{(IC-40H235g$t؋ FKd{曇Z{͛4L9f"""pbXdusbedy67TO9%4#~*jFfcF: K:W9mo;\"8Y4{Zr~SrtTt$m\G>* afrWl-jLj)M-8Ǵ; om(!vRꕟ2^V1[ C?-1[ G"_@.٣}ָmhשּ@U5t1T\eлasU{;Whw oб30c5_##eڵS[fuN,qbwE?y6kcUL-<_@a]W#{û%6O2ܫ9gWkPFfDB8GWF!{Aqs$sN1-dhq+2f8M/tϝNw:]˰f>*zY_5Gd~_rFc#`;5]{\y*$"(w@uRVQV3<cmӷ-#GGz}f^.ܻP_%QMNʇd{! -7lRGEEQS=%I۝hs6B m 8OLϝ G8 90)2ISQIgrgx0G=ğ`fi7ڮW) #]Z̫G8]J,a6#ۛq[iڃ^avX- gH\E&xU⸕4HA R6M`pss[duo{ZH1JǾJhrL9`kM(v\i=%5CdmE<2f}$8SN2rѦ }Khq h$ue?ݻԼzģz=zn}Q n}V$r<?TFM^f]Γt s.8 \}~:=kFLG38݅\nxRe#*cl_]Bmn7yhKL o;3/Z5{Fzqwfj8'0ߩ}3s\Σ7=~(\ti[rٹx/(?5թ*"" [I}դR%cNRBnlj(Q5lW=8{2Ly/CwM۬c^ESQT4Ae|iq8c D&\Jm-k\H:$\U59뤫Dtbkf`~75l;sat[C5ͽ"(ϙOn/+^Y)ޥj^ePwDwݘ-KŸTN*YR30U7.rrlVoV)O&;9H\{Iݣ0rLeu[ b؁}՞HWsF8wnE2(+_6LCIW3(O$;0nl[#463nA`k ;L4qn-M|-r浯kZYRPI$1shc|,3srDD@DDD@DDD@DDD@DD|wyZJϙOn/+Tzݘ-n}'.o$XZ7+Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ĵ _ +Ř fECY)ޥk+>e?ݻԼMُPQ&o(D@DDD@DDD@DDD@DDD@DDD@E+X@4A'ƾmڙwQ)6LڛFy]PFM{S<ѽW{PFM{S<ѽW{PFM{S<jjW&ʩii2vv K|QtKK%Rq ~ĿAKK%Rq ~ĿAKK%Rq ~ĿAKK%Rq ~ĿAgÄ8db8&Z\F>-ad䞏ojgh+ojgh73jmڙwh73jmڙwh73jІՐ,+GIs*%vRꕟ2^Vצo(ԓvcj" """ """ """ """ """ n}||ѵs;wL>xT*}=, {>@O@'E_ W /V밞M7mNa黦<-z%5K|2{sdQeJza,{ӹ@WFT%W?,L,`}&h(cG%x\DTFȝ@Z]9t>D2*a=^{/\%E~wl) 2I}KAg$KWSaTRVSO+ZB=;ʳ]*Q?,{CHnd+(M4. іZp+Z_%,.PƉl^6ZKdr!<bvb_Yއ kÔCkiK\״ΧHq \%kY~i'W87\?QaEpn[WVn}||ѵs;wL>xTk>, 7e4klZC *ð%STH̬dL 海` ;拒-x[naՂ 9c*3r5 ϕ}.)V6ej%|ݔDC7KkgT~+U1lSB-8?G܍64⬢cwr:[4S5BXY'˱0肏ԴΫlPM<& ZhVNUTX&7DJ C{'V|e]I7t煥BI.cY M ݬvRꕟ2^Vצo(3' ikZו?qsySxN_<&NʟuOr0:t\^T/*~ Ӣ:9|ySxL1ו?qʟ`t蹎_<'^T/EuOr:9|:.c*~ ו?qsySxN_<&NʟuOr0:t\^T/*~ z6Gsn\I>EXwGו?qʟ ΥaWXwGו?qʟ ΥaWXwGו?qʟ ΥaWXwGו?qʟ ΥaW-(m٠i*~ ו?qB E*_<'^T/[ f{X73ت:9|ySxAo,N`TP bʟuOrPo(?g:}SA3=*~ ו?q1TR6H&=kNZF :9|ySxL =} 3rDI/Jþ-*>_<'^T/^u+з؝Jþ-*>_<'^T/^u+з؝Jþ-*>_<'^T/^u+з؝Jþ-*>_<'^T/^u+зإ706EuOr:9|vRy|\RQ4analog-6.0/how-to/batch/task6.jpg0000644000175000017500000004204410161303533016765 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"Q !1"AQ2STUa4Rdqrs#5B36bct$%Cu%Q!1"2A#Raq ?`TҺ7SBd_"jB}ѮU9hnH3_M[@k/ū" JS^֐X@3}Nrwd1% #b7>eoPzVTtT<+ZPkZFgly(V V>Z72]I@n=֣_e 1!fP:(xq ]}xL͆YsVhh1JQLaJ*\Z.q}[k]g`Pb$A %ؼ_x6>˵'o8[,jHdT+m q u|/ Xk*-K9(#-纝PAd 1T rrO5Ws ۴|S} اXqpSN͆eB6w粑GRY'}S*!clKnQuW&m?8]TJ"Ynz/p2gdT2FOq ÎR/6r%='myfܞ0yͷ6L:kc͢=G .E迺ۖ%(WMe&+J$~͜~L;>(chFRi]]uGQ/2LBŇSB2NKddyÀٌxfIXҽm^## t!Ar&m[8S'JgG@Hm\,{n{uu4X63->Zl)nM$J[MAn!)=_{k;' 3΀pz/_i=TdU:9۵m/* jKZKYNvw%oyKlu*P jG;v"Tމ}!TލSMTnѯTލTMTnݞt}_{j,jG;vW{k.wF&tsk>T=ٚ ,ݬ1Saej ,jG;vG{х2FxY5SO2FO!aA ݦFo d&z0Munx6/F=/̋х ,kG;vez0ؽQBNv+ca}R|F ݥ,<,-P'o3M6B1~#c5eͲͮ굴^{-jy뚺f9Cc-kkoyzſ/^~oU>pnbm;Dp7ҩ;E;]i[ Z~{1 4y>)V]buw.k ]p+w{E>up}}u} Ļ']_s]\(n#:VC؏~]'ع p?Խw{j~]'غk;/Y˵,CR5Ǝ npRu\Wڭ};Y Wn"}Wg{k5uub뮮Ppf~DMUrÃg|b>Us#՝_|}D5UA>ŗ`j>s]'عx`U]9/ϱtj`=9, SbDsUT}yϱ}=Gϋ}}UR&>a5>/9+M5UN0|~s_{?Ώ}sUUC G>a|ح7U`ϱ}yϱY"o#/g}RyM5UQ_E$,󩨛juS?Z&)@"ntM5UYʹQ?+#}fy2W Hk&5") Ҽzgȧz'=zn}A#klAeQ[Yj^fce*%?(R3Iַ0N]xGJ8,b8UѶֳʷ)|،t)E'Jp273رQ6~E~) wl8׌g5DW k3Ӷ oS ۬i)g׌g󯝰c~1gks3/DUUMn %EdK/s38kHW@})F%= 5oÝQD<`ti'Q8k ()lE%4nc9># ^{l<ߜLoq1N/٥<1ٹ 97XtưY-- @;N.VlBS8 ߜE5GHPaPE*H߰y}O*"b+#0Lߩq`QR+j$[&:'ֳl : lp,hx 8.ioQn@nC͒Ni7ɵ57-wMkZ5C] tBpp/g!e% <١}4r69Z00r}6b$5I'c s38D<*U⯟ Rm ܬ&ӯs~m2 lp,hx 8.i<*8`Û]t4;0 a׸ޣx#1 PBZ<;h9MncF&:8ol1Ƽ<po ;6AZ?w Xy'-mZVmlx'K+ag8wu*vEt BD1ˑEXsZR! {(fQfְԂ asHd1dp:1ŹyI&Gkm ã!$mBGA" 0Dz6vevkq{h!i7mYKC9GO)ABqB5O ]MDҳ@6m{?.jxq sMACn}M))iF07(& n-%5f:Jx`a9b`h'+k*jauX$GrSm{Hh!; HZߎW"=VGO$V D(:ݻ]/ILƽm^)17ȵ d4͕3"ng\ka,x'L1,ok#dr~} Q]UҲQ9΅lܰ;{^yQAGR2 p6Zמ_&3A$$sln,wPT⸍dgMAFd2:ܥP3TbU͎<3.wE2j 9S=$OJ6x(H?i$JI%`/rZѠPҾ\NЗWvF [5mNiRɰd?drg/A#7Bٌ͆1+w:aCL_kbq ink eD6iscI:l_"lbmKiI,sI䵑{sKɥu" cI;2;5ɸPQ1 `ٶs@h# 1(WPH4|a9@~w\r uQ%s\ h 簹iugR@e%y{wXqnllc1sg;`.zt~2DEϑOn/+^Y)ޥj^e8GVwcOqoF${IGmTbQ[ꯘ5VcqYuV'$n[* n[]^Ui%-%yoM/?k Xs~/-}AUp%Uhi>w_Eu[@ jc{"a 9= ͌[nvK ˀUK9EMCE9/)ԓ_F_-fΥ6=l ~>7,%wn:(fcr5,,荍s sq"`aFp޹y(*|p1>?W)ì/YxX6n1LN4Gϻ˯rI؍ȮXVcg H~Z~ܸV_?iziE_TIM:Xe'maa|l#ZlVW6I%}a/eAԎ{mFZZ"< ԾXh`cP[!]n鶿s$u;KM T̑ip&[k*:^W2Hߖs5ZvYGS,/wlblY.ߛ)jyX" \ n{]fg 4;0䃼E8-(n'G:?nzm%Cw~ڍIOZwQ!Hr>WMQir K4ߢhn['HӲGŸUg@ 3NĹw7vslM!in0Y%$b)h.6VX cdzvHמGX\dUCO % s4@w^<-MUM]3,T-K84\8([]l#ONȻŸ,i*ML$.3fas?##{0_n lFVoc1+[0ϲ.n'7d]Oo]J.8mvE-&싼[MD"zvE-&Ԣ`rݑwq?ɽ;"zQ\j O;"mZw1%JVw7B"(4|wyZJϑOn/+Tz-S-0* n}* }8H]p5Ӧ|Z ੱ;KmeHKmh?Oiaݸ-q&Ժ#f[k?} oƫ_9wF@ ״;q7eE>? -aLNSf.Up7s\Ƅ-f'7YԾ7U+)$*/[ Ff͖S+ۚĎenQH]32j,thS{ *B)%h["{-3o8 jd׹ËoUgR ƨsK_I6Ok l/1wPDsLw7w_7]~^Mbm!Ep*'mN JT%:HF׉?Zn&:vFŶ:+K_)Sl!38u loi! 1IIۙO,f qH#˚6<:Zn:]^Mblp$83|cQ̒^9MH$\ht!'t˰q-K*O3,wumYSm/}Xe.ΰM]`6mȳEY f^Mb{h:6wuK_)S"Ics@kNf*m/}XhY)ޥk+>E?ݻԼQwcG ?pV_VwcGp~Gc:Τ̣4{F0hLa;kk]#d!}t`z/曟->m޿z\Xb@0dwsO2$MZY 2.7Z٫vm{_A+*z\wڒSDqGmd#pYnӞG9߯B>Mo{Ŗ"=$Udm1y$ڷa|N ;'ث)S%LE"Lr1ɱ6/:f=XhH˸--H>?E׃UjLyW@tF[O߿d_'/U=x@ &=gOm =@uŮ N>U.s;r8ܸr9㸝Z[";3&f(fɤ&3Ir[}nlPANB\< ɫC7qȹnьQI04;N}O@RpxdX|ҽ^Ya }cud[(5u1VKIMϖ9$&Yaw(}Fi}=KbytnAKtnlw.HN-P)g5)2Y4X,۸8Պy`tN۶':堲3skV2*ZLu0CR)ZwY!Cl@6M5[Up~Zjhi&?!i ;O5;tayo֛oJYW,OLj Z׆uԵ#C>1916|u \neg#A=>[n >:݆ڮ7ex23sϭs7eQ >1916|u \neg#A=>[n3LLj^A191dA191dA191dA191dA191dTsvMO78Hn}¨RTDEϑOn/+^Y)ޥj^exGXVwcO@vT?P?‚<Kfh`9R?I\iύt~_1(zX.AAk<#X;CnӠCپKs+U?iwXk)ńr^AAjOg2;-qinNRaPEg C %߼8me>KM+e7m3G=6[${y)Gu3A f ,_+EyKdsC8ybvzTASaU5TCZ1d 0[spzCt[ Ns-cXZѠs+TAEl.h$Z p7`su3C&S%f/f7wNҥ"+Y*ˣv{pc79̾REt\FȄg4`X5p7U Ō."ܧo7s,ưٙ.8 +z*-QڷG{B&Eս;؛V?bDȷڷG{jއUV?bm["jއMzwT"d[[oC*L}zw6QPooC&ս;ت2-dxp=!U" ""MgȧzTvRGMݏPU\ SXVwcW?rU}82ܸ(H?\ݙ˸-.J 4EF\sM+lo}h: "39Ge4QeJsLp4Z_[E?7E{to[aIE}]E t||t'$^j ~?_7_<~{uŤV?hۓae;o.fw5\Hã Fv7};u&ԽMڌ-"7$!xcs6{If|3wUƛTOQ69)܃c.s]+Y__pna8P\s Ky|9}rG5Vi}95""OVںJZ&B*6,R?Ä}ܨĸA0K'K3 {L8Ed{ ټ9r#y{~ha7:NXrO/w ۟Qrm*#q.|3=,Y>)+ou^A>ߴ\x>fdSpaOutHx>fdSpaOutH\ gN%zY="wpaOu8>fdWD9%zY=\ g] x>fdSpaOutHØ:Ko7p>}aT$ 5"^VRS۽K7v>}AU-H-Y&pw !ϧnXr[ugMJ2iÎveJ]n`,VVj.b:@ymk[|pA; >d~0 |P9  #1x7TؠcEW80-_hSHQek}B2aLj?EgufӾDfAu;)hM2@9žQ&k\-WGmEh .83Cjl-wjXmB=u)ty!k~FمZCED\sc; E%0) tb"܂łm5:yJJbZM<$@З`i4kxK\״yu=+MfG_S ՐG>ŏkY+I6#'*b 5 '%|mscqcj|2H+ mݾsB !i7mYKC9GO)XL}<.`Kvt7:܈"φTGsJ[6&0t4R#nXִ4[RnOI+$@DDH˳//:[η"ӌN2ΏoUdZqt3}YLN2Ώo8:?ViYgG7ڪ2-8:?,fUZ&EgG7ڜejDȴ,fSUhejqt3}" (7UY)ޥk+>E?ݻԼQwcv1~mmXݏPU ?9=Xow- ,c@aq[^M WvXL0XZAp*v9fxwϏ)n;9)uAk#l7Oa"ݑ/mkc&Z/ѪivIXh<(li)\BIc?1uS]RG9B=( ̭)@4}v\ :9Ilp>к9fh$)eaGd慡, ޕ[%ȭԪhm aMS=hSVQD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDAS۽KתV|wyZצo(ȝaOeBd^ܶk$ et.}v*1h**~:vZ1(= ^߳ӛ1_+YT35B»,U~G k[L: 8};"o?7ַ֤vJS),+t/sXwd9@i)rG9v:֢,a$+3utnhw _A#"p=5ak'{C8?1].ѓ12l Yx%|"s]14S;\\Z3S/̅׾7B+|nS.i?;K2vݜ*""4|wyZJϑOn/+Tz-6q[?)wc^<{@?H*j'uL,6L5(NʨV>ř$>'8 +t]Fikc<P>LeiL=3~ޡq]%Y6Ýr4#-7p0ͪʵj,#viiXj/c^C p}LJd:7gcwH+SG\>grgx0G=JN O034PsYW+ydV*""4|wyZJϑOn/+Tz-S-0* n}V=;t+4iU 7Yb@[v}߿}+A֠XɘgڠkUDx-P7USke}Ulclq EZ`f.mfzѫ7-;p} Of?'sε?>9AFszӨ_<-g(UXםk7?s.:Pz_4+K?5.S7/M#]Z"(MgȧzTvRGMݏPT(v^ ;;n}OjVf FܳNM)կkɺvNc.l\9Z&GO df: E?ݻԼQwcn}s[7AޕZzWai_%74XZzWi_ ޕZzW3E7ޕ ai_%74XZzWi_ ޕZzW3E7ޕ ai_%74XZzWi_ ޕZzW3E7ޕ ai_%74XZzWi_ ޕZzW3E7ޕ ai_%74XZzWi_ ޕZzW3E7ޕ ai_%74XZzWi_ ޕZzW3E7ޕ ai_,pg,50-MgȧzTvR7v>}Ak[&o-j" """ """ """ """ """ "6M2mgȧzTvR7v>}Ak[&o-j" """ """ """ """ """ 7v>}Ak_**`d_4mpknqo  OK$pϘ W⤻UuCj vՠ'nn[SXqo z%5K|2{sdQeJza,{ӹ@WFT%W?,L,p}3l7a41 kV^}[Ÿö3.kZ{sVS?bO;_a:xmdݚ9׻V-b|+uxL=pr>q\qo >+imQ<'PhNx;LOEgA G𒢿;Qq_Mt奠Y !C+h[+)'-ӡsܝYi*Q?,{CHnd+(M4.Ibef-a VWK T1[;,&֒nuqO%6Xk7Z6!5tkAfwSҶk26CW {Ahuh=t_v{ T*N _t+ :ڬ RT2Rj&o-kEL +据 mÞ7M0¢>9# #{SH湦Ť0؂F(Fec"`nЗ5ܧ4\lʝ&Q`X&Lܲ5cCA~A_KbUAډ_+7e8Ƽj6Z pZgM3i2<&UPZ7}+|á%E3YD%"x  N()]]KLV Ln@Ŧq~m4XuJ (^!h`/p7uJ&AWR~~>)|na \4A6S۽KתV|wyZ^efN9mֵ5E*EvOrvOr`t蹎ܩ^Nܩ^L1ە? ە? Ӣ;r9z;r9z0:t\nT/\'nT/\&NʟʟsSpSp:.c**EvOrvOr`t蹎ܩ^Nܩ^L1ە? ە? z6Gsn\I>eXw} }**^v+}/o;xзبr9z;r9zbXw} }**^v+}/o;xзبr9z;r9zb-(m٠ieMە? ە?-x'`oP~YQە? ە?-x'`oP~YQە? ە?-x'`oP~YQە? ە?-x'`o~YQە? ە?.claL{6)˘ʟʟ~A#97.tM$2ج;Gە? ە?/;xз؝ü_K[T}SpSpXw} }ج;Gە? ە?/;xз؝ü_K[T}SpSpXw} }lٸ36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"Q !1"2AQaST#4BRUdqrs5b36$ct%Cu$1Q!2A"#aq ?gd&&խ6mVp&zz*[Ŭ<0khv|/g62H#N#an:Ww^5in)O -|$)!R4>T)ϩG_fm,mӳZCuÿ[Ŭ<ՕceP. H̴L'^BwT + ge/n{Xl(wRs/6PAdYF vɾ1qX)hn: 3;3^K66ENFcgiZd .Xr*.V^Sb&V,1fGpb^a,VDNֳ6>'8뭈qEj6 (N31 [S!a-(wRs/6PAdY؅<͝K@R̩]$dS@9 ۴پ)>d{2}u {vbl6, 4HW8gstP@I^lZANQ5WL_t4ŝ+rQ?5~yW8ngg/ٵKZ .ə 9H+-;U6m[Yw$10t˼rԮݭ6b;3ļ,KYWIE*:^Ϋu7j#8H}Oⅶҷ֊)kg~Gf8_־߈ ?5kos-\.KXzջ TӅTp?Šݳ2iZԛGjF@B?nM_0mh[KqmΠ!3O%cv#,l`Vm$Fj wۈx O5k}x_ֹY :g]y_{6k6Ѯݯ6j !Y mS]^}|}+_5TbڧFvUJ+!SjvEy୼}x+o7TڧFv^x+o7_{w୼T Sjۻ~ю;7UBڧFv׃uvY mS]Yjvn|lU`Mkk!\6<جqbEd)^vckϛ16*VB:5۴bIϛVBun{g͊c^lT!Y mף]Mk^lWw5Cz5۴w5eێּبtnһmϚߛFz5۴q,$9.2%\;Iv{=6ie669+|EOqUu}& A[LR +SGoƫ.nZv(MCP3;<=]^z3qS_BM"^|;<=]^eF)kkȹW; =]^d; =]^w\۫/u{5vx{NWɹW ; |=]^d;|5]^wsn vk^ކ#zk<\PGֽe{5zX+ٮΕ0ה߹U8O-ߔޕ7mUT0s~Sꯣ {7>7mUX0s~S꯽Gʔ߱Uh寽Gқ6,h:<6߱T1j:|[/5.߱TantH7mU2qYlEm7mU3}MGSJ_y5gJgܵ¬aזP:A:9TEy]&4qOUOdo;o^<Êm7+I ճqSMGney&?i?cP*T4ks 'RBuִ`nٶ~Iwj׵Kie*@cKwq֝(q+kr1X,Ͷ JZ JN6Q^JY̸۽-'qym7)Qop.[%wքl˨p(:pwB&sVQڗ[R@AR&7(-f.#HLLIMAm[.@KJB6-$PS W6n=}opkzrIP#ADVf͚Rm;9[ZT32a"AŬiXSJ$lÅ23 ԏ9iXh4Uṃ2R Z5XR$q:op]^9tM[A6T$6!\FVEuBHRRm:e7]̢ej-)W 8I'RVR3[P Q#3sɴ F8 q3 ݨ3cM[5iV͖Ҁ۵ Yʤ%LT Dc9qkʊ,J!hSJP %z naۋwW%[P!*m J@ kY5vx pߓS-Q%\rֶ$nTR og ;|O,j- [Kl83'3jHZ~r Hso[Eí!ZVR`T'Y`7qF%m ZKkRtkԨF' ymnK[]d9]s9B@1R2}_rP>Iɩ_ 'է֤?_MP.HN#ߣ҂ jה A Oʙj :~璛=wݦ[ oUfΐ?.JgHˀ,}e|N\ C+UyozRJRR2($BN}#5r%LYnmE%[+$§>_}ϳ6rv{;u,[Ke \&r@/+JnPm@VvCBW;s\Zqv-a\a .pmV`Ϥ88뫴 \8W ")U82kpJʖHb3O.jEeJ6)2 Γ`](: Zp(N!:?U \0@߇{Y #bK\ X&Kv8 ڥR\qm$>'iy)T8 w f.Ulg;$ 2Aл7۰jm݊;7Vs6 F@+M..6 )?Ms8.ȴgvݦYDeA[YQT~%r'U4 uA)E*@R#2}sU͵]#-&KWReRu<%#0ɴ-mcUkc$''BuI,)JT R R R R R R R Ro>$^W^y' ^מ㏺@`*8 (G)<< FUpWFb1ITWV$NY5f5W+bj.էKz:#2kXe'诙?Ҷ&L+XNdVa:Itj 1"yf&G>``O$tT5ܺrǖ^4(M#f5y+N#(JѲ5עĺÖ05;e_.Y`KFi*_'^pR4RRRRRRRRRRRRRRRRRy' ^Kω?jW}UvAHW*ؗSGR9It稷H0z~ژ7W"&O]Y^e*O5Y]Hc3DZDG 9DJM!"G)'S)ԓξFG_"O-JKz1u`gcw0=hLۖ9#ugi h;*ܦHBE0F0Rr(oz dAU2T =,JFl[wtU}$ UH2w_q3Ap5gU rY+SV>ӂ}VZBN1lI''6ryQnqBwlZ)٥$p')Hĭc--TmS-ݺdL6$ N13[+un/ RP*N}zu UovXCj헭\'TQNU9PQL|gMѭb1u6 l>6vpI$)H*+-x$,dRSMTcZT7QG[7J)-*G8U-˫ی--j@Z{"@ ԅ2㍠xJXAh:(AROZӗ-BR3%Mx2ỷc]0KrC*#*ZR6SATaB[9+FFՕ*Lid@:8#sdNNS:$\RՌ2_m8Ju0vjE@ N=b,2)Ra,YR_ƭmnRJ )%F) u@#hfC̲۝vn@LI.AH!uJӊ\fe\" N9y5КP)JP)JP)JP)JP)JP)JP)JP)JPiEy]zğ5z+^{>}{"?="㏺@ȿa]H'ʤ f^VC'׶L$=5 Gq~uv[RL>荙dWН{X򙬤neTdb=n" jS#QV')=UsPrHƃ)hf''Wih]ړ5JG1iN5f=Ai%C6rb6D!;+{@ʸRtpFdbf=J~m^֬r1?SBR415Jz #jP038a?)> \mBV%BBvU#2eJVOQWpv>4&MCkg|lWrk6 S#yXimWۚi꼂{}d:+q}).%afc>xܿeebqݺ\nՁqp9A1+BG&!=n * RȄ$H2FՃ0Uo=r%B32HYE[Q@N )Q֣vpͷ[-k\8AL&#'0^wEK;Vٴn |b >ѻgHssG-Elem#3jAM5(SXvAgx3Hm/0$p( ;\aL_:^VehS&OG={0 6)*/TJ~8Ўx4:w(%Ew#&uH ^3KjeJP$F$ 7jySvugiӾ@h4۶]J*Ky[-x:fykJ0;tZJahXH$J8R`oSy7v %đG@"V[Zn rࠅeR!; \miއl^er؆HuN %IB(j0?h )/62-(WpTb9HXqul% (< ۏ=os|.[a)L!yw%V ɬ9Xf}R^mP5KRYmnڴe Ip$ ^2]ܾM%Eͨ-1#]-W0Y .6!գ,)\DL 7Q8-p\uR 57ਉ2ISݱl.(KaҬ §CAUfeWlYFwP\L;Aփ+v ˷yԁ!XI|s ͗4}umj 鿳S2 #;H&V(Z_--e!J 7D:('RCq9ZTJe&u"bm\I[ *M%C9@BJ T鿳S2 #;H&V(QӌYqadmr*pDDs'Z Tt_ٸ$$5j/M,("u)J)J)J)J 7+TEy]QqOUGd/'1VqOUGdnGuߖQuozaИwkjU.q_T8G^iֻE9&O;-] @Us80 Z.+5'ẐMB.$nZviZ_(+{TwZimC8o (7FӞwI~[6ֵ|}J>%p6[:ϴȐsRy}U_eyl._tH<OR-&5L(4$ӸVZCݑhCh>ZkxwR#Jθ,?_/Bj«{?IuVU>SU= ~<ԻȀMG'HJi()E"'A].RלFHy}Us-*:r.2ԓ$}CR3h7la[FYզŲ Z}B 4k`3:H&w{Jԓܲ7^ZR7vPqU>At;>Znwnג &G k#2B{N`*AVqFߧOƘX=|`,06 V9yX+CnӘj!6g W¿iU]~?EZ׏Kx*;VV̺[nȰT+Jm8T^l4mB&R2͗PBn9T21 VDPC8eUۥլ-Y.JT@:$ ܕpi C(axx1G0Ԡ:ڊ6t)KI(1o;U)@)@)@)@)@)@)@)@)@)@)@)@)@)@)AOuꗟ+=y8 %="^㏺@?b]}LQQp|'Ve:w ؆wHa27)[ۨFH[A@kRz+p6s%BjBeI)J&2Vk[[P6ޣ D󞓿;w}+b[ݧ6*7cߚgx_}k Ok<~Y}M+h&V$5HμpFy:ݰςAD>EYךG)Jʔ(((((((((((((((((4|IWROuG=u>Uxah}Vc`+ |/ @C9tYZ$(OpGEveJU!DU.nŻwV%+ouW,gs9瞆ٝoi*?CS[f+yH*[+v$T*+ 50P j?J׳̮o-o٭Gsža &SGuZ"(Sp}5+*IB5pqiQ^l6L㱜Vef^EZvDo}GjƱ<+mťtkog* 8S(BR o$֕_٣6kY.'H>LcKў3Jf:LUt vێF3!iNp HNEћ5,f&EO1ћ5,f&EO1Ej,up͸yOI)G8 vEkuM:k"$9gJ _٣6kY.'H>LcE_٣6kY.'H>LcZĭ"HJs%ed`7co:mtd!0Ʌp.n/1ʿFll \N|<ƊFll \N|<Ƶ2e)sjVD FI%JOT;& i!%+P )C~ h,fٮg4#42/yfٮg4#42/yEN0ӄmn])Ng8JI<.!oK&ueIʭJ@1HX*]2iq:Fid_T*]2iq:Fid_Tc{qs4mTL9&RNj겻F[V^J!p5Z8oh,fٮg4#42/yfٮg4#42/yC-0K&SaEi4ȽDqZ6xΤ]Si'6h9dEP ʿFll \N|<ƊFll \N|<ƪ쉷mØ{>~D#̠ګ<]&cyp#uB\Si(Hqh$ J$HZ*]2iq:Fid_T*]2iq:Fid_To0"S"G87 ȑAŝPp.Ummy3Htə&n _٣6kY.'H>LcE_٣6kY.'H>LcZEDmiy LT7lq^0mV \KL%QL]*]2iq:Fid_T*]2iq:Fid_T*ҞC E˪[rQɼf@02Dd"qVԱoh:A$:rhd($*]2iq:Fid_T*]2iq:Fid_Td !uҧ e-^RcTB$I$F n(ŴZQ!,~ZBRћ5,f&EO1ћ5,f&EO1*mvm,?39߻PnykmnZ Ph8e C`-KJƑ91+4L]\\R5$mV1" 0uߠ*PEb ;tyJpe R$L9ԘbH -$ܾé[!00DfIkl)PEvIBNRg.T%}GN lW j-"GӐ,3L&ʔYK-/? gT\ CHaR4Xs7.)-hBIIмVzU$r*e(*B×n)C(D0@ hR-m)FG -j^S)DQϩ aV8[&A-&4^)ܫ`ۍ2* eFӧSAZ C&L-'+IBҠ^(1˩a̻o~ʔMH"DPGMGqmP`x*P ܸģ"2<Ӷ^H")PW% e *lFE)HD-\t@avo3]2&8YFh$驝ʏlݜg,O|y)JTo>$^W^y' ^מ㏺@ĕbu>Pq!6dLpѯ WM8a#| e.JGMHxjūrWvZ1&(*ZtU[¾NLƾ_`5*nV}V&f`Y^+cu.+Tk~)]\NݻWn7ן">ڑ+X]˥ 'AHqN\KIAݒI&S.m@~tF#ko)A"Ԑ+H<2>üW;_A#8cmxR֐5 9Ok!(LO-69Ԩf][eTTZdwwHp֣!LwˇiP>]E3UѺ?DtHȯ@2r}V%JRMŹm+JW)RBQy:*E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ" E -~YaF8Q;DPGR/8Yn 1ƏҎ"2dJy³1t葩 Ro>$^W^y' ^מ㏺@G}U(7G"A0 s֤/qcQ}MpN2 WvV暍}޶xƬ[>3V2tpwHRVt(sZ:j-~`5Uɾ'+;ė`e7MGkw\뫬ʢW+4Vi9 +X@$ri&7{}}ټ~СkP/Yf$@ o6ݷlZ Ƞ8D((H#M9EWXj06VRFg' jh6b8}R3քRt<Ƭ}았6cI>UߧQ.C+v -:ۏJ%%%f($HVIX,aɾl)ˈD$+0A&D LZX\mr8j h$^W^y' ^מ㏺@ȴHg*18 ;1HyݽҘ_\6٦}ky!hfÀw5vye~ԃ?~oMAf (VAX;JZڼ!Ap-JkЄA}e`^kHmmDzѻ', w;v>_/rpJAdΧ.6!@e'VFE|:Yytg(媬Tז3~tR$sz_4;޹ Y\6N^]sJRRRRRRRRRRRRRRRRRRy' ^Kω?jW}SvP+j8 _΃s5-!W62mzx3Wlyri&*meC2:vJ28Zn}IIVEJy9j\JgW'-r(}ե%*#x֤V3Y[6\hkoퟵuMy&>KR[n\A"(345ה\̀HQD7W؍wФݭ} ӟßu/N.9 QQ@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)AOuꗟ+=y8 [㏺@G4pr@>ҰWR_TgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_Hu~t!yWPgJ_YFi܂H 7+TEy]=u>ZcqSRRRRRRRRRRRR O$}h*uFV͢|$^WAqOV}k(((((((((((6=u>Zw*m* L,V۶z]{Wm< O/<*%]_W +u[TA<ߤjwՇmx=qQ;I7mQr(vsdwV29MmEk3gk:ִG FݠO +LOJAs:k0!!Jgvcabی-I aHa(T$ N5ݩkvϟesDLn堇^x>(}h.hA~th74ZVSP'eNvݷs\vݷϋ[~ͮz4 ރqPtԪa>DdU`RT$qL#BGXyW,QzHŮ\yvɸBRڜٕ)y\}*! h 3k{r;YV^0(9qS)V0s~\mUS`^I5MűΰpxeN֕]'ǚi'ǚh+* 1Bt ᦺcqS\\rҠR;jog*kmjBl⒤)!5p!f#*v)LRD#6&vݷ0kvmCP$,s7>Z \SMɆN:Q(i@%dnv#?L݇Xvb)g2B\2#xͤfHTY1Bwʟ QJ,#KyJ >__Z*-3rH mEE r iT# mn-Y!N-VdAyGmx=qA?ob?qB_mx=qPV1EHPRJ#PMEy]zğ5z+=y8 \˝)r7 Ji_;7z=+won0:zW1ߕ`tc+w)ߕ\~V&\S+w)ҹM޸~V&\Ss[qNM޸OJ;7z[qLwon;7z=+won0:zW1ߕ`tc+w)ߕ^`Ե)J2TI>Jܬ;_2UQon;7zXwe>w+>̧T}[qNM޸V}Oþ)U~V&\S+w(/;}kSr|}UGߕ aGS,0+w)ߕ,U;}aYwonpo,?#N`DXG;7z[qAo,SX7ꪎM޸~V&\P[ "=T Mdz+w)ߕ-SN%ư$- JnRF T;7z[qL -K]%Ji$䯝þ)U~V&\S+w(/;}kSr|}UGߕ aGܬ;_2UQon;7zXwe>w+>̧T}[qNM޸V}Okmmg6 %s[qNM޸o>$^W]{ݗۼGFta!Danalog-6.0/how-to/batch/task8.jpg0000644000175000017500000005756110161303533017001 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"T  !1T"AQSU2Ra#qr35Bb$46cstC%&DӃ!Q!1A2 ?'Ua.Q2fI kz ֳqL[i]ȑoxWFj҈kY/.J-mВV9VA1,լFPEuR;T!QHG8Sm7g[C`ڄ&Z#͟gLSrʇ%r\%.0BR78ϏHb8'%uR;QC|o0i +}$(wQFlݟ~eJ9yJItBVNrT.ͻJ*vuZ;AeeKK2/1Z#]UThp˄O*Ss[\K{1aqͻ?GOh>IYRvLE5+R$%G:"5eYlN1hL?6ƕj^\uUSSC0Dx&mGuZ;Aub;AmMKkK%` >ьtjnٵmdd-$qQ}5WW#|xc$#hF5MU颺J>Mf隺2WWxxc(#)ѲWl}0VጰD4Se  {{7ጰ fro'Q f}hF4Ky>},Vďz|14Se_jؑ {[7z!,})Vďz|0Rc:#hF4_J<1ulh gDz"hF4?I<1Ulh gCM:6Y["=jO(Dz!,F/ {[">]D# 4el Q 46Ywղtd|1IiK˭<c:E0DM46Ys#ᆛ^Ώ|1QiF-ڶtᆚVΏpL{ 4eVΏr{0.誏D4ӥeW@pW@pM:6YgУܞJG=X# 4eWBpt{=4Ӥe_Br{#ܞ# 4d"= 葺#iѲɹ$n=ѣtwD(CM:6Y7>WFѺ# Td}7SU:6Y+;W ^7Sz"jF%!\ kHޣ>GbOb#2Yeu^y*'P1+lD;S3j_RqKbޭ1cF}O۱-bL1!u֥ZY $J35LTҥ.!JH \;^{gވ=7>Ūl'}3eRyHV9MĈZw i䂝QJI4'#%ʽtѴSJ}.aNeɦ r8V I'דUP0} %&ً0/KtqL熛xe~Sd#~5GgzEebr'5np;xrrUU?ѳ 쳽"yw^~AgGֆQ^Yޑ{gzErQ,yQoeaw^*ƨ~q}F~!4D720;/xÓcT?8=~(Dzl"20Tn{V{tx<"|.eM󏔤&]1&~$MPE3ۣB˛gG?A;/x,HMPFMs3ۣZ2k;/x,HMPhٞf{twǢ͙gG|nۙSƟ+B%u Q>0 &G|{?"20 .G|z$&?a2@R hiq"965C?n1;/x,HcT1"Ev{dwǢIv{dw3*Z>T*_h 6>0 ^f;=;&;=;gw^Yޑ{#=Yޕ{gzUr,j?5sgG|{3#5gzUeWaȱ,Y_lWaw^"ƨdur *20X a^={܉*20X DrGgO|i0;үxÑcT39?SgO|ir0;/xÑcT3w?gO|{ptYޑ{gzEr,jvS#={Cw^Yޑ{zV{TǢJj;үx,JEPtAGJh;үx,JcT(GJh)=ww^Yޕ{j-f{DǷ9gzUeWaƨSgzUeWaƨTZYVzv{DŦYޕ{gzEofzv{Dǹf:v{DŖYޑ{gzEo:v{DǢa1aw^Yޑ{jT)IfjjM5bnY-5d}&H"|8j*`GUs0W oZK΂RRB Sb&,ok?;Gouݥkۜ"tݱiNw:X]aٙiʮaeңUpTy~{{Z\! ٭.N)^cvַR zZWHrTdM?0_Y~/==,ŧ.iFAO ~'V &I[n-I4O8n_Og?!b?n9볿L}>77yj HĨkn#74q~]%/KT xsFqv( Pr&Ͳ\9!Nm$,njx/[\+jqj$SgV)D~0S[iن!RJESZ$R78rK;ܶQa)Y`$33R !.(@UB>86*e7] G" EҤ 5u Kgޒ UIJ[jjI̗D~֜e9)T K·[DV"U"f{"r.;6FNfFku *賹m [ig|@giZBe9ܓey٥!W^@7PJ!XkHʦ.V[RU @H-kJPL嶖w3m*xE)-3&ʦ%uIa)+@U@P嶖wG3w2jM%6P^ےeZ}eR$"i{yx5gߙjU+˩˹4ܻ4oTK]OcDòr쥤M$:Lt嶖wo]29vZ. + *]jn#w-!m,< qYry,R QYlU-Z}%eqjjpy?_J8賹m [ig|@PΦJ˒B˰~9Dӗ]]M8eԥ/$8ޖ"MpUF uܶo'0ʚ\BUAI@S1ysm [ig|@A,,mq`}K)_%'&T!sJ. t^ u .PaݭEҤ 5u Kgޒ2FRJmJJfk4 3ϸINډN: )̶*G T슦0_g*(0 G:grK;#w-!m,Ў9ܶw- ;B8rK;ܶm,grK;#w-!m,Ў9ܶw- ;B8rK;ܶm,grK;#w-!m,Ў9ܶw- ;B8rK;ܶm,grK;#w-!m,Ў9ܶw- ;B8rK;ܶm,grK;#w-!m,Ў9ܶw- ;GÚ嶖wxf[ bX๤٥ү 8?dUCa] ]q <ӷ-U6J#:B]M0dgJ--4\ub)=ۆ1rV!rJ *ҰFf\Ϳa핗8i_q?P2JmY;(hM_p(?@Y)II aѷ.1c?n9볿LA,H$63כ+N-bI6^lxCz@7+chr0;/x2'PB)#9i)H-)kڜU6S@bu քNS%%Jy@ I*bBSQkfi$ 5Ƥ⣫&*u')=gzEeb<\2LApj cJZq}21]9eTcKy3-rߩH榸CVFiZ%!*ry怿;/x,H Q 5LX 9gzEGBV@Jp5珉O8ڋD.-ȭW*T]e,H#(,xǑ$RͿ*dfbY iV[yq)%O(%Z ͮme t}:ePTiZ&r\"]WE̺i(ʶw.kKխh9=g'j"tp8ѣI= 1YgzEz]wҬ6[.WҩMԣ%>?(y$V+P:1w^'Yy-ʒStַKd9gpzZ}6\a*u; (,DDJ 5eAԶ_!$ T̩jZPR~4<9>z˴m$բkT J ֆ8zdIڬ]ɥ)SξaJ 2oԎUavMx,H "fQ;i*N~af Eq9&TJY=#vq-͚Oh/TFPXecӮ4 $wu$\N\}G>n]2*YSl% )+"ZcC>&q$MMVe)RJ( ^aXܳ"~u)9 ّ1hEʠw&[* I'xڈT ĺl)_ћ|k20;/xUAO2əJ[\˩ Kê9ÂA']c3YVl¥ -$R kY0쳽"21'%f >HT64J$WUMpRʛZi@_zV/j"ԥ)iHd 75;)B-wBT, >JIKZ=n|̙yIs.~DLy㊛$$$C"m6/d@+SuZW @y%λ-*-Wi9i%9T/(ZY:>XT̢AJTbZBIzjAiRR&T,[L?"}s+m ZXJEIemNPM,. b5 ͩ*I&ʸm)jhtQ7O1=3󈘘X*ڛn%A(P8 0{R{3 ,+eQZhkSuְ1ҚM\("ZNĒzg6l)O^*){ZyDHUHVBěLą!)'QJ#kE&zGX)R$nqS.)ңxDq!][_ ֈLIX 8ss~K-u892,)0Gڱ$ ] s7©J˃VY>dmOL<;y!j7b5?(w^쪞vryVkҪxɱY\Dᢕ,hE fC@&۫%Xeaw^p:eaw^pw^Yޑ{9Yޑ{gzEgzEec :eaw^pw^Yޑ{9Yޑ{gzEgzEec :eaw^pw^Yޕ{9+$˷?#߫vFWE}hnn-QFni:K_B手%3)$>_w8l86<;YrPL21xww^̩jZPR~4<+eG>J\uneN| HRT(D;/xGc|mX1 칭f`9gzEɫRy/Zs!Cx+ A81m [ig|G4J7Z=ms&[@1%!/6A)A݌Yܶ0ȽJ4ĝ]ݲ|0.uݭ'm,grK;$:ᆁsn>`C}WqeSy+MSQWjvNM_}wkv@n>bΓn}mʊ\jJHH:bZ^rIarRRrqVʸ$z,mt ᆁ_]ݲ|0m,grK;$:ᆁsn>aQm [ig|D]ݲ|0.uݭ' ܶBQ8kIKҺ-+zv{Wvl 4 dLӭ % `F嶖w3mt wkv@vl 0SH;.쩧PPHw-"Nsn>h:E&Y⸅j #;Y'@vl 4 wkva:dP$=E&2wHAcWvl 4 ኈܶo;&BW41H8t wkv@vl L*Qdֶ&J9eBJT(FPjz}wkv@n>2Rl72ڔn(R)虉De~"f_]ݲ|0+[O&l[ig|C;Y'@vl 4 wkv ƌq%Fu%gYA5-Ld1/@n>hݭ' "fNB[r *BrJJA-*LO8 ù%f긱BG<]ݭ' dbD˱4֪yASob^w-"N_]ݲ|0+[O&l[ig|C;Y'@vl 4 wkv m,grK;$:ᆁsn>`F嶖w3mt wkv@vl 0#grK;ܶ:λda\[Om [ig|D]ݲ|0.uݭ' ܶw-"Nsn>h:l[ig|C;Y'@vl 4 wkv6w-!m,!ƕ֥bN/8対ܶw-#9jaI*uu7Bkk&'`"rK;ܶ3uKq\K5aO-HV  8qw-!m,w^Yޑ{!aJmJ/7@ b8_q?oqdQv'`x_q? o?͸921i:08di]mė\J Tո%ǜut\u.S5~rC*-(%3L*. VRDw$ܘZ 075x'ݓeM.i!*[|$#RҹY;? 9h7f`4rd!`*tF/_jyiOϷjerкb[Kw)B& 'Yj{LֿeG&?dIcY䫴[)ZʒZ:=#1=,;EI Ի2YL)Τ(BSxTRia_O'>3Yr0k{剌.Ėrj]Qd@ EؒT̙dHJfA.. B.Bp yS-g%Ʉ/,Wk<Uj[,pմ\rY.JUT NMhF)jZOAH-[ `[C9ag֜aI,a4ĵjJ 4^`.M%YʕmW $Mh'`+ԂɇR9/e%l%1IÄw-ݚӓ)`̡]PlW"W "cYyiY\O%})K)L)WbZ3d&u.uҧ BٴgKK3pi%R&ip֣BH+&fI-R))[an r>Sj&JBdِBZ\uIx(ǷL?gGe5Sҭua@[!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;&!iY-Ҳ[C=;>-$4%jmJOG2,]j%fu!'+h*)qjO٥ qyqjt7]oB<"[d[ĕS "R^hIѧ€i%SRIJ AXPKnɩ=SIf̚Uz5KY\@%I TTq?cVj]C6iKnRjqI3smjВja,gHeZxJ!#xbD_Y/1gU|ZR~d!xaBMFam [ig|@}3;Q3 8)CE>G ~' š>̻2-_ K+᪱?:ߌk ߶_&#ZV̪A1Isc]ƼP펭wD8@Ĝ]ۼ7Rۅ5 5ye fRWDRj*I8%VxZ5[/ڦB8Mj.|RĤ 5+iD펭sC?:όkef٢?aծc^(gVx\ "gVxZ5pZ5luk׊%&luk׊ծc^(ծc^(gVx\ "gVxZ5pZ5luk׊%&luk׊>mIΩJYxАyy->c]ƼP펭wD {Y}IBBIHJV]rPMx1?0f$Q,ܳn>8)TV8$&VZ5luk׊!ىz]n*8tKĤL"{Y[J~].!ۗ !U*85`&VxZ58BļʟR mP}*(?e\T5sE6sRk(8B*08&?:ߌk ~1K?:ߌk ~1KL~13c]ƼQ.3c]ƼP펭wD@D펭wC?:ߌk?:ߌk ~1KL~13c]ƼQ.3c]ƼP펭wD@D펭wC?:ߌk?:ߌk ~1KL~13c]ƼQ.3c]ƼP펭wD@D펭wC?:ߌk?:ߌk ~1KL~13c]ƼQ.Sjڋ}Sg:VJ31luk׊>${ZcnڙzJfj2- %•zD?:ߌk ~1DO$W"IZqh xj8ES 2RL!JBJj!7q"ub5K펭wC?:ߌk-{Ers )6mŗfPJJXmt&IeilIm֩BitZ5luk׊9KͿ22ϴ-\Z HqW/>qfޖhV aMFluk׊ծc^()L29V%HJZ])&Ri_[1Sˡly#P.ky8+Љծc^(]j6M.v)Bsh <3^iPWluk׊ծc^(ɕ՗7ayj6"[2+ɩ_BxEc a 9ծc^(gVx#vɶ܃)ֿInY8UNjI.ˡq$2V. @qVH"?:ߌk ~1xEK#0ܺw(F:?8gZȟFc.YϬF")y:킺VxZ5SVQlRW9eWC .j5E[#(W+26*"UVM0MEƄK펭wC?:ߌk_M8Mj.|RĤ 5+i^nvaݒq)T+3HU&0/?Bc/}f׳(utq[AZԝ@cu]-IIYI581bV19q%-˕ Dʯ,D$i2*m$:ڛ}IR*AZ8\"C4jB\naIUjyWFu>*7hvn\)i8Q/Z&X^f~o7r.P$QJ :Wi?5+!2\nV_Sc6UĩDSRThIRfWVpek>-/Szp9&k?ql@v&Uj˟@O|umyfګIQ)(L Mꂀo& P .ss!̑6Y8`Ђ'`D8!WViumkU›yWjZ*x8C"iVq O\>qmE][i"Uն.??s!̑4Y8`Ђ'`D%xAeJ\ G&LՇ([E][i"Uն.0rv :kUw 2"QUwMk%&』Sq8a&WViumfYq6,XL Ok!Kprmj?qn򦞑tQ?lE][iUն50>m" p*OC-UնE][iSm" qΚrRa,D7ʮ/ 99" "ʒmɇk\*nB <կқK"bZySR*RD^9FҲͮNTBeeUujQ`I 9伩o3ĸVjqcuhD&+x=q(.XJ+RenJ:C#[ WViumkL"`e5Hm?\ja WViumkL!*O " q02E][iUն50[Hm?\45ƦiumkWVm" p*OC-UնE][iS`e5Hm?\ja WViumkL!*O " q02E][iUն50[Hm?\45ƦiumkWV.:Zegg7^ uד=zYiR&)hPR Ġ4©MG7p"4ŸVSu UIPhEN>Ta,lXqe( Ԩ(ֵ%Z's s^z˴uP5+)&楓2[͇Y,:.7ƢIRNWY$c{ R2M)gS0.AWvTTSFεoHJ(O8I9iy4-q.&!?o"L4ykq !(Ж4qHHHQ7k)MX*OqJIg)CR/HB N-s3,6ŵ,HZBI#\mq!źIk B'hI:na%jYԼ̝q'B뷂۸Eh5yv̵T^m fTREAZAJFG:YKhq*=& Q['+\]ʫ56L̥k\KIU`9G%q2K6i*O.9cw S LWX͕q*Q%GԕF:Uն50vJt8fF}qݗRR>c߫WWDy%~-„$^QB7ksƢcIcdf6tPDЊ(ԼyWRe@4*iIDZYslX90Ki*t%?WOCb'GJz[j֕{QB%^F?/TSvVď4TɚQ`0ڜ2ֈKiq5FQ'XTۂiO2* QA\c!Km%JZ@ĒyHGi&uƖP=NvYYsiZNj0۝vLε4BJpPk7PPVHuFQt2\U6Ź}}ܫiX*EEEG%DvBB9inT$ I'G +JB+'tu+]UQB\:j!E)ՁU(B քR$@!@!@!⩆4ܪGBJhqJJA>kq iJUAh HB82Y\"c<ÊqЄ aZKHR\@51/9-4Ի<&e@V1ƜdDyyI^jZiaW]Cn8( G&-[>arjqA+ ["i@y9 DDZ2g99ef.k.SK"iaj Cp(tu{ 0 GTs\)q7pcN0>"nvRAͩWBp SˁU;($4fM2\jHFh;=4ijjUзTcN7:%2y Z8#0!&- if'v6RPSSh!TYay7.kTkx p  .L00dRR*h9h#JZV$Ah !!!!oz'W ~'^O#_Om??ڿLPYMfH59h+,_yf.5*ล)RXj1$^*4ڔYCK$klPs1"0QH$ZɆgA:ihʡҥp ` +UUYG,~i gԷk smĆ+\o]YH0-yo)唙Jɥ m NJWSF+-miʵ7=2Y!7y8e ]*i+߂M:R 4Aې Dx2wB} 5WcU Mg''눘l3 !2jKu*Kd$(RYɮnN[=2KC )oKȺu*uV@a䅤ө Kmlۋi.MPK$UCU 0ܜfǜvyvhD[ERBݺ\(kDy)IYvfUaW[G4MiJ*[ T5&*JjZ]TW(-h M7TCߪiv_ ?T~JT]i,>R2ɺ\Ż!$Ҕ붃3I6nE9o4ۏ2p!I eT5QͦJ[BP(I?i$hIZm VrL陂`2$dU**T?5r!/iLMpU%G?,Ir6.:5+4ہ(yėqrB ST_6x8ȷ6%2Š)md+IZ@fZzf3KD\TҒGB=/y$P~#Ұߛry쳯>eY-P_R(-]wh+Q BbNלve7~UݾPJRq Yd[nrvdNdBKba*J+Z)$(BJIč 2-Gږqyy8󍥗SD "JJnbS|1^Z9ɩL/$)e&ZHU ^ "'QmB\mi)R* !U55Kk/Ƞ7@*TV3JRVӏԥԷP*RB30BjV_vh 2Tq)/Fܮu+g2VV\r˪.aĜnNMi}3)VBsvon|(^6%m9faֲ} 2B7e.&E߮1Jq6Đ}eK/PKm`(BgN& u$guI- $񔷅 QzDD^@TX.M4WRІăȥyQT3o̳2 J9u{UFHi%А" `:@aċ͙4&U/9!9ZA䡹XU1,ܛ}0/)Z*bJZB 躱I)Kᔺ҅eRjP85kX"^a-'ؗKM̴iԒO)h'!\M%JQ R~I?tN[rqRyn-30s&xR@BBU+[ՓkH*J]Q*kqEnz:nSDR@dٕT͞gSH "ċj6ql J,&]NTHcBuah"4EV%R2@'\fiNM%ǦdiSJzajq_ *9 E.b_r5!)u*EV(WVB\BV A?h :@bT&m&dٗ2(m(Q*I$05*WJ&̟e֔2N\}ĄMԡG-j%1p(U@}b?*QmA<"ʵ^_'F4T/q]ѝ|!,.VZ]Ar`RTiɫD6N˲M:PjO'0T/q]њc *e+T/q]Qd[S̽wC*e+*! |yeS̽wED!oO2 y訄2-^⻡O2EUy\J7_K<7_K<W<.JqZrSu^| u^|uyϞo%8+,}/ C,}/ D]^||)jN(J7_K<7_K<W<.JqZrSy42y4E7˒V>y\ℬu^| u^|uyϞo%8+,}/ C,}/ D]^||)jN(J7_K<7_K<W<.JqZrSy42y4E7˒V>y\ℬu^| u^|uyϞo%8+,}/ C,}/ D]^||)jN(J7_K<7_K<W<.JqZrSr򟑏r^⻢.ϻنR޵,fbV]S(SqxJxR鉶 e.>RAQx_q?l&?X/1/*vsZNϙrg7Ԕ5n`<QN A@16nm.ZnyǶ96iq7P:7bN YBJhسJJ)#T[;TwG~PO.bxU=d(!Զg\ P* TJ]xZE1ڣŭS;FEͩr<1ܺTR5itQ8ApZE1ڣŭS;fTӏ%J$s.2.mO{ဏZE1ڣŭS;FEͩr<1_LS N<@Zu""0[;Tw8cG|vR uĩf4&>.mO{ဏZE1ڣŭS;x e[BVND}>sj{܏ |)-nQ2.mO{Eͩr<0[;Tw8cG|Hȹ=G6G-nQ )#"d\ڞ#8cG|3[;TwČSxasj{܏ |)-nQ2.mO{Eͩr<0[;Tw8cG|Hȹ=G6G-nQ )#"d\ڞ#8cG|3[;TwČSxasj{܏ |)-nQ2.mO{Eͩr<0[;Tw8cG|Hȹ=G6G-nQ )#"d\ڞ#8cG|3[;TwČSxasj{܏ |)-nQ2.mO{Eͩr<0[;Tw8cG|Hȹ=G6G-nQ )#"d\ڞ#8cG|3[;TwČSxasj{܏ |)-nQ2.mO{Eͩr<0[;Tw8cG|Hȹ=G6G-nQ )#"d\ڞ#8cG|3[;TwČSxasj{܏ ;hNMI;.Ka)$(q>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#g>|³"d\ڞ#>anqg_ZH!X:L\˩p BJ=%d\ڞ# Sx`"ե3lYf=.(JZT(RG! ~',(7A 90/ohd>QWry~Ȯ9JsȄ6qIp"Q_9p"Kݍu (E*'Ǻ~ӿ`(2’UVjB"c* "X-8!,%P=r)n(Uҏ2?bi1-8aj%W Vya3i:\i.Jv? Yé|ioZ Using Analog for Virtual Hosts (Separate Logfiles)

HOW-TO
Use Analog for Virtual Hosts
(Using Separate Logfiles)

This HOW-TO written by Peter Rose.
Converted to HTML and Step Three added by Stephen Turner.

One of the great things about Analog is that it can easily be used to offer different customised output to multiple virtual hosts on the same server.

This is an obvious asset if you host several domains on your server and want to offer all your customers the benefit of daily/weekly/monthly Analog stats, but not all of them require the same level of reporting or the same 'look'.

This real-world example is based on Apache 1.3.12 running on RedHat Linux 6.1, but should be applicable to any Unix-like platform. Steps Two and Three, and the general ideas, should be helpful on Windows NT and other operating systems, but for the details you'll have to ask someone else :-)

Step One

Make the necessary entries in the Apache Virtual Host sections.

Here's an example from my httpd.conf:

<VirtualHost 212.87.82.24>
ServerName www.ontiles.com
SSLDisable
DocumentRoot /home/httpd/html/tileshop
ServerAdmin webmaster@ontiles.com
CustomLog logs/ontiles-referer_log  referer
TransferLog logs/ontiles.com-access_log
</VirtualHost>

<VirtualHost 212.87.82.24>
ServerName www.nuw-maas.co.uk
SSLDisable
DocumentRoot /home/httpd/html/nuwmaas
ServerAdmin webmaster@cyberscreen.com
TransferLog logs/nuw-maas-access_log
</VirtualHost>

Here you can see there are 2 virtual hosts with different logging requirements:

ontiles.com wants to get a referer report as well as the regular access statistics, whereas nuw-maas.co.uk only needs the basic access stats.

Step Two

Create a separate analog.cfg file for each domain. It's your choice whether you want each domain's config file to replace or to supplement the global analog.cfg - see Step Four for details.

For ontiles.com, we have a file called (with stunning originality) ontilesanalog.cfg. The relevant parts from this are as follows:

LOGFILE /etc/httpd/logs/ontiles.com-access_log
LOGFORMAT REFERRER
LOGFILE /etc/httpd/logs/ontiles-referer_log
OUTFILE /home/httpd/html/cyberscreen/stats/ontiles_stats.html 
HOSTNAME "ONTILES.COM"
HOSTURL "http://www.ontiles.com/"
IMAGEDIR "http://www.cyberscreen.com/images/"
LOGO "ontileslogo.jpg"
STYLESHEET ontilesanalogstyle.css
Note the order in which the LOGFILE and LOGFORMAT commands appear - if the LOGFORMAT REFERRER is not before the LOGFILE /etc/httpd/logs/ontiles-referer_log, it won't work! You can see also that we're giving the reports for this domain their own logo at the top of the page and are using a stylesheet that will match that of their website. Not essential, but you can't beat the finishing touches :-)

Now here's the same section for the analog.cfg file for the other virtual host - which, yes, you've guessed it, is called nuw-maasanalog.cfg.

LOGFILE /etc/httpd/logs/nuw-maas-access_log
OUTFILE /home/httpd/html/cyberscreen/stats/nuw-maas_stats.html 
HOSTNAME "WWW.NUW-MAAS.CO.UK"
HOSTURL "http://www.nuw-maas.co.uk/"
IMAGEDIR "http://www.cyberscreen.com/images/"
LOGO "nuw-maaslogo.jpg"
STYLESHEET nuw-maassanalogstyle.css
So by this time, you get the idea. This domain don't need the referrer report, but they would like their own groovy logo and stylesheet applied to the output. You can, of course, take the opportunity within each domain's analog.cfg file to tweak the output appearance, request floors and so on according to each host's requirements.

Step Three

We also want a report for our own use with a summary of the usage for all the virtual hosts. So we need to analyse all the logfiles together. The problem is that the filenames appear in the logfiles as just /index.html for example, but we want to see http://www.ontiles.com/index.html, so that we know which files belong to which virtual hosts. This is where the second argument to the LOGFILE command comes in. This argument specifies a prefix to add to the filenames in that logfile. You can see this in this configuration file, which we'll call all.cfg:
LOGFILE /etc/httpd/logs/ontiles.com-access_log http://www.ontiles.com
LOGFILE /etc/httpd/logs/nuw-maas-access_log    http://www.nuw-maas.co.uk
OUTFILE /home/httpd/html/cyberscreen/stats/overall_stats.html 
HOSTNAME "Cyberscreen"
IMAGEDIR "http://www.cyberscreen.com/images/"
SUBDIR http://*
Notice the SUBDIR command at the end. This enables us to see the amount of traffic for each virtual host in the Directory Report. This information is not in the Virtual Host Report, because the virtual host name is just part of the filename, not an item on its own.

When we run this report, analog will give us a "possible double counting" warning. This just means that the dates for the logfiles overlap, and it's nothing to worry about because all the logfiles are from separate virtual hosts.

Step Four

Now we have to knock up a little shell script to tell Analog to make a report on the stats for our different hosts at runtime. This works for me:
#!/bin/sh

cd /etc/httpd/analog4.0
./analog -G +gontilesanalog.cfg
./analog -G +gnuwmaasanalog.cfg
./analog -G +gall.cfg
Obviously, the first line reflects the location of my analog - yours may well be somewhere else. And of course, if you've put Analog in your $PATH, you won't need the ./ at the beginning of each line. What we're doing here is simply running Analog twice using a different config file each time. I won't say you can do this ad infinitum, but I'm up to 20 virtual hosts and Analog processes the whole lot in seconds. The important switches are the -G , which tells Analog not to use the default config file, and the +g in front of each cfg filename, which tells Analog to use that particular config file. No, you don't leave a space before the filename.

If you include the -G, the individual config files replace the global analog.cfg. If you don't include -G, then each domain will get the global analog.cfg plus its own analog.cfg.

Step Five

Save the above script as 'runanalog' (or whatever) and chmod it 755. Now you can use the cron daemon to execute analog on all your virtual hosts automatically at whatever frequency you desire. In the case of Linux, this is a definite no-brainer as under /etc you will find the directories cron.daily, cron.weekly or cron.monthly. My users like to have their stats pages updated on a daily basis, so I just copied 'runanalog' into cron.daily, but you could equally run weekly or monthly. If you offer a different service to different hosts, you could have one 'runanalog' or the daily stats junkies and another version in cron.monthly with the hosts that can't handle too much information.

And that's it! You now have Analog reports automatically generated and customised for all your virtual hosts.


Back to index of How-To's analog-6.0/how-to/logrotat/0000755000175000017500000000000010161303533016001 5ustar sret1sret100000000000000analog-6.0/how-to/logrotat/index.html0000644000175000017500000001723710161303533020010 0ustar sret1sret100000000000000 Analog and web server logfile rollovers

HOW-TO
Rotate Analog and web server logfiles

This HOW-TO written by Brian Clifton with thanks to Karel Kerezman
Originally written 2000-06-29. Last update 2002-01-04.

Purpose

Analog is claimed as the most popular web logfile analyser in the world. (Details). Whether running multiple virtual hosts or a single root web server, a useful feature is to run Analog and then roll over both the logfile just analysed and the Analog report file. At the same time, the logfile can be compressed and the Analog report e-mailed to yourself or the virtual host client. This can be achieved quite simply using crontab and logrotate.

System

This example was developed and tested using a default install of RedHat 6.1 using Apache v1.3.9-8 and Analog v4.11. Also running on RedHat 7.0 using Apache 1.3.14.  Please note, this is just one example and is not the only method of achieving the same goal!

Schematic example

Each week (or any set time period):

  • Analog runs on the selected log file
  • rotate and compress logfile
  • rotate Analog report
  • e-mail report to admin (or any e-mail address)
  • After 4 weeks (or any number) overwrite files with new ones

This results in the following files being created:

  • combined_log.1.gz
  • combined_log.2.gz
  • combined_log.3.gz
  • combined_log.4.gz
  • combined_log.html.1
  • combined_log.html.2
  • combined_log.html.3
  • combined_log.html.4

By this method combined_log.html has no meaning as upon creation it is immediately rotated. In this example, apache is using the 'combined' log format described in http.conf e.g.

# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

<VirtualHost www.adomain.tld>
...
...
CustomLog /home/httpd/path_to_home_dir/logs_dir/name_of_log_file combined
</VirtualHost>

 

Method

Each minute, the system crontab checks what jobs require scheduling. Scheduling is set in the etc/crontab file.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# column headings - thanks Toby
# mins, hr, date, month, day, command

# run-parts
# Min Hr Date Month Day Owner Command File
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

and what jobs are to be run is described in for example /etc/cron.weekly. In the above example, the directory /etc/cron.weekly is checked at 04:22 every Sunday morning.

My /etc/cron.weekly directory contains a :

logrotate
makewhatis.cron
slocate.cron
tmpwatch

The important file is logrotate:

#!/bin/sh
#added by bc 23/5/00 to rotate apache logs
/usr/bin/analog -G +g/home/httpd/path_to analogue_cfg file/vdomain.cfg

/usr/sbin/logrotate /etc/logrotate.conf

The third line runs Analog for a virtual host. The last line does the rotation. logrotate.conf contains:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# send errors to root
errors your@emailaddress

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

/var/log/lastlog {
monthly
rotate 1
}

# system-specific logs may be configured here
# Added by BC 22/5/00

# rotate log file:
/home/httpd/company-domains.net/logs/combined_log {
ifempty
copytruncate
rotate 4
weekly
mailfirst 
#mail your@emailaddress
errors your@emailaddress
compress
postrotate
/usr/bin/killall -HUP httpd
endscript
}

# rotate Analog report:
/home/httpd/company-domains.net/logs/combined_log.html {
ifempty
copytruncate
rotate 4
weekly
mailfirst 
mail your@emailaddress
errors your@emailaddress
nocompress
}

Note the first part of this file (up to # Added by BC 22/5/00) sets default parameters. Below my comment, parameters over-ride the defaults. One caveat of the default parameters is:

 # send errors to root
errors your@emailaddress

This does not work as etc/crontab has: MAILTO=root which over-rides that set in logrotate.conf

The part that does the rotating/compressing/e-mailing, follows the comment:

# system-specific logs may be configured here
# Added by BC 22/5/00

Read man logrotate for details concerning what options may be useful to you. Another caveat is that the man file appears to indicate the order of the commands is un-important. For example (RedHat 6.1):

nocompress

for /var/log/news/* appears after endscript. However changing this to compress will not work. It must come above postrotate.


Brian Clifton

Back to index of How-To's

analog-6.0/how-to/iis/0000755000175000017500000000000010161303533014732 5ustar sret1sret100000000000000analog-6.0/how-to/iis/CGLLogo_sm.gif0000644000175000017500000000771610161303533017361 0ustar sret1sret100000000000000GIF89aLZtJ`&1,92AՏSkXpUle|czܚ___oooVoZsZs٘迿߯///???OOOSjVnJ^yqߍ7G>P-:ա邖3B //迿,LH `` 2x $LP&Ǐ CIɓ(S\ɲ˗0cʜɒ≊ $q Bq6dsCh*]ʴӧPJʑDVMDsgH @ЦChӪ]˶ۖ %V4 6ቇu=x'xLÈAhjŠYW"ٯk̹g}` XGX5ϰc˞ݶU"K4\O-\ȓ+ gƭ[ ]1ÉkΝߤ'\usJξ{6}8㊩W>M1^1pXwZP}WQ$VzֱVZiE]p[!e$A %8ENwCB(^Ah'd 6c>]t_H*'euXu=>&C;-X%喞d[1T~w}l8I$VhF(\CmZ Ugfi%}eNYN@_U$XE*J=WxWDd9ܨzbVeY5\5vYt:xY$쳲YEck]ZU⏣ ~XV>t keenUm hEY a)YDF_6ZT憗Tz #^g&_n(j}wf $f^^hs6D쳅R%>duU?7`y]zQBFUNw_~tu ݵvXQA1`x|߆N*-}'8߀7ih\,ngJp}kn:U1U` aU7}P[F/ NLA;mj3ZYǚ%ɓ/a8&5 W9RBዿxdѧZ_5#XdusbMW:#vpo`ަԠ)!&p&~dbR;28!bB5. P@5dH< (`[1u`izD@08Q` p 1\b2| ! %YcTǀUwW48:,E|ccd1#bG:s-Qi#Ka$: x\`ra.cssJ[1?=4+Wm7#ǜ0h*aƀ&]tM& 64֜|e…dng>e=࿞FVh^嚧oR챣G;_䙶O{h-q)/G/w7Oog\fu/oOv/o HL>8'H Z̠7AGDQB(B܏s%L S0$Jß qh@ 2gP bı(b0*RyX#N>H2 db{̸Ė]cOd:bэmLl<1H'3*83 rd"B4Jf<"@vdHt !~B` z 9Rvj ##gI9=d$ ID-QteI+^7q>ysqVA)D>Q%ry)eGdYr,e$IjQCE*Ȭ\IQ$[H?D4w5JT89΄hdyΎz, 4";Lj'&VG:-0eJS`r c>7}¤+HnRQJ(P.2J©b4v; ӏzS[tc]?NR5LC)J&No$tq@@DЀ2<*3zfx䥗U~HtsUaju` hδ詋QOSK򴭥j7k5dUoGU@smxטh* r OPR:E\,QSlyYSuvhp/UlOԔu'+K[v Zǻ> M#ї2` D9ҝa rJ2A{gyOT i#kzm}keHm|iIrNM:\WL$tWk W23Pjj!͇H[UX)jY|\ƻo2)ղƮlt_246VoodFOlNi|*fgvܟ4kMmgo1Rxyfr0h}F<(*7o>mGU-q^V ^|K> e:IH֙{]3KCſPV9ظ~b9l&=Pϟle`]+/_IpZ['K!5SdzWeW?ƯaQQɸ^lȇ FwYO8% x̐+ez:O?/_so!^Ot*Ͽ8Xs|TA ؀8AC, "x>摀1e*,؂.01O:<؃>@B8DXFxHJL؄N?xLq l8HsWZXY]`bexY(B1bWh}PS/f儇JSȆ[rVt8pR륈ĈgWW=\dNh灈"ʼnm( PB^(CHHDRc>8Hgg{8G_ep_xN( OgfMƨZ|4qwHXagƦ8HCqfZa7(FpYLtg򸏯Dbh&gdH_&WVwdA)$5+{=ĺL;ʫ<\ыĿ̍̍,[ơ{̻lS4k/-B*s¤)k,̥J̔ \KAto&Mo|l] s6 ) OC\ [['x7+T$=*(u!]9S!eJlџL \JTʌ@tk*+}HԱҚ6Dr*2ʻӹǠ{[m\@ *MACf}hԙ|2&Q XIp]v}qПV:x]r= cl}؈z]]׉QؘѼ͚ؐM]F:a؟ڪݮ-=+ד}]*`«۰< Ŭh=PۤbW| ч,ܕkݻ%mݞ|*.< p$Ӱm-Vj%^£C .LӢa}M kN:Ug?Ut,3"޲ٙ׻cܿ_ӡlL#D8NjTIJުQz Eڍ}߰J=Aΐ,dտMmԯL%ǽ) -[g&1޿l|ݫe, Ə>k~l`n=F hRI)Rj ž>XnZ=د0&$j2خ>vgׅ*Μ|̱nڌvo5N| c\ϮnN<rJp n筪@v5<qZ;yeG-%  9~9"ۜޘϲH{湺-A}O@ pB >QD XQF3>80dGD1G%]<9R4]9H%$)ET)?5-l(SJIkZ%U*J-yƝ=}gZ~`S\Ũ#ʽ+fzկȿeFulΜ6iFl0_yu__9{urެz<*L\-|:i;Nzc}s,{p)g%xws]CggpPVr[>9t{=t~gO/=Ԯ/A%k%\)"? N9L}Tdq}Xn@{ͦ9 i tt;a   @ӭ|TJ' ? + Cs̛d45HspC3+LC (:21#StEۻ@@)5LG;#TN;U7۴SETQ.g=t-M`IW)P6XU#t 3M ud,WoHF38smRH#YK\e0,m }LmK2ty:2GG]mu6lA5m77NB9m}xAc K3~e?wġ{ɵm'w)Xeae](`ҽNg2H{v#<}:d/S LӾN?0b0mc[2pZ5!>4E9jt 8 ؇ܲVkO苻"i$W'tK>=uWu=\\3hr&;_Z6K-B^K]'_>z핾zz=W52*ڿkh6߭s߇?~秿c|ÓBGf#߳XπD`/'S42P`5AvNRA%Da UB 7!!x25aueHZH1EDbpf?C!2zGbE.2Ɖ҇> `ȼ5ё$ HUAdK[C4xU 1De*-8ɉ.Uy$SUuRB[ەrG)U9LbӈCfqhG>-qe%MamWB[ԂHcvӛ߼"2e,\jxPhiz\8k&&8O~Rqe %5IQꦹs@f#~VԢ8TDTJ- cCf'|{iLe+c07{٭jd!EgTVQrJ>:U9>1sR:UdgEʉ0&cM+Wֵk̚WuxjEBþկEK@LVsMld%K>$WNֳM]eo12Ō$΂ֵh U{dyY= [KW [&%H%rfjJo?׺%KM+T0|-G0އȫ.idOq]u;_HO<33?B9Rz694WES^![_78"5̉邏<#uz-Oc[B?|.'F1Me6quw7+w*XXm+ ӫSrh|'yQ\/(mi19hk~s?4Gyυ`ow;zN#]JgGݳSzϭg^d:uo]c'YkOlq#VsxuEpU/xMq7"osw|}y#^u|y>s^}'}\Cr>g]h>?tmuܓv{7[[%~}|&_fU]Gӧ~ig>Ky#}~}mn}_ܯ$4D@Qt @(akssJ[1?=4+Wm7#ǜ0h*aƀ&]tM& 64֜|e…dng>e=࿞FVh^嚧oR챣G;_䙶O{h-q)/G/w7Oog\fu/oOv/o HL>8'H Z̠7AGDQB(B܏s%L S0$Jß qh@ 2gP bı(b0*Ry(#N>H2* db{̸Ė$^#Od:bэmLl<1h3*) rd"B4Jf<2@vdHt !~B`%"z 9Rvj ##gI9=d$ .RteI+^7q>ysqVAL>R>.i% _"kIr:F̥L F} eh;VЂ'EIl#qTѨKkfBTg(Rfzr;i97ѳ3xZy#PKBҜ`>dJSqja3?IT6dZfBCWa)#~3LZә'&)ӲRmikK 'q5׭,)wF@0v vXVBk_ سfi3gkJj_޷`tk[srh= o[T6|lO#&[=vK,Ve `wx%'Ÿ=hKٸjv9~m-_|t63n4[Iy~Ճ$!Wgba|I$Tm>eg[%iJE-w24g]v Fnb]O"n[ =MOsWHq#UD&fzڅWiB;0ɷ˞ï/tϼlM{7&.Vפ=꿓rq,H"8OQORoZ|O?E ̿8Xx| ؀8X =Kҁ "8T$8Z,؂.02?'aHa~)8 <؃>@B8DXFxHJL؄NP48^9UaZ@q']`be]8RSwKanE&8>p8cuHNwy8wXyqRss4d쵇#Rч=\EH#Ȉ䈢lje7~^rh"eSQD$~gt(7g l6if(Cs8>!LzwH#7k&&EØZ]V( h|6DՋ8UxcFWQ;Go9FVxo㨍$Yhsȏ^'ȎoZBWoxy󖑿eȐ¶͕+90yg2,鎼x8ʨc7ZA5)d^*oHiRH66kX($)hC6ckP6y;ZV Y("IxlyS~p闔r 9TgN%ph )hh[)oɇ 蚃LY9vy)!pI9VIB99։i(9Z_Y93iB;Izpyɞ 9uٛ8qvXYJYYk[I9G9)*ɑC8ږ&:BZI{yEzT;j U*HI[QWz~]ZYI!*iVaBfYU1|çڧ @:@Byz:ZzکEȨ9EhcXz*A#Zz:8:ZѪD]qfڦqwwTtڭ AZZ20ڢ:Z}}4}L98[AL$J[@t^@J?qC1!/e+YfO۷p jiqY;Z{O7 KTKm ,+,Kyk5a5{ j-KtW+; 1b 趝 L^}{a_K+A[F{[ λ kKY+c+ī;˳  !3B_x+XFg{ALPᖲ({UˬX& K˅֛lkf˱>۳%K+K `!õK; EZ@ [k{¬{2ƋaEB>ύ ɛÃ-߄#n2%+)^K*P p6nҳjH m>|~tNv䃎Dl~(|B/nb]zR7_λú.L8m !}bXN#TL 弞lO,f&nu"P.+ͮmq=^  }Nm l]N^s'$$Oۄ^lJr.,<@̩K̼ˬެr/2]oi,]}}ւv߆Ȍc!\>"2?3˴VnAa! H/a/k_ O}o/}ՌoE"y*7"%d]R^SՑE׭諑 yc߳ O_ qtlo<٪Wo="1W? 4` B >QA-JX|$qH%MDRJ-]SL5m<*I BE# "Q"*]Ԩ@Q3BX(֗ Xe͞EVZmrx dܹ)I1KcR~exUoC UqK/Vdʕ-_ƜY3ɰsŢ̋5tJ6_PVHЯҪؗ  ;xm]>Yr͝?3O>&uiw=;)4Z0G(Bo{ qG[2J)lE@!!E5= O"N;3.Tp*-6|#B]K "QK+čԳSO?N+1%7/JMrW]Po5W]u֔(HNj|]eYgեa`}V-e[oe(ZVeܶ57]uT\#y= ]z75} ^F8")`/8cI} `zKP-ָe_&OM2ԇ>> b~HhQƓs>BL?af9&iXlFG=DS XYF;_G l=9A XHwG {7ci˖Np]{yaC5$${h.pGW[+c{  L0U!Y'.u6'TM# 1ďp҇'^/Z@Z/ kV {<71?R13gRЋ?e0˃LdR螞v=#D)Vъ'ie-$jы_ ?F,g$bј*эNT1юxG>Q}tX9 э{$d" g5"Rt#HHVe<#%-ɋad(I0RDEiJT2]"+]9nҋe.eK-R/K`S´"1L''yO~RfIg?z|Eh9J4%?PV&MA-`thHYQ T'bA-iRtS*mF]:q,iNBT?BϹRը1)}zԙ&uKejK*CFSaURP[hWMUVT%$kYzVUek!VB$tk]y UkWx%: G:&ֱYlXʲќ]\+ȆfgEYnUliyZVd\_Ɩtm.m;:v]o}JN=eqIZT;nsiGFWDl3JnwDW%/!{A>7meo݋6=[}+GF5kz_Uo'y`X$;2)qw6ȫq'ENe/Oʣ-s)7i;=>*&tI89Gzҕt(SOzԥ Wzֵuw_{>v'8B{վvo{>ww{w|?xG;analog-6.0/how-to/iis/IISConfig2.gif0000644000175000017500000002323110161303533017256 0ustar sret1sret100000000000000GIF89a@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤,H*\ȰÇ#JHŋ3jQ": pɓ(S\ɲ˗0cʜI͛8sɳϟ@$EȣH*]ʴӧP$ZXjʵׯ`ÊKٳhӪ]˶۷pE{ѹx˷߿ [+^̸Xg*j᪐3k̹Fp4w#;kװc˖z $4ë[ښpŹ&75gKN/#s& &2,mOfUxt˟O.зx^y 7`E{ ȠqM` Za}v(oi_Aa6w`-,ނ)^.h`62@dd$x";"98#O2ףעJ )昐n$FЉV 5֩exZ٢WH柀"FAh$}fYe3>)|VZ']覜e#ZdnlF:'ܣ:vYajPmؠMv:F?Tk"I-Vl҆+ohH(2lk\Ixl'G,SpgKuq ,$q(0,sF.l8\sIB8,Ռ,LfAG7 Q@W͓XtAQgU9+5.w=vR`,jW5Bkw}-*e-E7Ch9~N95jސy4doMؑ"wzvH/kE.vxsdqN̒+z#?;s wg_ݧ%< >%V}{߹]&?Ѐ, vdGwgb^:6O |τ! w@Ml+ h ҧCip ixFLn",C8ٯ~c`E(*tY&`k%htq ό#|iceŸQL.Ep&o sx!|׍#1Ll2w]kΎ3DC װUp;{9yƻ)?9P cxMe&i p-vg6ߟm>GMƋR LikG\*abCEb  i푚 "!߬DWK9nZK,Dl!ACr4k Ob9ҟcZP?2+*2ECafQˉ١R*B:& U2zrf] S Uʞ7%$*,3*7*mC4@ڦ[m  )C^ݩgJ|*F!'[>b˲|ZIh噜Hb"Z!"ǝ>x0E4Z ʜ HѠVڟy9Yz֚غ)oڤzkژ芮Sv^J_j/隯*cj3ɓz:dZbZɬڰ+Nk{7@ʱT籸"L; K~'$ K&۲ 2R/+1&ٳ>@TRHJL۴NxUȴ V{XZˤ9r^;dkf{njc۶aȶpkr&m%s;o@y;Fu4) 97[1zNd T66:eaaj,)L~xbE[` JTaZhKfXUpUXUgzd9)VXTzVfU4i(ֻlPt巓*TէEdMFioihUľClZk4{{ +}Co,}6|kGB&IqIi'p9&mLj!5}uU p'SH[p~,~$L2 Q;|=LpX8(țvA Pk><ŀ[e,~(`4bGLe\^̒kL\ csiXH|]sܫuRǜȆlZm>W\Yr<ȒtJH^&f6_Eʺ&tɽ0ʩcRLh8 _|4( 3(xok ɼ&W!X,S%qx9<ɑ7[Ӽǝx5_ϜΰdD^8grz}"Ֆբ-UҬl'a2ܐ}ϸ}<㽍O J`lӵͶ- p -߽Mߘڅ (֍-جܷ-Ǭ m|?}'=-܋R,ϫ,߼,W@]:N2ٚMA-k^ x,~Mھ]݄B̃нRռf$^D"ޡ=+|ؽ 8~]um.hr>ӽԜ|> ]څ.pN_ز=Ԛm-X .}ܳ|<ͫN^-U 3Z4>~:N6I~ɞ뮾JުQ#QNMRm 8*i^LSiΓn[~Αey _c#.<0O^j9=E<=IfQMS,]ه nր-XIZ鎅 m;>-F:' 1*l0?1E?g[%-ptnښN=>1 ڝh#jnjwl_(0 4t<|2xϳzx^/O~OȀ)3A[`(#FKoSlO2L\%c9ZoOS/(?~_{/5T Dh50MOot; ,5Ĭjg{ 6 X4<ߏ9 OcI 5/q@@ DP!BR6<ąIQHō4G =d(U4c̑MĹrfȊ=}͛(3jN>צ2QE&̨+;!ẘ|{*m$-Ԑ"[>[Q6H*3'P s3#"rL7{ܼ*ԪB.,ɟ@Sɰ’(C(PDe4RQEӲP[Zoݜ[[ [aeneWۭW]_7__8`&`\zم7b'b`_7c->dO^ d[EVc_9f4~eu]9gOVVK}杇&g9ݙfiv{5iWꋏ6Rj뚱XUukXm.f6;oox㏯wxgwy駟wǞ){Ѡ[+[NB ?_}GBwh_%O:ӟ' dC@Vp2>} t9@*pLXIЂ/K00;!qP;̡C8BU qS`TD&6щO7+<ADvqlADO& AF6эocԆ* ^)I"E1e#D#%<0|{XA yȝ%bU,WV+\ӛޑf9}Ӝf4Ys3e:Nz Yd|O&?ZMh3A6SV%M25Nsc  hє’~LIQT$UIUJ^ld1aI2T o * ЃG`[>#?)zrZM`)Eԕ-)܎MN.\FòЮP% YR1] Aڵԣ`Vu&5>#PPoWj)ò")˘FՐg`t,edukbr`[Jؘ2 jp[эd`ox:rlv';R|tVCJϚ-X#IZ6elG]|ڶ,nЪS==+/b5_-"7DVTqpIZיknn+{xh Y%~C߆c0\xX8X% ʠ"/Q 0A5CY#%!k1ۺ>Ų8,Yi]ʼ/,̽q[- 0_yB} M-|2N3F1?|A'yџ>Ftl,Tfr&]*XɚZpߧdVki!ڎI!QtmTW>vs=lQǜۊդ?L IGu% \>ef#G]#f{ke9sL|82ʗ0x[>|u/RI;)^q}d 8l7{|ݩfq|ڛZȾ-faUB8#^ݕ;ٌ31Lp w;@fٕTiG>m-#P܁xxgwfw m> ,;m˧' {'q| wɓiq{fVrݫtb'XM#)/ V};gG諽G?3&'E/Z=}}x9z{̓35!D#̩ 7%4&|/)'*Lvkq.t/,0s"W134 .dkr Z89L:gCC9$#C= d",ļ;_JDBAFDAԞLMNODK\|ʰR4SDTTU1>XH|,Y-|[EEEQE,̧_Fa4Ƈ)cTƶetTYgF i`Fel4mFaop[$rsDGJTuaEQ٤MMܤSQM}ѓFZAAD|El=W|N@uNN|)NM O<;lONLYbJS;L lQT2Ϝ}(3N2<E\Q +EN|Ј N i섳?@QЗbEs%Q"hdL6IXn݋1xH9N\$`JXdzhpI"0JYXb_Ib6xl#K`)礔EASFx Y{d" z&Wj!>Z鬴fYb2? ⯠ݧ}h%NhVK+xAf[&~+hm[Py%jFʼ[KX 7G,xgwS},$l(Sr,0\2l8|1:@ͭ`BmHsL7- TWmWgAK`4 d4l6 p/@=z7~Pm߂xՊkݸvN`T-.`јCT^`w^掣yBc*7Ra$yD/^.;C~ !ДD:x>ϬCI~1Poϔ+}BكLןy#@u~([`p;pq@H@-z:I@4AVI>!B ц1<hfP( z_?H.&?/!2&)^CBwR 8G4VQc=0PvhH:1ЎucX>_$ #Ǻ !kd~Fqv=9iz,eDvc$"A"2mUBr^ e-E`ҕIe%iJR 'm)Giqf.YJh" ];/RSDe}IMsN#9(yޑeb=G:z$eM#rӍ;HSj %% )pU; :JB 89ϕ3ht@)1T}2lJP<QNԕQTVR"j'J6m'"NͫFY9U[,&V#m&&2ͮ?k֬'^ei5^9V j|ܥ؉1u&r{O"+YPs,fcBž,Zkw3N/˞6d26֣nSIXʒeXpZ W)ZV\ӢKq׭EYrW۾:[- 3Ƽ7c}i{VO:O::n2-]M/^2%yQEN3I/K M[2-< w{pob!68-,X"M=}s!,'L^q|ZóSiK!?Q]`StC'rR-7;3d"6 eE򲷣 m'9a 8q\$A'}1B [>Pt)HDK~EoAzg8$1L;z15u1O(hθo8U^+ֵN3}Yl/'{umlMGuΣurf%u99 a ${[ﺩ_D;F>asPry޷]wn{+\V(÷ {ǻVeC;(?Иwv{;@ܨIc%wROm775o|7UJN9Pe^̫9.K.o첼%3uӴ`oڅԪ%#~.]|Φ{N^r;񐏼vr{|AOUe7Wr}\oy}qޟ[ݧ^E>׸ďQ?w oL7 >{Ko}_/6Gl%/:Ț38sW}/N!RQeQI (Uݡ/8Xx؁ "|-&t(5d2UdH,O'i8Fw8:P(~c.A`Dl-(m6I(qׄ3gAagm4b KKȅN]w|BVltjvsgtf.H~`8#WtBxt_ӃVwd|86XgWx(%zȈ4nyXyr؉989X6VQZ؊8v8sȋUxhX#،Иɨ4Ũ\Rh7z؍8X~5{z9;6VX{؈C)885|uԂ"@󊓑7ݧ}'rq(Zr,Ԓ ) Wya9Їvñρ/ Q69"9;X>&Xg}YC9ٔLJɑW<>3@ĆfrCa8L,Bb*N&&4BUyWw'))Iq~M UH 8!閆Iٖ,kٖtYw9Xdo]icI9&ϒ/II% yyxy)F|o ˜9Nɘ6ɚUᚯxy3 טiO[ȀĄ49!٘nIl˹Y9v98%C6s7&=Hy,ҖbjMyy5Hx1-h8Ƶ[ٞcd3f9)*sEjYX (0x Zz(4j82. :'5uuEȕG è1B[DKz4@zM8XU:Yڥ/ZAdj`lڦnpj/Uƨqau|ڧ~FsuhR;ASzw{٣z4}iʣ2꣘Z%é0*kڏJzj=X婏b*f^G|w#Jʫ*᫏jEi%HEʪ4Q5'z'Ԫg ߪF@tŮ誮 +Ѭ;0Bk [ ;zS0JAí:Z BAUvDGohG*: ʮ2::+;5Q=ozFfK'd󊯨c^Wȅlڲ9 Z.KZ{ $Eq4B'c I{LtSWrVX˰*7+ڲZ+`YxB8{ΦsKjJ?V|} T1z +:pDU}yo|FgrgQy+ W ˲X_{Xn F[{tDXk6_`(J.klq3-Uǔy,YoIGj6 xȐV;gSxT*,پ^|[+f4/R1q,XLFB}t8ɷ H#̟[Sғlc65!HΗ∙-1،dFT6xE͟\ ͛y~{¬4rHy"|P*lK<0ك܃~@"ݶ$ͥgIr;L=6|כ8mkЖ3MfCyRm6 }ՠJ}@Vg,EuLxL/lwm/Fke~q iMk=J 1=a;= MwUkF[3ȏȥםU Pƣʜ~!Ӊ]-ȁLڞ=٠ȵ}=ݱmŤ7ܺڡmSL۴]ݳE֝e;,(i}jMxa޳=ߡ}O%>h3|ܼ>I>MLL5^<~^M\d:/:"bh+AcS4N6( fN{WFhLNmZاJGD1HO# \΃QU+7“a^k-Q;PT%p9r q倎}>g.>߅$nސ~ޒЕ.ʙ芮"QѢ^wdkuPz=tic._ ]|Uw>VCKK W^n`횉qU6Ӎ +H&'O@xֺ֮f iN:ӖtĶP%i/>:=?sS ,MLPzgh`ԍLC_hy3:<>_CˬeS]LM׼0_UЬ͋Vϡ>lʺ^_ZlQmrЇ}ɟc67o_%}))ϜLA߁ "PB >QD-Z4ؐ21čL<R!ǕXtSfB3i$Xō;}D0()Bw/ @D072pB /K[0-G$DOD1EE)Zp:|Eo1ct2H!dz84F"dI'w2,$SI+r(13L1[ܒ.rL5dS2L/6礳4Ls4PA%PC->=DRtQڣRK/4SM7]-RIlt=!t,VD5UUWER UOYE{SY5W]gX}$Wt%y_ v"tgmì$cUQ56}i)p!Zh6^oTzݶ4W}jWȥχ.{^y6{[ =l6"j &^ ^5Z@馑;b8f~aW 9gJVc+b43f.BDbaDD3Jbi%RĢk8ŶYr]-BøF-1ONLFgwBuOȀ# mBxu"1At-|$H箝Lh%'{m2- `I>`/}ZzHoZv,_(Q?7:*``摑鋜)e7ˤ5$s NZ50S iV}RT8~tk ()nBM$g \p 86osl*F4W+:щviI_ҕ1m^Mo4pAj܎Ա5<3Z9XpGr _mW< Uˮ]#AQ(3)li2]E  : r%&,'Jk,Fm8t=}sou]5 nuxwgZl~'Otyx~.X;zԥ>uWWzֵTCch qm>vnj L:x>+,{N&΍'pyԝ{+ޝTy/ /fE:k'P6[y1!+ɣm_(7{QїU<==#Aњ{ =n#'=ܿ(x=?,> >k&\Bl㚁7ws?@>:=%+Bl)#A,|CC4{>ڥx1?뺿K(C$CB8KԾ9$CSL5_{7~-PRQjakUs;TdPEVm2? =%^bi[m1@ WW!;3T -P ͹RP{hXPLV8\ %.d qՉ| Z MY3I WU+5ьƕ, UQ+;Yh5Y}eNBk3{ZY=ZCڭeZ٪N[$۲MȳEۭ[t[tϸ5[4ػ"[ٜ۾ #\ 5EU\\uDžȕɥ\;analog-6.0/how-to/iis/IISConfig3.gif0000644000175000017500000002330010161303533017254 0ustar sret1sret100000000000000GIF89a@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤,H*\ȰÇ#JHŋ3jȱcFIɓ(S\ɲ˗0cʜI͛8sɳMR yJѣH*]ʴP!JիXjʵׯ`ÊKٳhӪ]˶۲ }Kݻx˷_qJKÈ+^|%2L˘3(d5u$[S>3s7Zۨk]d`UWu/Nܬ^S5.}u9p@װwn{Ckzշ?{O oqwy%h|Gyۄ=lϝG!A{wanF"q"Ӎhچ X^~g#_8 b?' mȤ5&HB dJ^eG6h2 %Kh]9Xx"J-tor6xdm &Wy'U 'ԥw%D*fFI晔v;֣d*bgZZdu!ec g4#W鯿4ld*~dos\JjZ%,CF{kksq'Ѐr:.*' #rM릓ҙqH[O]A1i]V`xq$-ТH'L7S=-TWmXSu\w`]bmh}4jpmrmxKMw| n'o#G!dK]&e6y*NK 9>ܭxUK`n6P3P!xb/@|m|G\xOO f*Pb.:KwJD觿H֕)c !Bu@4pn[ &@0#B䗿pp D* &`RxAvQ]D2τAU(~4 >a¤1 A> QAb?oKEy E. ib:Z1}#Za8=!q,!- }L` 0b!D3yEM*CQnz (WIUx~h8r%+7JU6P"Mhv2LZ2ԜMg0щJН&H5˒ԧ%Q:jӤ(m9C*LP,H%[XRqdNչ˗%fMŏ"}*K1~q\T_*Z`L>Ʉ&$~5c*AN0W-AJnT^jՀ|'H^3d&_ȯrj%cS>6TYe7֐)~<6Үm hY֒дumdBNRGmӁ6k -7NH{"K].3v킮 oI"91m[zoo潚t{|oH'ԢK߶l~ E-^ppqZވ} ~I)ډ!9GJtȊJ*J#V:ODuܑGL1O%!cӈaEyO5"A]) yjJ𒟼'gC."AfvXnbB$#l" H/>΍ekxH.H?džn$LL?Zȝl, JnVEs3!򤪛Ro!$C!ɢRd]],K6Һ2.s+J~yN6(g&7{sc]=ӓt+cӤ~,3kߪtKXhx?6]*mXj=jpwCٔ&o=*g[2~FiWs V]뉏O4*ķZx3|GwCə;`Yq.0p-hH7ea^[Ϊӓ-g㺶,9bS^=/:aЩ(bֽlƚ ;wo{_iI |_wՊGOz/ǼMW_ğ:]W~QwruO67\۞Џ]w[\۽_2g^8\vW|X޷ORrqz@v\~oph=GQHoV؀'hڗ|2cbpDwp5jBLZMK(*,؂.0284X6x81:|9DW&b>tnZ5kVtKTzNP9A 87leXu+Vh!Njb7yTH{ׇkRxXU{gx873Xx؏\`<<# ِ3UFCۈ 5#׌"9YV8HYkwI29"Ljy1I@6i`8+Y~<0L)&99Ey=(Ycfbwc?ٔ^CyaQXqADŽhR]]n)za9[cIIQ~vȄ~ O)_sIt&ryIsIYg٘5*YNetXONӗٙ%j:TcktݦTȕٚ#YG嚸9wɑXciՓI<<{YΉꛫ T*ʪb\Ozꨴ SيZ259yٱ2(3ʭڪ:'䊡 zQ"qc麯WzlZjʨz*Sޚ J|*Z S(*"˱ʩ¨#;Ċl꧹ ۰밦>?k#1⚴j\ʴ9~ʃ6k`۵$᳛Iڭk:ݚ{&H3;HV{zkZ9 +~˴e۶J< c [ڬr{ y[k3+2+Jz۩jP[Q!FkКdZC7%J(J #+١c\ xm 5 fXZYݻ;CۥIZ Թ'9G*=ZKv@(k*ԫ f+!<*6$먵K\pJs|ɼ\:Eٵj,ˈ4|̵ ʪ,|CG|茹|H+4Fk2 |˽|<7ܹ,#I7Y[<^9ߴL [kь Κ 2&+-ݬl%MM7̀=]ܧJѼhҿ-/1HiҰQ:8ݮaCW,[Psjhr}4| ]^z=q-sթHuwj]oӉ}[\щxsѱ̲~ԝدlơ]] ջڤG]M9ۗÇ<DZ7z*zMČ­7=Ɲd}ʽ6ɽέԽϰ,@ZMͽf5=Յ2U=mm-;:-^d!M ɩ5 ^x%@΢>^G8fjwu(*MuL9^Q@B> :nvMYqnKP9эzfd87RO%n8c~\}^`^YTkvg.9ik>]<|xz>܄N~Lt ~^ޔܒ26ʗ>ݞ\3]B1cfMGh5^@r &74^i{ry_ΫU3viMg ?nРiXNȮ~?uC]l>Noϴi~;*n~`VI8P\K[>A_//OD~~<,')~=137/797;o=vu_6t+TMzO%_+]ߕԕs8èﱨoy;OA@ DPB >! I@x@ŃR(p?=Ĉ@J+]t&A0kJNE<9Ѝ hR }ZQSLJESV]Z Pa2T$}s`˖+΅`ޙ_ Y d{am+rdl`ʕ-sMk߲jp˥%n6ڳj֭]nsc WX=Q.pC~mA᲍?wWӭ_w,mWngx͟W]9w·ѓ_|ǟ{ON?D0A}B7W#pA 'tp9ܳC?Q0 كCD1E-mpEg50kG/lDMH#|$I2J)J+r)2N&i73D3M5dͼ$H% O?܎IE=dQGLOB3Hc[QM7KE8tHxSh˔SWXI1PԼPssLjU`,؋^EL\fmMm\l'c[M6\gerTn/HE%Xˆ^h.ŋ.ހ~+&~7s%:+ &x_vϫҌKz]c^:f:.F[ma]YWnYOKt1 ILo>硿x:5v1P.ϞWQz1V~>}xP$>I"^W0^ `[@IЂ }AvP+E8‰xP U] e(C#ZaUb*Ma}>k|+5 bD!'$mi^LW&,o-UVdR9Yk[PǢmodψR(,u.Όs׼Tׯ-x#)<ةs|E5 ~ɍn\äx2` %z"gRv}Q0)52ȈT Fnlk[:G2S~1L|7D*Fh KC͉t&#u8]k4%=Ml|V.9F:&Jv-8L/i>Ӭg5u:1++V0dwg @0gD5HktH~e)nԤ):yR)eKe^t75KE_VS~EEt:6&թ6ZPCT*UjUgYkX:VլgEkZպVխok\I(Юwk^W& /iWӦE6AUpXZ XYf6tJ5kqIF;k4{c7KZڮeoFH8汶-Nq+Unf&z*梸V׺nv]u}`ϱn7+QRP[&,Ȥo|+ #vQrgpW_OFS/8y-risV=|OػkI여6z8߇'{d@tꔣHI6rO*%G]'Wln9je.x;Y&n!S -ҥ>p>Oʇ<.>Fa^hn2HGd{;՜9^sgQh)R\}eݶxk M@GOg;||{V[xO7`:vNB=˓lB{u{{_MsǬAnwϼAyk\~4~+fX/l8l7MC}o_Y>? @þYa <;߳?ZA0Lѻ裲==[Ka+#? , D;r囵h{:̢(h>,@+d;?{B$)tK6!L"'<ŋABB)>4@ۼ9A,@-D8M{?A4A[DT۝̻I ?T;s6 -V)C,2SkFTLNB¿ UdEݱZT )˘E\F3,C{^,<'`tƻ9O4 d BԸ {+j"ȂD Rȅ̡tHFmȋȌ2CSǏɐɎ\LjJ7;@J=%ѧW<諺gugǧϿ|y7_v&vuWbiX]Q_mb}H(bzH0A>^cW"Ju(Dxa뵸)$( Wq8rG )&mN/iݔp]wb)^f9A)dd'yY%\ܛq6:pygcwwdM^ Qejinr%hvꮼ֐kJʲ6,%+e^{cvyE {qM^Wk滮f/l' 7pWlMw,,O(,ɰ\P2l}),4;ь4D/MN?tLP)CMT3Mu"M#Rj 6DwM3u -5!=stJj7Yiwڐ3޸O.8-$!A>\qNņNy抋ĺҮ x㣿^yA-z© ;ׯgu{ ?SWĕxsߟ.>#_7n|+`HH}{@vwf`*8BzP7=`&Hհ'!ΗA)}fPy( ķb2ԗ(%LaE *ф/|¢)N\`m(/ 1VHlƀ"}(@1 FH)f\ٲH:%y (Gm2L%Ǔ򕰼OZr-wKV2f{0SK]lȴe1fr 3y:hDfجyLmz}ܼ7Ipꑜܦ)st3n48ć`\BN1ӕc,I4It%"C}RC,eT]@71iqXӞ@ PJԢHMRJv} Jo2]hR؍P%XJֲꤩL5W NES&Iԅ[Ĭ}kĽ2jT&WVi{s,$!Kʩt-Es2jڶ}lnUӸݭpB2r[v]tA܄5.FJ4ծxyW\6M/v[ׂW.{*~YM(w}IW@RKE/c Vc?9ʷ"@j̶Ȑj~$!`;e'r j<87 1i/UCN1bcM)S rj`vy#|`$mK3w9)Bn}:/{x1RM芥7f3-zэأLKwӿ=iCk1ikwuE]eX/WFvm[\ʯyK_GةȲ`b>_U-Lt 4hǵN<ƊCk5 bkSX6]HuK:UoF1s6qa;dޞ}[(F p4Ԩ ;,~y=qvy$p>ubmg{|,/>ǰ?fod|#onۜ勮tH0tFɮ;#kW9ſMd٥޴=OϺ߾ccsgrnYy14٤|5?^ؾcx1> Udtƭ'VƓBh@ZyH+tk{K.W*ы׭/yn iw6Gyp,R 3X3^K,;?ݣ{g$z3ӭo7GdŇ 8} ȀĤ' wwh'vȁ}Fwl"rt9 (C&(ny7FexWXp胉.he';nTBwwy=V=@8'̥uJ6p5gy:(/#nApreE_Ȇ冏f]'sIU'wxu}Qn0d.u+hw ~0GYvDu舏Hķ׉mXg~GmH%xvWwVQvfzŸ1T8vh'x0苴d13x-84f^cD=ceHS)s{5`eF(?6Cis :s}*29-j13ʸꤐ2\ڥ^]*wVʇKhiUC&c~dl J6ָS{j/up'}J/ rv|xz9z/ہOn/  yfz9J/Bg4BT$qvVFqs/`*bhX8^\? cb:j1Zj0Z:xVDa/n: Sګ%!ڬ6H#aKzx 3(kcJ^IJƭCaI+*ZMHXʑ:ǰk{>8i|yRXxWVLe2F) jWRyo:T#u(;V5,U=dErTr5|U$-Ĺ0|vuAf\tpua-܎2eoF ?=lXCKqlk?[[F,sm8|ԼѼ\"1]H(*Ҍ. 0Gh{8:h Lq+#D]F}HJLN\J>̀i>^k+, ]{EݕW$tm6(2~>..u ._H9>0DF.I噽1>RMc_6ZVJ+8 L5]䈞~^ߌҋ說;)G?+4Ml͜.h΃N+2.~m.}9s*jF3M~ =Yb_nXw,QΎо7Þ}~H|_ѮW$,i5z4^)_Q_~Jg쾻DxV+A|,eݩ~|X_gN ;"$]XN-#v)궤N|8g)Iu<^.SD[FM1J.LLPI?V5Q_\߭xb?d_fh,|Glnpr?t_aJ_Һ~N|{_"[ZnpM4 w WQo?! W1p s`|?I甿0/կڪOWǿOA_ѮիJXTC"^t"Czܘ"GL2G)[XEdȚeJLHPEq 5j0INt(ϛ!9xuρRfU= jtձ`8+dڷu{N@U2ȵZ} v0N;uoaƅfx9f3Tj2^1Qu -lvF-湟}BKz&?|4seϦn[#az-tmCZū𫵢,ĤJlpBm񂓱/q4rpG*7qTHXT\1H+I*B|r$&IJ RD3M5dM7߄S,ɤK:aNSON4PA%B+3QEeͨ4HRKJ: SO? SQG5TROEUPSSeU>53VYg5W]wJ!{6XaMoJbE6YeouYgv_ZkZml7\qLRsE7]ue]w߅7s[^{7_}_m( ;analog-6.0/how-to/iis/IISConfig5.gif0000644000175000017500000002326010161303533017263 0ustar sret1sret100000000000000GIF89a@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤,H*\ȰÇ#JHŋ3jܘ CIɓ(S\ɲ˗0cʜI͛8s$ǟ@ JѣHxӧPJJիXjʵׯ`ÊKٳ`,۷pʝKݹj{6˷߿ ӼL+^̸n}2yx^ f̹ρ%/L1[#njaagM wlиs I{j4'zbN}[Yϓ|yǣ_N>zSg |{ç_|}^uueaY~ MAx_]am$ay,A .]b"Ie衅@8ax$褓pߍ yqC%lJh+r)ݓl~v]v R]bz=c`X'xI%XYܚm&oi'cs7dINMߥaZigjb$Idfiɪꭸ֐EkJʱ&,%N;cfu5;pIk覫NW+{e[/,' ϋpG,=Lgws 2D:lL#.S*Kj 5 3"t8|:\3=s<qB-ŴBSQ5j5GX'#t ue6Fh{6 @i=Oo DBy}iMpoAj7}2B<p:* FojS.; 8c,7u3as^y遧Kn;<:ūsS~yO >9[n3מ~ޯ{}Do8ЈH}[ ?~~cW/z+ r=/v1"<|ң[0@p}x7.| L!?3'ذ ~kAP8b6BO}`s .pzah06(#q (RQa6̜W:%ސ:M_d'F{!wdX> IȐ X${FVd49JZ_Ù(svFLeɊO`+aIZE-w20K]sȬe1_vd:˔39hƏ5!nr8i ,659.ztҘ,DжģSܣ:uO}F?PBSX?AQ 58Q!dJ{2`"v=yрoh9³'t|Ҟ@ PJԢHMRɇ$E]hYPTLS XJV&&Dʽ<\ CJSޔ4+Im5aWhi^ӽ!N]+(#.+F(Gm).:$hd!|)لml ,l))ۂ2 z۴Vȅ[Ok7Urw\n7-tW6ۓ^7-vGSp~7xӪ6 qOgYJ[oVlyi`;k]P CXnO{ GLX0 \ Z0gL8αw@r :˺K&;P~L)[X2.{&d[% >6$Q. k7]&2}MgڹŻ:)AT0(XQ kf@[Ҩ$ Y }|9ъN-U}ƴgMϹUd/,yԏ~T\TZ34lZE0P3$ǨMaGDե}X7s V׉ec-%m;FsP}lo~ps=x8gvnH$=6ș vn:+~w,kS6pb <%M\,.mkJv̳ s5?:xk+aFjy=׺lM{f0Evl-6tN@sebQހGr^ʋDǻ3ۺGi"h9˰ce^9 y7~¬{~b9%]ׇ{>J0SyvOGDOI~p7/w'!_Jy`xw}F~74 rX}r v"anzVoLt(K!'!ryi/6󆂿v*g:h~<؁ X=8,X.wq'8q9hTX~ (@VHE؅xxKx:wk.7-DžUȅBh Xv;'^}GXbttW(Aȃ(CHu|wXuhf!j(qh)xh}|:,|xH}'x(x{zzH؋lkӧpxиu+yf؇јwW(Hi8ƍ7Xhm؎lfƷ''H ~莣M3IG((b(eF|>h ԘzzD:tHox+yȒ)2ipɄ oȎ/j(F-9Ho經j!aȇh*9G/ SXhؔؑPeRi`g3H4_lx[)\`uy$wx8h7xBɔx90mJyk8i|IVדaG᧕qYɆ-/y68&ٗbHl:闀iiWH?Y4!XM99Y%ٝy"Iٝy0XiٖƖ3h䗔 htyɞЉ~'g'Ɋo މ鍂ɛy27y mZ/xjY"7m#*I"D,:ʀɢg  љY\yX^阘YhJ:NZ(gq+gʘs*qBٙEIɣ*}JyCꄄt9sXd8zjJiYנwz$_a :* kz XIzDj4 )颽xݘ) (8:z~z4ʫ6|:Jɦ JiiIj"qٌɯn3ڞ˯z>9 ;Zڦ芋_ٟv䪰檝.Zp$ˈ&k[)1!؃1 gp57H۫9ZZ' Rˬ]*x*?Jx+˱-q 骰jq)J `ZB;GP p:osz@ h4wZ ]jxCz[/ڷ۳ZAʪo8 ;vYq;H(*/lXi}j;oixcٶȣFYcE|Kϻ犸۾VȹJ뷡l3 |狰)۴[W  lܹ,E/ |)Ix\\4Zh& ٢Ǽ|2:{}-{k7#ˤ^;l˘rˑ5ڨ˲ p7Y=zoGƏj(SVH܅X,\LJD\r襴JMɺ S|ą7%|KqLDX*()~긣Ku-L_/\?uȋ yJe9Y=̳]LKz[k ˱[~l(zſΫvT z쁟{a{j|xqlmxIZҜL\؋ʋw[́\اCuz-)Vg̙۸ yK\ٗ{;-Vmbm=̨͇-=ԗƜlu̬؃ ܉ɨ]W˭=ϳѵCHYl Ξ|k ٽ[ڠiڗ'L-2彺F{(=~?Wnmyޓ.}.]y< +6$n1NN)0n|+8/^m=K-[(lԲ[i,tH?[`bmO/`,ݎMňnLX n>`Xdm'EjܮM!N|N\.y,?ȥ'oǹ祮S$}ḿreޕw ڙ̰^ʥ{+zj35/ۧ=ˎL\猽ۺ>֎ޒ޴#%lGLO8FZiM_9(սJ4T} R z>R-|wѷ֬k@9ΔkZ=*^=)Z~[N҄.MOٓ|tz ^f q \њ'?ҁޮ˳˺@_!MUoB\>|Lh+:^Z,߹ЭO}nO ) $xB >%2xQF=~%I4YJ-]$RJRdT̙1yPED1å&UT)Q^]M[|+˱^}z t!UmݾW.Guuy֬ʹ9[ݪ/Ms FXbv,(߼6yã=ڳc(ܷ_SO[lpIW2OsfkG|]GRa$.MOX{W#s׭Cizh640ZZD<TJS/Aػ>nBTh? 30<PD0T0Eʹ⃑^ C=@~ѼzjH!CLr T?Eofp8trC~2K4 D)6㔲N*E{ 'E#JRI#3&lQ;'-H74MI DVv{\TwH?_706Ged}֋>ɯ~]?nTqZ,'@YaBb@ims$ܙR9qP'4uuV/$!Y%t>ML^|~ APQ6k ,QP{1 E9Z 86 l[Yf5QE1O59Ў$Y9h60kd">c|9I< R{`r*Rғad$Y9 |d,zjnjL'CF}QdIdžnTbH`ɖa.% 7Ps W̩Pqc2la/>iFv "rVOj,rL jmq Z'BxZM 9OZzfwCOQ$x( C(G&4 =={AeⲛXQ.s Q[ JFj,768!5F/tD * 1aQ+M(#Ν#!U-B&ވχx/gBbpN.FT5~`%J;ʁXMb4#L∳!X?I{|)je{xdYw9[Ln -)Sָmm=G)ڶo!hcx%1S k V,nS peԠegfG]ֱ~r!yd])݂@:V0Q:fԠWJnL?W'^hT]墇YOMכfa Z̲F7[ڲu5-b҅C( ٥vǞ?Wͽ6{kmrdłg-rzgZ v*NXXij渰PψCd{;>lh* E3(r[L/*c|lU;QOpȫs];L`OU~Q[k%~</󪅑򘯻knZv6]4g:_F]U9&}'Y<ͨgXnMVWt?E})>[>!l@»U!6CX|gu ?x=ۿ?7h!{,d?k 0ד{ tr;@@Î6j{8kt?.L?u$Ķa 1B#Bh3DTdc{9H, b$ĻJ@[@Mw٬++B/ 7|0̿P;<=>??DD7y=EԈ^c>} IJKLDzDs/PQ$R4ELD?DNN<DNԴFϖCN`=tOtȗOC@,O%@ М1 PZPPjOdPP=Nt@ЏO O }O 5#g -:lQmQQlP&Q#P,@*Q'M!Cѿt)@,%;5R7C2US.RdF15ER09eRҜҙRC+C;S@DS0}F?)R>qD&EQ-G=TSUTJ=2щTGKeT8eQA%]8]QMXeTP' @QeHT!]ЅEٚeWdٜVxٜО{̡ $ڣIEڥMIeڧHکHګHڭ=HگFٱ%۲5۳E۴Ge۶u۷۸۹mˀ;analog-6.0/how-to/iis/IISSetup.gif0000644000175000017500000005661610161303533017104 0ustar sret1sret100000000000000GIF89a-@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`𠠤!,-@H*\ȰÇ#JHŋ3jȱǏ C$ɓ(S\ɲ˗0c8e7ɘӨS^ͺrۮeVooUHwsɽ wk>+_μУKNسkνËO>/y%>{Hz-Ͽ(hНނ gi[Df!5 ($x Z&XoД`~ (Ie?C!)l!:/rϑHQ~]ArOVTBӔW$UZb%[f[Ve`R9fpߗleHZe$oӊ s Ψhz5u~:CA*dj 駠*ꨤj袨qǽ8ҫ*무j뭸fBVT UnqU2B9,V֢q]KR ԭmڂ-vk.unێַk[(|WZI*TՎ{-\G, įA:wD%\$l(Wtb-[0qU!ks2OWDmѷLۡm33 V_RWmXg\?-v]WE5fړIƶښŽ6RmܣѭݏgTeum'N憓9-d+ٖgwi_7Pj? >OA5V}j{O'OrG>:Wݏwh1iv)埁>wY觯s/`CЧ*U6eV[w'i) 0$YK>0 @Ny <{BܔBJ/DbX>ѐO㣡bpJˡ K˹at&!pe:bs'*"T dbߥw`0,@BZ6igT)>;YXv;FsD'IJV2BFTEGh$-VQdsB.w^Vje'k[r.L2f/#梌)BfJs6nB,4Dͩ#.I:Ślf/p[§>| h=%=Ѕ]=A ~*ԡ'D)P(G3PDC B\Ҁ2m(CyQ"tI.ŨB)Ds)Tv0;= ӛ&&Vծ 'l :~Yj~զlOw*ԝFOU COWC,aXMb*-lrXnh,dYłPaCvvClgKͭnwַb[0DB.Z\%.tKZͮvzWCT q:юDetS󦷎>[oRUѷͯ~ԯM,jݯ+!/w'npH`X4uCVi\7Qu>OI|b 5#~A 8-WZbYau1^16,z=-CXκ|y s9qCACRԞ Qcκg=>QRf A4/%ZI1d,Ü+=#Ҳ=ުy RԜc(C;GIOF}3iĀ[U+]rAO]TZ|y֜;T(p=%R.ٯѝoWqZx;coڒ- ShO;|n\ޝx{dOcb+L XC%/kWʶ)?cakMmmh\1G Gk;]U6v-PRct}Xת;u1K]ִ91)K>w =DRmEN !޹mF5KT7"CBUY$#큶s 9se'n㢾~u-f}y>.,lts9uDiW n;vJ!~(Kڏ4(!ia'}L۷#η jW{d|% D`uwzwDzt>x"y9ug8Xl-*x.*ł c.pe3Vg/.d+-Xc?ȁBhI89'XNa'CRS\djWeڔl:Q2d<*>QoPF<PWp8yErtwyyH7@8~zAWhőGHB2zAvxXH{Y5f\x!fvUdCElL\PVQ9F́h xx#GoXmiD8Tw'CD'CxV|z헉~e<Ȉ$%Íh(8+81f*gCR&6Q@S"SBOvceV;jyz猇}ؐ3}H8o̴8a $y(y/ЖL& ђ.29l6k%FW(d#QD=URDyS*dVNd4֔ĖcrƘY?וfHf\ l65Fǖ/iR^f74{g11YLa/2ٜYL89(PuF8OI)Wd)\L虞ٞ1y ^Teis1Y( C  :Z_2GA :z$z(#Z,jjkg02:4ZWA? Z#BQAR7y6x1vSlDzGCz7rKjVzX* "(wp/ 8JZfzhjzGEir:4L):o0 2;EڐkJ3.s)QNA!GR!y!\k1h7D@$|&~'~Ɛvʨ4(;##-A)dQ"AbG4cwU!!RI2Ң:/Ț_[e_^_,ZfGsbA. Ѡ ѮZQa2M#48N|Y+gj {nit(Z%^DeY!4 9ʪ@e8˱&+ )q0M+9gS7U? 5-+QڳSzH[b jc:5lFV{V zZ:fO]JlJTbk6ӴԳ.i=m۷~ F!Sp€:"OaM0}DCDGC~gD5ԫ[71NۦP;MxqhEakӁ\475aAkAA4<Ժ+j; Έyz7Hݶ&rHv#}{hkԣALuVkq#F[Fú_a[M-_Wv3:Jʻ!4'G= 3Ʒ\%E (*,?njǔ?X:1IǞ2[Ć@B\DlNwЩ% <\DKve,9/KqʰܝgK$=4/ZUC$9%%sĂ334}"(82 v>w/.<\ˇ\-GY fK Ԡ ֲli_K{1XWF9S[:WJ-M,|=10lw47J7m,~dn/b)cȓ;F9f(F yc\ٖmʕ-`Ȩ}N^؊שcuh,{LfHm/(}WLB'}[ېiuv֭tm5M34/m[(y]mwݓcz}f8(E6_IL֮.&Ԩ  ݸǟ>^~)ҍ!w!go@^xt(],suX5'pU')nJ#%1Zϒ27H'Y JL>[RGr P[ɽ#ݶqUJM^[7.]b>hjU"=޲+1Җe8%r|g`o)o sBk&,ܼpr~Qe{h}CAmPȌDŽM@0ASx[(oqhgL!n;/ٝҸ:s7|fX{ܹXݶ޿"ߍsԇyN-xޛ|H޽~y8}m׸EYL RsR߸u% ĩ ؾ}yڻ~Vt/T&o\wM0ٔ. diV6󭗍nj:l AɷbDxWCW}ǹ魐:繺|wgDnk7!@߈ɮT?ҥMFZj֭]^ZIiƝ[n޽}~\pcFvrO.7*lO?|:nwl3e_3 ~M/Ж@D0AApA a"pB /0C 'A?,,G$DOD1EWdEWP)s ͱ: L0AR#CD2I%d $(ʄD<@ˍ-願d&dM7߄Φ Ne+lL0A74ͅԄQGID!3J"ηk 1EO&NK>SC_M4RYgӞ5W]w"Fm6XaAĵWc=lRMUa֊E6^pVYt%hE]w- [m煕[R7_}_X_LMn,E8`奷aMZ'.8c7c?9dG&dOF9e7fb_9f]XR% gs:h&hF:iW6ے|$ocgg{η}o⬳lV{i߆;n{I7)z˪01)pq|;YDrͼ|l+<sGg|OG=uWnnYeo.{Jv /L}/Ψᄀys.rxG>yc{zǽe>{3|yS"|G?}g}߇?~秿ۿ'.3_wЀD`@6Ё' ?Ac@""AЄ'Da UBkg<>BthCMB"шGDbDMd)#a ÊEqx$-1~LDcHn(F81$ C'̰dW1MlbE" $N` 8nj<={#&'9IMv!c&7K^Ғ4&%Jr#uc,UJQD8J6RlL"V%8q|tIVC-b @<䡎UO3]7}JZr-KtSTgy2e>q(EEdF#;@LH#OVԢh Z[Qd+! D"0$͌ԥ/iLAQˣ@S&$ɣ1iVS4t-éNS|:U QA1 byj֤K"W;k"4fP-03aNeV3s gZU+o#\1?BShj[{.ٹ*Ft_CkWώ60kaU 4CjG+ӀI6rS>`ZV@ub[Ζcd-껴5#o;]mV.q؜oKr]Wdѥnz4vJ[woSjurV x5/R?f6گPf %SGE<E&i{=J '³quc ]7ؚ+<'6̕NɠC[LW99tV~(ork'fgm"C5eQnO;Nr<;vs,)nЂ4GfF7Z|Cw;5iNwn-j3+-2lNG'SVկfᤅ_dG-{}#_J`=lb{Q8 >†T{, mn6? nrF՝nv[%Bț lg[b[j#넥<'n-vwy̮񭫍ڲ J3)A>r2$ 򔫼%_9>sW'7>䜗i[wm2;#5"lOedӽN:v\!;CSRӯNsI>7Em#;w̠a/`we|ߑsdf<䧞gVzē`k&_gpP#!==YTs+幢 `NkȞO W/3ZIsֳ%7E_N>ޯ%% B10QxP MSsDȃlHԺBrHIET,WY̼EmTpPJHē HU @<ԙo#Tph?aUJ+3S,f+Bјb1ԛ*YlTӖ; i;qe׊DW(Pn;}"1;0@u;~%0K>㾱>{Jʭ1%3-%`8#'񻧱K\:8\uk]}}۽ص126 ME¥E**Kݤ5T,P O^^\}تZNVqYq%ɤ[*]2hYU;Y\I%:[\sڎuOUYUMIl``Y ̔=L`OFuU׿TD]!ϛ<_!^ԙ,y?р$!&"6A{E KJ<}NdϷba+ .Kk?2-/#v7tM5!:n: (ySʙy{*;VMAHd)<~caS6e׬eGKtZ.M|D~lmf=/&FaScK[nVgXvfwvxyz{|}~&6FVfhHb[hib#ge]{ (A~=hO=4]hyb\WR{ 9jhZU^s*|?q¾t'C]>fj%fiiOYTb+>>kn9jÙԽݵFk>j 5kȕ!jX"03q'i)KKb<ƨgD+Vmnm!mA^+ ǣ6즉֚mL\>nE >8bnxfl#J,YlmY n+.*>2';`+{ l%>nťU#wVjp.>^n%Un`/87V쮦Ћ.'_@n/^.6 v w &,!}~_jKj姾vo]`*q(p뮺^,_aoHרe_ r->mFfnpnSo\D1?.Oc !PK9U9KqZ`q{gS_Igs'v:VSGZOuuakVu?D:suFnCq2pn;W?H\g6!O,D "@7[\kv?p g\'?62HBsw:4G wku^sQU_1w̢Z_mvd3xlWV& Ga+A^G3nNW!_lOx9{u59wS vd~-/ i,oE)Gzs17yyFHY`Uٷ./kk b?tStG_>@/?o{uw#^w{tdX P~J_ަ"~7~·+W={_;w~)sO{Ėտ,h „ 2l IƌIY>вIhwSVt8qʧ|A[~8wҭ3OH{|77I^ɳ.};]o_>qu{7}y : J8!ZaRio\ׇbЈU"U(Bg ^"1(a&ءzhs#MٕmDzT95#M:!J&d Xw^9`rX Xd}W: e&lcf~Y\iɥZU$^XcQYyqngrAZo睢N:Zv|*j9ޥuJZR z+ J+f+nfk,:oQ[-jz"u{nB~kp :!`NZ~IvQ4|0 yCI]9dXqw:|׬ߧirFN!V3-23ˣZu\w@߼q]ιt"URuQPED5GY'T*3a=N}6L5FEqq <6}kh >8â߉+8/m|mEo^ŔrJy9衋>:8ꩫΠ_Z&үVfLZ;^"͹~<-~;;K??=EO=O=_?h_![_X??2>#_REn%/+(Hy\w-kDɓv@rPk`8k\d* ( AOo w{3aJ'!)"!(EωV-^T](1%)?9#Ө5n|#(9ұvF2c2`<$"E2|$$#)IR$&3Mr$"G/֨m )$(SU|%,c)Y24%*qiJ@RSG>JSm#v+Y1vd |&4)iRĥQB'J(U.GyR%2bc.Nz('ALg-Ljҝ >)P*T`hVTQQҦXi *yӗt05&OqRҠ\*XjӔsf=+Zn5 E4(Z1NBTddZ]eQ'Ke_+RI"6,hC+ђvv/A{ղ}-lc+ŀ-ms򶷾jO^=.rVN$g+7 RLԽu3r.xyw)zӋ^{}/|+ѹMn- 0y#@?/+ؾ=/b x0{`spoC睰<,|ath#$c,1sDD1$&)l$pWih,%i,){ qKș2qBe>\f Øn~qO+uZ~ ;I alD(K2&E(K IQҍVkD'Em=I59c63)骹/KiHCmZѺ+ \:׿V{W`[~6MKvJfZvLPm%]gysUr)Փ4ۇwgmߚև^8npm3|<i-pnK͝jՒN5) y{m~GG0a49q˚I'vőqo3`y/BR /䁎] =|7>펤6"{BHAs7i>_XP/KW??_%_y?]?ra}"_F( BBCzᑎP^ c$A!`"1 7-F * `ATH ͕ ڠA [`Jܟ "`ְ . & =u[I9\ ] ɨ`z\L J]ㅠG@^̹iޠ| &K "!%6\jRV??C6#bb"F$b%D(R VBh?-&m!JzDJ!@> 2nc\^#_a'5r;734!&a 8>㿵;cfb8nb!##9c D:AA~8 N$GMEEbF@vIG6.X/jdI$LKJvxV`N#V. aSv T~HeMPڣU. !R?F$XƥePYYnr3z_%H#F"YMi&b&b}#Ua.dN&eLD`dHHD`U*uh&edXvMa`i&lHfm&a&o*&T`]e&M%ݥPE&JrrjUysfUMuUtSWlNMgo~'oE,pf eng{w.`5uuKݔ?!NIg1U& y&q^zTd{SMnSL ԅԆ'vF~Ԁhbfc:y2TVh,%!)hqƨB(('hA Hq2\.iTZ+ # H$e_fZr&N>0J)6n)ui`>'"HQҚ)@*&*.j&# 0"hlM"~**藢g>AЩ֔1M*k :&vR8_I>+ʄ5j3>j:q^*-+4^1LDݺF+NkjhNj~zbk$M ۲ڱm IZ},ة*쳹ŢƑ$ꨂ+mT (hLbݮ ,,-b\ެ&l^,ZDOltl(R9Acrj:+Ol,nmel,b\к6Әq뵲VզDM阞,1ު-k-PzDxN4n-ؾ?m ~n"nb)ACG.GqI-2vթHVҦ炮QGnPI4n 5c~aVq\صkIlōﮮmDI$o>2/-+b",-jm蘆]!9}ږcAot)8F*M>/jf~diuo*ԁ[ypɉq[  \} \ )ھ00 ʍR@0q@CUX0-aq0 g/Yp w{\ 0o0ӕ;[Gof?n!1 /qן^pz:Y&Vbl$C7nywr'pUlm2'n(ɱ%]=Z+o*B I2(/7Aqjbm=RQe>3/, < 3J￵Q 2%^4QsMj9FnkJ8MCUf=33?3SkўrW.s?'ߩs0#BO1496d=2EwYa4sB6r4qG4M?4KK4Ksf4DG7sU.39POL5LQ1yf!/OsV:$?6 JV#RwuR{52֯ .[#S%?Jc3V5RFUkRVõ^g\gkm+P^v!5"#1)c;KAa-vcOv<67CRfek4fo6hKggiohfD6kcKjjl3kil6nJm,%Ivn7b춽f^tp/n-r#70Ii6lf6sw >;~W_fS5&?(ʇܛ[=xxssK~HE~>H~'> =>>J(??WC~=zQ>??vo~%|S[S@?[c???@G@  Lp!† "thbD/&8pă3vaI'QTeK/aƔ9fM7c;;}$Rt%iSOF?L)O_;lYgѦUΏ?} 7.CCqޒޅHn~5Ÿ8\$>ge˗1gּsҲCMtiӧve:Oc]͚vmn9ֽ7N/>xqJ%`T5jϡ?Um>]gxyѧW}GG'):Py @<;Pl!P )TK?*9;m N )LaQiF.$ DGs%kT'R)0GH$DRK3t5l7ar*wC;N=;JM8 =kBMTE 3?}LF)J1TMt4OB/SQM+OQRKUTU,u;h;Z],aa:bMD qY*d4Ws=Pm]f*\^6__[d٭uZ[WW]Ii- ZfX\o?V:b&ǽWy967E I7XUD;&y_n-Ŗne]^i޵ dXE5:_cn袟y=^2L뱷JA?n93F9iZv;>mi|^7>yu{hxmmnMxVzo7oȝFZoG_kPQ/{YmAw%6|rܵۅ[};b{ػ|O&O^hޭo:tە=wwG[`W{R6tutsS6~ش?. !e9ll춦w .d)uh\!\\Ee2Ti`_p 2h(D!E4Ç{U["xs^ RxZkxw4+bb3ֵe|"Fщ g)a&0^{՝D %K]uIMn'ub+ #\8U2uz=Bm%pNt_ȴ 3vm0>OSm`:uiKVL %cUK);ON*q<^ױ\,EY͕*ֶϭY7dֲKE]y9X-F;lB'PuZ^`R T4$Mm*y\)BMԤN(CcGNsT $>jUTFUXTӬ ?5YjQeORW ASYi]VrWN^z׻0KnMakֵ5?=gLJT\*XXxWϒ5iѵXDZI.IYꔶekQ[rJnw ׶5.H[.Q-JNM.s39cl^65y溆,lw5(^:kP*J]^WTC`YJeZSָדŹbP,`Y߁U)UQѵZ_WδŗkVZװXf&CL%t()E62!iP[B9dfԨv;AFTT#vu/f[c ?u`6 |[?8}9&y4RYsrKOiT{#`rILRK`L\C+dUxՠhjY^# 7ŏR/>,z1`иHQ{EHeMψӝvJM^XeMJ0-cRxڑ¶Noޚao}~we6qM}` gqO\-qo\=r\%'Mr\-g]rW08Z@SR+)N/sE7ёNj(4gih%h]]G3tDVC,ii;YR md#t\XtOwQ:u"%Iֵ>U)){Md bgU 4'p&ywGy4zoG}sQ|;ꯏ]%Gl`Ϟ47ߚ[鯔:?i)o1 #R#"xί0I%(/!`$/)) p 05asZ%2H30? 3ۈqC8e_몢9 !4cs::)g {sH 2/S#3=s=G;){󀤒=k%>3?=P; ;gpsT#TjHtFu' RL*'L%,ON=)ES V6Y?^MSK2K6SJg3Z`tFIZFLYa@a)Z3c TEJT%[> c=6eU!AvUDI6LveifeL[3fkf36fvh geg>tZS4ecF͓$[`ָNԶh[K'Qh7TiiJ!(++zI `6*3]3JV?TI2?[l7Mm=tږ|5(j.,o$Q)r5+2n,Lt5apwq"|j7-Bq3ӮPkXw^'U2u_uH\2SSVo75673b3:_C*wu`Z$E]4Wj,ERRU`Rl$/otl ?uv;iw}da.mَ6*eb){1=X?VB; m%z*jXha)4RUkiM{ODm̓tWr~8b|ֆ+-8mTHxXxTX[Je^KPZkj5DxoGTm8vqpkw-Ɯq RJ؍Kn;9oO}xXu(ٜt@aԶOUMx\6Ys\lHs=VU'y6X 2øR'̙JqWWG@tNyYg\Re9QZtWs+Y!kty9yф|ɥbi+ !7}_mj7Oג)5V9 v=S/^Öўpxvm?ؓ4EHk<9Y^QUwo#zySڀe:<~bqkQAzA8xy%GwkԑmzEkF6Z:{kTzm,:SQH9nK7VR뺑M5z:Ftea pǴh'j T9br&{-_Y/][4yxaՒ}.VCVxryZFH틦iǗ:I-ҕ#y5]՗3w`ۮ;wyߙ)ZOUZSZ p,ʪYh Jyt3T>EsסsѸZwCԣ#~9ld;@SGq%U`Q1z͉[ۜ\·z\}vx$8|5(*"Hԫ2śЉT]y:_1EŻv͚gِT1A=HEwyvuU\]dWPgMy)J}Bk^L\ڣ]ʿ[#T6݌]WaUS~}e㛾gɼW̿^>yb]+K,4~iF'Q~?we~G' u~vSl~iy>ezd^蕞Q^~>A>խsK<^Tx ݤ^ևufQK7e>B'wy ~ M>QZȐ  G y۽܉i܋- W|}ӪAߴ"mKz_OǣVˠ|]-XY-L?N8>( Ȋi\Xu +]cj8J 48`B 6TСƒ#Ftp`Š'Bܘqƃ -fDx#B"Tr/9μ3Ν;I 4СD=4x:} 5ԩTZՎZ*د)Ú=ذM Otڽ[iܽ|7 >8s:~ 9Ŕ+Sl9sܵ39ü'НK];r'hW ;gȴk';f̺ٚlYcIiH˶ʃT:΅cM$r$[q8pÍ_yޚg~'n_;M7~r}^5RG `YӄFt蒁ᷘ{|$},eŨ2~z(H ncy~<i *$Eǽ(NyP^镋XW]n 旧YTydɓl gr^i&vesg~ _uI||z塈.h2Vhx*(}ViB9hi}Jj&֩Tzjl kʥJ٫kZ뉷j ߰f-l,@J~ nKn枋nˮHh&g;-NնLpBruasn'wM o<*,Õ0F տ]Trʏ!` {pYN߂i`$ W*)MNIh̓*OMu@,A 8]/IdBt X;UE4r^Aݓ~ "'vUMTq-MgN/-2Jy(x签}wސ3Ѧ7}\kzryzXNPV7{A8XAeep#߀ǾH&ز"F?̗ Sf4l԰1%JqRah0(Rq\:-vqd4F[qlGBtU|TfrD*rl2HT/d +CZ`d&YPJ꒘&ɛx0ޛE K:Y°+[1b/J3rw%-Oep=/kf*ʄ19%cTd kt]Zj{8sN줍6nzBۛ3 7l?NxjJ/gAVij ]B(Ƞd?QAm]EʋftyFt,mK_RUo4HIJRtz%N)S Ղ?-jITԨx jR2NU$թWꚲ/rիdS@;analog-6.0/how-to/iis/index.html0000644000175000017500000003411410161303533016732 0ustar sret1sret100000000000000 HOW-To Configure IIS for use with Analog

HOW-TO
Configure Internet Information Services for use with
Analog

Copyright © 2002 by Christopher G. Lewis
Rights are given by the copyright holder to reproduce, distribute, modify, and create derivative works of this document as long as the above original copyright is not removed.
Originally written 2002-04-29. Last update 2002-05-17.

Purpose

Analog is claimed as the most popular web logfile analyzer in the world. (Details). While originally written for unix systems, Analog has supported Win32 since version 1.9beta4 (Mar-1996) and has had native Win32 support since 2.0 (Feb-1997).  Configuring IIS correctly greatly simplifies the use of Analog, and will allow for much better reporting.

System

This example was developed and tested using a default install of Windows 2000 server running IIS 5.0 with SP2 and all current security patches installed. It should be applicable to Windows NT 4.0 with IIS 4.0, and also the new Windows .NET servers which are currently in beta.

This sample assumes that Windows 2000 Server or Advanced Server is installed on the machine without IIS.

Installing Internet Information Services

The basic method for installing IIS is to use the Add/Remove Programs control panel application, and to select Add/Remove Windows Components.  Select the Internet Information Services (IIS) checkbox, and click the Details button.  Check the appropriate check boxes for your installation needs.

IIS Configuration

Configuring Internet Information Services

There are some simple steps to configure IIS to ensure that Analog functions properly.  I'll also include some of my suggestions for log file directories which simplifies the use of IIS, and moves the log files off of the system drive.

Default Configuration

The default IIS configuration looks like this:

Your first step is to configure the web server logs to gather all the information that Analog will need.

Configuring the entire server to support Analog

Right click on the server (in this case NTLewis11) and select Properties to bring up the server Properties page.

Click the Edit button in the Master Properties frame.

Changes to make to this screen:

Make sure that you change the Active log Format to "W3C Extended Log File Format"

Click the Properties button in the Enable Logging frame.

Changes to make to this screen:

Make sure that the New Log Time Period is set to your desired rotation period.  A typical setting would be for Daily rotation, although I imagine in a very high volume site, you might want to select hourly.

You can check the "Use local time for file naming and rollover" checkbox.  This means that your log file rotation will occur at midnight local time rather than midnight GMT.  Note that IIS will still log web hits using GMT time no matter what this check box is set to.  To compensate for GMT time formatting, you will need a LOGTIMEOFFSET command before your LOGFILE  command.  Since this offset is independent of day light savings, you will need to change this twice a year in order to produce the correct times through Analog.

Change the Log File directory to something a little easier to find.  On my default system installation (C: for System, D: for first CD-ROM, E: for first data disk), I always put my log files into E:\LogFiles, and then compress this folder using NTFS compression, since the log files compress relatively well.

Click on the Extended Properties tab.

Changes to make to this screen:

Make sure that both the Date and Time check boxes are checked.  To simplify my installations, I check every Extended Property checkbox.  There are some specific items that could probably not be included (such as Server Port for a port 80 only server), but additional items typically don't add much to the file size of the log files.

In a typical server installation, do not check the Process Accounting checkbox.  At this time, I do not believe Analog will process those lines.

Make sure that the following are checked:

  • Date
  • Time
  • Client IP Address
  • User Name
  • Server Name
  • Server IP Address
  • Method
  • URI Stem
  • URI Query
  • Protocol Status
  • Bytes Sent
  • Bytes Received
  • Time Taken
  • User Agent
  • Referrer
  • Cookie

Note: By using W3C Extended format, your Analog.CFG file will not need a LOGFORMAT line

Configuring a single web site to support Analog

Configuring a single IIS web site to support Analog is similar to configuring the entire server.  Right click on the web site you'd like to configure, and select Properties to bring up the web site Properties page.

Follow the above steps to configure the Active log format and the extended properties for your log files.

Analog Configuration File for IIS

The basic analog.cfg file that I use has some slight changes to it to accommodate IIS.  I've added a set of  LOGTIMEOFFSET commands to deal with IIS's GMT logging (which need to be changed in October and April), and DNS commands for host resolution.  I've also eliminated some specific files and directories for Exchange's Web Access and Front Page.  Lines that I've added are in Red.

# Configuration file for analog 5.1
# See http://www.analog.cx/
#
# Here are a couple of configuration commands to get you started. Add any more
# you like from the Readme.
#
# Lines starting with # are comments.
#
# There is a much more extensive configuration file in examples/big.cfg
#
# If you need a LOGFORMAT command (most people don't -- try it without first!),
# it must go here, above the LOGFILE commands.
#LOGFILE logfile.log

#CST (Winter)
#LOGTIMEOFFSET -360
#CDT (Summer)
LOGTIMEOFFSET -300

LOGFILE E:\LogFiles\W3SVC1\ex*.log 

HOSTNAME "ChristopherLewis.com"
HOSTURL http://www.ChristopherLewis.com/

BROWOUTPUTALIAS IWENG AOL
SUBBROW */*
SUBTYPE *.gz,*.Z

LANGUAGE US-ENGLISH

# OSCHARTEXPAND Windows
# Add whichever of these types of pages you have on your server, or others.
# PAGEINCLUDE *.shtml
# PAGEINCLUDE *.asp
# PAGEINCLUDE *.jsp
# PAGEINCLUDE *.cfm
# PAGEINCLUDE *.pl
# PAGEINCLUDE *.php
SEARCHENGINE http://*altavista.*/* q
SEARCHENGINE http://*yahoo.*/* p
SEARCHENGINE http://*google.*/* q
SEARCHENGINE http://*lycos.*/* query
SEARCHENGINE http://*aol.*/* query
SEARCHENGINE http://*excite.*/* search
SEARCHENGINE http://*go2net.*/* general
SEARCHENGINE http://*metacrawler.*/* general
SEARCHENGINE http://*msn.*/* MT
SEARCHENGINE http://*hotbot.com/* MT
SEARCHENGINE http://*netscape.*/* search
SEARCHENGINE http://*looksmart.*/* key
SEARCHENGINE http://*infoseek.*/* qt
SEARCHENGINE http://*webcrawler.*/* search,searchText
SEARCHENGINE http://*goto.*/* Keywords
SEARCHENGINE http://*snap.*/* keyword
SEARCHENGINE http://*dogpile.*/* q
SEARCHENGINE http://*askjeeves.*/* ask
SEARCHENGINE http://*ask.*/* ask
SEARCHENGINE http://*aj.*/* ask
SEARCHENGINE http://*directhit.*/* qry
SEARCHENGINE http://*alltheweb.*/* query
SEARCHENGINE http://*northernlight.*/* qr
SEARCHENGINE http://*nlsearch.*/* qr
SEARCHENGINE http://*dmoz.*/* search
SEARCHENGINE http://*newhoo.*/* search
SEARCHENGINE http://*netfind.*/* query,search,s
SEARCHENGINE http://*/netfind* query
SEARCHENGINE http://*/pursuit query
ROBOTINCLUDE REGEXPI:robot
ROBOTINCLUDE REGEXPI:spider
ROBOTINCLUDE REGEXPI:crawler
ROBOTINCLUDE Googlebot*
ROBOTINCLUDE Infoseek*
ROBOTINCLUDE Scooter*
ROBOTINCLUDE Slurp*
ROBOTINCLUDE Ultraseek*
TYPEALIAS .html ".html [Hypertext Markup Language]"
TYPEALIAS .htm ".htm [Hypertext Markup Language]"
TYPEALIAS .shtml ".shtml [Server-parsed HTML]"
TYPEALIAS .ps ".ps [PostScript]"
TYPEALIAS .gz ".gz [Gzip compressed files]"
TYPEALIAS .tar.gz ".tar.gz [Compressed archives]"
TYPEALIAS .jpg ".jpg [JPEG graphics]"
TYPEALIAS .jpeg ".jpeg [JPEG graphics]"
TYPEALIAS .gif ".gif [GIF graphics]"
TYPEALIAS .png ".png [PNG graphics]"
TYPEALIAS .txt ".txt [Plain text]"
TYPEALIAS .cgi ".cgi [CGI scripts]"
TYPEALIAS .pl ".pl [Perl scripts]"
TYPEALIAS .css ".css [Cascading Style Sheets]"
TYPEALIAS .class ".class [Java class files]"
TYPEALIAS .pdf ".pdf [Adobe Portable Document Format]"
TYPEALIAS .zip ".zip [Zip archives]"
TYPEALIAS .hqx ".hqx [Macintosh BinHex files]"
TYPEALIAS .exe ".exe [Executables]"
TYPEALIAS .wav ".wav [WAV sound files]"
TYPEALIAS .avi ".avi [AVI movies]"
TYPEALIAS .arc ".arc [Compressed archives]"
TYPEALIAS .mid ".mid [MIDI sound files]"
TYPEALIAS .mp3 ".mp3 [MP3 sound files]"
TYPEALIAS .doc ".doc [Microsoft Word document]"
TYPEALIAS .rtf ".rtf [Rich Text Format]"
TYPEALIAS .mov ".mov [Quick Time movie]"
TYPEALIAS .mpg ".mpg [MPEG movie]"
TYPEALIAS .mpeg ".mpeg [MPEG movie]"
TYPEALIAS .asp ".asp [Active Server Pages]"
TYPEALIAS .jsp ".jsp [Java Server Pages]"
TYPEALIAS .cfm ".cfm [Cold Fusion]"
TYPEALIAS .php ".php [PHP]"
TYPEALIAS .js ".js [JavaScript code]"

#DNS Stuff
DNSFILE dnscache
DNS WRITE

#Exclude Exchange
FILEEXCLUDE /Exchange
FILEEXCLUDE /Exchange/*

#Exclude Front Page stuff
FILEEXCLUDE /_vti_bin/*
FILEEXCLUDE /_derived/*
FILEEXCLUDE /_themes/*
FILEEXCLUDE /_vti_inf.html

#minimum Requests for Daily reports... These are overridded by Analog_Run.vbs for Monthly
REQFLOOR 1r
ORGFLOOR 1r
REFFLOOR 1r
REFSITEFLOOR 1r
HOSTFLOOR 1r

Conclusion

Hopefully, this will help you out with configuring IIS for use with Analog.  For a VBScript that performs Daily, Weekly, and Monthly reporting, please see my web site at HTTP://www.ChristopherLewis.com.


Back to index of How-To's

analog-6.0/how-to/startwin/0000755000175000017500000000000010161303533016021 5ustar sret1sret100000000000000analog-6.0/how-to/startwin/analog.directory.001.png0000644000175000017500000004573310161303533022306 0ustar sret1sret100000000000000PNG  IHDR tIMEJ{ pHYs  ~gAMA aKjIDATx}9o/m"wşx%1P ulY1gj_ũ5`= $8{Sx) HeK/u H#S9%Ndm7;귻gy>^F_|{F[n˯zk)pe޽zx m' s]X(.&s]i&-[5ѭ$̞N9f0<:-fk(w|ĮzWzrX\#9cK[?S [mv!/8KT ffFi@_'nӭEۡJ~wrk;W[bU?:X]N{$?ܾsy8 oKV:N^17`i S<el~˖G \F¥4b_(F?p:~6+~% Oh\):0s`Vh1Fl]g!hr"$f U?VvuP0CAsfJeFn?'/M#tL<ƭ;Iȗgu#m0>22FK*Z\|f% @N*#7HC)SޅX[bP\1)Gf_ɎA ?8Xy]U0m2w@64fwiR[Xi&??Zt'  ؋\5cDQ0>c{6y|{WR̖-3'ȟ,,)ǜu(q87+Q0?Q0_CdR/<ׂ;lc\Y/ҁΝgJe0ʹv4zpom0á0k=P(~v1CaVbXLhKc,(x( `$L..I˯z2O^RYs1a ﭽpZQ%: ?M/ 7`垻AU_',k}Y8ZX3: .,/\>t萗bف¥t`ﭟUVXҭ5B!'WȔ l_'Sƥ#*\arֲm۶F9K&`^3z݌$%;om5"سgA9Sw^0mCz={LL;T\ #ILLe6lX퇭%~%˔P0S٦MejӦ?:rYV[_~kjma‚GϊVYXNMH]q // '.]na'#aw7c,&@FW_gj `Ey嗿b77a*hPL?3,SDfM",_ah4M$+we?# ZT^2f!z[ru;5uϲ_KDN:'-?ࡉH;E4"A\0,H--H?8ahjJl5ӯe(O9cO)/"R̴緾1_z[{Vc8"zaz6l8eyA0K^Z8e/zMXppG3q뀈w[e\e1LD.,Q5ޅd ;/_k~7~]p?8񃥥AKT)7'6,eKQ4՝PBO c\]Dk-V1sϽKϲ_z=\뮻nӕ7 @\;+<LQ N~K SGwMIG_vaZeUdblT`6lOKKhW#h)ap//K)1{m;|qT0 {`$1ƗbNldw+5ģ^mȐBTb7}bS({"?'N,--K<>7E4D99 USGxݻW^:P'D^48[B"1 q˗O~˗ /C?՟*OHqooo馛/?|co)7&2Bp[ѷR#ƢgRXƒ?JInƿh"F~NFZ_|_z+;vaaAW<11wtn!ɟBQ":{M7eR3̏?׆~nmO ?PRU|ev1:faaAW05Nc/t @2&Pm%*DM!_2I\tEa:&#?P0|bbK#pܶm[=t}zݓא2)x#|TP(gwݳN@w1(-1zFX Y3鮁|ed%[mɷǎ~p 7<O8dG17]pXoݺdڋ+1 ƫH1"ַ|3P⛩ls뭷گZ}T,1Ae3EMw ~c*Ӡzf>a=M|8Ĵu~(#B{z/o3@q>oo{q'%|w` 6quN1g;v7@ʫv&Q9]o4|$XDm\(!I!|%~ŷH>o8c~iy<ɸ+g{sSO]6Qʷs՝"W0ϑ/8ܹʢ#؉vR+^Ǎ B)8ɿ_1 ҙǘ|'2z__%T05{jʁ/t7Xr iO%߸k37Q?"!e*qv* K2 .i(Ƹc@)1q} m' CKLQ8b14>Z bܗO+@ٳb`>>|pI-_m'R^zŖW-vz=ČDSq5q>vpn:F;IfnnBsE@ar՗̎''nwNLLcZ̙3tLdKDY`l9~1w9p`NiA4ȣ,K/4 1.:7W9]\hDHXZAȗ~^xFb?!GmmgsoyH;zk9" Wz<(5(/v.ɷ?O.Y4--bt(ӽg w=2e5,|U"Ǽ]MHBEO<1+V:Q3Wq -W0O?__<裊)#J;M$EX2 fsER0"QAv!td nwqϩf&z!`#ar+5ZĪ`ǫ'b Jr܅+?=­`,M/'~7#UFW9DɯKA4zH?%{2b>~~/nhY^~P +4%yE;h&)7؛HaY,z0/--9a"Bw͒\!+|TJziyG " -k,ѣ7x,cq2֊ן_2ȃ㭏cWѾR{Zpj3x <133uՀQxx0~mTlMY_`eN2~~K_JX¨<su ~0wP:SٻwoQi([n$4Ey{v|O?WO n={x/CaCm6l;;;E;"Rtag#' 9 9 9 ]3{`$AHnq׶'n. FݜDr)yޚ "-EX[䐹S4 Fn+G=e<;yXB kb] uLGF *(?Pܬ# 0n]fѸ<Hy)>]x{ߙcFQmdז#XQV1n`Cq_Ujoqޟ1Qfjo&:%Xj/nVKM+3B7b [%| h\b:Oye:Rĕev #;`|df{1ޘ-bƘR_꺖7m%+uLI 눽6͈·x=ܓk\ƘܩS2"k|*Z6-vߨ'ʘ|Z3$W-_+@X*t"#Bv $Oxн [F2uĸ׌qFhqi,0xU4o 쭏bFϬj Roc klȿ~h**_h-55=Ç:hl>`z윆(fܝd] v\swޔKvNvNC+v.\.0m۶bq;>iiiihN"СC$ } cb`$&b&&&T37FFܙ-//} \ǔM fǎӓLJ;TECjFJEL`l9~1w9p`Ni9vZb%f曫.. (Di U`hʵ.ݥ%F>dJ?tbN6]KYRx8vi;;3 IM[ųW= h\lC P{"<QE梄b {vnΖB#x?ZS0Z'(Udm~U$F.5u/;l"eB2Dzz b4yr.3opD-{jQ1BǬR*{b"3eX zMX٥g}14J~헹]X"+YrT AAcvL}VQ2@ٝܗV]^,XocCѽ➥dDPЏl΍טc:(YFddׇsKxpa!i!(;9>{~t)se!^TI1jMdՆ%mP{#)*V= iD,_p˲u'-.~qOfޮEt&]7 OT>G*뒋g <Fȵ݌U4*)|ʪ 1:;[ⵤ0JD5-\=.۲p3v7Trd{wcGrP{_!-t7ŧW35K](A)cze[F `LaG0VMvg ~ cEdw&1\`$G'Tt'ͭs':M fǎӓLJr;.P*breȎˁsJ Rckټ*ǣ)fh(8' T~b}vplx''u.~e>S,ERT{0M<,vNigtШ]<{扱.n8S׼iVW-ڹrRH`J^O fb|̏:n\Jq/ =F@pՒ2%.!yUawvc5cXstv\[;!YXS#GUw]Y g%&𣀝+Ïc bqpZbzyHF;v"hTp.4`g+&hD $IsskI[%t̎''w`#"&W0[?~옻804̠i 5͛or<8r (8'T~b}va0x~qrRz2X35Ze9L\ʒjƣg)ΰg{@<1("xܾ^MPֶ`řō]\0XEMӺ[st•AX[*e.=02^O<;VFAJbbhdd7jư,`yr.3opD-]Y gUw+Ïc bqpZbzyHF;v"h;Ox;X4@ b`$N[34lN*DL`v8=9y|K,gi] \l2s-cr<33Zb6o38"m͵Ese!^TI1j |RfNCzwLdKp7qdIJs,4wHF|-֝?yfw)F٥B5\tKt͍`I<)*Dsolג(մpb4WnR33WxNPcgRf뾚|)Nc4i\aw)ZrT AAcvL}VQ2@ٝٵ/u ~Zj] }PtqR2t(GS6cFk̂1MD,r2vqn` VHϲD2Nξ^n]gu 윆dYH`qUR%bڅmjEqMo,8Ȓ`4YhL#*Xe[;iq2KgwXajlok+mn,K"OYU!:F{cgKF Zpat̴焲ŬYNʫhY,%Ʊtjf)TܔÏv ? 0bki:WP cEdwӀam*Zbo9{cJuwRR%:ZVwR`M5 .bnݚoggg@ug;E?rtDD\*cp>LK\[b&VLpL`Nȸcr9{}ϕFY^bት=׉(E =y^9;X AD-14@W Bԩ4g2aZ[rzـ;Qfe^s3vN-1Yr%XnWƸ\N&+,*],^3djTbiu wvK"۽c4`dL6cIh0bTd2h/{Y|L Q:b!eRiFN`YDaɫM%9 NvNvxq1"o?oE4 ,zQy zk(FƗBO\N+3;Н֋k'4LKDiWQF=$+]`4`4y<_e!bm{,O($#YoVwco`:f;7v24z.G?{1+Y*% "z!a(Ff"2F71:쌝sgܝ)e~bXeYIX 1.¯NlJ ׻Bѳ+"O'2`hҊW"R-b,cx"{/?&QBZI@'ء:"=tRsΙP~Q*br3=k󙘞Nwwn;#0^غro߾l߾_پ F(y%ߊ?eՂ6Ak`e+Y&a*h*@/n)֫JB _r(OG>Wٷ,g,zeD좄i+յUss_AKv1WɶY3ͯdyEuHnH..лxbOC勝Ӏ=}vbL>F c-U8:TDp)SeYmc_Ҝ%.WpFsch\q0!J쾡\Te~r-u?h\) =(KCʲ{dد#k6 "cYz-XpӼGbg';ɤ1ݟgKuvJ2?G1ֹ KX\tJjcRmBviV~zVU| ;G3͔V?8==mI7`pT}9w&;[|o iڥT<4`ʨe|w~W1ZzeO[<0,8$b?zSg?_vم[6Om'snq镥 7ûo9xfԩmɲ~_Bpk&ҙ-'Cd3v_?yd1;o1Jˬ;i||iw .h6pݗ|3Crf#m|}{Lvۙ3QҴ@4eLyBeLBїtoW^WXbSS [>jND.cV&?vnw3IKg&l>xp̑f7>kkv '/]{K!^Μ9,YuVHNG;b%rYBly=0%ʼ񏝱3v"{>k?~ /{仿 ^9''t3X1N$bhzzz߾}GY: awnt0IS9Ҝ%PޚȩcFschk%M[n5Ae 7SRdPXNoы)R2"cԕ %:쌝sg?ON;&R}2@E(ae1^*g++" ٥XT~Ds4SZLino(+Dh 3;;Nj@1H&_'J[1"z-:Z;P*۶HEwam%JfȳX ,<_q }^)1+=lUDUgk2u&|^墄܅3v[[gt?zOSٸEW  [Ld|0E梄Y:3vΝ;iB=tya*ܲrSrnۦ9^ &nJ=~B[P\9Ru?mR:d1XOمvQcXqvvIbTZbdSź8~KA,햖7bԩ2!ە`PreLDY yiνcLLAY)|^햱9 M,7mo|)w%$.8WRD gԡ9aيلL&xg_Oda4J{27;&1aXnj9.qm䪢Ҝ咝`K͌`Xh:-1z_DQFuʲ<@d4oǽXuEԽTVZcYB*hɎbQ"2FmX*ˌ;cg)EFVZ~:r{cyZ+5OKpIWtucX 0t{*ÏvfJ+9)x+"6YJEݻ+Ѻ 〭%bL-Gwv`L[TsV'B`M5 ؙe $&%Fsw^ }SZ0jy;w*2 Rakש'Xin-~σ,88`%Lٽ2y3vv tk, e,.Ըl21ք#(-2>" sQ¬K;cN֝<7Ͱg*X_-R_B^ҤK)TZ7&)&R"aNnOdu윌եI ҳ[NR)ʫ;ZڻW[bxm0Mm c.:$/6E 2/9;w ( },0lm%WK!Tˀ+^e=phىH&5SL9o;;'Xo:yK.x[/qQy)nKRJj^\xS7QV.dn,Y4$`f;11/ܺ3>Nk7X?PlbMQFmw|KNRrZع w&ҡ4ոPМll\HvI&xg_IvNvNzScb*{Ŗ%X7iI"P.FU.l.4gGP5Snj`4 a7Dcboٔz,a.K_aG#A %^fXcS p9k#=(Cdb(\z%1:쌝sg1^Ot9z[itXX~MR.Iβ㕰.x%X̥yշ|O'2`hJ@Il"ݻwW6u=[K :KIGS-l"F޿q)N*J,8Rѝ$lv Zz^Й29L}x=F{O\maqu{I5NVAY>Z9qpD.JĞ<_;cg@eʌeD~.wpɗ(FXoB^sC`oEgf\0+R?vعS4dINRDŽ&&.!ZTeH䲋rlun)&E;M=-ֱss2&.W @Wk_^ -FyϨS/Ie(C+.˘r!&p{fӀ{ǘGXN^{i] lbMQFmw|K+!qa4`%&.?  V&̅d*0;';vVܓ|Ĕ^ᷘ6t){\ 6xC .l.4gd'-;R3#ع!% rKqQ尣eon~+e`H /3\XQc+=4]`-UGKv,}]Yz[|}cg쌝;EBphd`ouX{tuK/bWoۓT~Ds4SZLi+_R*bv]ٌHl-1h,, # "FD $I10 b`$AH# "FD $I10 b`$AH# "FD $I10 b`$AH#9vt۹hHEޓ6; |a<|Vu/]S&y|%vm  cbSg!bڶ@;t߳nd_*bP00t߳^zIĠ``Sg2SjSg[G9'ۮ9-Ӆ~϶k;j$t 9]xl[fjw:L=7<>F҅~϶}TӅ~϶ PM=/I{ ?hх~϶Ym`1vWF.<{ݶm[B8' A#lÇ״ٳ8FD* NdMKCvu{ S~ ՜S?9rY6갰[?N/T1baao/_>gm;PM|sF\*Z(`|/o\X쾩vl^?m;PMIPP~hO#518%䍷}@9K> _fu^[2hmF-k7ym/{h.zK/}s UqtLHu-K`ݫC7(vxV ^Fc @,\^ ˼4lv ZTg?+3*mb|ɍXeyam{VPèRWľG]䛼?]*Zt߳w7x5L\z(_~wϯ{,95̽v,*u܄Xֻo{V\žu}`9gN}#|_~;O<޿0{?_~?̟< +onl8RP ,Sʐ&icmr`i&=kP)W^ygvWt7?LM 8?Kg?g,e,W?,;y=;K8u'$դ!f楗?[so?=˵ˣ8n;E=J)DLA +sO., Kz嗅ɷ?e\jZq}9ww>L0V:s_9ߙvZ` F3 )i; ONGey'cE11t$ZtCڢIENDB`analog-6.0/how-to/startwin/download.001.png0000644000175000017500000002657710161303533020656 0ustar sret1sret100000000000000PNG  IHDR1R tIME0%vj pHYs  ~gAMA a-IDATx}MSGv4иADGu-Eú ylWڌWqH0xd"bЦnz裤*+F牎8s7 BPD4ޑyi ^Rn++J➇ʴP(uzLZ".ڭRXZZh:경_icSNR( Ő~[?i}G^y\U`ϿxbU%Փ B1 `6֛?0VЙޞ6qoC7VA6d: i+ptw>FO>v B1èXZjT5jHk[xˋW/6W/}ot|K}ՊP(Qjw\E5*I(\^M~0ݰwr  -/.-E9IP(#nmnNGxiQ—jms{k1}*!T3Qt=IP(#wva&MIjQ+uhQ$\k[߀~m>u;fO;/ Bmpn޸g@9`hNw_vsNMׅO'(ʞ0( bʹc;mՁ/Jdk ulMlթigDP(3dNK_<@c41/|9|3O( 9}gܴN-3LO4KH2q/,E<>K-Vͻ7$3<ǼU( ]ZWmnAgb[6:i{ڿslswT!.XOGGwJb \@?/\( {]) 'l3/^yn-!n#_)dŽ[71/ǠPpt րx. f^-9YʙO{jŪ %8uuEۈɂJWP(nc4,~qDs3[ަu|`9"|*iIPfc \P(>Ts5F`u6qʕg[v]XJkqH-7`qNWP(nH$Pzn.^kn::^[gLA2:IhW;[(S@]}BqO=^ K.3` n2wm>SP(n ds7qGE2qЙj+g6Xڡ0W`ٞS( = v~cPjԝwFͣ]!$L4pYhu)') bx,.g ۝Je1`, ]XZ~ֶV B(9NMY;Onp87Εm M;k BǐiLb<)۴eV( Ŭi[E^v;tLv~_ٍ-6p0rBP(uzioќ|$w&1{ B1,ՠOxT[iTǖi{Z{,%KI1fˆ 4hKxV~=Зe. ijXl~' ­'M]*UrRfQgT~ 婗Om7PS/Q0\]Lؓk6)Z @GO~M~ٵZ Jt>xP~i~vaiڅBu#BP{chB* pBp#Ce>rj#,>*] Q㙍 f2o6OL";)f>[!>PPy_ Kv2ʸ'L\Nr@Wef <찙e&:D.1bt[_5s$BR tb z^.-'x]4$w#1iT%)/`zoja*< S ]fنIS\a~(|*1QeT /A|a{Y^RFvp󎬋@nX87H\&KD`=&}$dMv]C:4j+u(IЙ@T wQvNX?1Hq2"[ϼh}ef?0짘)3ԙ=!D\y^̢€;D@%N2(,bjeC3CX /,T]lBZ|SYhmTXG3l5֏9mMR]k0vQ*'I 5em7,rngpD -@fZcoZ^l1c-|y]r Kvr㆟{Vy:J g;ЙvOc scrDaihg< 1ѱ{e 4-ʐw;hEdkrC JҪM˜ǛUNʛ}>Fq3w$ÍrXr(,HQVH[Ix |?1\T{,,S&T.v]O[[Oxx5T^E{^7)') b$$+IgW_z V;A;b}:'omϸIskZhyQ( #>ׅzh+KEܞ_V٣Oy 8im!}:|6KzRg7h7C7O,:?~XN+/ c,c^rJJLB*SMw}: 31VK ~2$&jݎ-hK !:ʛvvb {*I'͘m?wĜǖߵx 7V2#H88 q<-L(#p8J,<"|CahL(cwEcm :Ԡvۮ-UN읿n&¯6Aٚ=>MP1g rh!u\>'S)u!c>2: N;#[PaCaB7iM._c33̈́ d&*|?} pR?\8+.8#gH.b0 KK1KVNe|Ky0Idb P8ڛ_O*:{c *_kȴU->롤,'%Z+wGR5A+G&µ@Qn1E3>Vex-73;b!ϧqT [XO)`>4EtP-O eʊdpG[|F3L|_)1l.2mUiEI9dnޣ@%~=Ŵ Fp 0OrqSP`^ wf8a@c? 7 $jL[< z]}h]ݒا+cHP(FK.%̳UTKV*<߭&y-N*?iس7m9Ri̴l٪ߴN:XʞgT@`$g@p't]en1 m *m/.`%ϵUigms W/U{//loպuN+DyG[I 2,+>L٪TuZGszJZ4A5'0,{M;; b ph%'M!`q:@%{=Y~dE ti'F9IUHm8ۏ<[[v,`*bK`7@K4WqtBq;1œ R*V\Ȯ*4V vC.ѻR'm)ێ9)r?@ʀ $2_Ƿ)cW~3;5C8N 6x' zϴ͐'y'呑jC9H>1̜ 1*\'Oa [IáTk? =m^uG|xy#7?(V')}oPnQOr 1_gfјy2c$]Oy,@~ c >\䅑gb -L&QΩ-LO%sȖ*Pky7P 1g++ʀ[(#'eЩ9t uO)<͋M#\y̯9/ t>jz.7oh4 B1 Bzwww4Ё?YӧOAKo4L) &p3ssqnz=sٵ.sR1KZ8lNm *BpǏóI B"֩3,I Jh4!D_Pԋ/ݮKYa.>x+% D䧻+QP(nz]KH?h9 VLjfZ82ɼP0(#;Wp%[)Aj*3HBR3IQ.T-'T.|&4P(MTX3'jükv>%K]ؿr~pz\I.A4C;OAП@?W?~,3BXW4#xpB(ف$)BÓHW IP( N߁%KK i'. \Px^Iб*Qc=1.e2p/_+D!̀EwooX! T(&ƐhP=CՍY ߷~. >S([p f1kڿWo@|J$ҒBP{{`&$,~2Ve,\@fPpx8 BU m zr@aLl6JU0d0 # y#"=ǏI B1vp}ަ;,2o@?ЊkOAB%ENF(n$h9܀15}n"CBmzSVĹ8jZtp!ྜྷ* Qs+') qLQk/J1(/`&Y 48=U @{qzi3~#O_| %PT#Aotngן9WGv.D!ڙNQ~N+iI@cX<4Dy䋥z #{%\6kLB bqzngfȼys̈;qˮ} Zi:(Ox*{/O:,$;| tga sdZS!HNs\wFzBPLN1#nW].Z[;of|<֓ BȃI <-&nTs*fVP(A5TOhҚy* b3?gXb*梯-VQNR( `#' RP$tvCx(!k=/rG4H3c/7WfBTi+ݱD;!Jɩd'^Ş5]{Q:=[9z蠔&1l1+DG\ -wG.ͦ|D)2=ZSZI69&٩?EO܍evBg!ɌOx%{rՓ--͛ƪה:rV#xF%/_>zHz/xFz@SזHHlb*%Od־qlM-]2<3,$!3q1}[˫TK *M,Iʖ#?xuŵZ o'>#=%[f-,%WK-?+f-EHlRƿc)N^] 4*7R3ٰ[ Rb(yQH }<,4@5g%n^nI*"8jm"`4d 3:6L'h&m$ueSgkq$ B c15hYl|r_pBDHqB䮝 -I y7sȅ$S@ %_T%,8辬Q~ }=D+U=QwF&D*2HXdJfSY戹f-wKD y(RI()$spq[#wW6:67`?jӧOifV iR/g__pkMQ1yavRd=/J;ҡ ^LtZ8#TN90*IbD@Lp 0hd%XV i'gStQpI<؜jHYwfE%GlȦqSh?oRtV?Z6TkDi N_7c(9 3jHnB`ix*yI:P2E&j+Bvc_R@h~)$LBn93Z慺[) ؝%n]-=oH|l`$Pg%3+hHoC'FQ+7,m r6"zY~2I#] Ȏƙ {3Ux#Vf ρ}wL&l>Vngɲo}JQ$ fBVR!`c$6r*1Qx _CXHg-:S-W6S d23ϰ]X;[=} βePLٌP,(n@/%0UB$~Ksΐs4`npj%@FyIfYE'bgt+8Uwם? (/'B̥0ʊsY JM^XI3WMinvg;I$|c&pى}86*'iT"S;,"r\SKGjn2QUR#)SSqbl]83 JZFF˖X2W5iFuTsU#\g;_v7quS)xyur* n 30>/~.ɼE*Ei5$n\2Q%IENDB`analog-6.0/how-to/startwin/download.002.png0000644000175000017500000004220310161303533020637 0ustar sret1sret100000000000000PNG  IHDR*̑tIME3 pHYs  ~gAMA aDIDATxw}LJFbTD)Xu$~m*3~n^7I㺯^ms&_uzN#JG ՀHX ~~g`~u  L&ń333>/ "r! ehK&/^ B.kll,HD"1w}TLю&ID2#B4pH|l߃JOn_U2 G]@ncen2>?TEۤƮt!ː :O,R%{\tbv,CA?wt}TLѦrxq4nlnn 0Bە3fS2jϪ;X鴱)pu9Ei`_rK>xk+-$eG{㔬Vm![0H1Vj^@`U#4mFL&:}iK>x;*w>(XЏvϡ>oׁPfөTqG43͍Jʎԡ#bzzU ͍ 2ܰ!/F'N"Ya[c9T6x"Yѫ @JD"\AFkK^{dEB8$hu Ⱦ_hz TcDKVFe Ê<1+˄ ҴlޮUP(8BMABY*YAJ7MW^wȋ#k|0>1qU @CLGTz+ uU0P߿Q@k)X'Џvϡ>oK(Jxl^t]F ŢM1$Gtt7{Nu#JҳSχtKX21yb^9kP=VC^2$RL2H8B&GH$B #l#ݮIa̙3gꫯ6h 8r)6iiBe\Tq#StSM'(Mpߜ:|D gji-lo.!"VZS!hM6Jj4/8Ƣegǭ5HCR++,UEmf;Wdŀi%,Mx#R<x[ӏ>?.~:EM OEJa Y:~TMj8HMh4%R?T`f$aFڇ âb9".GȆK4FwiDrCٻ|[ߴ_i+y!3TE}-) \Ym@@4\-UYV^=qieZ r&tNjT͔9}n6ȥߍ$g/~/a8{s}4∃q_ʆ5;{V׸ߐv&tN'¶ "7w.nMnW2 QWZiy9(}K:*ZF[BզnW]&gn4 %, %XEׯ q&8E jV򍲁ier:E.l wAo.8$[Mo6 vȦH@%~7T1BLq)o5dEIMR0vޑ&d}pQq҄!I* G:~y$+uN+Rc]U}vKNfUmNR\_%Nq{vo\Z ui֋/<}%^aHЧZ!ũA06)jJ;:vDٕ {;]7&JP=m+5M-a͵53w5KW@@6M:B(K2$鴯@d"v@BsWazW靷"a3B 5]H<,wjBhX0EP^ eaT1͗BPXv JDR 侏>ɓ'Hr}Ms|GhwcZEa*J: 7RD%iWҰJʀpDR1è˩ $h $/0 SN)'ʳqr{%RpAMmt o}MMMr"B9d2b8iB0LCc(,O6ʢI}>ʖ''NE/?%5p%=$6=!H"cpa2*^:ȁp0N 9qT(uD(Cadp@1tc4-+H;B+ΎEKn/3 t}Ådc )rehp&Bn.]tV2 sO7v+%1B!6Ɣ@I(2#QYfԭȎył 0v GwJT䲬!VeFñŒQ~|42K -BLC4FR edmJ6wdnfxx;t B.J%4Ţ,lk`$Bˋʹ-PB.6fᔢImU,Ngc{3 te;^dF|l: !F%Ds509G"[oo$EzsW aHDJC[4||cPF،'Kn|ɩσ˖4OTyuKaz۷yHsi0Sz N11CKȨPfTs"u''޶N[Wwq`۽[~gvrfJ^훭+y-~{%֕W-;?6.f !uCD)A0ͬ6qW$qJ@4i]t{1 s ZA8"=aesj<77GަV2 /V%`Vcӳ_;4sE ZyZ1¡K~wn7c.~a $}PͬC A3k<p\/ӡ^Zc Ǿ׍dw9ׄtPWf]:oDBH2,91pƏD Oپ精vz±R:ԦfO!M$}t+o8M'G#a#1 jrXmѮ\r{aTB+q MJrnM~a?"N~?*Nṥn]=gK|{M0Lc@!Z.kJntjHXM@.kr!KVe56ZҮ'NWPB"I%3PB4I%וJJ wej ѤC%CoOV0M>T*Gc'Nㆻ-Nz8@FV_x?y}ӷn.-ีm]I޷bA5Jdە 2v.5<œ ћKOL-/- Khkv-|x1C{ؘU~wQBY1*Y4wQ3^\N-ABZ͡v)*.oԱGWWB5Pna6RՙSS ;8>%GaQ HZͯ GPB+aQ߻{GB94?;Cl ˹%œ(G_xwwnB僋..cԂ 33\Si~zkRS=Q{}vvGs'W%VLKh(USwNH);o^]WC` 7|$0<(:jȐYSyS.jsiX/Ca@j.ڨO=@XpWauV2 ӻ͵&i"t5˧4fH9/?`dwiAp<ۗh~pa^Y~ 0f- ˂[-#3 s6%s>'l}pa H[Z2#ە 3b$ C`rfvW}eJaJq}Xj& [ U,g6MG Ja H(o.GD^ Ca)w<q.a}0SC w{A-dc3[H̦EpT&V2 sՃJBa'\$_'2#zI3 sC%a$B:=~Tт1WȮ9Z2 ;he?0L1Tgorq 71MiAn~K2C^ekf?0Lہ] K&>`="OE2cYU J:kJa`WB&O&H"(dOK jSJYn(k%0nVhh/ߘ?zzz{0_>OwO7xN+)p،A7ٙTxWǵu{K"D;[[[J bP(Prryu]XvmG_e Jߧ#czze4hnP!1}{A ;a*B4aQº@1P2YmxZZCK[8C/32^YYV ElaEr9#-JnݿQBJ/v3eL3 ytA ,-B,@ zvѳC؏G=ـ}Axr>s96&TӋPL+Ca9¢Ė6q(K81!2ĨܼM7;}bfvѓ~QD0o}"!)H::hM j7v 84 v gS[9`J!smmm00'}}}_sfMć(MxD<ȋkD95-10aG C %ēf"LKѳ!k8Qeن}paW6 -G>0q{ioHH:!gD=Qr!LvZ o (!<'Lyl=U{,Mщ?OsRK~+]lzCo4 ~m4Z {x| E裏DyN-խkШ>y\9ӄmq')Tv?8mؕ4!766.9tDzno%-r 0$ `Jώ~U( rR( ,J8Y/΢X۷#]o߷z^}p&<\l#4aE"ĹE4d;fțm7͛7 tqOcy1E܂JȘT7S5-MN:ΤdAF{¡z]ws#S dq.W\m;#iQ); tg<&Gm]2;_|z_ Q8 ]҃oANxP-s~NqB?]-<+Ir n߿%s7(PQ)BGk]=tV_y*r+=+9zVTRmLF*MB? {궛" RyWJf=sgh{mzJmlLV*rasK3b?>!B)BM3(_Z8>z%K+p!K_[m%=^gΝ;|{キW,9aer tN>kfҐ侫RR.ÓI ݄qtSfN[1Drk H_]]Uq8W4FPP H.v~q..TC[Wg.NgjNR.7MϤ{:UDcHG `^?ϲO=9Df.RYw gsgE#UJb vc6\*;5"hN6i p.砞m-e0?e8}\}D~34'QRrH0 ˞Tl}=߷kO+==i6r k6yчWFGq\ ]QPשV"m/{xkm麻)m]WV%FМl0-3u~{ʚ[>nx͞2r% g_sጊ7*l-0>^[Z~RݺԓIMGjA6dmTsd.!PX=@P(lllP%^99!CUmאa'y+JAV GR= Ahh B{D+A#Z)JAV GR=c?{] ܈;#AYbabO H+G.~Eq 8+1c}/Q Ob c[VbAcqA= Pۋ\.tȾm{QoYXA}~{9mNB^"5=z Ju40ÍMW IӽI1(!Wo8Q³նuxVrww?8tw_sK+oλ;kx6KD_11 ?ǜʑ+^%:M:* H%Dg+OTGFetFI9JAIې}ywbŰ9QRؕ/|؜z^1zAミ3uLJ)R3zkڧ0qvv%GW.q2*Qho=%|k--vznn]Xke> ŤJf.lŮ`֍0nZZ(Zk%@%iUXъD+h='gs0ˆDՓz޿WO*^Gjtqh ‘d p! )!'M!Rq`z:9c{p)h/E+9uc7fH=e@ aK*[=!Z>f洒m l^}]1EXyM7u2 cwA6PXZ |}sdh;RJA6VўkAIk;ǺJNӺG۝ RozMߵy`i_S_2C/_UGuUX^9T7hqAX޽{;G83ד>-JKQB%al,(ؕ *DMTM(=4(uP~:UҼ0.Z)B򁩘nwoL4*)cߍ; }{h$f߷vm{OtZϏ]ԉ>&5* ::{l erBJL'ѹ!9֮ԹFV3{~xrqcrRMԴ-3& V6 nMaBST65AkJͦT.M<-)i@F.*hr9uv: Ta>m;PVR(2$rggguu_k[[[&jXDH.w% DZiMً[ZIr{{{ee* W&zyϿw ďk흸O_Yw]^}¢ (؁mt1<ﯬwuGXd|r:FIeۏPb[1_op9!Q^ i>'~4nXPI2tâaT؛J% 5.c-b[Ls*grCۮ-<*x )QP͌j6GeCF(WY A+Ju㼷ޒyMnYB/*r#GhzG_ :5#W* QCH9W Ife=s " &*!/ZJtLk6PR٘byUaYD/E7U]gb;-c"`H:_j6ag}}!āP"qT;lQ/u.%rUH߻]IGތdDqjePFH.,,嵵5{;.,.ĝ ʯ$J٣\y;-ǨTExVVcgj "1ɘvjJ%766γ  YX0-٥VK(#d4o|uܿ*AEQ{ 1H{䣏>q z}pZpS%x)֥xZ+)eyR,KؘqR讗خ:)7o޸qې˛6q9c{Ƕ}̋R*)Ӌ'dq#2=7gggCU穀fG9L_\_7y] ?LK@.G2_{mX|{iiڵk'8 goOU*SY B7HWHVV\c(q /r)$IXܿy@}9ŝeaЖvCB.ٌ}cG AC.WWL-J8CGJܙ wD1yVrYe-IevLLĝka0߸qCo!LҢ !32BAoε0L!)/VIlG.!+aB|GF(_i)$%}P݆,K3kE (1aoz;.g\~~,y+ TW;i ͷS XqgsL(ʋcwК;dlYTB(阳_WxWO!. &bQ _jtmՋб?1PEV(Fr6^=wxCJCu⳸fLYc3dtH.b'#7D g2 O4Bܙ!Q+أEiwi\WHP\| (w|CM[䠺 ʳDyۺ P4=Qyvvf,U$o݇5|O1ޣ}ce#\;=u9C.T^WܶU~-]TW\(]FDqXuD(&G;sG#(D""JV) Ú=2Jqe3G[NR}Otμ͟{s%AZB.޽ <E$(QҘ*>O4m3EGӐmns.HӲ+J%Fw;'e*=1<,u^șZȅz<]כ`3F(v^+zi&>} Crggr\^^n6ǹUŞc8g/ύ:|o~8}-T"W~,=-Åh9+aWB2]=f-NYc.$[O̞>111QXֿ2GB]\\,B ).,,@:e kK 2Y,sTrmmM鉅Z{W3A'lEnH'tLwAFIf|ďNAgrkkZBwvv%u B^;"e#Z)83 GX,M[:Y)'{u{ァnX˅qA,2Εn8R1Չ; qb9Cؤ.B)\%C2HHAyE>\FS 0ʜ^>ve ''" ?f_x3wU ri ߬靎TXO~}vsr?AH,7oKٴ\oXʹ9DYqShjOsPA:qN?|#MkO?'E?3R \ylYSoK|%l9Og!txda$\tʕWF *yQveǩpnR] ).y公ɸ,0\u*$O>]m8Gi%]/ʺx%uqJ>׏?xxZη4"Z)ty|yJon]e^H P;|Hy#Z)􊫯 ߧ"t]: . 1ɶ%V cF gg.#xH9jWk3&. O]DYJ%Z)^!.HX|Kt+$ t~5CJB ArpWk (oAq:0B IۘAJ3`%AhW 1$ D1ߏ; herGh 6778b5l=:W =SgC:Vg Cj gSyʈfdpVRV. …aA +@׍(ݣE9E=?@A$Togg'cZ^XX~.h¢  +ÐBT!JvAHZ+ BJGhdx)8 >xEA0VҿD1|plmKv">  Cke\:Lw߰"T*) IBk%f) L7E*&#"> I‚q$FFۍ zn!vU.,qC)>pz߮Hc }t")N(AGCN\>sm};4VfA.^q:/ZyzzoX1A+o{%Lic~çO9׏( ɂE |饗`۫*L8-|tz"N]/?̰)|h9:?X(a\ץ9+J^rKH)OYZؚ̉'\`1ÆE % 'R;z?+I|_@>|ܙ=sɇO,*2.#K)TRrHbRŒPFLd0cWJcΌ4s{{{}}]5(&Bp7ןH|VK%boOuFAۑ"fW) _w*/t.>EE}S+轘u@8T"[[[*qiM _f:<'ao Y%dk+R^reTz(KpmM(W'ede=( &ab\KYL;Y,5 O1Wq>;QC2|3LHߵ.gL`3rm'`ĩ߿o1[^,GHVb|擵纹ιM-=p.eE]bwχdԹ? oϋzsDw\t.! S0l1n՝EfU|FWDvR^gݲI⸿f2:v?(|*v%bBsDrn`94*N,X(?n!|tb B@`ΥwE D%Ȕ]3}sLľ=5s9oL&M(.'"̰ދQVCroCAX3Ϊv&MƖ^7}`.tU_Nً;[Ӕfd!|~șhDڌdpt=c.]&5~uK8J2}>^UBjL?Sk[^Ӓh58JY?޻`Ď-@dq7etƙmr9mX*Z9i}V:|mmo&p3Kj,,bۅ:mq>Bxx9<~|leC8G޽{L-3\q->&lLd 18S(UR@w:@|]5ݽ{);ѐJ0:6T~+|PʞYK} M#񦪙7qQ̰P.H)ƌ\zs*˝;/  |lANiqNl#[hΘB\<#5vA࢈O _aysbJauwg1q E HXܔC5>/=YS4#3(Z"dҘ!dYj Y{D(CA[nhfl4MlU! oUD!'~_,--u"@wSp2G:ޜ(.zWG Bx]젞eh!)[o'OԵkW^Wϋ䖙a7Z#< c,C&BGׯ,DAḨ:d!gHf&Y,"E=Qc,Y}S!rpgQ9 G Ip?5K`N4Nf? _xkkƍQO?(j-,uz囬1A{5WY;'eKŚUg^6zwoyW]H˞6˅Ke܏twwEAs{{˔Qb]fg;] BDٱv'Y 2A0J'JyYjȬL w@wŨdY[duVޅBrj |cl ǃ>KyR/G-ENlj`Ra֫ʪ11򘨝/;i=Y* 舱COs8j>OQN҄APڂNR?edY`n *<<ebbsick4LR_BvH+"bv?r-#׌,=?" }.VS\+uș=,Ş͍pBlE'i+Gbv9Q=0-xicX7u'LMb & 0>ѭkXh+%R`HVP\woxKsy3HEgEs-{Ys3n~q%0*ק)DDDDDF48Hk̚2 'pb(++͕֢JsY1=Z*urWf0&/Vs]^Vuhh !c\GkkeW$1aVWqPÞWRPSYE^D ׉L1h3E\r\Z v*>5h [1}9O&p,1 +aD!CJ;p1E(\ﺴza2~F}]0$ݽ|Xg>Wj~8b"b"b"b"b"b"b"b/f:;rehD3L/1`p     (z:nV˷ *Hv64:gsB`-ge}VU j&bfKs[k˴|T::T!ǹ>=EFRp|f1|ȉXNBFW|<~]lX4YS&m\՟j Wp#U7&DIy Dbk(1`9ZJP`-aT!W# 41$SCRqAD AD AD AD AD Ac/M5ӤM7g9bo1bP6kmRZ寕jr*m4/&=jƯɡnNj)nmw\esQZn39<#K2o_?_,[!2/ȵn_F!#H y"B6^#KX #<0b$,Rn2|Cҹ(a{6##Nj( T-Լk0 [/?*ڔOݚ=]Fe9Bk=^L˴^Wm1UѤr(H\Cfmy:!bP C)b<`\ 9&\ @@@@PbD=gcaF$ZDEL/T9i&B'Jit#U>"Љߋ tr}*/&AѬizg98sagVpU8\uN'++׍zzۑ2Sf2"H1/qiӄ1]pԋVF^}B3LGxx1zlDb=Mӱԇb<4GW ͫ^_Lc"x1|/ " " " " " " " " W.3L0-tk\zwK 7Z.=TbbkYق\;gmkKWB7߬b/&Q"z^g`u$X@!ݚߙVns#k!cgl-u(moHZ72yc=ZG,g<7TB8"h6"vwwul_!(D *~AD АA"u~|hhyC 1D "^0Nk}ٝ;w.q?|g0DsIENDB`analog-6.0/how-to/startwin/first.run.001.png0000644000175000017500000002343110161303533020763 0ustar sret1sret100000000000000PNG  IHDRQ,tEXtCreation TimeSat 21 Sep 2002 17:28:13 +1000hXtIME (HB pHYs B4gAMA aPLTE3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fez|#dIDATx?v㸖+xEO7QY28UT JJamB5Aq;C.@DT.DQE}| Kv yP4L<i\Byd,%5(^Թ/>oɏ[ 1`+8oD/ݷ _7bpe==<=x]'Rg,p^LөBUp5:5>}:~?^~|?6IU0xDL>&?Ҍvè>mktUtz=uS׋+Ʈ4Mשۇ|u{V߅%u2xmlɲAzDH]c޿zziQðxM/)juBŖ I*vmgw6z/nubOoQ.ݥ۳\-w' NmשG\E[^>.EE'Zy Sz}\ɩ>8}"Q x2+l[HX^"D, -kKћr%kGD-VSniWO <Ϳq/pA: j.8ӧ_tqZ>tTB(X)M~Reޝf^?THС4-uޙzf}!5/DVj1usԇ_tPø#umo:d2J˅ʩE[ػFT{SQ?]c" _L=4D}@=.>4sOE-)xg3EߍTѨ`ipr\Z 8JܣK.R^f1??OK#1Q*!ԶP-RE-=SëzMGRO>G4zr;U{~͙ԶE3'@;D/_z!+(6Oׯ߿$ (zs; >'ÉޟT1ID %/wɦm靺U5mPW ?~{~z~:p {zgoDڧE˩!y6z:A6sUX5Vqf9kmY4I]Rd]7}P_%kj8!T[R5ױSae^7j6!^(s2N~⍃~#a>,vjcaG;އ}\ևQf\_ZSw8̷m\];wnyF-eGŸELޗ޷HF ֐C%[kSi Y,=|4rcsIyd}yw>J je! W-/u{pXGkؗTjpj-vwE`[lQԠ~lQc l-j#E15.K_vD G`[#@L na ?`[|' `[|/AB`Sn0L›؎ؐO N 'FApj-,=85~";15As585(@9cLNnYp@-ޙ1Y.DB.rkpjP~%Sm";;_݅op[S~o]rkpjPc`[NN i85(@K15SM>LuD59bjP1w8585;8 N %858Qé/b|N>jpj\ K(SjAL L ]gjϩBSq-=P/>f˺`[|N}D?5QEpw1 Sgz@15;NUw?15S/҃SmA;PS99GrkpjPESJ ~T bjpw]?~0Ss9 YQ.oSO585(\4z "ԘIK0SZ~K*Sm S;Sd 򩕖Ss@ԠS#K ~j85ԠbN@D159f>"85ؖXS$1Sc&P/|L3 ҉Sy!f&w*_Y"U9Gљx@*_0@fȧL^N@קUpwpj-$ O@F1xfS$pL ԘITHEg$J'SNIM?@feBfuȧ^R$ۂ,=pwO *N @Li85(|j85hfU&UITF 9c&P|j$$V@93 :W`&P!>n1S{gPgIߩ1Sc&P1܏sr@NTA35 sj$P1,=85$ p&$%P@s?0X fU|L^/"oINF"85ؖx59fL^"WhLNԘIO SgjN "OSz~Apj$%O=n$*_H̥|1SIf|HN %"f5| 1(H>5fu|HN %vݏ+`[ITLZz D+_KhSm 8uԠ ȧs}j8585;r3 *Sc&P/E$G$j_M@*_0S/)Sm(2u@UD*_0fBin,N JS"ԋ˭A KʗLMéAAp TK1;hfU0EBgqu$jOMEc&PSΘIT[$@zIlK1H>5fu|  pr85(u?"Ego\G3 zSc&P#,% Mpj-@pj->fȧ5|jpwԠb|N0)RӘIT@lDqHLbԘITI쪧N3 *S73 8uH@D-Smngg$J&O=?feErkpjP|j585(d遻#wN *}j85S'\[SS°u_5rpjPEY"`rĨxh 7©AapG]T:©Ass?љegJN JwԨ%<ʩu3q85([ԭ ?&%\W+ ϩE5D@,qN 5Nb.NRԠ\$k@D©Ay2Sء=b] N JBs';H }85( i;D1CpjP~\MéAAD p%lN fHMj5  <:ERJiE-(09* H 7t֨|꫋(fY,(O6c;t6ÿ ] qzu"<P(g ?;6= 񟺥=+Nn{itTWkI~iՎۗ';bDi9S)B7XÙ2zXԶ\\&ӕfUJ-iWt~\8lRZ;#VhMENU=\ΗjwqW]@Fpjɚ+cG%EHy7R?ʒ7Dpަv9'[K%n5ki6&˜>"9UzE=tsX|b\G6V%>^xO ^re'Sk_&f۰/]oyvĦ3ޮ.R$uhΧ.שUh:\r@Mj/b\*ZZ7_*̩Y0kH`;mJ4ܚi_>$5]ƈS3ߴKUNqw89b}oU2vq6qjaڋs')`Ԝhk@6au<FEeSͫ:U|%V ?EuiV ['%iφ1ao{׋>LUɂҧkn5O:+}Ю#L儆NYh%(h<"".ix?v}Ecޥh&wW&^sN+ }܎.~w(ȋɆ*vc/NK1"=4l $Ed3ue΅9Tzmz YX$p2ݾH@;N* GdyqCT jn*$$eZV#)% 95vXZML /wX#E-KT994lrIEL} ̉"-;>.\T$$D,V$ R>S,:i"m HN4'0깊)01~߲"~n}GR Q+?6YڪH f.H`g9E"j*ssK gf@RDm(Pe ;E3M L[eVW][$2@Z8P!u:㊚Kq +|*Pu| ;^ ?-ό*H'ӍEԔ9`eɕY(H ڰl8MC@#lgwagoS$"_kP$LQ?X4O5(|Q?//m/Qs] ?0CEOvꗱmE;^Q+#'?F$Dޙ,Q9d*̀L/ dMo+Cf;խϩcƏ'V ,yY#jc6LӴ#"I>OCrd[.jO-MnCGS ncZ86:!Պuqwt])}N}[ۇ oO:Q'~Z5NLTlpZ͈w9H9Nտa~mN=!?#ۋZuw8"ԾLkܝ"`Klgq~7(v83rdvj9>J*IOEQΘ{"6GǿhyCD=ԯo(j>NDB:8Qrvj՟86|w~pN?9?] ofL=DUao*>;e>U-_Sf Xj^i56>gG$[vcjԢZ$8Oa\MONiF߰DrFH!ߪ跛tȨFwNHrҼxv:]vtQ///gHECOu>^hO^A]]$Zv&}Lu0}*jjIҼv3c#c ?n.{w{a?.7MyV]P$ǿpyǩ;󷷖!߆o?GKjL?2YvsE4iIbfd(v*x~ArOI0$ $D#3U#ש "Zx |d杷{3 ?S3GSk+杇dv3Z"yh% ;uqKgM/cӲ &Eko6HwIz ?my Analog HOW-TO: getting started under Windows

Analog HOW-TO

Getting started under Windows

This analog How-To written by Simon Handfield
This version (1.0), created 21 September 2002

Contents

  1. Purpose
  2. Downloading
  3. Installing
    1. Introduction
  4. Customising your configuration
    1. Introduction
    2. Running analog from the DOS command prompt
    3. Using your own log file and changing the report location

Purpose

This How-To provides some basic information on how to get up and running with analog on Microsoft Windows.

The How-To covers:

  1. downloading analog
  2. installing analog
  3. verifying the installation using default settings
  4. some simple customisations to get you started analysing your own log files

Once you are comfortable with the topics covered in this How-To, I encourage you to read more from the analog documentation to make sure you are getting the most out of this very popular log analysis tool.

Downloading

Download the latest version of analog from your nearest mirror site. The latest version at the time this How-To was written was 5.24.

  1. On your mirror site's home page, follow the link to the download page, look for the section that begins with the heading "Windows users" and continues:
  2. You can download a pre-compiled executable if you have an Intel-compatible chip and Windows 95/NT or later...
  3. There is a link to the latest version of analog for Windows (zip compressed) in that paragraph. Select this link and download the file to your PC in a place that you will remember later.
    You can download a pre-compiled executable if you have an Intel-compatible chip and Windows 95/NT or later...
    Select the link from your nearest analog mirror site.
    Save the file.
    Save the file.
    Save the file to your computer.

Installing

Introduction

Analog for Windows is distributed with all files organised in a zip archive, and so no installation is necessary. What you do need to do is extract all the files from the archive into an appropriate location on your PC.

The zip archive contains directory information for each file, so inside the directory to which you extract analog it will create its own install directory which is usually:

    analog [version] where [version] is the version of analog you've downloaded (in my case 5.24)

The archive will also create subdirectories for you in this new directory which will contain documentation, example configurations, images and language files.

I'd recommend extracting the archive to your usual program files directory, which is usually C:\Program Files, which will mean that, based on the latest archive file, your path to analog will be:

    C:\Program Files\analog 5.24

Step by step

  1. Open the downloaded zip archive using a decompression utility like FilZip (freeware) or WinZip (shareware)
  2. Select your decompression utility's Extract action
  3. Make sure the option to Use folder names is on (or all files will be extracted into the directory you select in the next step)
  4. Select the directory where you want to put analog (usually C:\Program Files)
  5. Start the extraction
    Open the downloaded zip archive using a decompression utility.
    1. Open the downloaded zip archive using a decompression utility.
    Select your decompression utility's <code>Extract</code> action.
    2. Select your decompression utility's Extract action.
    Make sure the option to 'Use folder names' is on.
    3. Make sure the option to Use folder names is on.
    Select the directory where you want to put analog.
    4. Select the directory where you want to put analog (usually C:\Program Files.)
    Start the extraction.
    5. Start the extraction.

You should now have a directory (C:\Program Files\analog 5.24) with content similar to the following:

analog directory contents after unzipping.

At this point, without doing any more, you actually have enough to run analog over the sample log file supplied (logfile.log) using the sample configuration file (analog.cfg.)

Testing installation

Testing that the installation succeeded is as simple as double-clicking the analog executable, analog.exe. It will run with its defaults, using the sample configuration file (analog.cfg) in the same directory as analog.exe.

When you double-click analog.exe, you should see a command prompt window or DOS window open, then without warning the window will close again after analog completes.

Testing that the installation succeeded is as simple as double-clicking the analog executable.

While analog probably ran successfully, you can't tell by watching the command window. Instead, analog writes any errors to the file errors.txt.

You can check your analog directory and you should find a report file, Report.html, if analog ran successfully:

  1. Open your analog install directory in Windows Explorer. You should find a file called Report.html in the directory and several PNG images: this is analog's output.
  2. If you don't see Report.html or analog threw errors when you tried to run it, you may need to extract your downloaded zip archive again. Delete your analog install directory, and go back to installing.
  3. Double-click Report.html and you should see your first analog report open in your default web browser.

You should find a file called <code>Report.html</code> in the directory and several PNG images: this is analog's output
You should find a file called Report.html in the directory and several PNG images: this is analog's output.

Double-click 'Report.html' and you should see your first analog report open in your default web browser.
Double-click Report.html and you should see your first analog report open in your default web browser.

Now you have confirmed you can run analog successfully, you can go on and customise your configuration to analyse your own log files.

Customising your configuration

Introduction

analog is a very powerful log analyser. This is great if you want to get very specific information from your log files. With power however also comes some complexity in configuring analog to give you what you want.

If you are just starting out, you are better to make small changes to your configuration, slowly working towards the reports that you want than leaping in and trying to create your own configuration file from scratch.

The sample configuration that comes with analog (analog.cfg) is a great place to start. We'll use this as a starting point and make changes little by little to get the results we want. This way you can always go back one step if you get a result you weren't expecting.

Let's start by backing up the original config file so we can retrieve it later if we really break things badly.

  1. Make a copy of analog.cfg and call it analog.cfg.orig

Now we can start editing the original config file, analog.cfg. You can edit it in any text editor, such as Notepad or Wordpad. Just make sure to save it as plain text.

Running analog from the DOS command prompt

Once you start creating your own configuration file, you're likely to encounter some errors. Analog normally writes these to the file errors.txt, but you might find it more convenient to have them written to the screen. To do that, find the line in the analog.cfg file that says ERRFILE errors.txt. Put a hash (#) at the beginning of that line, so it looks like # ERRFILE errors.txt. The hash just means that that line is a comment, so analog ignores it.

To read the errors, we'll still need to get that analog command window to wait for us to read its output instead of disappearing as soon as analog has finished.

To do this we'll open a command prompt window ourselves and call analog.exe from the command line.

  1. Establish a command console session
    1. Click the Start button
    2. Click Run...
    3. Type cmd (WinNT/2000/XP) or command (Win9x/Me) and click OK
      Click the 'Start' button and click 'Run...'
      Click the Start button and click Run...
      Type 'cmd' (WinNT/2000/XP) or 'command' (Win9x/Me) and click 'OK.'
      Type cmd (WinNT/2000/XP) or command (Win9x/Me) and click OK.
  2. Change directory to your analog install directory
    1. Type cd "program files\analog 5.24" and hit enter
  3. Run analog using defaults
    1. Type analog and hit enter
  4. analog should run and exit without writing anything to your screen, and drop you back at your command prompt
    • analog should run and exit without writing anything to your screen, and drop you back at your command prompt
      analog should run and exit without writing anything to your screen, and drop you back at your command prompt

We have just performed the same process as we did by double-clicking the analog executable, but this way we get to see if analog encounters any errors as it runs. This will come in very handy when you start to create your own configuration file.

Changing the report location

Probably the first things you want to do are to change where the reports are written and to analyse your own log file.

Let's look at the line in analog.cfg that tells analog where to write its output:

    OUTFILE Report.html

This tells analog to write its main report file to Report.html in the same directory as the analog executable.

If we run analog on a regular basis, we're going to overwrite our previous report each time we do so. Also this mixes our report files up with our program files and gets a bit messy.

Let's create a new directory where we'll put all our analog reports, and make the report name dynamic so we can run analog without overwriting previous reports.

  1. Create a new directory (mine is d:\stats.)
  2. Now change your analog config so it writes its report to the new directory:
    1. We could edit the original OUTFILE line to look like this: OUTFILE d:\stats\Report.html
  3. However, using a static file name means that new reports will overwrite previous reports, so I'm going to use report dates to generate a dynamic file name for my report(See analog documentation on OUTFILE and LOGFILE commands for more info.)
    To do this dynamically, I'm going to use the FROM and TO commands (see documentation on FROM and TO commands) to tell analog the month for which the logs indicate usage
    1. FROM 020801
    2. TO 020831
    3. OUTFILE d:\stats\%Y.%M.html

Running analog after this change causes it to output its report files to d:\stats with the report file name of 2002.08.html because I'd be running the report over a log file containing stats for March 2002. If I want to run this same report over a new set of logs next month, I'll modify the FROM and TO entries to 020901 and 020931, it will generate a report named 2002.09.html.

The image files that display graphs are generated dynamically by analog when it runs and these are stored in the same directory as the report file by default. However, they will not use the date as pert of their filename so will be overwritten with every new report run. All the html files for different months will point to the same graphs for the latest month.

To avoid this I'm going to use another command in my config file to save graphs with date-based file names in a new subdirectory to keep things tidy:

  1. Create a new directory in d:\stats for the graphs:
    1. d:\stats\charts
  2. Now add a line in the config file that will tell analog to put graph files in the new directory and prepend the file name with a date string:
    1. LOCALCHARTDIR "d:\stats\charts\%Y.%M."
  3. So that analog can add correct links to the graph images I'll also need to add another config line that tells it the relative path to the images from the report file:
    1. CHARTDIR "charts/%Y.%M."

The %Y.%M. segment in the last two config lines is not actually part of a directory name, but forms part of the chart filenames. It might have been nice to separate charts for each month into separate directories, but this requires the creation of a new directory each month, which is something analog can not do for you. Having one directory for your charts is not such a problem though as you can prepend your chart file names with dates.

Now your reports will be written to the directory of your choice and won't overwrite each other each month when you analyse your latest log.

Using your own log file

The other important customisation you will want to make is to tell analog where you keep your log file so you don't have to copy or move it to the analog installation directory.

analog's default config file includes a pointer to a log file:

    LOGFILE logfile.log

Because there is no drive letter or path information, just a file name, analog will look for this file in the same directory as the analog executable (analog.exe.)

Your log files are more likely to be in c:\WINNT\system32\LogFiles\W3SVC1 (the WindowsNT/2000 IIS default), or in some other directory to where you have transferred the from a remote web server.

My log file is stored in d:\log\apache and is called access.log.

To have analog process this log file, I'll change the LOGFILE config command:

    LOGFILE d:\log\apache\access.log

I have no spaces in the path to my file, so I don't need to use quotes around it, but if you have spaces in your path you must include the entire path in quotes:

    LOGFILE "c:\my logs\w3svc1\ex0203.log"

Running analog now should cause the program to run, analyse your chosen log file and output your report to your chosen destination.

There are other changes you will want to make to the configuration file to generate the report you want. You will notice that the images do not display correctly now.

The analog icon and the red bar icons in the individual reports are stored in the images subdirectory of your analog install directory. To fix this, you can move or copy this directory to the directory where you are writing your report files, or you can use the IMAGEDIR command to provide a virtual path to the images from your report.

You will also want to change the title of your report from the example [my organisation] value in the HOSTNAME command if you haven't already.

Work through the example configuration, reading the comprehensive analog documentation to determine what each line does and what other commands you might choose to use.

Once you have worked through the simple example configuration, examine some of the others in the examples subdirectory of your analog install directory.


Simon Handfield

Back to index of How-To's analog-6.0/how-to/startwin/run.001.png0000644000175000017500000011221510161303533017634 0ustar sret1sret100000000000000PNG  IHDROtIME!*Ν! pHYs  ~gAMA aIDATx]oƞ!-J$i/x͢,(xh Mrǎo']LJ _.~Df'пj펾cێɉSD$.w8pa[ӴZʵuݲ<{zʂyC5p`j;kZa9 zר׻]\ޓ$v0`#BaxpѿL/`J =ò GYQ)r=hBQhe"| 5DY]]'Hec;oZ@$ųl"/ȱݽp*@5[]KA_- ^`CCX,FiKhtAvwwӇ,0pB5[Χ!©p|[>\zaf:Wnuvy,P *Ch͡H"gIZ^~%JqDҙt&Jq777!"\9NJy> VKc[ۯ7xT6TQp~} K i[$@ ~C իWo޼p]"<99 Gwv*iN\[*MQ@  ;hm7;{*F"n@b :h}NB%`I $`ؿ4uLؐ PIT9ESrM#sy\J,.~`@kM$dYaHB~icMLO܌WuXi>BP3>d@ooި+kC#DC^h^_϶Y IcdL8|sj B'O5A`\ t9w[Tr"TC,%D,lC[EHQ } $WW;Ul7o->|x亱xLN!$^:4Aqb7+ݔ\wkPi 0@ <ǹat[(A0YJA< BAH+Z0pB_*rC9'{1G4d";4tۯo|.?yd񫕊B@̎$` 4cdn|JKu[]j5pf 0 %hq%|ȤAa,*^a,pX6#m(\ƁE>9J3RGhD\-$-ݸqgi^&C0l,Zqww;w:,{$^\TзW^=yN@pցL@ 7T_յ+x.h l#gS W P,NoeAoou PC .$9E]7;{_~ U]Fv [͕)N쾪ʲt̹z;S>4 XO3Ca~C+vzJvB;3Soe-K*%'1NuƿXfgA 6E',a/ yw rT\Nqp Pqp#QB -G;14>q\;{j[tJGENckz6B?M[_)׿o6qa] 5o:,Y?=cSAhql$Y:5hYR"S\z{EQ"1ih~[%N١fw1™b1Ņk'NM5=;TxlMX]]t幍R,&"| .FydJzd@048%Dz(\ƅ lB{DQg/GI"6~6$I:ی"|><ŏ8Ǡ"|n "D8C&9Lܠfpep_jD+xI{UMZT+nvrlȆ\l>$ }+c IJ@7fZ]YzԮE'M]BW^֕* K4hDs 6%RCB04h\6 /{8W#ZT9vZRf4cۛ˔x~D@04^їԈ Z[^(;ժI}^.3ZQtו\TI΄W{{@: $m8;1.yeĘKH "- +)0ٞŴ^m6-ə&P,ru9v}|DwU3w 4o&%c(Bp^ۘ)P̆YCvˎAL[ qűǑL"%-n"ZjDWG)~>W~Ybq9NEP:N6Ek댠=8mm"]$ZI;Ƴ Ӷ5H׫Te *awjoXʈD8+X{=9VFGŌ&zcQFN -h">XtuR*.z F 5 tZ'b蒢Ѵz/!iӣG/ B!$%#[- 7Ss(:#?[ 7Г-Ic6Dhl#2e4c!iVUd*6>qʣWr0S))^6 =;;|3HzKk ĴBɎx*t*BٮJTU"hCFbWo :q鷩xNێn?ylUtؼRPPg̻d*k=tJ4-auc6p86JOD_I3Kp^.+Ȳuh9Y9wm?&Q/LDAɰ)d"AU}*`Ԟ~tX%Fj]2}?3:K:4XUt0=)X2!(NG+\ s*Y xBNԀ*s6 ?BΥ9 ݂HKJ$|JF>X0$ܪLKR\A-ЦȸL^XM#Ҫ!=N9ѵ]X$"5(2 Rl8T䮛6-l3Q5%\%`IB\]]'hȉx.EP%TCa.膢 Ćy* {ÞR<](g @ӇuwC'2PJ s%x/=:%1* ҦE>%dMmHA )bH7l.Ldu_JK^%t^m!]]ez-G!+Gn=y5¼\V42JA5P yk`- L.Gq9L>؆P8`B'nSom:R BJ8 TJ],͢?02(LynŽhv4''v<]' Li~n!z{ib0(wm$DʺIJc{;ws\NG:vC;g9{s챝XN$[D%`knly3gd -/gEa8.J.O`ղ.wbx?=%ԧU0% `Uf/Ltn( [7<\_vK^D(@肎E$O:˦ K>i,(˾}VyNz^v:N3NúB#a'[j#I!,Og[9Xx0sD3Vd$K8ѷN* D&#R Z" 0G`FVK` FC/tMUj-&lZO ⎆- [b;np)֦tScBs-q\)Ŋۃ@H3 RP60JY]]lz1ʓ| 1qڹFNFZU|r=tbǵ怍DJLmC-㓚Ik r^(I5B0Wm"jtdc,R&w[>7`t/[:U]j-Vr@iqRޝZ#hhdJzFτ虤Cg/XډQ{)o8jjH'dN2DcQN?_Kw޺Zc}p=è_}|A3Y,R#w=e9)0V+O=Y ׊6{Mc٪RR>%ďœAG(9 =6JܷCR(ayW609olaְ77o~rg8>0VAkbmQE/|4X |t\f 5LQCzV=R@J僰ǜ#掛3,gF]F(MOmnxt*8df-1}'6X6jpگ~Q\#'|A,QD#=+O*ِ.r{W˪|q-l<Ο^.5~[fD+FnC̓5Ш,ylWOhk{)y dnCTݞx?`Ps8XQp" cdHY=#riZjmU_h(s<1G0pլe]EQ<:񤓳u~p N$2"'3<6׮ȇon6^seQ} @ ψ{hF+2M[~ݐzv6JqjYTRõv:ݪSd,7}dd(-a;I; {r,]z2.qDEʢӺr'$%4D@KM꠻_m. |ӗyKDq kz xBZ lD,<΃<Urllw % duxr3>^V~ %n%.@F_4J(9@&cVkt`I)2/qy8o  + Tj, 0 Y*b<pփ|{mŀ|FjR* ֛c41!݅%ò(qY a(#nP q&G">xx RЁLw<<Hz,K7(q^8g_vIq*w*Aw;\p@wvE?.t_ѧ\%]]"Tva_Kmn 8>PqfQz%Hú=RjA;kKmySꪨ) Cc0f>BRj[Bx5WW_} K(8oDRj,-A;s;6`|:4MtuC'lu {3L(c~99/ !*'f䔆x{fGzׯ'@7@X216Xϣ5cd/1\ ADꩢ?}x0p "w/WWFK?n0٭pF3& '+z?qr ӫ ^ t%7o0žE-J&ﳺFP#3(=4)_49/Qs;Sj3ՇO م?N~'nY0-h cdoW*z9)i]5+wnZ?of{R+%'>Q#wFǔ'H91lv&=Gv~PR;`2x 77o'gdfNB8%&1ՠ>`p>#3bsqxZCwDuz{sGn-;专ϗ|i^jfEc7쏩j5wTpv_Mͦ覽`h[1[Sc9-MNR"̚1 q/y-V>R,@"υh"*Zy6P]A_LʐM1pArnK~u[ 6f (O JÂUS>$ݾ/ $IٔBffǔdYQûwnvmuG5 g1\Ѧ U!&'Y{(*RNL/--jU`ۻwS"e%NWh6ٝY-fk(ѵߠkZF{۬~uh~\OуĠSқR58$`|- Sir6}HV`}9|S/X7<ևu8[*R@R&҉P5dp0F3煎_,d}fِjwv@Ca[ѧ`ĐԯVk)h O< b^!FY.DX- j n! 8Mo(/v+AVq7CbeUkJhQ1ݾmkJi=>5!7DŽjҥ087%V 45e*d^HNaNI!5] T(XZ a^èW~N©P6IJ,0XBvвrd&ɐ!L"y~FE+(XJJ4O?RVjVOj:EbZOVTS˹J>o{!D3DJFb3DzZqYa_'7 >: ZSW!Zb ss!P~ѣ+FjZpDwGIdAqISyD>3)r3**  hirzd ֳ9`I'D4A?Eït:YјYP dy}hRjq;}8UVh~_Ġئ#VW E>{%ӫ~SZQ:-fU\?b Ciۏ+NE+%E-~OYOE%aGǏNTд'Vx0U+tpX{\jj5ROz g'ocNtn7i/FĮ+?ٽ׌'_ҕm\ iD~frsl-N]pWM)? gߤZSj4$TJJ TLFO-`ԺhT$VV4lULF+Yo'3ס;1.K j4%~2$ {oKp3*Fc! ʾU޳8'"R'Eָki[rKͫA01OcY>`ydy ^EaekVZm  ӭ5IeTpi`ǖQDC1+B6pI%9_L|Z ~-ܫ_60ri+!}- wuCd6pi%٤^۾JiWYòնeסWoż l4s 6c;7j\$Q<(f<^!򁶿y8=FYBp! <)fnZ$3vMʌX` }i%.E/8!a$E7rCFV]HmQ+ۦb N3.,a;HU.$qX=zYh-{Ul*Fe-%~)pH,b/_v叾#=["Z2g| byXf7PZ v$%,ɻbWp4]o#5f F}pXIyP߷c0`BJ(qᐦ QjPu KH?;,Ɉ0lU,,g!m5gbhBjSVjE~~ue) W5Qր`(4sʰ.B 3GQJ4)h9v, ߾in~N=\ $G u=Es px`@.)X"Wׄ'MßN <@Dʜ2*HhI0k"J2 "P# XD4IABJE0g?Y & e.32{HiAշIDaढh]~}$}yUf~@6oK)T݈ |;(J)h8$ Ȕâ Iz~vA䲖+>rt=/Fxiv`Fl̫++͘`O(T4[?TOW\@O:a{9}.*p ATWfgNQ3eX!O[1GWmyvT0%KKT\U/6{oao_ ̐:l\<~{|m> |M4[?fC?`Xs'UC7*gtAw`{-ҏpL{~5g)% ́oPX.h üa;- IPFIh`nPX*j4Ç/%GC+ H212sCtuQC(*Ȟ_6`3gU20b9Y +uZ aR'`3<[?l`ޫv c<|=@eѧ:>}{hUviosvtat>{g a"^mF;8IZV5bs>d͹50 P2AZs|!"ݒ(pL0 ݮ'z/,Z+w}T:NK&g8S@7<%-K*2B}vܷ`򸠴?go;[[:X)EG%U`V+AtΔ# '3rxd~nOLoĀs>_ W>;?+CbtPF߼mq+ĥ8?S͘abj@p<(eSIŒL(C8|F݃~A_~Ncű/=pc=O@ZbIm^XK'n*C? |7JZ>G MR*0A.Owˉ<.TاH+}D95 S W58NbF"_yUthD aBe*c> ,(,|Y@'>~{6|03 gňѬ1 2 s1#h=wb]ԎU4huc9w | 3^45yL-Ib*TFB=Bò<|uk~ЀF,JDk*~H'ij7:9GYI@4lccӅ_{HK*}'g!/k_w`aW*4=\@% |SriQ_N)ϻ=LF흶*C&?;Y˨?Fc_-^~ubn8A[Sv~{ @UB8vdY~\Hiduo n.MɚF FD@ Z|asB(OɣSc30 t$?[/蓜D Iۯա?[ T/BPI#w ]Z3ocQ~[]='sXAcj0~S88dXGd~r[Q>ewhjK4S>7[Qv0f^S]ydwM(.f+yLEdn^6g|\[<Ձ 3>^N`*5'g&ĭh|<'UOq4^1ҽ!Sw iPiNcH8!IH8>@rgUb###9ɗ!Ur' &;>1P!AEc\b R ku@~amdŗv}ຩ Bz!2fe922]}|6J4R!.Y}>RlĬ+4$``XHl_SB5.+o_#Z,C b6|Õ>u9 k<~ͭf_[ 77KK`Z᧏sл9``>p )isΔJfᜑ8 # /_Fc n/x`p(R>׻9~RA`;dM'/Ь`x m ͐s/}ãCK]WvRGLP`ggwccs}|s\GH4(o/7pTi<ا߽ R .)k4֡AStqy8;x=h3 ;q4KI)FT*^Fho~y%Apܔ޵գ޵dڒ5~d(XLS'eC#L0$0:<}>+sSɇ^ch}eԑnDٳ? \w|G|4@yaQ2Pr7LD4TliFyi:aػݸ,[,/z8b˱8$Nfv.OX`g,,Y`v&ǖ$v&mIVKE*bj˲d!)jֽuN|A܊So͸^}Dr7`<$)Y{ayPHhrescp1ie>MUZo lDȊiՁ } E"|\R@qBlZ^r\jx!@୆pj1! p8 $ʔNEb4"1U2ChZC N@"tIޓ!/w4Ieϕ5Gn'p/7nQ!$im.c) bӴ&?;\:nV'd&9q\"DOUMsJ0-ìfZ5xӪwinsiYJV4H܄8ǏJCDR1f>'ˉ,E ]Y?˚2$Fys+].r$$en$EQ-iUՐ1]RZfIA$a jEG|#w)voaa@sf^848}qa'1)$UeGU5 0$T/(ZQJe %no+;W/]ڄ[e}N 9zl0cX1Bom;'\$xȗ&H*jq(~5(5ZuYmQjZЉC˂ }qN22rϗ7=E)[ŸןLyglJٰ$e=a D}_߬JRx'8._ǡ^5n0$KC2Za\(Q\YX9{ط۔T sxUFG/ Gy] T8IXNBmԟn^X:|^d=$raeS!> ,FrXL_QCvISNuxswPnCp(pq:B5إmCA C_2ȰkX?CJfg;߷.]r-GzzkUX15s}~wu<ѩ(u'In^>| |?;-AwRts:-8BxPz>.dpsϫW_-8=ׯ/g:})shH{F |m0qh !\9{lށ>q%S5C`B/<}Fq4XPD,M|T][[$`Ӕۧ2.gwhO.RCp CcKRs?Ay'} }Å9{B`qq?EP8-;,:]|QPʅ t( .]Ռ/\!OS0,7r6 -k[s8 PD4\TQy@5>kFF({w̎1dp%#DZ뙌kHo̧R\mB,5a~>_1+J%CCr2_:l++w=t pD1 0M5XwhPŀPm*?@l1Jt.)>@! )pz}CS sԦP#G߉k1}$0ejMi0†&ņO{TzʅTmT74eL/ kð>C%xpyKR?qznʄ8bC|˭“- \'-,^>]r|#`A;#;( QE"rvH@:DF A/iaʻ|c'!a@76Z7>0Y3=zjح,؛q ?nm@>f{> a5N=#L1wQ胭SD4D>,ZbD$m;L|{ݿ9۽!I!#~݀{„`mtʘR K2Fq4x/&ˋ|~~Z"8v"vt}P0'k[ ;e1aaK{U/|TՏtn vhơV<L@sL#ŋ'G~ƬHE/J7@"jP#TӴH/k0M `M[蛷n##k 3{ɯC]2k`\o&@|CL]N 7nU / pژf  +s^ 唽_|GE/&a\l ǽ W ^bC)C$qOCp]H$қKS! @. G{=ڗ (.Q̂ E1$P *e;lƁ5z.,M$,~ГeLAHr=N##ݼy`D`a`f/ ҕPvzQy9٭.D'SJkFXqv֢I韙_plf-n"NoF :NW)7nӆ=B,8N {6۲*kaqdgw2U|5'P]~;6p'w4> 0<fg(/V1Zض#J/]kZeol'ωa*'6ϯvݨZ?}hvI_UE-kAQDiq4}s|W|w [dP\ 5wHEҶEfr?_wWݣOV /p36S?=F#Bju>׿*韻+&]#@.b*j[*:WG۟]U}i4$ Sj俙POX^qhEm[=v) b~,W kU5:e릡1$u]ϯpw4Dw~I Ba2O\e^Y]dX ;bY&9U(P @%aT#DI"pU~Y^^$ ֵ {n;W~M'f獽HBR4ZTWdM3dE*Aj؏><;X?|S$% a\5...IZ-nuG1p \j J#5!4 8aM`5ykMP> G<@e$ˁǦ!B󍱡40'5P9z,=OBY֖cC9'^gY1wזA̚S667)yS^čk׮rϯ9[)[XH6/)76xTs qgg[% 8Ax_IOčaЁ[J]W+Yo1Ñj^o҃f]j֚3 U5FO40'53;;19, K?]5am8?Z=ogDqpO8E.\7)+X_h ,.s p*8>@(nb0sya %/єcjT"{CIlGzHaWkr=9* Y~@`+1`w:\T$<ܩPp$H%EO_<^R`yP FT Da:&AJ\R@WAݹ$gL~W& )8'1&Kq:y`\L$ǦY0࢜yeW6YPoey\.tNG|dcRx$QYB΢K('XӀ 7kѣQdq[ uz &ۗ B740>"xxx~{p`L! JWS_,"@jB~.Jx]vģWc$+DH48*W3iN3kPs"GK)bТ6j^au]C@#.+ 0amz[˗W 8)Pf\ M=\-'?·Р|,aYJ3[3YBHjLufLa6B7q4}>|iQ˵/cSFfAeAQHB)nŲɸa~ٽÎ7#YS ZJ*O1IM)X((B`|z!?UR$6w$f^WL x tQ"ÿgAsJSE| $4<~ςdy>;%x@g{G4YE(p& ^Hҭ`h6#fOzn#LcHBCb0q&'']I)#UH1o Ae˓xkT#ƨL_o>zt1nRF+͟ 7J TaA?~ gʬуi^53B\rv9Gr%|!u5;nۥ[hdcI_-ˆ#A&) ,$MRI,P~|S?>~j 0<_2(߁<$eYgV^n4uy(B#C?(XU 9i2 ~Jb[_lr|tM]+ՊHNj4:u\wBO_}at!"( 8N}`yTYsyHZnn~mYZGVDzw^oaʱpcv% B_!3\Yf|3r9?mn~GӶjn ~=yW߹l_T;|.)'5zptf9`#¡%'bWVq,8lyz9@ɶEqd h(:x|^Lfcv;D(s=L2@nGOH|HGfS̝Fhd:}81h9gdJ翫z&#}\7v[f[f>?}3BjaPZ趷#:7" fxR"'y J" @J@>@UC= TWUH90yN8X68e]Q9ۆchF#EtvYl*^/4'@1u0t4dv1(QB2jQ1J(5JYo,N Ae_i@CC|ahj|vIi$qea8A& EϞԬZ< vFglxn ?%9gtŇ~u^P8x P@ċRHPAŒ]2pph" M4&e8(t|]߼]5,˹wo˲\Y/}TσRdS^K*O2>i+!'E{QړB$#H9 7o215md^`a&@1++y`/_<OO6eEXM+ZU<9?R48 hqq;{$()4TV{vmN ZLNֽR-<Uhh  f}f;::5 q2bZ\\7677eIP6G;$ ݙ$(y iIrrbv{-]nam{,yCT/7O9 OU6JN+RVOˇA<~!bxU-aSiXog^reyd^'N E`$yqFX!T GI`⋇?ǑZ J!*ouCnDAH49 Ò XFGSZkw!8fxX2 Jp=:X8coY^Ibi[ؑﰅ-O.^_ZzeٔEr_QR\xqߴv)9V@5ܹ0D?1u<)nY^ RIx~IJUhkZہf>)qZ !˗_ڶzvFwt`C1ӳl%\!Q͈a&Hv[ܙke$tsܺ< ?U:,aܠ@ FjDQ*&eq&ۯx10"daADض-.Bb}zUØ0Z&딗rȥ5o0Lh3z8 1X$ q匦 ^h,뺎Zw,+zIUU gt(,^EJOr V~D>岢zn+b䂡荮5"f0o4'&fޔ$lVm=Y:>(?!-;Н- 0]&q h 2=/D1|Ł -{rA$^/|EQ\¯"۲T:e 4']Fl`*Y>pqM}k_V?zV!+dEq|; ;-Z`X3FH)[KJdz@n\z/q3Z_!B{R}>*-Í'||+W[- O_xPr/Xq&t}q2&.sncrߥ{w0b  Sp\GrAP=r<2{y1FJ![oQlgEI2"QTpjѫ9"Bn\=w GMA DF .dx68(|lА ;^9~|߮fTdU9kH\b(֊XACv ˀ3:%L|:D@ 8':7UB&uU6=Z;["Ctı;{N%RrvbPb}l?N I|5+d7誀ej8&h̗"K"ֵQl}~!Jv&aΑX!Ո6|`}oNNiKiౡi֋(@ UT c?1KcYR$Gt8`϶2(OVP|uOiբ/eY(X;K*BFq *,"-@4I >7^9mh .]aBIuk[%QR|\uX=sX_kPQislTȭSkR4$ 8d[T5C~y&@#$AEd @)}՞I"߬(9zE=Ӵ3M|,|aMzO&FfR`v3:hkq_3og `7y"xryi IWExX1FЈB` D:ѨaD8!X23Y,l5r|`\_T5y{v)1ziqhd CS*)=D2q96wgK SdՕwխb\,("xKb)VИꬰPf x,H%s2+m#Kϯ6UH,-7vzƞL݃n% 6}j;9O%h$ d 3;"˖-[X")EVXR$%K>WU 6@, ;tKgbA?ˊ{12^+ HZD}nX=AəFyU5d_ /z'}=kAϑt)ׄ$r ^.+#|ap;`WҠUOI3}CudmH"{ #l+M69vnA~rhJwc`hI{PQJ +riPc] N նXi' CgCH3|iҠOۓϐ!%;;x˫W[A+ wm1vp+WجT { @E"vjhHBNᇿ:ST w|nZ4jB[; @Af + G1hKiiS} jbAb @& zY;<gݫ_q!.:}>{w Q[ácߒy=B1V> &D`=Wp]_~it4|@qf7fKq2<-uR):3%tx3mn>E:pL>/_Gw{ڮ<-ڳx.  =Ӡ_|E$ڂT* .nTK&BtOtюr ?d 4 b8X)j&%pvAAݽ9t=~mt]?%{q+CS QtYNsv'R@.\Mhǐ&j|p}"]z4ES0I0J ':`澤~g~:^xϥK,2ڵO]M!`@-c7ŧx]|lӍ݄:> "~˿vWE@3m=@E&X\󿃷A 8m=@v;0Çp7ilKC2[xמ(\""!Y6}o<[zCCSS8 ,7- ;hpt}/pÇԩVX>x kEJψȫg ڵkϟ~)j|f89cAVWi{a`L7,t>> 0鿶p(߼y10huٞLؗ}ص[PpO>rО"yf;CML3t>ukk%4| ' }߻:42n~p+;pyCA0g]Cd-ҠxM_ M#I̜%tU1m3 o2bwGL1]0 '46)PQwMCMdN?w@ ݅- ӟvVMZ gfn;1@/EJ]!ONIWI9кf`:5u_`yiP 0D>~ѣ\ie Up<^]t] xAk`jQ#˦*CI AT1[gs˲@8.zlUj V= B~7< ]*o47W1[8.%p81Q TFxOMc7WBtb:S4qDU_9ne*,,C,j؉Κ, dz _<hҤr*Iϳt+4nGv ,&f\wAǺ:B'\5inV\$ș$1hu5k6j @-]7% U~ta #&A{<!!CʲG6T57 g %H&S:A- ?@#zihԁHR_,oer/z47_D"iL =3D#xsbۏRI7@~qSM@ܜ>pΩqˆs51͜Zk@ҏʚnsOg7~B  x<t~L6nC+R:K޻vݗܷ=~iB J۰k='p0xAHAzrνB2}O<]$"}4}3d~aOѩp1W`܊2\ScrCKzh skG?p3t O/ tfig2,:)ф()U<]y),aC壅RO"TylL^^^Fسc#ܜ#li3)kYt& [CEI[|ɍxw`gT@'ƢtPCWVLTKbxĭkT;gs~jj4p:^$ݐ$qGd :үSawhhd2L0Z Fc5((ک,R-?٠r/T|++'Ib'w1]Xx~QE&ZTRu!1 (f>WS:$|r?S2鬬@oB^EYb8 }q*t [ >?b)/d6R|U{^Mog('GtCť1Ypo25WAaop%{ D@S eEA+ҙL ~iy 1R adC%زW,J K\'VVdrචPRG14tٔ@MPK gIr2*8 &aC[x'I uBhLq=~7{zİage2Z($ZP  x P,<ӔҰ~l0Jui^o ^uE$<9R2)r(i"ݲ o%:{,&nnEzĤ'wl# Džո:{6Ԛ8{D K]WEBS@z>xr9G0Q^_O8 7)H8@[ T yiVNhT@Ԡ9yIDE?{4BaE$QZftc}h7(Q2RL?95BCssPHBUfem z)Pm@܃I{ar E(lY,8o&Ӓ$>I@7Civ(R1 e"Ay! &ǂJW4PB!liO1`&v{hS1$-SsZ,p^`S(R)́[|46~;&Cx*O"D3}wW+ҬUachH?D@ %᭭T$`|zڢ#d2D@}Jy.fˉK G }@3hpl6JCsHyg/85qչ ٻ8\]}+WY%"iJvl1$$C~M`<ySphw%+.DJ"%|Ugٜrx,™#a鮮ΩsJWxOXe[e?C.PA`4Zv]gWIڭ BUB28SfpP4' D>歏Z09b"sW?Qos蘴',*7tW n4ᗿB5 bKQ]X9* i~G띕'7NчKIzJ9/飃IR(9NА\C?"{yq1ԈeAaw YN Ӊ/\B;n+|ZO(M3>/D+Hm;QR<–w7fCV:ENݬ0: (RLNdM׮]~-2g F$0]}.!rPz&Pm[|ñ1ec! x>$(X0djsݒ8<ښVFv(=ZH 8xԲ|Aumm#3eߨ7q Ggv3L$vE&dI(f_r9!$a \ K]޼a'>:6) [K*5ŴS]?\,t4x{gZGf ʾ"41STKC0 T)`- nK, fdN |Rˈ6;7;LA(fʆY;O*5PT9OA ζmwٙi4G,uWIdقذTO''J?frZӇӈ8>B@ P@]W 8`bSWV>- FI[gc9s$`cK,` |Em&~QW #MKLQB^u=#jR(83SAXr>9< p5BAq0"JtfzZf,Ku l50t۝=ssD7ISTS[r* dP ~XiߑJiXrAG:/>TDZ U]d} 27;9Y<տI-yx_WZ3cG4??_W3mzqyE'a5NWH)r&րj'ryr3|qiQQ4>cH( dcvF\,4Vų4'axfB]Ot=D#au9DLhyH"j&}{h)n걼K^f L|/B8Qqs%o>-Fy&XDUMB)^ .b6K%xѾw4 ˶i߹n3Ss]2?-~??R՛Ti8e+$aQl@2N}x//^N;]V% .ӡ~s|ȕBj+F_Ш O4YKIG.4U᪪nU2\5jJy6A/J2G|piZp3kR?:yd"pviezz+& =55ҴX,Ay&ΔeRèiAЀ,F2 ^c9".uR.&Sa˻ja w)ۉkJa)'Aɬ GWrw.@vn(Rl$6&zzg`?I}x&SЇt8;:#Uc915cǖ5NGpoYr0m^ta fQ!co}$2(T*Rw_AeڄV/JèK݉#amO(Z<&64vCaW{}z7{mX(6==HWB;ӧkZn43+{Ȏ;9$g`./qMh_KW5fʼnuhRF{uݖc5%zACddD{,Eֳw,hL,'_~F<kXpM#,3AgGԖhⲂFaT(X>/??K~Wl?oqFѲ&4PD>+Zҕ hs\&CP(.mşK"UĐ\) і`j#jw(?4ôgz1eAiр$AĚ.k;Vp$l[?]p`?BŗM7u>,lnpq|B[bQq;/ l'x27[.ݽ;+߻yOٮҖwheX+IB|g`woö#Œ36//.6|!yq,eXև8cJ'؅7 7z>یf;PXpWj5ETsnnmggGSEĜI=!;o'Ҿ^"Ln;DW*{>:IWsݽV,K/8k׮6B{{ [pCH] C!JMe.FjI`=./G";pU 4T fII#G*U=_ŋdzW vG#ǂx~cMFqb6sNܒ8eN/-35,ǯ5_ӻŷ#øQZ-EUqp7h}W F}2-(q 3W/߾JwQwZ]ڳM&o,bpv-[ۄ9ӈϩ˥[[@]Q nBv at+][+q:aEѶ9< .ԨzF ܑ\t#*wK?>/yQ2"f8?td*'2$H+V`ZoO ϷO,Ejuff PVzPg_)CF t#%:<Î[H,Q  Z2w$|\BZzp /hn 7ÆOm|nl$GW3j.~܏Dq$5DߕXB.==x Yѹ_lX" TЏr$ZҞ ^arTudlA]8ze$م1bJ0PBI^hS!XD."v<_P؏a:66C 6'QUH Í܊`^g0%:3];l%j7o;5@IՍA_X㳷EI6_lL騄@s|QHP`􎛫>Gr;24+,,FQY4NS1~|+/\{콍;"3M߳|\TDWә"bTSB1ǯ'b.X.2w9z䋾8|'j4-4oaYEM'e:hn342}/eF87Aey@.z&岷B>qTNr.Im80?|Ed@?zx~˩`TSj[+\>-}磒HǍ<##aPcJ>މ3Rx]D Go9!(R0A{wm5r/j$Is֖<1F.|dЊR6ܴUg9QxDI7xhI&@q"8i(.RL"An`vW~HYrm n667E _QbU1;ZtTOLfuF6SG`?lQ `DbONԮx{{O McGPNms͂?H| tFFs[21GGYP$JAY4+Pr==HHcC3B_ )uM x1 VB-)!]' n!1PH97àynA^a$rqӭ@BГs.j|R~f71oZHӗJYbzbzl_0wm`~>:,:ԉ'N.rqи K_*]i6_>@ɵ$Vm\0tgW)[b^Zg(lwQf1`vP7%5[ꁻ,Tʇ^e9^M?{4f' n$$byE~s\IUs\ykEɍs(k-kE:U)9zLjN%\73I @{~{{GП NsܒQq@zUoWXJN+1$"12&V_:1!?kIPHs'қ/'7] f&Xo}'l5}7X˃;L2o5RN>ng <|8r):[ (43?bП$X *jg;N_65KdA jZa08㞊jıyp$&-7L·c9"]*8J{O}rzqՑ+NIDy\GѦ~O;^Zj8.E 1մD 4]""#={?P^LMBd:LތZM:Hu 7o]d3ToL#. >$wq3JGxGpt`+Y7i~:q_xcS꾯>,RpCָs$ϧ8G`sxah,#Y3 Zk= :VV"+h;L.dE b>Wg$-uKqrҋgFcdE%nf25\. l]ǪIENDB`analog-6.0/how-to/startwin/run.002.png0000644000175000017500000003253510161303533017643 0ustar sret1sret100000000000000PNG  IHDR[(tIME&#m pHYs  ~gAMA a4IDATx]wFI!@~UUeE($?|l?K;sD8Gp1Wjվn{Z]=/p]A!:;hwgвbu"g)4nUIȫ5d[KyTE.G Q4Us\kZ2:3{/Δ_6SV>*1bɿl|]^$K3XłΑ*hT2(*Q~|sNoO6uEi~y8Sx\Nsj$STx纡iQk 3RK(lt{=7 C-"$ j5O j\qњ%d0JSft/Z /";iE5U(㐓'dќ:_ÄrIwj5QlضN:` eNfr9T< @g, :;x(w.t|ۊ$k.&X:ItI͟H:Hײf$$kgFr)I:IZI2ֲKʝÍsabJ<ߴ, CYt޽Nx[9ܼ~]'*i )F t\_˺t CN$O]W0Jd[in_-Ӵ$ZEQ|nZF`oWoe0nyv%BEZ{f+2QnF %!# Mgh;]')|2rjb;q;PO߿0AbˁB>VkllrY"}RLAU_e OTC=ٚÌG#ةWoT|hp??yI=H<&sW٭a p8KatON~s](86HQ8. ?z^'Sx5B-6Yxf|͇CkF9 ,< (LPD(><ifFcNiEZnwp`?.0sz^EP(Ek 2͓>; o\ߤb!܁3[LxKZީ7ӣo⭃0oeϥ¯mIz={WG?uTӛ k Tv[_q?/7bW@?cgZYwno3l-bF"P|E'muMDo?EX>ZM'G/y[YV?j s5M#P,0l1%yz4MZYލ]\R5tŴGc6b$|3BlsfJ|a2Ƿ-qj aa EA; 8"@hp+4}DO_6*ctuv>0 "'},]\ljė!D Q$Ԏcoo|oz=A-ɢwd(' n46i_r1I;H(2Zi& G~8kYm)u0T,Nu0doێAW ÈE=fe#JT6d=yrTE 0` {l_: !<#L <#L <#L <#L <#L <#L <ڪ!{3]Ο+( UD@ϋu<1rBxJEEϋF \V>wV'tk`5ߏ|5'Y9U`*:)_\Ƨ=:~FO5zU u *R։؎/YwfPUNN2B*N&kž0sχ46jE U2[) .Ӳۢam$cr O|WM7yEL) neF C MO}y}8ju5kP"1 R 007xYph [&{5 X4;֟3ou>+Yd;>n^\ xgN;tgp\w6=6GWo0@z?)du?>A)F KSJ,' #- C75g+E0hի7{۠=n6?I n܄w 6`%<2`bh&XHX;քo X [ Q-XxdB eַR"J %S7aIܼ#L%wI ɹ~רŚ6,9Ҧdҡ$ 1H4~|A {fZcu`y?ٻ/714qi<5{H ;TB #% Wb QW[i9ȘM$ (?gϞ3aZQ#|Lzl'(K_G2z)&OVjL26 6B`D0E&hO)[ q20Β  L ݻMJM$$y2QW5=9ya!3rR҂*}!7>u]q̕3PȀjSǨ^lJū{&[yNun`{:@[ :ʊYBK0.Ln]س%NXgeq\14$V%R%q.hxoJKsVƱmtW$\~ER|487ԋ˜w]_lݪCj(+2(H©~1m&=BOao+e=ϖ异 zшnvg`kkk)[2nsdcr~xՙw0Y!10&UP2^C,Jgf@kHla{ <(~M9Bc06ջ<ǖt nR%!d{Zv,?y&ƲQ]ƒb^)1!gK>2DE{-j+*=5U5 WHzMP-!2G”|I E\UQ;dA`!"0&m_dYDX[qqvo SEg{ؔ6&NLwPJ[V&ye0K0[8v>Vobh[':OFtNŴq>fN͟OjW86 -j B^ʤKԢM-X?&_gYL197 HO_IyzKB\ SzAFk|$r(Wyvv:Nv|yM\xAJ.e^Q2n'1xk][sFIPIEْci,y-975yǭ [G<}ǭLm+몉r|8[Rt#%$uIBgAta]Z靮p씞#}o{F גMi1 $=֐r8*=4?+g+4tiQOd̗دY CƼY,?( RxZ##bpcchG''jޞ务V7M4 \w{)gw4vY@OhH <ǖ^\h. RB3E,z|>BcgesL>vc2xq|bR1A=ϫ놜2PE1\Up\#iIV%ѧ+GW8wV"kS4Z8(ï@q A4{EE5lHdm$AvE\ҫ%Y#2iᆔͤS{{wZ/PƠ?ڵkSSSkatQ 8*xh2 з嶷+4g+ϑ'OQ ɜ`!F.Hxh?aȈ=qEz172 U[ +5R!N ++QOO!dzW*t wn&Jdr„p`pQA )w C{%vpAV[%Z\#{Ci[ zQZ(+"hoVgU 50!Fʆ=bӐ8 J \=,)Ft$6z! ")4\-jQOY<]:v6)Xs(m. 5ՊxYpK[(duOP.ןkG"`iUz  ulgRD*vvRaKG5Ⱥ*J᪔/'qvq|bgg{2y^Z4$\,1h|҇ZE[ &wDˌ{DPMkC#dy9VB^^#ȦPBG@T00 jv`mBQE=Ht_ CPNM$f:"ԐyaDm\Oܘq ͧеc!D1(D1Hਨΰp,Ĉ*!_)M :Θ ǝ,e, g^~=::[ F9HЁl,IJL$#ot6!^]e Y)8huy(CVڞmȵ\ < EGp5F! !Q/:$ABL(3gc|-D#Fd[gՄ =ÖTGGmu-T ã еJ(Eq@HbF-(Ьg2&}cCvF---2`YܫQ)6JMdTiGQIm9#zՄ*HE?l)ьF(,T%LRPz#|Ͷ`8zj:Ltf' (Cq=޿~13x,xt^?{S7Z'#pYb؞ TIhjJPb1Zry{}cە2L^OYZɟN>[hګXK<,fc}Nv^7M]8O^m;U凲{'&8b1e!K9j:QsJN,̬]6Zh] FLl,ˏ,I r@jAii4|.S,韤b0'AUՆcnLe{8TA EL!ퟥ# Ɖ7`\0#0 #3`0 qPNX5t8jB3 ;g0.!2؄P(ҙᡬ! #OI0{6$0ZMϣ=d2;7'֧I~+q~tկ5$0M0pi"p.7ST]ƋcmF٧={=mNc0b-O &ŎX̩c=Ls: :N>g z >}Hb[g}p*fBh41m `@. g2h˕OܧiE̴}D7V!: ُEwNQ쇽$- zЉ@G0p牫9FfQBԀ?JVu^m;Zq$<ϓsײ,9BzmjI>wݵ |!5W]7w8sJ;E_;~yZmwwǭ6t+ɜ T;qIEQ%hTm/""D vZE@i bH4?m tEB|/_( o}ˤS!p}MiRndhb -ͅB vsw~$kI'qJGFFp2<2Lu:ȤSLF$axe\42i#35c:K:<\Pb舟 FRhFTp`=x7``F`0 Ff``F`0 Ff``F`0 Ff``F`0 Ff``F`0 Ff``F`0 Ff``F`0 F ' ˶u'=,`sH3xp]j: 'N4+*r$zt`Uk744tN40\A\olltqˏfy^V<e 9=teՂ.V^ e}0cf "GDJ:gU5wg 6"G'Yu:XXr}j twvvw߿]ѨVYi4䝃WJys'{p/`F WDՂ]9 6jX__?VvFIR>p>`0  mA:t&PWVh0#Dahh4쭏N:Egۮ811a6t :4Ԓj΀n8z҉=3jv^\At f# WX%Y8ҊF@3#s3BbP1S׏F_>k+S~xt/xa"qr]B0#$^ʾ++#AQq=%ʅ=ڐy|5ifEC2*}1w1:}G!loJxJ[\\TƋpga\Lyvi.9Br D-,; [JYLHzhk6GoW`) !CF (g^S6YӃ!P+:G"9R@/_ZZZDE!$!+w.#u3+>:n.ʶDɀ1M#;TZ$LBR,ˡ`d$@O3iG|>#]M`FH(xDSɭX/q:mT9r4qZW3ӸI_AX\176,&mFV@ IUΥqK(-bPjH'J_|[@i>G-+kkSeY~ >~ oN8)PkCP=MBgafGcW!n7gI]sF"\J|oH0qqmGCvR }XqV~Dj!//^Fi;|+C*$lB6|4gҿ2JYl;\ŷ[BOĄhN)[|~ lBfa-,Csh;[z$/-}m!m~[z, Ńd^u{:(fmI%ct6v{Yz#z$--"]_%c6ʇMXI$i>iadٙY 1‘D=aPav ;>^4d'E?y,É۔~KXגT.tC̣ "X8BEJgq7emIv%, aY]צԎsFHY(S(>((Y/--G! ^ M= C6}RMG4]5GG| CѧZV3IHgHT+NϐF ?NDWp3i5A"T~>udFHި%h>mhypѣ89.CWhNuj /8ZE[Zi]=&8DPWC yJWffnHԀ4iHfĹ-%!jۦbr/y 'aa!Kv) PP}H07):SY4L(]3L9 IrF3dFH 4x鐫#D~3\)8^@v1#fK,\I' ׅP^vZ}gwו+#뵤St핫*V3\) p mV^A#'&&:lnFҾ+&TZR-{0˃hka]Af6j5Swժmۺ MM")r#HndD A^to_ݤ{f@S HS鴜d`F dPh8N8t$Yu:61Q(<l"'Vߋ:`@_d X3z\A\sG>D]A,aXk8LO'a@,gbʊ f56613]53M,b._0 FF5\5?_^k^}0`Jc`pE@Y `F`0 Ff``F`0 Ff``F`0 Ff`0]DZ[m[rFa0 }1^ƆiUzà Zu\ݻr*wq\1`D-+{WkJ:h_` +w7MIENDB`analog-6.0/how-to/startwin/run.003.png0000644000175000017500000001226710161303533017644 0ustar sret1sret100000000000000PNG  IHDRL2tIME/2 pHYs  ~gAMA aFIDATxͳY`qxASpvlYSY<``bq`ﲢXQYJ.aT9;?3^{5֑tVwyָZ稯ޟS K7s%Ko^{旿;n˕7Zjr}6W::huNlwvftrY-Ϗitg?uO9Όɟ=s{wWoߘ?;t Jrk2WVU̟wޝ4{VE.]z޽w]Nheޱ柳Tcȭ[[&gnL}u7Kl>W\[{gկ}}zYo}Vp=ZVzqo>N?|sV_y?oep=s?Wĝ6UWv!N-rM=_ U溅V>Qgтg%.uMy[xlukMY~յmzz}>񬶭\V_;s,K Yj5^<IV׶jvQvyν9qmG?,."^?U~ pywG3tM|~PE+]L>h/|;k_?79;KٻO_k^^Yvo^ww;@5ߎ.2IjOraѷ_yXꓓyZ*[n0~~8sף^|[׳UmKW_gؓ/?vV\T"nEteZ9xsUV_U=Kڪµ_7^};KquTFS2/:5Io< 1s/ιʢuMnb#}v;ykU6[UmkX67*b>yw>D%51nfmteiwygnr2>ŵ7y3g 'Uk^qV7c|r cCc<*xձ?}}}n6ϮS{37*ϿM;W6Ӊ薓VUm{,1nDN4'*7&=nn.5亗uii+Eto<3/S欰k;*&wm^֗6U椺^ʦεɵYO;ͽ'r;]}s]qҽ'$Unh˹,Wfz?)޽{ߤ4\}ɡS*oK_{[w'cjfw, ~lX 9EkjDA\_puLFv?ّd39KAv1XFdE1̟HΙ"Cyx^Qr.tsftt?J|z}MvYݝ*_3b}O].ڒ~l2XGV% t'e谘KȤnµo$kWݜr8hv¥1i"ءv -YT: N8o!E$^fw Oܢ}NSۢ374iݎ7߶'W8ֵk[fKrʷE\VsFXs晴-:8z.9:[)fOdx`9q~əy`p7&ӷl[r꜡v.{WV&=]bjA+3/t}5+?ߘn,?s֟@㝒28ܤJΓGҬ=17٘gVdx|~8gc֤i_6l1pK3&}Y9̙yO]Ҥ 82E.YQfL|S*oFkޢnCEwFwH~9Sc &9oߦJpɌ٭I愞Jl~fzTE9RK ,E9RK ,E9š7hnƞ]fv䒃Ό1]'X7j"3Z% u*McNvE蛳o%?~׍n\COGt=* ;(SR'&7LNz]|c{Jd栩Ksrܟ}{/g{>R&vq=իmG7bc UjbrUjb1xѿxkVv^H6H5o2o/͙٤Os}e;bR[]kr}$WCmx7oUl{RLL =ïGpǁp&U$Gג%5ZX73bU݉ I.U=U&:$\uj/ޒ\r†\gVڛuƜ o73d\=yk4M]gћ3>zW{gjme-y̭d #&wg&Er#ݕ>\c򽋽?eYݕp$9’K ,I$9’K ,I$9:t;1oݵ9i/]h.s2gO9[Eeۭ=1&m7<۾?w尷QJ^9Ǘjp?<[YUʌwXnxn˧.29Uţ&5082IrS6SiO^_|jG6V8;eH\-߻S!#Kr;~v%$@XaIr%$@XaIr%$@XNr>mZ D$3\ne9c?cnx#܁Q%^9ֲjp?9vGUl}&嶁7&&=ιaӾO]-#r0?jr}Jḙ/2bU݉ ysw1jmu?Tr}eNOr=+)*̑"tf-)hl7sM7y:޻w;k\"S\_+'6oUsyH::}ҭS3o/.z$o![t3g6AGvMni`r2ZQ:>/߻cڟL,ٕ7aIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@XaIr%$@Xau+/ʡ'!n߾pԒ!39] @Xa)r'_zw{lx)IЭgP8S ER׶ W(r W(r"@XNLG*9z$E7SkE֭[nZ3fwW$78Nk؋#s FXIENDB`analog-6.0/how-to/startwin/run.004.png0000644000175000017500000023420010161303533017636 0ustar sret1sret100000000000000PNG  IHDR9 tIME 5}~ pHYs B4gAMA a8IDATx][WGV_WaC8NI&Z?60挳0m {K}=_V7⮖ͩϬvUU{Rw] UU%(JLBBBBBBO o7u@jZj}r @d]kA~r]+0:}S(Wj^Zo[-z7&n܃лm{\\gNmWA\M+ɕ!驡[C^-?Z/7ʖKꎪz^Զ{$_Xf ]K8Czĝz-"՞߱=} zcǑxϰ¸~䲮zidx.f86ֿ{*9cs`yF9~R:I%?fl&P5 TrUi'+C\v43hc6`pUx{>iدj\]w 5)7~`^yryɸߑ 6D e=Ϯ~0ܾ x[-?\rdn,2SR+Lpf;x]S-Cר#ǘADsC`+`Α-g5q5S(^I3{u*c"4.v+XB^;f) Hi36ySODI-Fqz"JiVtL~:h!^VzSS0L:I4i;.ȩlii( dru( }% m4Jbm~:X΄8GwVXmRogFdͻݶ?.%Do#7N=IHHHHY IoVA_?''F LUWn;ﷶwۿ6>%dͶ.~Nr! sѴ(=o4T,ttA7/M |^")ʦ&6ˍ4=5>{Qip ӸSnڂԅcl&  E"p1+jPHHHH|8LFf*mvKULpa%.3"\ܖw;^B(8ΰhҬdֺtZg!B)26l㸱}b<׊;. H[i0U8f.:7 ;̨S0:SnƑPo%KtJUan0T|R# Mr (a,o}؇Eo|r2fpDaMx|,a0zÆt<$$$$$:yIÙL9j2_L%ǚsD{,hJdΓU`848]ը}y<:9pֹ` <(Nm3$b(P3`,H!2h )v_z UF'LDkIC>KXyW$}Q-X 嗔ᑇAl~4 G9;\8/W<9[S&ٓ(Y ^hߟ/0DVaR}<(4 Cs_\Y݅q7pji91x|\_a<4~hַڞ_.{VKO)s .Qs\4X O"#`Sr]קR09GmP#<+޴[kx!+ 0+2"ůk}~ȨSL2<\-E]G"jE;$|{yR A\4p~^[8\բB,Q˃ǀ2+zՅQu@WܫOOea#S^:dZAL `smQ<<]r/@xڧ6 AJ5g^>Ŕm*VnU*|ERUc*Ы;|x-kRA8ϊ,}/י"G`{j&4Odh*@/rJycU-:49Sv C|KX}VK#PI < aK~eu;bOpj큉P.P24 "1@{@,"x4 -㭕=E-< QKw 8x^T\m얳I/M%Z6lpAu]On;ƒhSsuE1; &O[UjDJ4ES>Fh.< EbS|BM<=9P|> H4 qN%l"?B|ΌV@I4EY~XntkbwB\'uwk!tl Ga Cg=9 "y 0vi^Y,ˈ{1ML#Y8!`Ѥ^o ATl!Tğbd>׵gwGhADgȥOOq"x@Y>lJac tMCdMǻpY(~m(&14O;TJrW[nx@Wj| ̓@@b{/l#F->%& hiZ\7l/ؚo9nڽ+0SS =hwKUЌd;- twi+l0O@bG=Iۨxlw#K:'&\ #ܰ(</P>(wJ53S놦u5 P];%|;/v|~{AMG>Љ͈XDŽf-"h$$$$$:Θ-Ͷ%*)p2<$J`n:C[]l|s9Xor0nf>sNU6_rs™ oD|Hxm"G/>%y:%̔67 ~8,:PLQPge*alأbt&E:p _܇ׁ{o:`锖jdJ!;8{1;$2d {ՃO}[A-_ S A qmм흒/kdo~8շyڏȫ a}p;5l<_Q\73gP#OUǛ-GUc:UUaõcXYgBA 9E?8 Ws]A' B 5X萠B3@iٴzPH􆫿wr۞Wko}čp)w7MH1^Ͼ?)}b,=>1(J%!!!!!٢>=p?|0<>Db 9 GT5:6i MX ǦЃyy~>+$T_gjY&XF$bz*J9:{WH1[BBBBG0 `?GiY㺎n4qvǹÿњhCFr#\b],ݴAf3?~kw8^Mpڣ'~($$$$ d+=j7&c2OuWKjd'*zYj}wTz%,r]4EpB\ 8.ZcZ_??&~($$$$  ϫ׮x@OL_1?xZnwvv-ƒ~7<ęu 76~ѩֈr5gwZve&8؍QG z PhW sW#TOXx*zRFGWԭicf8AxpiYjAeD_0xĚx)2fE$su9”g=3ew \8X**KHKSGT vmtbM9иUfͨV< v>o8!H4e&w#}"(GEiZf< 3 ^ܙ"4AѨ*pG;;ER`~nPOBBBǠK8OTE(G3tS9 z|wx8@)niqţR5qHj#5MwPAzKY蹶/?f766M|:24(ݢ.b1c;"]DntDSw9$^,wV͍+= pvSblhH_߼y+(s sq#b3 ]$?|yt7,ATp'<7oV#Ad (p[d @gܛ)@$ YБ{hqD^E'%ޥsd &b ᔀGQ -A*?+'S?Dh )n0H833?:G3$$$$+mH}s_ ! x[X_,Q8%-Փb]Y]U-!""6[bug@>Ӌ(=0;@ ^O:v̞?;<:~DxrD)Rg1-8oߞn=>G]eb럾JDv`_3qL D¥+/2̖\Z`5`1ܻDB3"2RFC$$$$.+X,Z'\p[kΈe:q.k2s+\.2B A1 ʋ_E9bÃ'݅ewz(Xitr=3,zW䉃"'sGK-& jZsٶDEJ@cHyWe%$$$~?x4RTu*RU2 }ߛL<5MlypcsDBG޴nj苗/lNR֫PZ0 -ZUnwu0J!sEvQ6(s0|>dUQ(*%JBl̢|H8-t꯯REQ8 hZQ&^m!DKظ`2qF}E_hE]ӺK;1 َ:Dh {àXE|^_}g,d/[Tuv{(OdӋ)WW^Y1 X8o+qδȫ-yq]"ļR!dp=aŔKHUTEFX4 AyY5d;r՝FaJ>mhxyb 8=⽋̪BWlc,vSxG_UcPla:'Z|K.!>!Xj4sA(RA-C7H ܯOt OK1F+ "l%\gآ~Lh`Q*MeYa y{FW08`mY T'n-bo]<\+ @!% 0 ȆUUR =ui&*tFc⺎(ϧ.//6t]Q(7`e+]o[ %$$$nNJTL&c WOuձ4Ri<#;2):ӫ*x6~,+AZc<PP ,MSo,dQ5ue_цG7{ӝVA;7{^:@ٖ$$$>VY(”fU6Em#9ΉmzO!r[bܬn{(F(s8V u{nQʏF|>\ʆ2`G0%4uzbݠh`JP{Ig2MB$di>{{r %~V)(zLXR9=FeR VpHoq:D3~04AoH%Y!ಛ 5W!L Ƕa6L81ַ Wœk:}7GÁkA_DXBBasbvb ~GN)0e~hE~ ~7Q gbr'݂L:ԥ$Ȼi1ӮJVu/h:u]4.nq߿xv/.. !9FFZA4&p2 &Z;n":S ˜߳w$oЛcmQQM>m4tPMDg3&seW8SUjUШh븪OGW\r<,+h8f39u>9ASY?}{{ `6wCBGpn^܎CP-LMI+ !xn~IHHHxлŻ0Pa8 FBN-7qM&ScOBsJW߇tQ}&n\MY^=Ҩٶlz>;`kh?wR]W_}yX/]iˡ , p;Tja[2 Q]?dsDR#GV?tOO 6ȕ&_o CZQT9u IzԊGx'{O  *T@Cf }qkFX~m[a^\\Ɩ'5$$$$>o\#i5 yajX-Q糧1Cpg>řȈz!hj*b.6=?M-}nu@Z`/pۃbLjb<롩:6RT*H*DH:`\"۸ TkH-bG8@?ׯ_o›777`{oo8xPx>KM$\MJ|"&/JӘcMhlL&mP0rb!an)WV孿~݋燧ghs[eTAhɭhjP$*B-t4~4!FyF^0 h elkS@#0º6:$>ه XPL&?pL\6&.Oggghj46"{wJn%FI_4+|xs&Z4.''?)@cJ$[8rj@D) Fgvqϟ۪0,^P2u/yO1XBp>mdRGᐂbL*RQjtR*@ТZ p!Tb:NW~ʹz3vQPX-,C ' `8I@rSVH?#AP(@xzoO~zxg9r? K(a@ ((#eRFiM<(&o 3f;[7lOgv\Q*7ԱXQ_yw5u[Vr}tR <4t&Ո=zliC) j?88}~'N[Xx4VKDb7d%KHH@eՁ# ŸcWZƓJ[TY(Z BDbiD3I40{< pVofuܭV uUzPLGU"jPy&vǧpkM$J|К%koցJ?mn_y?|vIzKjLwOkZ.DJ:vw)+z h?|t >Cng:Z}Cj6EBF:2ŃyqX_FV- CIDqnt2x4}iFXr{ MӊDQ]axPHWxNu[1bd2_!Ǵ.ҧdWiնlszzZv8Fضng4拾$4?i&^^/0eQW_?? =IMF ;N^(L:͈T#(ElZ-tB^dQ4cLw?T"\ce upO ♆I'Cx:'bZ\1T2Ҏ&; h!Â:ا>.Xbbd ~'S5c%w]JP nfV,ͳ>T-<3{sZ4OKO"%R=L!~DAZO 3~]O߲z`% F_2K @aq/jN^S[ Pc:痰# 6Vj֌^&g{{$Rk4X'{%K,d[!z;xry݋P 7ܳ}ۻvXZ^Q&M6wgn޸Q,9_FRrߣtt؀''9(c`Ή<bxv>_]yFp`bz][d=MVmYw먺; *nfnD,-.a 0${g߽;۽}2ԶmCΧN-88 Ch'*_tzcCru+:JgKBOOŤܹi<;7[/ y/իߗJW|45g NHtȏJ@.tt v=Af 2T::pY ix:EVsc茶Fe ~{ -lݝ[;e1n,,c"ѷoKTss+Wr{|: ./8tWKK06 oh;Egǁw~Pkhg:8n˖U P wU=c|ߙ3Guҁ3 4ݫOQӊk>BS*= Q1a5|Fe! ā444(7T8:,/-nv\W!pYY^   F8F%MCxR5ZRkea>{mw捫W:ul83KV7gRX.;s-}lI[TEcw.|y+M 'x|`pp~aGrU7 筛+ݎ*@Nv@ ~|Jqpp=oݽ3kK"?'0ZYp37W(  mu6 5EՃYqQpFFWW9t9<4w~;]mۆ_-"/^ŽŅʝ۷k{p8n6tnWp|, | vOw5[C4usNuDq hݾGIq]8] Gbic\:SsԳꜫ06|1 cp ՅhzO`bC;_vuߣHM@bH ͛̆;(nElCџFi1t;k/>8480`hP;6P@3W:u kDIP ЙP0-[hEp{L+;w%"&\KP s cx?|4琲ݻju%?uۮ+j &7Q}]t{KܱiF=Sg[&B9̛ lJ;؟HYw.q\@Pu6D+y\\ClP aσ}s!1,.]̕`0 w }?ܹ ?ܹX\iF/) %TuY炄5pWS+.B\uNP6M 5JŰ?44Hd$b`0Yq[og㹷yc0Rox~`03F`0 F}[`0GU' Hoo~Fg`0M@ g~oI}Q`0 f^`0 o@}t~hs}`0 Fsbsk!`0 Ë5}jy.U@a`0 h[q=1=6}rHgFXf2yY6 ͽ >szyj1 F  y7o(5,{cL^Ç:4*H#}6j|cY4g`0"WUTU3Fhw)!9Sb~0h y6Yl`I67~ |GY-Z撆Vd2`$DG(,OuQ={ rՔzBΫ5襺xڨv8; $4A]b$a3`܏h69ŗR-xgQf8$F~~6WI!p;eܐ=%,"LP(k  "htBs}_SCgw@*fQa7'̞\ i`eRAl] Ha-] H 0uG}~~[7S[kh3`iAtPmGӌ{ЎOmCiw@N[>aCo7kM9TRg ƒ`0ѹj}_5l lSzIr叧סּ +VOKRTDxe#RsCfHIT)T(6T3Ϫ5y*y8yqȜ牳'dD j^Q'h$65پMf6$hs3Cl`>*{ULTllz RZ Zbm #G pS"Tl@}^k@maջ굺j3=BQܯg_gP󶑮6y.4fc$ggʞhs9E$2Kİa՞l3;z7[ M@K۳g~ϡ4Paw: 6c94T<\,72F l%Z= `0 F=J@±Ks87=/06Xh F \8vtTw\=~(DoiX87>CpRA^)F=*H 1r$ 7Ѡͯ%E3ҙ-"VgK-3 y6X *%pm\RmyڍyfϾ lmTxHXc2$EӒޠ .s<g "@4 gԿޜ>?}p|ʐPtfNAK#ږ4 )oҨI~h@3Kj5oBs^5 œ s(YɌgy ̳N~mF. ?Rտ6,Aq2 A3_=W~}lWDC9znjQյKmziʒ ˛v `ٹi;wv|tҫpU?Fb,!n% FK~CfHIT)T(6u3Ϫ5y*y8yqȜ牳'dD`J&IQlBP I`_Yގ&yOZ SBO9ϙy60e=gLNN;:TZi)-1Ĉ6jmMj?yZly6 t/5` JzL"Fr fQԼm/" E^II+j[/ M\ 8=i1CPAC=FN04!&tUhqF:Ew*lɳ9!]%x9ہm\RmyڍyfϾ lmTxHXc2$EӒޠ .s<g "@4 gԿޜ>?}p|ʐ0Esn0 [mN) E7 { <KjoBs^5 œ s(YɌgy ̳N~mF. ?@k(b0}0A3_=W}l%WJC9lgm}iʒ ˛v `ٹi;wv|tҫpP06XA>-=KH[m~If)!3$̤NT*e*HGAEw_̳jfJEmmx?u^?2y Ą!l2MPk}>N;]`0`2LNNNLL4n[`0^ ˽jttF`0 F4|e| J@X`0  z= cJqnzZ; hhkǎ 1Α Ǐ-M ;^9<ƧR0A)F=*h7I6cD {$Ũ'3 hg-3 y6X *%ph[jjn3{EhgkKCr-t x.ZuaS9<lx}X8郅ST Մs aW 10жTWfQrF蛄H,͕{0O*̡lfEZ&3 9+0φ"G;~P$lG\|;/Ϳ%4Fcd=HzH#xe&wz͆Y|2q/9,hJN;𜼼i qZƿsgLJJg) G_jJ g m*-C h#%gϤM.)y?05 Qf9S^T:sLU8%oCO[AV %%K)!3$̤NT*e*HGAE1ڙg՚msP`a4 A3_=WN}e̛ b('^9ڴ%gZ%9 Ci799!N+s75vP3W$D+ȧg t/l8^6"о=7ddԉJBB1h3RZ Zp ԩSANb#z) [*=w8rxO!ѥ`4>Rks!~C!#'IrP ېώ} *^r\8#";iy?g݀Q PX8>eHX^D(S(T=x=b`4mNө y &a/A%5x7vI9ͬHdƳ}Vs XY|%^ r^{a9_ Wq/9,hJN;𜼼i qZƿsgLJJg) G e1 +VOKRV_plDʡ7ddԉJBB1h3qg0 Vx??C.`0Ȉ\iz4qi;cF`0 F4Xi Kc33?X7O WAu4WkW1`$S($o ?$h.fe5^ٷ"LfVe2ٿ`l(r* -}zӟjFJT*LeZFNxcϾ2R X/Lfcdo"4f#Qyh jS'^ɋVi799!@ љ02?bğvmbihļ븛Od %„rM2g2-6:f]Huڙg<jgf1v_=|r;}7IPKϛ9FYe6IKl,4uBڜgF& =(?t#cgg22>:R+~P*MZO^8bT3gFh?Kbg2$. PM0Ƈ7FΈN_[xXOGqrd9Q+L?}p|ʐ0O_j fw2жTT8xELZ&;*Kj7vI9ͬHdƳ=}K%Fj=xKItB5XTI J$=$$ o6̢$fN+ m2)·KΦ+Kr2<'/orrځgCV6=gg禧ojҙgJ1(yOJD5'QY|FG)&IQlBqj!< +d6IKaJhI6939棬:Q5IS22JŬH*bD56ȦQC5ԟs6U<m@P[\񮳚.1 /"ST*ھϠm#* ㉷d2f;jνb̵ CٓmsZ>4_}`gY[AT{N ߰ovҧ-sh TN¤M.)y?05M,2 nqـyspԩW'O.ȏM]m%'lo~C/~\^^wuuutX-PWXT[F痱I1|W{ndxnw7.g ϟ}|ᇑ.\ؿ?~I8_N1AB# EHoo޼$DmS$|gyF[jSu/\HHNi5b?*UA5a3%5!mU($5BUe\pZMI?Ք[o!V&{Eh QSд)] < ?JU)'Pp4ϖ%e_"ΕF:88[,;;;{Ν%___G2޽{8(ʙ{Y_NLٳnoo#lT&(~ox !d>O>(D($ov~~IÅ 2I;=i1֢*1RB$pBwx/`ǎxP"Pe$*.h\?p1 9R3U.U < 8dbvgI6HEY?^!*?k.Ԁ3!KЛQtE3!r˗/M_| W?ZsS?JQ<%Px}EG9\K BB?@JB wIkn"TM_5"< *CIgx6D&w̖PfYjxHiy M}*Mөatą NI"7P/` M% w- P?_z%d6hB9 jFr.noZ#m&%Ok%Y5$9Hd˵CY5Z4!M7n 1&5W5uoIgx6}O+ccc}1z@rCkJJN g|Z ok5YG)fZqRHo Tx@. (E^[Z!(U-SQՓ{h&'%'b*hTa#i$_(p/?QY a) : 1QSGȅiB9CQF4yi& )Y/TdR\۬%D+54@UKE3 LeOBiz/l" -"Oߒ2sKleZA (+H!&U4`SnhH ɅU҉jmq_ ᨚ(| #d{R:]&/U""/N]d`XvAMWaG̔=l#rUѦ'(c9@+ " BС%G9(< њ3fP'rTBz (vBQV%\RynM1 J H766 |K+( OEѦ?2 tA}U4ثj(NM]BM5j}vDsڼ &A"A2@c)M򆑞wnPuS A$n/\ Q_VJ*L2cqCZF}ZP),"݋hnC= S'j?"YpD(EK(_zLRl e>RP4!Dr]Ѧ`dA&S*T"ڡyf[3}]GξqABY蕠@_/fAe c.vߴ A[_5$*Q+Wڇԭ^I4uaɴ {d=ERWbU'/-B[wUa?m"{R' lH^T%;r2"P#YT4dƛfCFH\^JOKjoӲ k%e[ڕM_<#{ݷo?EP(p/ sNĀ`dMseaaGrIB2>pD?tHʀxx8 Jׯ_RS+xKTM DuӮTfbI*iU_Jo|IЊ@l]]]n I5޺u+\97\3PIh 1 ᆪhu !AO0~x@p< ~46.M#(cԶ!ɴGM%TRh_ -*9T4Vg;t[􅎖d[5|JBuWlSe/n-iU<3M³(gZ/ʧ>swȜ\: /r{ԏDmAW.KՆ/uJ,%fdybp%l"[ 6  4!JDsb{WnD FQے"cuOS\ r@fO))* LrH[$9IE.Ta*F܁\V&F({9yJu7FJz0s8}iMK>77=~ȬG(PN\Ѽ TɒM-N<+CZK53@.џZP[RSe*~+ *A-Cik{~ͷUHk9$* 4՝9!CPQW֟#Zgx|~ߓTG]]]saZ*`0:[N޽g֭(c~]?Tlׯ|?~{ݻꖾ->`__ d ׯyBo.w*n``N[6ɩ .0EҌ-݅ Ori.&%F*ϡϢP333t/ȢfQ)`U@mjUc΢&ݜ/x$}PňMD_5t@5jN߼v2@GҥJNl!A"P o(:y狔jfitt\H`X6TP+]のz=aKݥ Qoe3 $ Wd|Bf0<@6h!jBAHh:o߾В2s [ǟ1<[_mry=NGX]]YfpLLLP){Bޖ/^,!6{綸fE.Mu&,Lޣ%HdH =&=t z'Ãv^26;b@2AѶ\Ls0O:4hGSd5B6 d k͛\~VV ET OȀWg"9 HQ Q W )¤RrRH'Z"AbdgAZ%ꋘ'#hrBMH}+jF6fO:YE(ॗ^R'ywK)mW%eVvxgqq E P\.G2"_|vFh]9-ImI!766Fu#jvrdrko2kP[劶 wwCDm!UjHgyFk0-Qy$~rI2iYepyWWAOQ;{Q(+AZ E>2$F(i5,+{Y"2%W?`&9PCyeBA#wcc֭[H C}RV'|B3O,$-!wC id QcJFZKhgN ,'uSԶ۔s?6¦jvh^Y_ZӃ(+_"$$#HWPy3z:;;{{{w100 judߺuM2 `qq緿SO=E V  j)Dim^Q66Jb.vڵA DM>quyFsյsΏ?X dC,k`LР](`/vvήͻ@RZy c}YncXo҄=uŇzŋ=\);E}S@sPo(g>#nBC P6leIx6HnV!EWԡj-ܞz3,] K.s(aw ]!>~RiuqqJӻw3xW;P˼tog@v?=Sbpp|G~߽ -;26{\K2 SC74'ZT/NV]:^rt*BkWЧӾDW> MijR(k]zea8 .%e9^JeumrㅅKΕBĭ[řvVt}}]:PPTc:rAS_Դp!:9>l@r9h===;vXYYy衇>_-PuW_=s­D>|L@߹a?U4]AJ9ڭ@4`8('Bz3X˄Dd1o>q]/ُPqIU)BS zoВ7.UC4^ mt;%).u^a+ԕөej'=APZ ;AHм{kv lYz3CWwwqeeJqZݽ{֭[QJrgiiOBf:;~PZ\޲ |0-Riaaacct!vvv`/rf ^oHym;Ȑ;H >\\v MyF6hS/{r;00@,?pA񪁙9<)OI$~w( ѧ˶gff NmH@ף> ܹqIW+WII 'i7\q Zȶ*trpwMo|2TRjJt&`~T/woL'zB7y$m3R/?jZx"ѯ/PCЍ o$B%HuMthH( >fgI? W3 ,F* ($cDi=&bbY]ERE7nAp H[jS_M#*CI,ydӋb`gcchmm@~uuwRدXDLH#z̑:̕z^9%ҒKk-!:M  x@GGEFm߾'fkb #(]@*d/3* 0Y N$Z3*4rhMtDd4'&!ڽ 3R o)S?<՛ OT硂UK(ɋԨ4{ aᎎutyl<WV@şdg9o?Ć.el$(,e+)ֵgyPfUt*kvz3,FhΆjZjDxVY5uoI*̳s݀;;vӳ秽# mn H@WKn w4ZH?ԥŅ!9@TaU+"#9Pt[oCDN.ii^m\݋eW+KA!fET409 ~z{HTHbC*r.DpMJ<#~ӵU]Ajځ4:qQ1T .JeFxt{ Xҟ䡟K]^Wn]tg Z(vՠtRKۦH\\? ҢF'=VsI0Ez3,A xz.EՒ-)1!Ry?i}?P]& Ry O &A]yز $i'me$L)5I"M(KGG܎;E2A5VtݵyB ACV]T𯊜>ɑLIRpH,4{&A+Q*me'J(m(jrgMyrʉ톴>7-PU%Qx&\utQ!Ze ym 3|Ӧm:3â<۷/s<;;;;;r],k$}}ķnݺBZ M&&&(?V,GX.ْUeɥVTVVVn߾ ?PY\(z?;w5 E҂ꗶܫrLdԐZV4ڬn# 4i{ZfS_lHAEk,bx-ڑ>22B*C=tWWIHSF=)Eh3pd ݢAu E l"G"w/ XF>U uD<MtP/c.uDor] Dm$Fld(oATϔ @dD#Z2ЄgepnBɞl{>}k B.dY_Kk˥R3wڊKOM249tx_B[ DȪOy}aʭEMm$HSW(\WIQFn/]D%<w}j%Vtd0̔ϗ^zI5 x%@gg3R?a_Yfڕ# Qv!&CrFh hR g]]]9;w@-x'P}S*K{'6rD U&$7˓"U!,׾:$DIUUOQOHUZVOQ!m^*Չ&p %KKP)@ߕ ^~VBX(Y5BUT` iبh=Rmhb'hͭ& $SKQO5ݷm\KMr!Z$PwiR ]B2QZOf;3UTK}_kbCy<_ݻT/^Ġ(666VVVׇQm :g#kg" ;`]A4qt W}"~'@f7l 40p93`c޿ۻevve۶ 5c<~@Oߥ9M#2b@Ngg!id3<UV%: bH$3M{mmTZaqrJ,ov*[ \Zx^ٶmZFGĘXo+D岳zV:;*~%4|>옦VALߑ i%U3  Rgg߯]d^[ծ@R b|tF}"w?cW(6-/;'OOPO {_8`0>Jܛ tt{G%Z޲tւwV*J @neMHpމ;+ Pօӓu0 n޼ z6hӱ#` >&kkj!*-kk!:6[66׷^( tݕ}Pt% |eKj\N"e†Y^^"(.xh4[Gՙ cT99zeIx6HۭbuGd|VeͰt1x<[q#ىc\ڵQ+K ޽}K:so_ZKlֶC0GFg)Tysx.B' g}FdwnÿQ tk7||e N¡}dIcV$z-xsQ8 K][|KZEWA=>3+HSfxG){9XUQM*ZJx8陎ʑ2Agldp][ɰ-ҳ%mb̳%ϝ?tuwWVn7;vrKK==Bn+XjW-7Cwsۯ,l[^+nޱsp`0X*666K.ى?@~___.ewtPEJeݑ@t ~At?optݻ۶ ef|\ygpxΝonSyEt6 I'R(@hC AH|r.P(x ^rΝ;A/ٷR{jN֖VK/@8>ŋ~̄p/q#P(2FKYϑ(*2 ?译"PtT\^'YF&>+(8 {+<Qw<Yt&ԕa wCf@"ԓt;vS <h B}Wg(Zm6Bڍc}~bb!dx1ToRwr$3JgjiIT'Ni~NѪB͂M"ЩCw ЩVMOgut&!eQZ<5@ 5ɒÅ $]::!ڒ*v b~饗Q6ZھAN{*PLI^F"oИ hgjm.P#}Nʞ,426R*.j8rFtt)p/g3R ](bgr<}V5B[Ut*k2Yo97nܠ9Ңi'51pҲMS(3yf5z?[5T޳eaO=KBNVw.uϖ,: ]K+jRn . @'",~.{}~eXՊ(-tޢa QBT~|dž[O7nܾz7|_<%LIXOLcߥSS̞{<=ZJ)Ђ]!oPFB32vHUޒ*AI,v󌑯MJ#]+\{8G# A@ ݚJso[֒K͢.B0BѕV|?O^Nݨ~A t4C%PT qɝ_'}e +>GڡP35Kr8(gy6oTDGPܖ_\/7z]cpU(.vw\, K+[` J\( g$h'.?}Scv7ElXrnybx?)_[=!N T>s9k)Fqh DŽ L Ayg]Xs[Ub047/00͜pÿ|8/yclǫ8c4{"ÀR}ZTUjՒʕ+W\ yv. 9ͦ97kcƤWgഗP,]H.Eh8иw)c.pFiN1&XetJrv ul(H5˜ź )@'݁3쥏;)hW3^!!jfpz %{dM_9Wц=Yf.4BD~&(k_#T3&%ȑ:G,{sG@*t+^*&V+xI^q9$vRғwF6_SD3Ǖh?Xӈ8T,QJH0}bnE+$)AeCܝrs'fGHx,S[y 6`.  iVm/ŧSS|-rJi$g07oi! Qfkk" v}/Kd`ß>dΘd>:w݃5m8Y D2Ӯ55rHpzД 9~dK#ъvr}O'w 9%Ƅi'Lx5SR)!22ĥ3fPLKKm=<؇瑜; h_7$`|i >J!2'&Fgg$wܙus_| OVddAd$/DMH[гghhTtA.>H B~»2eK!' bQHb:f7]Ʊ Eʾjp #|E"FMp`EhR҉N9 3ѧy5WTKZm|x LL֩wF2^J%ႩobkXf&[J\.W([nTAD 7J*xD'0+ɅHߘ@,y|m-h1_>9-&i1tG.ƺŽ\ޣJ%)909CӋɀ:Nh }0SBEk2V/=D\ p@:m35:6Mw;ܜeG [ tVz4,d&Z21>2 ki+ī%~(sj ũݪWo2iswZT"7L2ɬHVsTLe2b1R s-6k9FWb;N0G|l>LEkw1c-A >xڙc9S[=T(6Q1wn*nڧ=%O9_Eh&tE'MiZ;b 2ر{q*6O]h{ 9FEnXbE 1݃h|WJO䌧?Y_W13zC8uX`ӂ Lk93vۍl5f"h4[xyVLrdͤZE=eI.?y2޽!" N[e7ۓ1± ۀ}< '5(RRIp6  X`ӂx&]Odn9Nf*h6[ꕚWkּ:Q\ַ~vqq%&:b1E1q]-ٽS SGz =5ʍ?Cد&8c O+Mߡ;9cKA\=k]ю3@⥥vrX ue9bR}^ bҽbV*t=h|gӇ }֯yew4jwn#2TҼ-߹8N%锛hw+f\D"+mNR1OtJʎ2$ormSIN`=ٝbh&,-")Y{ʣz [oW1{d}iOpv|u$mnC4Z1ڗ>̌8G;O$ ,u-X(Y&nPht|+7YÐ7df$2n i-9b  "@}*䚙NVXħM7/ ųIsoәL\ކP4[s&L&Rwwd [D2Mǫ)ezQ-${vx w Tխf'V*t:pz|>;7Ѝ/^Wq;~||o{xEtAġ̏?Lu< پv:_.egR wr4*beĊ8S"*&㠧2(L@8ޣN`~ Ee\>E!dT{D jbԙSKfdN`D*xx> xX'2o6VzMό9{v/&/&5V[о"jjZOL2+՘ ^NܛveWUG8QVNȎ:A9S1 si`bb̟H&= 64Ц!CqL?b/SfwH =I^G?TnCD`H]BK=*X]J$I !& *_zKKKDqP 80o߾M/M}IҖ(ZBgC/a I=58a+_@'H:pEkl|*{ Q7=ܬ:N5̼.{&^oS@>*/ٿm)Pv>aUX?βNyLtpD.'9냽( \G,%ԭ y޽7~wzOSS? ^\Q@3D@L_mx5"--O+ctyHO g ig,gJ&FsٌNdZ&j"IS!pd֊DYCÐ1QR+~C/,+-K,QX$s^XrS[[4W "%RUm"O@{{}?a g23_\h& HՂqFC?m r9<+dnDV|VU`WA[0޽+j@(3NDEqd[q#A#."`XCCj=^9B" _h7 Ƹ^Ttϲ=*MLۀpO^=>ݑ[<[<Q`v!3Gq8y?untڪXSwQV GLw#6$8 7eI ۉ5q2ԛ~9!z3E*騭J9$şN@ {NĜ`U$U{i,xx>!x~:znbxt|mY^Xx~15ITër.8˫CBANq?-A߾}[L( {/BVpaA7ӗw>Nվ^j>?x %௉?|5!-5,@0GW w.} 2! Rx z,*dt&PXU" lJc:a=KA].v|B3߿ųIspOO-fǣܿ^(a³!`4^*,3gצ"c%Rq1#N6 L-LbFR+=vu4!PH'=.X`CxF=lԶKY~}z湑/ڲJR*9}eR@n$Cעn9V{DvhΝd > l6={M?.M>|\X7S>{vpxxPnʔ{Ƨ ,XyB{ |͍7?WZ[[˿˭-<߿޽NCPf][` N< ի_߿w>޽/(}7oޭ'.'^\vݖ0` G qށ=O!$N}D\|̉hB7qA+.G:mr;h|gS lbjsdd( ٳgׯ[m{_GkNcpB{zwc̡Cp_,&j- 4m{KAH!^:B#*LnorO^: ]'28D,Xv㙞hAV}[wr(PG4ųsǝ{ضEd4$"j+=W$DfdD~6`oͨ˚4:4??OOtZx\ܖ{7##=[WZ.rejm%rvv)$\ F0< w,CH:=XOfF˻&f04 IBgK!%Z={FҖ6[&,]E9n ]0 3m'y-8{mi]-eo|ųsoәL\lZ4[3B!LJ244JP3ccc4h4󈌅,//#>$7vjD?>w/&F!HRu ħUZI4.:_X8t`ZÇ690)// N>_|ݥK6:z.J_p^ɡCA]B|gw! d' S"9鍹7]*'d!!2$DhRܓ@!OE~$(+ULu-D%NgO= DpB_g:mTٹAp* .PJRӂh#XipEobJ͑DCG㉹cIq,&~I~?V`Gά)~<5m8|P%*':ykw r7:?r2@EQ(W=ʨ}M2qJ#`l)4Gz/j^gSn=aiȂ&7OtoJH(fʌrFNxIVN('ju@%Eƌ z^2CjqˆDB gxlYx胋zŽ7B^8pUNk9;W8 = DQ$ fY~邜1%V<`*"DqxL&ϧ3I|1v:yf, B -UA/vOBƍ"Lp큭;OZ& BCQ$T}t$:򾠅\^,л&T >Q7QIQCfM;Jy]d"?iɚ`U!2@+_Tqa1B4\(тh?y(aED2 e+{'NgOwh7.]tk׮M*JVwMxpg!xyЯiX<[<C|F955%,F_@+++vȮ$8q;6BinM3CP%vT!"ף2YDUHΨ>W#tCFCL\ׇN֌Jb *Jd$Dhq`^@Y}8scx||b``kWsNh/ώkyb r>_ZZD6Dw޹Dx iH^iőQ*Z]]T*ZClZҵ.b@7yRw>m~ȣxJڢ2UH(w_2wǏшo/Twܨ=j@7ɓI=EW8o:QD0N]!!OZ>F4<5BÔoaDxhi.F{|C,~:]w_߮y/wsWb1Wyzb@Gw}C棂z@;m:!{=iZEo>:_t5([.!; NAAF]ȀSr-kS+Wpl|=\aAW򽣊ycV0zgF8,51Pqi*ulVKR퐋tġ{nybOȢ.1$9qY9 P4 1^L#vr~xHDD=jE+}%V0LO6x S2ֺ6h27~Fsw<#8Eg}x\Xxm'_O϶th5w0q{!d9+!"LgHgxL ze'C10P+p M uP"N~:9ywyFE /@p=yى֗ԱkF./yLJ܅5;XJ'\З|̲QE$=ˎ1t)x胞]4j 2a?* %~vaW< ?~Q3^j}g.L ;"j]6y@F `?@jCqf;uS 78O`uteMӡ+1 $N@$PNpUNA] gJWq.ُƗjN&T N~HGP ^A{ar[DC'I ås" |>m8a,CF`L eW ss`ɯ <zxyVwg?zh(_|+Ν MNrЗ 4W#MF#?QE$X^Wo2^{t.n<GεP{bCo事ُ ? YNTٞ 8-</.t0k/ q(S5{gM0#7ImRЭO^X=O2%xfYh.&{2#p9y-{s7@_qWя!De%G)! dpbv 'uQT*o߾_ S `ppٳ!I% k,X8#`j"ƍ,/>|_1!tH;-|`Ă N&Oeݓ'O0Wտ4 F͛7_|EP,X` Hbk𜚚իW_t Zd ,X8s婡!V,ju{{{sss}}?)m8+r 8z08"W X@}w4iɡ}vc%}TßẊ"Ѵ|9h.1XBTƷxx>ex?JY[[AzDgϞ^~ )AJu| nǠu&2&8OF%._- \e@{Q{s!^:l/rCXU{]'JCXq,Xv` v-KH3h"$bu>h|gӇ>o"O~BC=t@;le.^$̊î\2??Ȕ'޽+6݌?CtwF~w4wL"ә;=QI Mw2ofg4m"D;ݹ2C*= tb?. =BfAkbFQ(30$F+W={&X0&8#Ӝ" ;  m"Mv!n7ilI9LR.ocf-WЙBL&|RJR=66Fϟ?㜘m(!Lk> '''yzz?<yޗo޼H$8z6IM +[[[O,,h@G_j>Mcŋ^@6t9::wڪDv):(PMiNN2B 7q(A(qNڜBymA$D 3$dVwDC@hRC!Ox&ZBE2kuJHqZP뙍1C^y>ѲQq\ ̢n- ,jB(FY4Q-i.3krp"O7 2 " Ot}wbԌ!D \C BК*4RhxT@*e 3{qSZM!/'Tv.=>I͢T)]7P #Ch2Űųs7߀#ݻw1Q\Sfdsz+Bm Ox0>ށn: 87,dS'Gz!4~d:<'t}3/|rسe1ł8^; $_lQ"`AObfB0 ptbR&fFk|>%n $"p78*;52s dTt+ !d j"Lvųt"^A-ݯM wUf9R60  BwIQ$|gMNƲB{bXt pNî$q %Q 4meQKPRq#Ur!5r=D&+E=c\NE^]DN.'"BY@CRU^F--$zҟ.׌sTͦ]Ȅu |eK8St/u@,yݭjzɄ!}R#Gr_*!=ۉ8n) tYm,2Wq|bd\yK{oO?-n˸vӋ҃twEpd(* 3Pn|S 8JW<2 {@gӊdw$j'MAV Ԣ0eC`iiWnh(|fB,8v1UCtVt{!)_Itzb.OQ7QII{N$ 6 K'a/Nb e 9iTʚ`U!'oXB @!E3tD`zP?+/Ae+{'NgOwx*7.]tk׮M*JVw*>,,,,//B|;B𲵵5:: "_pAx:LR7oޤ(@4&> üFjT*uYй6 ot1{?nnnr AQλׯ_G???OD(MJ$\͛>c ǂ ,X? J0r鯾V+7FfJT{#```BٳgOł ,Xp d",sZ̙le뺵4qŁX` N RDWGTk6ԒIvT\ޯ{^^/%N*e ,X`ᓁX FY_P5f3ֶѝOqv0&y&*[(M>`Ns ҢX`1@f2Je1-@&Z*UuzbVV~`N8%9o ,p5^d80ph*J3rŞs]`($ԡ&r@q^Ί[<<}U7%K}+mNEl6d6 |8844Q*JÅ`0<cnmU"K͜(3Y* d2^8?LSL"dY7SFZ.'޾΍_N$r ʋ/P|>J(Ɋgtqfd+MW^MLL@rJix#///dddt"`1Ob'O&''iHG ~ |2tuu;]3HC4 ݻwF#tX4b^pÇG,,,q#gEP4bBqH)e`ل#2*/_DZ<_~M[nI D!'s yZT0&>COӃ9/--{4 B bo_pV0iD˴냷VJ(Dkt0c 3P9q.wPWRiݻw~4! (I[t>"ق=33sȕ˝+W (,IWڠ)/$!8ͪ#aSE \| 'fťfZ=j\#_{M;6 L>sZ-?]<&H=ʯ0́Ub]ѫ~cX쩃qO |eLMMIVPhm?dӘÓ1*@Wg5QTO(Ԍxj)98`Pq<`rRV~BW#iW3$S ݂$&ֹGCios|.!F g*HzPrw,)(;}EQI2kzmrB#D0LsEVT(:Fq\6sCZȠ*6IHñV3׾^hwW@(|HFUD*:l9jC]D`Ĵ`!.7GsYD51"9N 9E@f*L}d 9džC1O Gm&3zNj9_Ui8R3 hD'0U,9"@$< &&&Dȡ+{, lw[&ڍ^݇(BHNGaI-B _oP F qP1wFG fsVklVwe~rl͍J=pO,Rd(+*TUp… @zRY]]E+044tt:⡾! K.ի4Rywr%PBPI/_k,Ϭ&''/lAdj(Tr;M˼  Ʀ(#np HЈX>c?\C|@(Ӑ$TIw4gaAg:h|||ԓVu a48S cAKüف'8VEG1Sіj xkboagkZs2)d2ݲ #!PJ78JvI;n&bHM>ͪ#&T~\҄d1$ EFC4R3Kn`)'r8p:*~M;̓~>33C=J82 '$Ӓ_ %0t7JuiSqKDžh.D&T򐃢tGc8FygQ{h4|.7022600W+,QO§,t!th*kƪl1:~DZgSpfDuBW yrmnnٽ{}l,/m5\8s]:_x>F7z}zVK$݁QP%, ,}9`lʻ/ZZY.kYY^v\i.N&T*N+X` JX57`.厎<}=ϤREcv tFáPEc,Xp!Fw-WvkU雑 dVVccʲpҠR𺭶l6X\\h¨(i}F&B2體k@0ͦdʁx8@qJ_qVU%(yh-?ui]vO V$+++tE3d託,wCinĥ8CSϞ=JIt(۷o^\L`?+lPϟ4yK-"XO##!]eG 򄴉0kteDއ,7sBX8f4x t2N3f\6OU3jx;7~9d xA\ RIaOȀ"yD_ER܄|>*=³p dccc mjzjbbBSH % hI[Ԉ%ϟ#/^ >JW$?NaɓI=9Bv0]]]h;h@w8?que.ѣG iļpÇF ! `H%Yу)zUdB18$ǷSLlBȍĀf"-_Qdn !'s yZT0@~qV>CO_r$_ZZ"h6!ddl˗>p3c`j~Yfi-yV P{͠Dtӂ"ovBV)0)n^Y>u ;g WYS Uܻw~4I\HcK_Žɖc{ffQە+W豍HtvvV6h6h9'ΗiV  |VrhFԄ^&`4.O|E}PQ&Z->{&'8]OϺ ROkJh0Vav x#Da%\ߝ W(zJXbWQf ԔdRhm?dÓLE^ eiOrdtp jOP6]QD`Àh!O] z<Sr?sVǺX̽`[, -Q " W 4ySrEC2@_z1'x jzM^6Z\i?)=[#^+P$bgY]T@N^"Kh_JaWiKKK}$-a'OBJ~( Kl|J\KabX_}7n3h5HI' G.#(0ǐ/32N4rjW.3Kzr-'4BD>dEa5=gO%/bcxHhpLf<}mm)TM^߁PPrm7-&+w]4(81CA j}hHX ξ k2MadK Tu4d$ QA QqDrsJ!-->P%p(,=j;,OhzܼyeOOO?|ttVWWyJ3NefnD@je˗y,ҥKh$e4Rxw૯Br<}sP Hekk… T2zիW5Uܹs'ˁ 02C sƱAB]E$ePv10x% +9PF܂g% J 9?f@5/P!C%; H(Xx /it f':PUDx^FC|D>\b|\xFO?~Xrybaa0)GGa@X͢ b1ށZ.[ڨ\L3~Lkf/sH@H4٦r .UxT>˧vA-۷R=|78OT!d !I(5!(iõhacE@75ryrs333ԣ+*W]Uiɯ\LILSq`)Džhå\oe]l%wtBrPT.h H7o~ub17u~f6FFjfki"fU Ԕ㟓 .iJe*kƪl1rĠJ4IўDmJP{/DD8z977޽{>n,/m5\/4!u,iҢl%#ð,Ckj8 HntlllttTN5! dueu}g y'-5;hTi63\ߤ/IdiׂSμmug x ٬>7z}zVK$݁QPW_ jY-X j,-=y^ywE\Uk6r0++kn##mɤJebgk ,X`ᓁX FY_Pr3ֶѝOqB@ØThnp.-J,Xp!FwiZk! 3&#:iуWNgE]nUheǗ:DHw?nYqSJưto͉62B!_, MJcp0<80X, )L\٭U͓oFF.‚xT@ @*BlZ...R]4a2Ѥ 9nhߴ@*"P0L4r &-N;=D-{U"b JMh`5gw>ZOB^|ob1LE1dr4$6-/5ת\ީ5wJ4p6Emʕ+o =p$֭͑[7nܠY4MB'фDYI&nEzWT:)F^ĥCd{sOZ7SEj MEpvヌè9255ŞzT(*PZὸ(~WJq-?i<γ4-:FFBt-t ia鐐Y*ox@qRi Ad*Jg'ͺl>f6jr9wnV >~f x UPCQAhesssii)#!-| !umHӦW&&&@] C !9#///יϑ/'+nƧDɓI=G ~ QtuuQR3i${WWG򦧧… >D8̓2daa8+z=@OJlP(&TCY&X6戌WFb@3ׯ_Ө2xcя!'s yZT0@~aB>g(~pK%= FdYY![f~eOF1;\e|pV0iD6SR*3\D"#0wJdxk┻-p ;g WYS I1#M#9E-a!*nI/za7MfKBɁ=33.\\rۈJggg鏄HU۠圄Yudp0>Y*c(p+8Z o׷J2ًQ.ҥ ^3?R"L"[|rAM Dq>ϟ:ub(шaGa%\ߝ (zJXbWQf Z*HI?Ͷw{w` @(OPip7{A;QITSTqhw`NxbI4}|%!'uDE?xG6O-2O/HD?ftg1(S ݒrtsǗ 1I:TΩm\B4d*HzsPrǿ)(;}62k.<#'?~,dU~]Cb NX#0ov ,fQ s\1R_~yXL?lmTkZ&l?[[v|a_y.7 '*R*wYg*ҍQ6%ӧ}ޢ"tMir@7P?CL.4`"fN}l_zaE (JfiQB\u9;TI%J`rnͅOwynR$ɽƱ*4uպ^.% QxDH& '0^HHL~E~dY~h6лc Gpr: =%I<,i8Vkk733breǶF@ >0ߊc>-jV[v87?ܺ! VKU.הmQc7&ǒ@ |#Dn8?8NT _.\7[\|j%k f^Mʬ!d+FYn.Z'=<աWgUg݁|ȩ 5d腪 ҇o>^qn?zN&ohs{Tb}VkNM-O7͚?=ݸWkS ~O=y}fr$Ihx_<-20MSz~iff~<ߚжm0]tkk <|8 4N D裶gUJ5$7Nhq.ŏRtAT1vT= 'EvYz(>Q| >c"c)<~RNa_ǩ*#m,8$ävvnX=xfiQ?xiˣݭ߿ώ>_wnݢYb0d4!lLVVV׊TLL3QpAԙSw(9"+?i]\iHf  K7g߇u)>ru_~TR\ ōv5Cz)p Ʌ3OIEISFHHdC ϐ6)̚ >bl*̉:Z ̸U7'՚U˶Sr\R +~/J/7 Kijh E< n aQS իW6up>bp?:{pY^^8??y mj... pHEPBܠ@R6縧ufdSG3)5S,F|>zҥK{ "4M-0#?}ߧeNL766@1%E (h W @d~ 8* wMļ|pkC He M]MJ`6( WapT&Qy3H/hT ?v:# zN0?d F8E`snj3Np?~Ll0*#C" 2%`ށCv`LbRF~%끦#J4LBlB?0"$\ ",XS LƗ=ݻG[FC.Zi?̖{Xogk%8+ŧM$$-ynNjL,1Np|S٘pqF+Q):<5# ۴~sP.a˸b};M04V~UAG23UIa9)LD rVONt<5 Ĺ~j,S@;:{+:|sg vA8TVե,<5Q!Zr /rAwP{CqD~Z;0<'|MB2uFĕZ5 =BӨaSlI,C+DcFI ?5.-)ȋ\!5CŁd]\)Z>7!` CǓr2 KkY˖3D":-İSO2u-j::pVM G Q¡lӌ#gu Wr̉zz 5' +( ?`8jr}C3*nφPd&gO13Oo鯝\$BЙk'>g00c("}&@4ySR@CRYJZE =C/dYIҤZ@0`rv?Re j,{B_ň*LZ0?~|BBc ${9T%l|Ia i 7 &>a6E +vbw !8;*g&l ScAf>LE((QÑZљ,SpCn/Y }֓ ~h:Q$0OބP40㜞nXrM6Q ,In{*GVB(VV:r'85YA͛I7;-I,#:pr sCG)Ғ+:az:=фT unl!rP3~Dvt|IdnC$5TȥJ`hߢ8V2Ona\^7gU8-A'tp)3$t>tfo05)Q0!WS1EHaؼAoA JnY _Mv;AdA4HAiDv7*90/]8>KO{ڠn@yܷmDU&d'OpDF?I|WAJoZ %Tzz,--q5⠋RgV.],=ŘU*@+D$92gKT* 5/CšSƷ9/AB  !Af'\PUD<-x_^^6d/}AR:X,o~aסũE#؇|[9E01(SpX ]-c$ܜi!$vZ?)\2$K?g=ϭTq$8V岛NZ׋ӥ(p/S|BӁYN/i}oi?Z~_,i4s]߱Bפ N΂wx@It:Oy?iA?Zƍ?LnزrٱIS c%}o~˲VnAD5:?Tŝzn{L%[@ 1F$q67pRݓ_.\7[\|j%k f^MRx:BM1btOuun\:厜!^qn?zN&ohs{Tb}VkNM-O7͚?=ݸWkS ~O=y}fׁm>4E 3./4}駟fffф>I뎆L"Q[jg = h(L4NhqEG1NZ鋖oU5E#ՠ̅;6KdI@CyDQgnGYio.IJ=5H`Fp5pbhU\7g߇3QѐׯM/R/Vx.n3OYdk\Qә$"Ro`d$+0v݁cgm4YħCBR>Mޚ91^P9۪jM~*e)9SՊ{vŅvy* I R^QjZɫW_.m !8,//s@iD[\\DOCAOs:3y })⣻l vS=zt%=&iGӍ PFI$DC4y{紦X܏?!͛y(!Çgě»blP(*j(K M9")rcg@3/^Ш2:tFP6`~$)O )&pB珝&z+#񙃪0_ GHqV}Z"9FYS't<5 Ĺ~j,-VPuGr}E04% ҅%BSWR\ D~Z,Qk\O)y"tHDGŚcIαPXmRCWNj^ab1*>ŐQ  OWgf@ 83`UZjvoBj6W`, :HŕƸhq*x%joY3p([4>#WXw9QBF'!9PpܸaC{8= TwW< 9W?uژ19P|y~"η~K'1?:O\M=9[F)<p0AȣBB͐ T*` g/j0x $M&~s/+(Q9$ Yu0 3GHsGT%l|Ia>%|l&>g܀..`Xܯq8;*g&l ScAf>2#Q8ͣ#*l3OY4[ N ?^:'tHCa2*:D)8dF9TREdh&dc$r$?v |쿣 N 8N[lсx㠐n1u;><.R%WFǕ1Eo~' 54ݒ}6<̀_"fEY31p'-Q" HF.U~qEq -:eTc;"nD''=eqqEȱ+{Γ3E}I^1J&$ /3SpqÝ"f)ޠ %rbC ?,߯iߏ۝  JN$i~ H4 tFԗteyQ>L۶A4MvVkZTJre$W`KHT'T2O?_|OoACw—9P3~^I]m1Sj~A3B;Bݻӧ: >]Ee~8>^<7!֨cHqӵ麪S{]` h+(nW@93bqYGgUi9^uzV4wPq'#tGne\ARN¦{݅c$3;{VsPv%7JMUXiip80ut}vw.h!Up,0#`XX5 ~\$]wpiQ {t eFmC  btf9pc݆];N~s?^$t,Gˊt(,C{ 4???77gsq֏bIH|]1,)h6{?0K\n@ 8q~:: G (A$@ #D ?tvk;md5mH/_m\XfyH|@ Gl'/_~;O.u7k2ʁRQC6YYYmmo[I_ A>ov{3UڭnrU I8:;M~"]ȱ؎ƫv.4{ݠM|@ ݝNO>~13}l^:=Tdi i n7qƫ=Z*W0;:+qTö( ! Gy]@ gU%0kxB}H_=dqIE s4I, ihk|iv/o~AD I*~tޏ, +C@ B'`ޏ @p uiBƷ-..\r}&@ '8lNf?VV̈@ x ; B@...4pg$ 0AU(eFi_87@> o= @$~Rj;v<jvPͭ@ptv:ݲmOVPȴbm'տ5쿳XV)Myk|@ G8VԨ7luݓjV gؚ2 m;@ptڎh40ߞzc*vZzUor~0e>C \@ మTթTիo =vj^$) @ ,0vu+0Ӷm'Mc,Me,n@ >\3YV Lk8NsdYki}z'F'ʬH@ 8[/^bzhK$NRYϙyg]M CL ԠU^mxv< Eَpbt0j鋵4U*4+eGK`rf&)uVKtS'D^?+w ?u˶m'g} 4"6蓮8SeI D)KҒd2oRWjr2 #di.c?怢(|xm|/{C-v{jumn,lxw,Jb+N̲ N$ΦWe,;`eYuh7!h^A7[*|_ijV 萚Dq{}fY1f"cPKU>g.Ye'Mko~kj۫8^GVuZo6cun^=l7?i&PcŹiN'+DI(t=?M O5j/g~ɵkKN'q NE?v(8tq"k"@ | qmc5:VsC4DCiyL{(,PU\zuzh'~*eR'rۯ*хv))eI`mlm6?hd䉠DN?5Pғ'OIWTreC_[•5R Ӷ[;#OzgWa# [> Sd?fxt$S,^̿qX G:N{qq`qaaygT}&,&A+bZm|뵕ZmǮmcV$MY4n?|X' e΋u;wnHqΌ{H)X}߻vm4$r _(9om-DQ~[Yzfdd(_ݾEEys+H  jڇAā1d! yi0i~?2@ 8 y{ȶ_1/oz1΃`>D`gC>nk4JJ7TrToKMtGad񝮭,kki6%6Hv7,lR>GB2bt)(̄\iOɄS`'^r9IZFW.lT oSC8Zק^aWkjvvO) 2kgkHpD _ݹz 5X\@@\ *H+(7n,7`"K N3 .&`=^g-r8 `pI5Kn΋ę^W:[IAjQ0I9KLef|";o ˏ~ĭ+W.#DU'ּIRM yꕅ7T sr\Hæ궃jD ?)X>X/_@_ ?<"{>C|瞆'T#w5!7n(mȷy-^؎0|ediZ,/jGV봂Z4zR蕬J[Y~eT׸\3\%k웡'? m<mA@.0 KQ_*/rA+%Y>.2m`Q)m%J,\co'6m. BPB<"@0Y쬭5nbЦL5ڭ=!u}mqꕕU}&^|eGն;ioG}ꖃDxgR/+[崵~k;7l\ߵkK>wT{LߩeP,(߮ae&|Zzm}x88^ 57 ҙ8k6>+\7yaL5ELi?A6؞[6a'7o~1?bJ#Cɷ! 辸$䪆gT4s{vWO 2ea;~B$Aq$pt_Op`](Gj~hTr09zLjCLrjsvlu>δvl}&$,e={x>|ťT9J꥽^~?L/LOՓ4o͍[w<8B][, G@ ̈́FC#d6g3sPT2!ff~ e`< x Tz'C)r"b_O?IcYVz#:ڵ쪗~8qT$0ZʶD&fZQ-qi@5KiYܓxcp>ܾ^Ka>7ױ;An/r Co;T#S< 8z@ x+7|ţlþ: 5i@@ 8eRa^jh`N„̺o, 0jpSZ^刺ŹgRe~Z*G/_&itmwZ\•=lپ liK7?Fq}ѪސEQ֜Ϝ7*ǣX~Dk Wa2?i@q\w%Brt>jjduWZfXy֚wn_ZY}ٳD;7W0(_ > ' {37X: SA U!v4ԋK;//z^,+JFs I:.{{lӊ7 G !knkv/kyԀۃ&FFYgGznqA(\pQ36y<047?Ϻ2Q2IqR>wiU*գ¯'-o doRäi.t$ tvw03k9cTanl`SiURi%3FݯTsL5ops;,߁m@ >\d7R`;clKSL4C< ESOhu>$(^۶T1 CG6l ii<{ҍmp&IWI eMTԸ.@p͗/:)IENDB`analog-6.0/how-to/startwin/run.005.png0000644000175000017500000010653610161303533017651 0ustar sret1sret100000000000000PNG  IHDRtIME 8Ͻz pHYs B4gAMA aIDATx]sƒ@AY۱sةzU[=zo/ےu$^$n$Kتp3= `zߞb1UTU}_qqq\tzʴT.c3.2.2.2.*v&}zg?"W?+DrM~rV!|tvY}u z-U 4MizLűz}:hFs:XYAUl4g:Cf_S=c]뽰KyO{y͗n2g-ueu3gFJzLEA5nqm?ʠH<?۟Ϥwo9o6>JR'Nk{;"YnfHӸC[|NZj9|Q%_ ʪg3.G`Ҏc&ԩ\2NXy3LD}z^nu4-ﺕ=n;kgd#<}شsB9q}*RO^S:v1A]gOw rřE$6Ns1?X ]C3ehqdrT!  z(<0d¡1#s³-G NOf&~>GSk=}  wt\ߪ=Q:~"h=K]Rv/kŅx釿qz;=0JżRن3al~(@QaƚI?r+?`y %i|.jCcI ElFBp_ z-kzc h_h+SLseq#156Дl5lMU|n[銖(vZEot]isx;f?<3faz87(H{'QYi`9Y(+~d3E}%p5Ty6W4Y|UѡoDyx}4:K,2E-ZNAl2sùOFs>a˫68͠#hfѴH4ȕ1vV\I8 (<)APPDf2*!*!G j| B8GwGq]jh~q K+ ]I\~.0̓@# :D+RpqOV{rv|U'K{@[ߛ!3^U@d?Ñ0@~d&%Hʈ}[X7/~)o666;{Ra A{lXf\)lƒ~,W뛸Ce( k$KImfkǖ~Yhnl6f/ ag(g?%"r`mʅ͸Q\б]w L/<˸\V9 횦$u-3a ']J7h 矿*`>g2ƻfc:e8 3JxjG <fv&F3<1APv$%[4"Rs(dHQBU?NQ cZ sbhIY?8:t)̫ G_ЃâĬ*b0D|LH AjD5B&E= `tw#l,t94 }PdKo(n`$T=#7# Y% ABi0@8E%]!݋p萩a-5* 0rL ooAQݓE `dFpHMpqQސں⡅bNڧ`P )H~zvWo΃Ϧ! @8GS,.dtil#r Ȍs-22KS#=>4?6 "KDqN+aT imB :| m^nIPUK>.WvMSЦL`g̵V|M$+%oAz}0Tcz.+&ň E qSSOH0$Ź܋-<]5T TҠy3<5!;"9 8@Zzĕ9P*Ǩ2ε6AG3z׆Uڜ,R!71vxu"/m+kR\idF^ܿKyT9 rNBfm#/4 _Í/gePl=$$#e,a<1Ҩ{! 0HI3P#7ۃϦA!'6KCV 8n"! 8j)\,OAnq^gRoUͦ K/wq?k 8?.Wv7~WldX Uy1Sl)q@}Lo_vj.$x't!șrxwcv(+ 6@o^|Y "s 8u}ZHTNyP D܊#a*9?U`Ad89vI\r }4LwT*jw_]=僓S=M/zݓS 1fqt&] ]om24J 9> 0j1|>_[Jy (4 #r^BU(ت~躐l)il9UFaM ]$\[O|XTx,S,$`GN?ꄳlOŹ|a[x -΍-.shmb؁vn3"†H0$ ]qWDZlX2Nwuz$m/z#x5}K%r cocY}D|8VCnH@ X#L)FZ ~%٠AJk߹/P])WxX,oËEI6'y? oQ> ̶9jⰾ0hh=2.WZkNoM-,2?k)= U))z&|Vyy')hI$OsoMIT>%u,M gɡo 0TShQ>|yU إkߗuY̆/ՔH)^*Aح0Hw`*h :2 p::n$6g+pmh!na!YGV,eWȣSbnNFдXB&]ᨂ2 6N-RGefaJoN: =Lʽ*=OT+: wNpFC6|p,ddk"6=bUABJ{aDd}lAhAnI<  kW  ROrэAn#ϬK(o k 79?)~trhWAAkk1H胔$gTyrJ%Sno%AST[!& Fo - ^0*d'`+)It_߬K N '{z{@:r? -"_E l|G E1J$x6̸F wPrbmP@7a Ҏb )KO[[4$- B;tlN$tӑUbb@wf/l\05gZZ٫eM^5t[pM3OF PUmW*z)=O9ݪ rݥTҐI+S3NG}nQ FޭBf"ϦT (iw^`$ѽSuhWcnѴ=rhJ6{v<Ս#NHH˪'sfgymg&434-zLs$N$wH#Fv"%&A)KS$HfkXۨb8~y $-N@d2SMߝwmHKmeOLlO8ٷogg$qq|v$[EwbZ$%8(mF*ՑQZ%ɪrb-_mzM?3 h}F/tkز?>҃/ɼ>? s?vvժtF9v[$g4:|@pD9m#MB:5oq,ci}֥}oZ20< `MBn(WVxQLOZ,pG @YCDO՚e@-vvP$_p_ 1xj5W4~Ѭ/+ٜo/䇂S|zO/ixa޾~}c՟ﭮ-..UfŤhq_7kqES[Mw34kF'ڑddLmm r8E;>j"QT;ڤuw^P=zr,MJbcQVz` W䴖W:5s: MJ(K.Wd֩ג\h&v]K*02'/_r6xa:c1.͆jqѶrSYWZ.'sj,Y>i`hQO6k¡L Ӑ)֛{ e߲4`H rU>=WPr}ߎ+)fmjN)~27KEʊ-ϹŽ+B.,݊%E{;U^]nNO_)oC\>c_br^;`0dMf15ǻMua0YF.oki {"'MadN}20fB8bKv[nS: ޶׬Ӳ*bL*Rjд$rO,Ju Rǚl54ޜy|N)*+tN}(%ꍑYsP4ЬdQ9YiX-5y~Ҍ6ڑb9Z\N<ǼTH>^!]ӜF5 CP;A{n9j /J$Q$"I&_y)[+aˇ_H;$AyVApKXOkx:poG-o/Kcy&f ~6Utm~f)ff6|8|кc0ga n$훝>0AL,O ɆU8bnp}>9 9#=wϫENUk^+4E65]wvuۖQ  mR6eh2҂iIP5OuVORH H?*wŚ<$)Iti(9L⥮p@%)DxɑCNZ]ZZjF)d0n%8a'R092Bup\uu/Bˆvd! 2 mCfո"HU$$ .s.P%F8a$(iyqb _yaRpMGh2tC?H<% 5;Mׯ_v;<8qi45.PO؅bqmgwW&fe`Z̠ FQz];:jDj#KXymuʥa݇A};}4t~ztPQWjGAqp)O#7I6&gvucq]ݴ6}& -dŦf&+Rfg7 |&&; zyQ-!,wE9d2Qq CIb!1؏8va,fYI:1D7nEu hu vNy |j:N[?mD 调8nR7:R#c}ٝkdD34ħɊp݁_[BW"=K.*60|`>Õ>{aߩ!Έ A}ђaS 2.c[5#XQ? Јc={~֭0y<,F^<]iEJa4,`Cz-ncP3zzcЇTA ܎ \⶛Ke{|(I"7 =kaz&j*4\2,4 qEBsEۓNHxq]LAG_,Cg[.SPs )IjWouE,O4 ;躮~hqq?_ŋ_~,Wլ{Fi3 Awkfagfg4n7-ZA:QNȥ0dx Rx}Yh@gZ$X xPzN͕?GJ++wƝZلx,q`0 r& ݇nm`/>ǵ3 UF?ݸ͖Epe-]>^yf) 7䀜#iziCE<}Rj4[ dFb 4Ї$|}k}Wل4( z!"ivF7ų!JEhʑIJ$n隥%:` aHn1L,䤻3uOvqm@˶aZ("5[$=l:p=[;0 v\1;JWla?wݙx @Tr/=ǜ1% )pxA- A__3 ]zfLrCNg]x߭}MJ嗭m/_ՒA48 Zy#f ^,g9LAwM4>eu 8ãPKiǑnq F{X ,~ yIK&-M %'{v!1QԛVmrJJx֮Ph4@F"U+e\*b^\ӷ-2LuKlZ ؀M8꛴o<ʖIH# h!4с>xA>⁵lzP٫щwN p] L?&͖PƟeJ0~,-Ė Lo2fsas=/k~Wrm@ 5 8~' 5WO,[г&cDpC~F+؜&E xLg>ux/7 oo޼q?i~֭gR\ %zLJv۶nP &r2>G+s;rQ.*Jgi8t%MpvP? k >Ld3q/v}͛p@BDri& <9۶P3:w>ףX(G_5  z :&ik:l <űHxu-"^\E*}Ńz$, pdGIW9X\irBǠvue90 r#=Miܾ' lRyŽ{Qg{}ɑ.Ssrz߭Ȱ/t T\ Ry`!a)C2hI]:H UpeeEVsR@]{[esP`F0߿Sen3'`9Wo;.K^MIRՀp_>\G0P";z*.=j=vj;~[mjbsr-_3m'~"-3uv;Jwٻ6$]]}/˲Mٖc푯eb7DL3#Q$/+R4!iDFUud旕,pGz4~VM>3bANρj ZY!ƴo `0:v?wi<~o\YV]0SpEUo! V6 ?iQZZj3#\L , %@M6j<%i$8 YBR B#G ']Y6Q t"i6G -qgo{6m7IRKZiyU_J:΅Co>ו$1/Gq'*@ r'[-=84s)XԊUnxALl NED*$XgMA?)w2ڑahY L?tlh ns+qc 5r4v"OSv$ir'w)S9o|Yi;!$kjIǶVo{A`nܿ)8d Q}n!4h!m-0  ʩe>2/)Jm(XL 7 e,ꜗ {2w^s=2ځ`iG\JxјGfV(YѾF BQ (Olss hv\44o`۰Od{ٰ-v5jxLbhn1KY~f|0\).SQTdYzw{!aَ/Wz]xр'=l6Lkfd|h~.D6yNV5 xsYN:{*F`=ͪH^=*=d?M,_T`YP&4uuqהV>3vi[vEi{ʉ<{ϭGRA޼i׳eKlI: ,h +7J9;ݜ04f$ Mܚ.'@= \W;u\߅,*M?vc'c/xO?O,j7ݻ-U@d;@֨M Q ԙ? Sg0gns6Upun9 ^fӳŢ@ٮY>߇Ń3Fuݓaܞ+=XB-vDJYC,t2- 4"n(K",ˠ(f((EAlt;t)iqE 'K]9х& |N@;zC+D)E)T:52vnq[ѱTBHr03ηٳanlſA|bm外$JvfV%lOZom,ȼ,y)ZE` 1-~ |vy}VoWUG:*86YB3Df kTc<8qFi zS\e.ynػ;Q?=&04m8jpxBOp< 7"DRT֎݆-sQx}I̒Ӵ2N]h5ө >ޚeS7XBl E{G ,˸eӧz}v:GkOO}yEX8rڲҬٞWa4콹n-~y Q2Abm+\['0$b55h! VCe=?j^fyX-dķnt:`nMweaˆPz/$FFrt=8bEt^Z(ŶO6ԥ#O[YCwCqY%.@ZjSNG2$? ZtesޯFM?N mg&$l1 he0Bfs IFJb;o=5`}9Ɋ=Nq?Y}¨#ΆpJu_7|Az`0iרbzC[ [һዣ,t$hӄp~V=1t1= 6їP";n JgY%;t; eBQpp=pdӖ[¢#$P2$YFƨAs7cDxrebUY4t=jv?c'V3}"6vAq5Vy[?޿w#Y7 $kO=khɀN}VíWô(Nvi󐋐hT`CDOm-+ϒġy--u,'48L(K`U -RSp|4 rR7+Jtރ+F 4746)+l7axME;Jf7_=[65cɪoB},=1 8J-ׯ j#k' ¥=cJy.Oz~Y~/n J0Q, rֿ6s[W|0lf^l/I¬U4vFbǬTßb ]i[',ЗWePЏg`<*ɫRju=P!ٙ>b x^*lO$/48nV4Ry< ]i;/!{za;tfs,m^YDz`x7YHN5?H4zn駇NF߉TiՎĪrhG~6愑5xD 9-OQz%$v|'>G&K{scc3]GܐhwX =>&m~iVg z0]} <e6:isۉ,K[t" SuISDMoex'f7MpЌٍP7Nuh( Jh44樝jVhF:D{!4k͗ŀ(5/o$wUU++ rȨ~36YΥ9fuY#^#/6).5rq`8̈́fq]u" Nűv!e0XbmxiQ6y'nVǫ(z= fO)#G6C`*mR4#wmQ[gx$V>鏋q6V~?6[NS~zY5犰!×< Ӫ;FM$aǏY&d4"[QiZ{{-T+=ҞC^G_@ǻؗE8J\rbMKDɦө.-4s'1AP5}#1YB"I^UpFRX H{,WW;Cf?] .­+@0zk$4tbdtՐXeQ+:88ȳ|2ض:<:Vj:Xe("64VI ˲e[eԢ&*۫krK:/YTҽ˺P>-Q J&INQFg_"i dh5c]VOYQ`6-FZml7)eeW^U3@meGB$`8KJ#U UJ0pl:nors(9V_Qn;H/ND`S'^ nozY'mwz Xq|BH 4uM~^%H U8-Zvx,sl9x~hðBD̀xv3 a+m->\,iݢ0\e](ڔg+.ِ͇ \}8715K"`JiMnĪ!; 05nm-_x姓KD :"~0G_8&g&oTSe8OF#si :!yd;^qvvwN_F/nskJW@JmѼ?ENkUVec||[hW^o\u~A!O(G٬iM+ŽՠCd]VڜgQJu_RK7PmTiE"/0 ,۪Hu&m@Ƥi6cǂAZF <8ZwAp/jf&VeZAoCGWQd5>!rUMrW~~äW:')^Qb|XU,#_ӚTS'r}Ygzþ*)%})^)kZӚnΉvپEC& OEBe~)_eN9Jp?EYMk?H,ͩ,JA 4GR+RkYq3IQQP|U_]=9mZi>ބ^Ӛtô69Z%LW|߻馾#2{Qr<F|"&*9)t(jt&NȹџʶxmrEas)wOm\KzFI3z?@11){{S[z~ChFy@ n91Q@h_w>ݜLW7p8܄g2M9"BJeT୑],skNi  kY7 RxR&H7zU.G\r=Wng2BI\Ғzk!g&mҾ68ϧJFjF\$v!JgdT#(k2%Lf($#oMC߷TȻW)U#!]Уg2` @ =+d2RGM1-.6[=Ux$3y+携St=J|Jv- @  .v&)2^ljJgC.ow)J)mH`I_+YʮÛ 1?N<8_]MsmhʇyޔHܦvQ)3ROU'm&A;p;)ʄG1ď(?&=\ |t`5 Y۫וlk䟝 r9Lbn6^Y_XZ3]pq\qý7Сv߻@ I-\tnZ6uBiP1s˴L(NOU~RVQ(*=T)aT'Tc N lATŀU cX)Bgv:p+蘝$٣`(ebWL=ѣcq߳Z&_4GasIMØlqR$ Pݳ\OӅ6>. ){-nPJXrnE83^V7^zh/ܽ?|nbŅ J{f+bxtnG|MC:(|i9P˜˝N' VʒgN+1IײS{`Ժd@ۦ:W_ vI'z1ukvnC2ׯv?cxn> U7lmm*tHYvi*U}RJojPUo'a6f뇇m<gs4h A4 B)w=i6ivMh?u .2L%`d\tJ]L=SR}zevnV1"V5- #Jv1G. P8 ̧SګWojʹ9!驩:c(nA5 Y*,rtl8:R8V.NxP(PM a'UxSo$9:jgyl7M+Z^ J---9 ܹ~ ݭr\)$nJG Ǯޞ(%l_/gk{;@I'nt]T2+m< XcH]3i6i_h>k!>; Dn˵`l.;[{cTP7 bUjDvE0 !H ,;h9zac6@|b#BpWՌ@XaR}Z;u;}j^$doZTC|wݻw+r&rE%U?E{jj a:X:N_9FT[tgHVPQ c^+w.mN$5'04B(5z0MSf3>hRN dJԙ1˗/pXMP`Ɩ|)dMB%3ږ`dG66WaXWkXۢoժUS:t/A3> _CO~PD珪k~L:533s5Q&j(:Wc;]Q=I ݤM]ja$!&$!?̇RF޹ZbIw:XP UE.ћfBaX6`J`W&`XT%fOuE3J9m*G IqLC"xp@\W.϶GOڐb_U슄aA@C nv'0M)MqNOQ|QP @dT2w;F\*ևDSx@rt::⺩t#!ŭ.`PxWjtgj5Wx~{eࠕ,XcԨUoNU$_8}/yNF<gϞ_y| ogxdv&z@$NRB+ LLrOڤ9gմz#'EaԱp^'<98 O~"jS>#t$lNMv>mAiHj 3L+p"bZd_RP pw9.s_ʃ;lm__֪@Ex* 5Eږ-Q0 t:rdf 6f%  GJދ/# w? ۄ5 'fie])RWٜ5~`RԾF#wQzd&!߫WF >%]G]h WA-Ӛoz{uI-ܜ/W}H jlwp[N4^YYY__ps% L>3 zIqHc=a <g=i6i_t&Kb!PN2b@s0aJ2>6WLWOvdڰl ]˃sx4tDa&8cQ2BX<İT*  9`F'E#+N}Ha)2&rָuVVf:uA :,sZl* vxamKl A!8kKqyN0 E~@߃uM5ޤ#$` J@q>@QfRNRxnR8N>'5teP20 ̀Z]Ok`vǼ7d$2C4,0J|}wlI=|ަkqĜ[7M+VTO C>;;F-&&R8K.;jڰC,S8X okI?G6'DNOU} d7oú΁l$- Jo鄖gdԼDe8XjB8 W}ɤ KRWh'~O>_}L™MڤI]؎tXKNL$x~t"Egdm+GQ]e]*;oHWZpYC…KザqP8%3KZD'-QY1QCĐ=*PN꣮QRγdrz"aCR\ FG_gPڶ풓ycclL3Ur8\t>L @<:T D%Z* v?P<_YZJj"% #mdX5hX`h(\'`G-, 4!߼yOо{~]ƈ`iTkS`: ajjv$6X|00wQ'E|9]@h捹pdf=ۀ^$-`aJۓ6ikѽX*z_*T(c1$cjt'Emfpű(W;2M3$NcX0K0j\ ys}@DQZ@.R$aY {aDca شzt agpa J`ȁ] M0ӬAašk42ٞJo8U8Sx;6|RU L|tb,"uY{lͤӮKw zi=8z5t'-V~L® EЇj{I3iP*R> h-/ߒ[ILE924}9ԅ8XD?CΎ EAa(c&mB[quuzV͜u1M D@)I-݅eìa9+UO*6ir=!R|Xt%M}<+cj\뗎s CBgwX=[ [&T: Ǐjh=onw=}BbDyfs>p@Ҹi;}rkCImQ9`֌W:9>3D`.޲L]X=X\߼j;}R.?T$JsK}΅,$/lRSώ3`>D/5vRQ DIS[0lR iF^d体8.Mt7K9;i݉YwV"h6Wo&{ ^Ѩ"4tK7`3<=OU:BSsU:Uu콏_[7}xzw3ӷp >p?ݝ:o~u\k{v}7SN t tñ{>?ū{~a|6~w=}/4 [H!}~-잖0]}t86+eo`?>h78M}WkWw^>|ڵ:GO~|yl]XϾc߷rПy;Ny!ߓCw]rwq0+9J3e2olQw*_? T{?]Ww~Un?}w.~3O(nFcǮpx樂t>'/ſ~گNvQM f-aikNc([v-[n~~ֵf54xKCv}'.^|ogxj.<>/]w/^yuxHz+m"+}aCtfo|?盻#B?xoq~kaMJGw>|mvء{nɟB;oO~B7Eͷz/^؉>9?ޟE; aMWku>k;Fg_JvYoV3_^b.W_?~ۛn:/e[~yx?*>|aPOjڟ z vZ*ٟ]ݨo~vC۷u7 'foĭ7o~{~WĶ{H{>w8qؾ+}}_<{׺/~;N~?rmH g+bwr;\ٝF[)`ruxO|o޽|y31\p[]{~{OJvOUϋ}u޽Y:xmQ'P/ĉݻS/_kޅ}"Tid} U}5Â;8ݷC_|rc]~meҭ_8`x"}Nruj\uƦ!ߗgjCm:[m!k@6ӓ77OX?u]/{c.]RKt_չÓ@''ǽe%/zvcw;__ߝUOuCI΃հcךkvu BRo.߸0&mӵO?w7m1ŇG'N+afxɮzj_0Oϙ3g \AQ9?Z:qϟ_:L>Ν׾t~﬽Os_?88-!?dO~{߻{^}O<};y_~>GYȄAeXp-z #b7ӟAc.>_}lԾQ^g) g^CP1cv͠ZVopPE}8_?t~aft >?=)/u<|e+Wv?ɓ=݈8RxmH3%kn^|8k7s5뻎 ԔooWO_~uyʕ?XJtqT;ϯss ԥ `xŸ5}jKw}][Usl%[뺐t*s&/|Zݟx>;kɓ݅ WNLL}K?k?n~>xo~dwK?4]!vWn=U!h _nl`c@'߱ԃg^]?ԋwOu/|e7{{ݾ7YDC35_2OcB9x5^>"Yk3k$שׂZנ9qp.~l_p.\x]UShS\k<[P#Y@˲lA$HօeyY@=ȚDg'ކSSXRw)MNW湉BQWgj?wұgmG'jAqkvEnjh?3t]ڔ?QVC^}˵NONuTe4kpiCNrgm:ϐxƓzm>؛0cwk@n_Kuz9&@Uf|N&uG'*ڻÃNݜn>ΎSۇm7!Zז|SvTe{F[YWw陛vȻs꙽y96zFn}݋FHؑ}YeX!o^x5wly}uQTP ĖPrRKY[i oH.?-Cjh"zǵŖHf/~Dzl ij.[mwfQU LXxr  jSӫЪ&m@S[CeGL]D dڂ垵O){:j ST+Yk5My֞LyGc&aJMGbk辫@) CVҹ'"X`s Q7bFlvsbHyJݘZg_0*,CHKt 5eatek/n w71`NO4${y`um>ԑ)b(JJ~(9.q)pP|:֍Iچ5<ͳU"\_5TОl֮Ī N*څ}>X]b65 Q-XEv0Vs A ۵z"d~f? OVsg.)Zu 6)\֛ڕ[5 ڣ8y;=5/b-7%:U'ӵҜ["Jy6cĞJ'E~rhp> aצl6ϟߖ xSjqy+'ZOl;ge"J]BT\\3D"-s\{:rbg[iC `]WM]]7fhk?i|}/jOL?"د$r2^Aa3! &9Vm S楮ᜫ]X?z?{'ۉ󞹇ּ Fh[×=o%W}*LiYX$Yo3Cp-]M.lʼU1WlCnKxG%Un3 8Z63֓Sd̖%uɚz'U5m3ôUoH.ͦFSX{M9'L<܏<1ŃA#k5Y?tD$(fkX gX挤yնX0#ֳg\\zjϞ=tם/ǵnef߆N?uzG+ЛŢZIRZoJ`j眴?Rfp3ezڧεe~%X5?LCVYZDP)k|L|)>?q/rzg|:`9kK9J5i?6_E(\+3$$9~.PJLAQԿ^g^$gs[V){y`8猡H+yXkz@Mȭ \S$X צ1&_DڟMm҆ڸyh69ԪIXk+?R>sLg26x:mcpR.98k$p#"eՙ#y.k͖_GUջ<3`Y@j"5"H@SH4@SH4@SH4@SH4@SH4@SH4@SH4@SH4@SH4@SH4@SH4x66e.]Zcۺ PpqQʬxlxßjZ`>;2Kڤ|g .N=Ln溳'ڨ0p-8ʅUc0t5R WcLTSVey p6\kʳNEw'pjGh'j~W>Y^m\INkXWA ̺=})N~,@jWqvIW@͙a8U~gWmf-+ucC˟bsuz.Z)CtO-yAEyIO'ZѮv!#h򞋬 ǖLoZAir< ۶Ʊ>%XOqUK7x0_c;cW:`]Cƿj;nu~w=Aø]= j=_mu3BYUxōuo?'<ɖl.uδdQy$>.O.J.?\N2N-a &&DO<~ky!?])KH&>1&*[s=c.6 3כӃ W|-Ru>AyP;=X;V q &kc+xE5Wh`v,.u3Ė3߂SRاo/#,KVGj:.Y9]R%Jʲ?sq OAܵF5VʚC^=wKc~_ʟ:OWu/ԳhkבI_"l؉;",;F[rV=O5?vˊ2S"BcPvt)=kDv %+5rMue\Aj;lZ~ZNpw\ \yӦo+s(0)Ιyݚcl0SF&*ǺHʟrFYCJ(ǜ_p_=_لWr.Mݓ[ߪfcúU)6?-sM(X$wY7їc} mnU LY«ZE_ᜱNb:0WלSXUYS\G]7攘mL۽^Wu8605a;{ve;ҭ7/{N^=@?:6 RbJ.(5k QZ<‰Y;oe9^l(?)Q3㩊T=]7f}q^0݇ہ'd"q]V^@r-2:J>[ך5` >-Sdt^ffO,sFZ׈d[5ZQ[)]Ai ㌝n]MWd ]U[G]\!:{-3l k5_rT]2d,,a iWM2pN(Y\j5g'oc\f%߄Ԯ*zd q`]LԞvQs:Y̠.u׶{? |=̨µ^aHK90*@)vBj)vBj)vBj);wnStj׾t):?З8qh h h h h h h h h h h h 6!av:{,#@ϓQ9R;!rv#tdwԍ)VԾ1Z*k;Ľ#VspԐQy^xG&@%RڅM5B:3MXd"Z!j=UF[ <57==#( -P!dGKdnaG?g,5 ˱R>\ 65` $k3s=#tţB .N?kɓst)U6blF4:3|KQY$*˙̚3|}ް`mOvs8:Ξ=;ngΜu*?.#]7\w5)c;u5Wǰ5-=:j[/?)VZk 'SYImڄϱ)㸼k^X:k/s+/l2[usX PJΖ$v'ORߴɿX)t!US+CGg4Ԏ,h;Nt#Y;M!R;M!R;M!R;M!R;M!R;M!R;M!R;M!R;M!R;M!R;M!Д9_l6VaURuzT!ss?ٞm0w}U\kYꊘ3Ls ¥_N0*E%Tǜ(0o~צdq¤K\oL+?o~Iٳg}ѭLgꔨ;۝ ~.B-9v-˳^V_M5嚞_xlɓnT3Aui񻦤{+mnjyv%9[BS~Ay7]SD{_YѲx3+3*If-1C~;,4cEC1ڻ|k xV׿_`>BNS[˦][v~ϱpKd!?29ΨkӞkVY+EZpg-7c=3=$֢H$]jy!2eG\C?Slj+rk T*Md!y#vMTIF?e$UےR^ꪍ듌tv I(d6[p5xՆ?'1xߵZ׻gW6 5X*4+0sMi*uޭˬ9ݚ\WW֦g,(Α$;ud=sFC-|iah4ۂO䬪%y= V`qV(C k (4n]0ϲ$H4yBj)vBj)ϐw=gˆUJNxG,]*:KCSk4=/Ps|Ծ{/$*Xx6vO^綾c- ]x`^Phڵ<1Z y׻uzv[\~3KtZ0y@״7 ;kE$g 3~p;97*HX2kmZxHZ*Z ./`n ෲvGj)vBj)vBj)vBj)vBj)vBj)vBj)vBj)vBj)vBj)l2LGHIENDB`analog-6.0/how-to/startwin/zip.content.001.png0000644000175000017500000005433010161303533021306 0ustar sret1sret100000000000000PNG  IHDRb.tIME#Fs pHYs  ~gAMA aXgIDATx_d}WmAc0lC&m8sE@zmQ7]Aw2KҌR35f(Fq7A;yH7n`spa}z@!-KL/` )1`SglM:~yNկ~U~WU]U7`U}ߏO- 7ߤHo~R`>l&`7EpB"oYPx0bK2a,fFTLB-VCe2 y'9SjN7R;yg1ӧPv5^=8 <ÿ[vA Ai9^ ] <b6#7?y_{"Դ#Q??#;?# {`ݰ\w uOMG>f?fm7_|cW}boo| g3q4U\=H//q!g@zQx#3Sύ?7'\ȍ[?hL9_Ϯ?+xW{C <l%obҺg;wǗw?-6"(oHC{y4?Y<̨g:ޖ's^0_}޾8‘O-ֻ|w{v>#Ԯ^Suk`MNzjק/EOԮOodeRG c< ϒz8*5jS|ל̢[Nқ|wjv}q)9,FyWﮇܭոA#iԴg [fR?^OC/B(5/wO=xδ|9,?ӗ ayrs vX%عvv^ܺg76Vw|7>jE2t<7+/5Դlj[IG@v( qA\߶qEv*$֝ziM%uF-WQ6R]S~N' o5ُĕb% ̛_/Rekt;V@K< 5Dm:&/^fm52K_Φk/B>}^ ِ5l=g/C}{6yy|(z휁QK<nuO}ًcR3I]սꌰF}akܮ5/ryʰg!3ᯅG@-RN|Տ8yWsuc#V\#Eqú__/˖yމK;j;jxZw@ 0Xt)ΨK^-`"qÊp{wnk;Fȑ=iJګgdD8&yF#p'Nxh4Hs昭~xx\Ҽ2ph -8QuQU`epڬp-HRjPYG9She!BUH)Sݝ|Ȗ%{oa^y[QRa`pJl:`2s~)P}e옼8wΎ ÚvfݦW tܲPYl;>o|Q d/CrPξ{*؏192%36CY$hbqѺsy^l)@۵01ͻS?>6Ӳ\^^v:~Ki/XlÇӽhtD2x>.gŹ@V`=Jq<쟬`αffKUg`0H_VXOW/>Rn?*vݳtwvvp)j<0Zl)3J 9Y`/Y̵y!/f~틋, qMZnxwD6 ,rɦ3oŅSKZf)7M si^t=/W꾳>5@u?ΏR=|w޵4f2$<"wZJGcl0]:MpzeR7.;hQm(VC7yG_ ­ωF-|&&5FKZ^5aiT_=ͯX}f3)֋6NbbۘNȉuWש~ZkWmirV2Nu$Zdw0ȭt:F>O#KX}dɓ'9XW_}%&dV_!)h?/h{;N0J~6,y~ nvewgS ?~ꭝ8?$Q2|}{{lsR%V֝ɸhOv?Fggۄ7]<`gw7k2'4|$G/ONNlj٬b%HI)*StˈκEyms?IF=iϿrtg$GKI٥U)huidy2dÍ/z щk?#XⷥצGTGo%wV .:d^SZ$] PiҾ#_2@B4e?W4GӉPoPNh^%|5 ߾|JZGI'V{j8|nKY:iSc*~^)^Ycȣm5m&OFlqVJ>Y~#jS3ve,NҼq=4#0 p%>dtf'y?|!f^$$_~+ŪHc|!k~B#8\1AUF~'S*R[-IBoNWnPH/1AtsY'֝VgtvݣnZh\ OI+'GͻX t$@ԴK9͍%iUrqʰ[-6m ;yTz E7t3ZO1u:tw_4nGi@kx]5$ZGڍ-6krAT]A՛[F,Y3z©PN䑻~]B!9PeHN=f &c7~M@ߝ, x2n6,'lU}}2߈7k2'ۋ޻$9qRkg߿J{{2|Uo[[OϩMOzGYg-*3@B4e( )*Y UNbhG-Ј**Jݕi?=Qc+im>_;4xjd8|69poTC!NΊҪBH?E"q-VچUZө߳ QHUԀrd>5NYiW#B uf/ZP49 &;Wͣ֌ù&44<;Ώ;ILq8MW ^K"U3ŌNw}]o蟻/|84t4/ҿ$[A{]P+辈ƃq]}  ʦbT3z џE5OGxSZËw2WJԔ홏kZx!c {E8JB; 8>lFk vqNi'w^S7tVH% d.KϬIØjY⽓T ^{`=%xxڨ?&;jZ IZd2q~RiĹ:nݙjMudۘ4kͲ8#Q7B YIXxv:j{'ds:L@')KSahҊx!斴~jѷ1 je|wmlUŗe¥i,KEi>S鷚hy*X/{9.FhmЈj̫I,ߝ6Ord+Bx e!OIV\.;04~wWMy߻֤ )65cW$ce1*d&Ixœ;|yf)uxl5NU٪jA 7ʒWS"$' /$;?hƮ4!4'aFQQ u|"<@ J Ϩ𻤯KqY4cl.>rqG 6'+Po8S]z)D|0L"DgD"˵W(Ex"T!jʦWsrnTH4H~ʺ\=:: 3 Q,=h~_|ӮO儮Uwgĥp͢جIXn?1 3fY,!z`@r뚂K*1i2? [#qNYܐw3^-#Z+=n׋dL2R y wҦ {N+% t2 FQ$~yyYb @()K i RA[ ?x,ZB푾!eX]+w 'Ƽʄ_^^RKyw`{RnV'@DګNJwu2,:W4;v}<ypi:?H~U}cA"t2jDٲXӺ7B n[VW~v/KX<N;)dP4YI+b4ql1 1Tl6=&Szv5 b~t94>r1[e[ܰ^~ d5`A6D4G}hmUߺug-bѫ7+tuWU.Be/I[+ִG:pbSb錸u'EkEr(LxeQqԴg} K%/8Z|cZD;uko٦uy|ڂB)+CY"Ԩg;\̵ׄJWlAb)pJ_TypiڋTh I'h fM3Jsm*bll'lA^uںcw]{nlȮ5%ʣ3 4Ż1OI iTF$05vgqmqök;[ KUԘ/(ﮉ5£K2|tL^KeQL8{E`ePx5b,r*SZY]SS)1?"*Z**YWy#qeHjL:wٯls 6'k_ G컅9kjϴ-%SFl]?&vL6xey#w8BBoH(m 1MSԈTq+h7-#%wb(Ci4&ggؙx6(qHVU/Nm##i֚alܒݕ&^Kj_"ͺ"N+ɍ˿-_E2H~)/ʟEΦbrὢMV~?* e ?Ƥ,Z+ag.*aXIYRDu."(d1ttt$u]|w 5ү.//N\%kCWN'5eXbNK lƏwݲ )כԔS?=^'7id8f#~=(JLIywNG/6oO Hi{,&փT%P ⮂d¥)_5~dTg߀'Su?%N lϙ<{7&[]gcͤkU_,y◂LNcxyut_-qj7ܢ_{~8h 7W95UMxD.>wW nHڢd;^z-! j +`3.%~jooE3RdQr4!TⰈ9ʮu; WgpƜ^hoZ:: 83vm_.^6D$փd8irJ#[6/8ە㇅7l>JBK1-A 7M* 8cUpÜ9H#_Ԗ9i?i[ywKൣVəbVz(g9oVW{lz5[" z+(PfZJn3RKE/|EOywqy%*8C)bJ@hl93f%Hn7'wI5qR8i\"Į∹{wC*`l /p x#տׇH)#o׋dL\ "G1tESK^F`#X %p}wł^n:::Jt:J|M^.ΰ |yD}kuХ_z=qUrw]_^^w7U_u:`ufN+5. Ua7`fzrj'& ^u#>w8Lz֢]/ݾNFr5oO۝d1_M t͈ 4d¥5~dTg߀'Siv|)jS1B#$Ęw' ~<{7VUjsgipi˒'~)4֎WG'X*{vIAlY߿RE&l[SLP{vAPtb7+]B=d%lr"н 6R  Mjox!>'kš65/MA*(iyTq8Z1pE{:7Q83樒C-A{E}&,_mYX4 w`~}HNO4P,;'Gjg=iFWنcؔj+qU+Zi37-2?Dql@59iyV\|i_F~!\Ʋ_ 39FI|)B)j-4kM}oExkp<nT};kVmZ%O7!vC %#MVeG(Q5Wf\5F^ԯfCzW)GȽv} w'UdxcE3)2F`V1WAgrn^`Z/<`z0 U^#9>MX6/8FPƫ.͍K1-A 7M* 8cUpÜ UǺNjm^D"xh!Ur&آ+Y+6/XZ.wέ;_/UYynaZq UUJ-u>l+W89}8 S?i;(֣ H5w 9j~ͻ[$h8ei)ZBzִs.Btעx*v^Vőm1~NXiu;edsz闂kB(pj +\K%d=UX*UVe$~||(*k+A6{9 )W @gVQ]UW '}wjUez; <P }wZPUI |zVkRZvVk{7)~zrQ߽NnpUWH10,3Eϯ!;y~ Hi{,&:\y2Ћ?2R嫄,U:EF)N5˸>Ęw' ~<{AMvNwYbF~!\Ʋ_ UB%FI|D(kq`%^u7ܢ_{~8h 7WVҝ5{zb j̽O*!ML&MVemF,RM7@*k-vL_̪UkwlB\&}b R{\.p W76SKutT-A{E")پk Do=Ǻ_u>5. Fy뼆6;~Xx3jg=iFUʯ >:(QEAWy eBU)>|-:#g'?d4 h615$;{}%[8B롙B{WZ+X˖sfUL*6lSACm|,ꆵ%JJ",Jsjc+[e_wOgg3#P1i ܳGcș4kM#A$ů༻娊S©%t/Mq,gJQEbY~ zܮɘ~)k(mtESK^Q#&}qs `N` ~F\{K=*+2w?>>V}utt~tЩXFF,/{Q<9ŮR?E!wʮ.8X&礱Yqۘ_,yU#Rg)Q YHutb#6?yTuZ-} MT.QtxV<\Lc*dKN;ܶeh!$RF윯;^T ƽsGrꐱ:Ϫr:nl l"ip!D60h ۊc͕pnV/P"MhOzX_ic4RD \f,ꌒ^OkqT`8GB9ƫT`knƯA˅McSA-6ԣhݝ5DwOM;;cS;ʟc٘7BRkwm1奚3(n'\;gs,$_|66>?B?.:*j,èj @yiQ!t_[[]*[@ywNNM_ŘnN^,+n[Sw/$#iƵ-,p_ Z*0}*ۈ-֯6cdi5D(2y|5j#Y`^{H\!ꔠĥMVBH_ /]QbӆUq42IP?&tY8 zu ~pp`3-=&,6}~_3?3QU#^uvVHklO]U"gd8J#z٢oouϞ vn`uS}<7MI|'lU}}Ꚍp> %ѽF>"KGXRJ_:?h۟$ 4ڃk_93IḤ%㤐„nXh%9swI#ڽlB4k^R0dޮJ3~,r ++H3I~*\vuV1nm?=6=I2-[Ұ'dpGIWcK1#.McYďp:#֬&{+:gSJ%|5 i^GhT|hF=TsT1ȪtOBM}eLB@4-]B=ҴپRDsgvő'EQW4bSe3.Uٷ5$S$O՟O_~5"ѬӋ$$oš6qTPfi2P,J8.fD*&;?+BǦW'g7e 5peJpޝVgtvݣnZh\ih*ܫR#gT]RFsc)ΐ<oC)Y; ۛ9GcZK_5:tw_4nGi@kx]JD;"x-jO.dkY^甩f1B6jp}hvۍ&QvӮO~^oL"(`@s@޵;.)A,W-67^*95Ք8k{)F4yQjNH"ɍG1~;շp4˅3fY.fC4)~<Nb@<ⷢHBڴaU}6Fv*>: 8~rNχv^o:y6Oۭ&5n$IHrjh0Jӱp6V5>DZNe^$c\CHl2ԉ_Z;ÉsZ _Q({QO?;=!$[g'}9@ 1)K@}=!=&q&eIR C3@NǚojU&~xXj=\ {w#n78<<* (ӭB(e(R+tաL߽py2Ҕ̦0fj2{U:չSݩI\ `q֜X!"vK2 4Żh)d{5:ٓx]hBԚJjiCIIz$G_Ļ*,}g6fRml2CKϷV\.O<մ",OGNםh5GyMAچ-O^ UQͬ<|yf)PYp/;e|ز4^C8S=d٘I)#6woZSZDeݹJn+IqɨyUn6%|{'!bhK r& /<RH=tA4466-)#a]/1@[TwETN>(^55£o 1|@WЧ`%7&eIՂs`mhdqjP.([c|H b ROxpUpgzV{ձ?c>-֖H{@)?2,}iWpGWn'#.M'\㗂:ʟF-E &'JBTD;#.~R`&##.McY/g9Ŷ1Y-WD'Į*%uR }wyIVz45Յ \@P{iQ~N]9KắmELqYo9mzEc?)8ub92!KSoT///&rdopO}cl~mCUt̘b56+J%vNr mDii'C{YSā}ٍ =kY#hms jS_U/dCbr|5ji}ѿuyZsI\C!7 #x-jODt6bSgj~nOT9fGT܍?APľ#Ps@޵;ђVm,6.\՚$;m'k]UV611Kpwq)pؚ=@I g\dUq_ :qM_QxZHq2#K _cs_@JY^4/sM'$hM*ɮ 2Ef$lkD2_ 9u?}ixrkm:>P4!@5~{нfF+9ׁ̀hJ3~ [ wĘw?='jSlO]U"gd8J#z٢oouϞ vn`uS}<7MI|'lU}}Ꚍp> %ѽF>"bˆ@kK)]ea}O?h6Z;m'¨'`WL$h8SZEc '#.M xC`#Qy63/FjoFxt$>V .:d^SZ$PiҾCu֖t+oe¥i,K.X/1rϯRj cWZ{/5QI'pLgSΝ/Xc$p_-! u'Zl<ΜxogTUgsj&Sg3.53j a;Rp=5NYiW#B:HIRVjv4*!MJܯX8&5ٹjf4酦Ώdك\֙1|EyB]&Dz-}@L}w- cL8pޝVgtvݣnZh\ihգBX؊#5RwD}1f*>k O齜E$6F'شR- )1D^}h<|GwEQ{{ݥTGڝZGBX !YVxΦWt9KB,iD^ }wM2;^]yNޘN. VT1]RVEdS-=qr/T ^}^s>8?tOɤ6^6ꏦ+wڭVsBLnܥu*q[w]GI,8u#tTL5`Gѽ-u+b؈6ng6.fdT87, 8~rNχv^o:y6Oۭ&5n$IHr~˓N͊ 4 15-fmSE2b ?w.}|8شaU{m/T W5޽Bz}~}aY %U zu >%1#s'eIgLm}tF\{@EpXAVʄ_^^RK߻@M޹+aψvk*mN3⌤ 6DJ#HL{4'`y靑wxҰe:rYU@HM\< -;["V>)Nd'kwqj2-C4e( [Jz)Q3Ό?ԣTfeK $i;-`E;r}ەo_B;M(dP4kwEjJ=vyцOj5kqSĎl鋉DvpI 8/M.y`8՗gc,U!lLX"z ~3c*MrRio*EƒX'!w}HNO42w .jSGjo䬐b~'i6*"VlڴQf~GuS3-U Q}j/ֆN?ZT`v DU/ڔr Ѵ7. g>agT8o5#E! A6l=߾xd$͚KlRU5%"8ђeqJ5^W=k9G!K$:sXsncډ:#64H/[ش MےkE2_BmSTTQjiê8^b 4PI0g Fi'[,R> XcWGGG鷝N'ZnL{#@WTujA~P.NM}LwEu<%yw)N(\jegwS?Svkʟ֧ύgaSͽ9?CC?W r}דF"&iNtB&[W_{ioz<d{ʉyw_[Zo7-rAͤh6^jک]o6\8 v)VTOя}X9 4Y"iP5~C^SNm&mj7o~7zlHjiѠ[[[_.PZ<:9'}{&f. 6pS\ۡM4JTTuQXg6jEBdJL'ϲC?te3dN|{Sr@'Cl+ uŲA Y(8O| lr62s~O}LuRzBK?fAW}κnK^j?7.>[`0Դ"\UuO :C(Fv"KS|eDd=,׳ !KQv!^KKyN`h:'yo$#2H6dt~AskOdx=XNEӘ] XwQX5br̼qpR%+N!@j۴[n[A'~,ldńwOzt>鍩]C̴Nc_r^}=밌=Q Ac_EW5oR7̃l 7&Ixc\k$}>8,!c 3K^kڭݥ2}U!e\"6~݈FT¹5u=4'$5߼/Ldnړan{766F_/~fuj/ q~δο[:'^:/e5hXGP&  嵍גsMmt47bl<M^h>,O&kܽ[[[ߟd(˞y4Y.3"v1||vMIgp.$R#sr ].`LA͚ M1BylƮm=D*l#j"]#a~|G?=&פI>_[®QO[~'ϹeO'敏oZ4QikG0Bcixb"NfKܚtr'-{7:6ywzQ#w_ y2U#5ZU s]:!%O|lP$?>.*n$IENDB`analog-6.0/how-to/startwin/zip.content.002.png0000644000175000017500000001546210161303533021312 0ustar sret1sret100000000000000PNG  IHDR&Dv-,tEXtCreation TimeSat 24 Aug 2002 15:37:23 +1000(tIME&6T4tg5CA@]pu'iHmQ%pV[j#R@|wp~wwݙ>3k7A oq B CP ǟLb~DzCX ҧŴsftttRb6ܑvfl1v@8eڛBt$RO4Df4_A8磗'p%wHdPeKx B p})1_U={2ҴC!6Ld7`c}B[zv2%BH8PdJ ~W@!:1^_i޵zIxY`9TX0wKs/~cHKB7+B{y29n'F8a}.:qD.'=yC'/"K>-$Qh9A2G[|]X=4v~uVY h? Q?xlM о=0}؃$̰ Y?*ؾ}mۼ@}y ҠAF:f5SASXD砭 QeYZծ\ևf@A35{m%pQ;ihel\cw=aV &HbP}mPHkB8v|) /899i&Hڑ^r5]TΗ_AX)FQ-gltH0}nźdCYEz86o"M@8%(D!L(ЙIO" 0ƍFuES``ws LL8nU8;;K&$e2DZQE'XB锖*Ǚ% F8rbbD0[@`Iv@B,g9ڲ | 4NYO^{+@|iPu#c/&84fuj$lEūӹP` 4cױ5SC=7Zkr ƞm hL|kQsU$ZK-t82 ;/U34)$rqP!\ 6.q0.Tȧjmo(nc.\t MBƐRS54բ&5t! vx6w-[D4%i64m 0lmN-P7KMl~6/`ZUVBݳ>p~X DQIV*jf-yz.ü@ "_|*{8X䓏2 ir/%fP= ?RˮslT4`5(tǒ8DNR[aqިu?~-AVre"pmDe^O+#f-ONg9a;K3oEU?8X)s=t^G \)~f޷m7oQ!Erʏ F=}T`>&)W]ueE@G$h-){!&)?D"y!'#1s$E_GF+B@0?hHG>t 2 bHc)9x ˲¾l;>N+6hFJ]bvHts._WsJIUp-ؽDpLP0ױ{L1 d15i]90Y1|E `C 0e8E|ƬUc?۵2Vbe 9 ZAgb,xi4}ǻ $, Zaە|њy~)K) )K^C$awK(?K_Hunُg 0}X'v;$g[RltwHyWXk֢>ě`<(>Qъ1M>0E(Aq JPIF68To@FhIg#)Ł(Aq JP9i9b+SY(EYٰ- vY-8~&]Q ZR-4!ӿWzBNO ߰8=(~R{uŹ瑩X:SBOrO* =yM͊T d .FT=_6Ui$>փ'8ZzͿ\X#_#<?!7[A-Ł(Aq JPtArifIJ ?JhtROpBměE!{69Vd"M~RFWUgrDҟ[`t.qOCJ,bDHjCYM5MH$c6^K=b'0 tA$: Jr JPŁ(AgD F%1o!JC(,Ł(1Xs߯.}rPW"2) Ya v>YB)$Jq1  `dJeG<Iνg&BĆa@G! {-9Yk?M(6~0)a1aIӉCjymn[5EPk9vC}!C7Z tH[D- h )H9<= :5^. z!JVVk-71g(<p:W\ngZG5+_@ _:2ιiwIY=]"|irom]Yp\A>Iz&~_Vle25qf Y*&zx߁Y x6c4 Gg-[ *.?TVB`ed`^ˁ!k䪁@㐼͐B IfD2ilЛ`fe|3'3P;#P{@(nhpl2L٧!ԧ1 ԄTX}3~% jQ>^zo15*juW}B>t('۠eб.l4K,e ~+*,XJrL0 孖;=K$B>=l5bM\ 7&Ui, {kOߔA.T] `=$ &Qz [|ى'VXqAjtM}$.ӯ& _gn!W]2gmז~IX[T {uʰVC|=twh;fj^BZ~o8d&ZU ˞ꧪ2QF1!+`5CzZЯDxr ʨV+ eKz~{roI>}ᰫCsد xBE)= /JO0Upq鵛VU$!ԸssGnVU;pQ@8%(Aˁ(Aq Jǚ,8\z1@{T#oo[y_c{;هº)dZM5$9Oj[i9n0;N'[!biy3X^=bz!`yTT ̣:yrN\Δy֍'𽐅(1<.\ASМa(SѫڇMId V;,1wfwD"$v,ӜMgĖTdW*𷸪^EKq`bGx׆;L6F2vH6Y9Ϡ>NO2(lUf,` ]Zqm}q]B鯅Ջ J,7y$dU&߀W=<5a'unH,^0}"ge.~&zTM㲫ojA{L-j$P/Cxj;YM.[c[WIf$ >`;v<1a1 V0t`7|1")lV 8+(AgD ZD Q"1g `c;1gaN!YSh6ryvvvppPSx&೩y;Kkl&5@ /PP#l{ٞwx= ]y'{"ݥRPYUKOXJ-#sD sssqy @bzNj5zWP͈0ZArYA?DDSρh@q JJ[jzqPeo{bd- mPe:LŨA@MH*RִnES(*"vH&0Ǵl7,bŠ,] Z: UA֞r,`vhCg@)HL6`Wm# lmҒAiusX/]BeGª"!kO(;_!|Z+j;+Czx6!B6ޡ۳ñ ho2y^ e:_!B2:!X*ö7lIN_#R 5XxMR:8Zi9@Pu$QE%OJBEwLPM_GzSyS ߜ$RU˟?1-HOd1I ^=tvus]4fſiq S[+D(Y(Prg,iYhJK >t`¬HBHsP)Mb9GG.Pryq mݖvNxyXġIENDB`analog-6.0/how-to/startwin/zip.content.003.png0000644000175000017500000010604610161303533021312 0ustar sret1sret100000000000000PNG  IHDR?tIME/RB-< pHYs B4gAMA aIDATxw۶ǹJ"Zr"M&mty=yg~i3oٓ6˵,kȶ,Q[H./@B~*ˊ,IH$D R%3HkS}Y a>鴗EDi(zq8%Iq]cjIHzv='Ξ>%KQI1Y'8SWmX)'8Tm#dX*O@dc_GH-Vr;v2A'~S_ *8%ڙK4`9Qtd)]Ӓ 1^%.˚:bp(gdkrrnvp,a;nw@FJSatwá8ViےiOT2"NT2ٝ<.V~/38>QDvD몙WܨܸQA_$t4 ]g]VkcæWUErc ]:asu{lVrl=( [(k3{}Yu>+E/"*Jul?7!H+jJ++xcw]EvlMK墢ٌS(zQW*&*/BDZZf u0[n+rog/j>nR6l.ofѲVɀxlm 7b#ٌH$y ˛*fP{mUF}Nz{l\*u-T\ LPDz]jC9r?|PH?G7hV97?Zmśm|RۇrrUcoc!pa-ȁC}BKenl~ǟ]:H$)( 8b7Xr_~"˞BaF \1VGO˵jmo߲\8qחK<!Y^LX*Xjܳ|ah{ &"""2tDJhk۶$ؕ:\*c޹OpRcܹ\p[m+! 8n/$op}} fݛ˿>B^lcT1-C+L ~ f]I$ [*66,m7ͽi޽s W+9\۔Zɿ_|-0?!vݡ6 R6-rQJX 9c[lȶ[~͏kEX{.Ⱓk*`#IH$啮p p TO#5nn0^M&P[o߽mvYwn.3G;n xB,cΨ zg׻R2>X3b "čD/Itysَiqb ?whTVݢs+kXU51䤆[DHTfiaNw;?D1 E[?jG ,?dO"H]+:di,=x_mܓx[|02bH wsO-*; HOp3GUOҳO:3CsD"]ԝ#$;:$\l}}}U*YJ[)NvJB \"P '>蜔x"vcgZ72У_}|@Y%@v}$,>ߺ{s?sD"].qF.s}/DUZ= z^F"ljW/ki26ڶ](9|ppĈx<~߾~$:-/-h}q,$HHajg3$EƍҝNlsj-}s[r<%CF!{zuB%V?άR}~ǬYD`~sEyvCpGýEዮ$VT*2p|Ğb55;;Q#{GGk0P #5N>Jx. ^2uݞ%S$tQe^o E?dln鐱 5O:1 L87T&1M6E[Yi1rxyapmfEӶ {ЦiI&lAb1g1p8My38ZHDJE͛QyNHERq&a!i//+j6KɔsnjEP0 .&-0mvXzJ}94 (tcլ"'ƀ@ήe;hY2؅D"I-EQ$VF'/~snjEDJ<8Ұ718;xwv^,#, /&o<oԞxj z7D^q$b 7#AP.c6ו`ʹcFL"JbmL<=^EkqHawWJ8ԁxT*qt٬[4Ɓe֭ۥRiiikJ"]g[]pDSxWz O#Q@B%DOL#Xӏb-|fhg\9A?ĈiiܱCǡP)8< 3Un #g9#R=pp_ƗW.{p5 ,b{"iLE3kOW 8;HJHi{.@JǑ9wx&Jo3=)]،OV4c]x0Cp䜈ko7ӧϾڸ"MJ!oF=~hvݔs3^ T]yrF@yoo{4ǏjK|aϞ={[֓'O:߿s= ((FPwHYOG` 1kQ@_hkwQ^A-EݶRU3]݌Ik NG] \ Qb3ۍxX֪՗^o|y/=Abj*n~a58L~|vACx:{ͣGt|gX }%T~$AR7bPuQ؋X[~$$3 *],%X lGWoGa_IMqpAgl J!>bOuPR $F!Yl$TŁD8 Q>jEqae=ytaMd!v.Ĭͽ=۶ Y@T54,r^uEϯ_t~)}+c݈^7׌f+џZ8Qd\t:mz|VcK!1؀1C֛UIao|\ 8 6h$H>R{,` Z=ݣOsk~}{{kWGeڭ=f~䥔=XȎXB[__~: V&+PGe NP*Ċ@2C`!)t-1/ a2skk w;!}yyeeeQ 4`((϶76h{zj2AzŰp}2 ex<|qY9S jļzebPq'O׽'O bHsok;?w-9 s^oM#a0)qe-ٜ 9NyAt-(HXW}f|A$UIyZ~7$央Q׷~+I'6B|F]Ţ^Q ʉQP 05Sˎ-[QWˆH&Cȵ\OgŕMmxE/7Un5+t͠70LM͌O~LKz{?U={<٭m4;;tDǰ?>q:$YG08`$"3A !i0"~@$n1>bH@~*`!y%ߥpfH چ8_:+!ϯFHɬިuv-}뮝B0JwE6fv5kjS?9SxTb7]Mvyן[jz"nI{tUFH4k }(ٺglq?L)PX]ä=\˯@RJUHqKM`&'ŅL&z޳A[P^70k7bjUK\5j?7z]j3 JԽܕc?g˟O3z̈́_᮫n㶻ՓyBOvHжm8 -$k Vi; }2>T.KDVv4,-D=RP ՞j\HASr1:wAbp7 n\U8_\}de҄>5~Usjx\u-; %Od%~<62<Ovɼb'BM͛7I)Ejn`&tHp?FeQ eRQ$tbXDL <ե[p[µG|G?Xp7!P-޹ӧKK_Lc捱Z-k.eTyXz5S:~{q^ 62ȯ ;? _,bVrB_(Qs4:Qƙ4'L?%J4Q6m\aP*/Go#Fo+ȌF 9~(`"48-o^}iuSP0L

%VqǝyC;5:]{*skO5pckυ iod:SY v>Ak۶FK0gI_]]1}-<;?>5M3c0q^.D]n78TbTwʖ],Jb|DAړ!}J;&؆4$`m+~핈4'-Ȃ.ʄ8/%>PT*6b!Ӿ'իn%7ÙrC HaII?cB *Nն`x3Cׇ8!z%Qjxp)CJ-S&3s~<3qss3++k(X_% !OOOv_|EZ/ShO'Ht n+ZӇG4MBEPP8KbX|!觺 1GhAP;duTBjx4MixN) J>|LѶ84Aڝ۷/^gDڳ2 @ܘXѡZy…1=aD7;-!)U*Lj%!p7mACܶdgPp3E;vD8?~,Ef˗. Љ5Ÿ:z.+E2vBc т8Ɖ|n\NzNj%Fv:rzOZ"hq"R|&KTGAЖe e֏m0&]fGAbT pW+ ';fLuc}h" XT%s >M&=?Yg2<8&9}gX,\ )Hoq-׉ol) 9_|b]—Ŏ`]ٝ!i>I/,X`b3͎eX=!PyL8 iop2  bq1_zW)i|}}CoA䅑ssC$U-}U5x,<ᘆ~]Ez>:%wj!naf bae"k% bb6+i} LNlaM[ EP%rUlm<}׍~yl8n:Z;_*xq_-7`x~V(_|x+ n$ $Oġ`I"w #=6Wu6X2-)TJ5#ߤ T62aOJ#b/!kW:i^cOƟǰ@ܡA4S3 ^;iMYbKYhnYL.LQ8E;^<>k:Ldض[0nvz ӑr% =B~,r#fyvDinS0LҢ߉hP}Qpye1;wmlh%z8:;"=zIHFnו 7p9ĥ ttt*zx́'6yULУMf_Et)e.10.Sp;3{i2VAu!\ݣ<~BhW1==1;;n/7*y`ãÖ~nұ\o^nq čAN!=NtKeҩAN 74R˄kCX䎲^|u-2_YY[XG .C/ys5n(3=8#xxmlO&Iٿ xzj}{_YcX]CNAh c, Ka"j)yQ$w͑ۘШRѶdق)scwt3Y[d j1& ]+ze9s~ҟ{#Sh/Q;N x;nbmjdao1;C8A!( shQR.se\]]C)ȣa 9_ (t1?qswLy|? x$5ִ-ڬr@N -\<zy^ Tg^ @eFo%nޫhXJZI."7MU k.!Kk!(K?m O'>pR=wGb5?]l\h2_e0ީ2Խq&y(d+aο<ϷoܨtpVNlyuM3 rk QWv%ndY6od }"|KUPQblpH\w"7pɁ u*[jqR"V:QR&+:v\rWD48MK6i E$X$kmR[ ~mfK dO?@9YkK5ѳVRAUD]IpNinl)1zWZ%:lXzٗ5r"Z<6o(2oon2ce/Z IV$*zoѻjkxmU((\8KfC?\Bhgx".C&n8)*_ *"n E  .T2pHA.*w?3O0tMK4oVw*y^(tCH$RTLqXM8>qe3WWօD4D<+L ~Sq fDDTr#gK×#^y~ũ׹ L4iF4]b^X{OOHZ' Snq܊Íy? RIk7'f$HS) ȏ8Huxh?a6H$xVr׹[n{\o~9 ai3-iqM?`[>;6.,RPrb,#Hpω/;Q@"dtt!1v wFK}<.fDz9 'nv\yr,%Am9'ֆ$`6L&JA*N,v«Ko+AW@a6%ŁG)/]6dFFF/쌍sr!*XVm+SiDbs w>vw'D%禮Ld{yuP>4t1=p-.=Вv#YUR$J7~*萵#3^#$+W^oB^c!uﶶ'&LHT!G6 NIZ]xJ>M3G R`%*.t:IkX,f) L8GWż"U<J4ǩR|Bg [=1 }6B{sr&hF"lu#^:U8UHaAkONN_ j8noomƅ-T>|'J"!7_:DZ=j\L6,xٻ榱,-Y/Ke;qAx&)gkfwmvQл&4ı,y%wpb`s#]݇bI瞓+H@7=V;&^%,lR8I,v릩V;` ,3E&>8{՞~1sG x,TgM-"3T`M!d,&Dvuh #\#'-V($t'qSSTӜ ?PEF0 3;;!Ҹͅ<߰m Bm6LZO=V-<%c)'Mv5N]t Yѣf_s*/dOLq|x~OZ-H17ˢ0xlD7otڿ%%5=E*%߮-ZnK$FDQ~zB,9|ZjBؠRISs ~uZNgJܢҿ$EZ|Uw`)>`B0Miݐӕ(d*'W#AzRK;vO o0f0oiY>DAwcd0!ж 'Ob%i }uA' s(gVMsz_1`dꯀOt7x#m1AhuL 5gʉ1nVHb/B$_ўhyޗ*PY.IB>4= dTe2r͡T\7FN"`iOw*M m \UHA9lk]5ndwn<(|qSwb,)3{weDFP8t_wiZrw PuSʹ4EV& "BI?B^yT3D4_N9|'C0tOn*\TG^uP՚]Ai$6cɩTdlCJYL<pmYJ ^"tAD#،iEs}/_Ycx/ yչ90| Y!Ɋ 5yd@ەg/eӭLY hKq ;E[R;Dŕ_׫Aڏ??~%`t}'.]hpUg%??GduTUpCnۼjWZ "+v(JV'Mw\걜Ryf˛1EniK dS*MT(R'c ?8(ү+FMvJw i^gU5-Zd5H]Q=̾E6AǠ&2Xb|5Ha-t]%\263Q KlIG~ij~cFT{[h2n[ 9~ Lj,޽~۝B89nbHI)`@JGty;;\Q>A]ЛN #7Őia?a" 6pKyli-( l+ra ]]Q8"nϥpXEN36g7N6( psB]'Iv R\%Tukb8 -EJ,d$rb[k 5-S[6c@4E!Qn[v=2BS3ŐSv OvW$b;ZHg@L0?Bt'|Y!>mu!Yur*uVW[N f@mh?26R#gqq!M{ptء׼Xtnn9z%f..()elMNih8vR:];$q6 u0Ggj z, t"d$Z h׭BQY8K5(srn`ܦJ^) en Z7nA,ڭ&&-ȼڝHcI1Xrc1ȉ1n2wNr2 FQDZj$im8KBC 0AZc!r: LdV, d#՘3>{I ؛uXUJy 7L ҽ;"m5W.]TdtO E&ɗU k J-zԌv@*u`ƙ<ETEA&pYsj 4B~'d .B*" 6RET`Np;7_@zB'x>{9+7LXF_IK}70ʳ+.O ](CO$z~W@ys^_iC@ݠEM,H>ʚAD^rؘ?mZ߼t ]79>. َ-( q2M4xjf=F/.,対 h!< @px1XkccCMikrKaץsHSMHMiO94+KJH~`Ѿ -6yQAц)v !nTEӸco8pE&QVfܥB L3@1+%M\g`(eoFWC ‹S^|9Aɲpi)kE*˲;<8-p|?8{c.J)N O_K+(YtM糒 jٗ{= [ϞR ȖPT}("u'=Ua>߀ה]#yNj~*ZtSpr2 9szvi74l\w/0'SIYDw;f# nj;bt25%n* ddmJ= ٬1 ⲻjhsξg=Vƚw.#:r QmMf@ЧiMgYSq* 2tt"<(1g91m.@^*dJU@wwMq;59\ u;0RҾw> ZOMCoKq~!h%≀M?ygYM&RaАhVV6; \^\X+V%@ C㌖Rirt28fÒ))p4t%v.uWU!hcUʪj] +/je<0fY8;@x|>>qcv'g qq< !4f^0Rw 81ӹ $}.ݷxbʥ'y,}*Ӕ~׊ A6.y?ךmV* iDZZ٪ ~i*2۸G >/n.--3 S&jVr%7_Jm2)Q,@p# 7;zS1)QNT+'iAQQXQenCgO~)8 o)϶fܬnt(D;f5-5]S߬)Jǻ?l^^킽9e4aDSJ%I qY>BY__VjZIk&I$Ix)q 7Nd8Q ^\:{|;7Ei' zf7put7 >i'ĸZQ?ˆ;;?F-Dbtdb13aFvy=Mfs,zG;wXyW!WIbZ޸q 🹺zMRG rpŘk(*78rnAhߐzFd_3) xa4Xj+D`k\)AVJ*RT^v*&!q>rLSլ^wӪ|Xq*%vG͍׾U,fz DG 81o`pT 3,0zrYy4F "fԌrEi =S 0 uuL LQP~`gYݲ`+P)wK@aV\p>Ky(A...QY w3y\_r?bd`DC/\`5<"OUKf}{kKun%Hٿb;ڝCVEB|ϫn^*'mZ=#GHZJλ)H^yt"6[*n-MVo޼`cFRث@իW¬SVesᇵ5JA"K,NI ¨mVsk׮UR%"bq!}um${vEv)>lql+d[g왁|wc`oySH< @>쟑  @݇x7kozv|ǖ̕<#")~7ɜC$ElIuiuWWӧUu~k;N~&" ,8:ne|uΝZ673m;^ă,r^>LbPqGf9lRPdPLRe,9F'!OT ?V8K+KM}y:Zk9! 2B-^`ꯪdS = `^-JBP뀵 Xq"9&wNfšYpVW06Xl"wGLwSnW?,0|յ7 ,*\P\t]ykkPۋ W1eXX)n00+lvovv6 [RM[7e9݌2IVS'YP>=_|'PsEG>F4Ű wNMbg8)FzMZVqe)@Q9:gwl:}^% R=B۷okիa%}Njbp;ŭq$2YR 5e.Xʚ(l*i|(uݻwE9b 4c%й aH.}Q=N8իWPDiPLS3f6LcD 9`dn)'m!AxSAZa GUF,oTALWL*#1 㨸LV쭭ۉ$JJ}WW=pyuuu;G_\ݒd[r0,؂2؈u=c@'O`/q$q&Nq܁ɂSFqs?|R>wn~^V' fu]jk,`ej˽3!U:+.cګos4,.tdIJS.4_˨HH'E&cN"{o' D Vq'(=K{ϲ9(=Itxv"Rx<ݍeh;bqg{{ӶjAW ,X-Jqn{h3,xa*ÛJ&'3)UWv( 9YeJ%WǮ+3>?i0qm7ON~uJ劌b[2, ֎IxE{R^}M'Ɛ*Mm49{HGڪd-;Uzcv޸~]>m8!ytZs\n%֡4#w&)~fؼQCb ge–ն{G\tZư-c,زB`zkf~/], "g7C-NM]!(Z/]p@rb (>Ṕ R^%ʏ+^ݪcG 9eJdY1׭ڶm[@?_znobw8l`X;YpWŖ|F"Zio*}n( 18pN&S7'cO S@Yoqw-ɌSS)>o_)Yp"Ṣ9pZ $Znm=wPK?9 mY[qcwWUp$gW8BZ7OڏezQ?oxLte[:YĄNVɱz\v'ʏ;K?ٽ[n:Dbƶɱ_@WɉfT6ES7j@ɀc0NP8{A*:4W|m%M~%8~La`&kT(?nq#֞|n[gKg~B=G=QKc CD7JDdG{dw?[D۞p`^UHcdy?8 Wʛ~^e I+hq@7' ݍ%S3Skujqooos %Ţ fBx zhxg7l5]-¬7gwV@΋v\kdLP(Ubo;,ۊb9V,QXa3_i@7ȤKEp-X>~Kky.$7oXW 2?6M QI _|w\kdxld:|Av"CaԼs ''EJuW\qC.,,&4%~]27HcBYrw 2_;J]Fnj&a›=:#'XW!*}Kc cS#8}ƭ20_f;;xO+sjH(\ukTJZDŽq鎓AqVG)98j GΏ[[;Hf?)=xgW o*<}ڰB-1>d:dU&Jp9]٥6p@R—/_O> <$ʥ¸[30FQ7eY?9LP3Hp4Ȥz Դ_Ϟ=?{[xLS-ew#H qf<.GZܴ,3Y0Y}ܸ33[ҵ#\7Jkϟ?OtШS-1UJW`j.\=eo\vV{$~K*~MzsRo>hm:[7D17cyt:&Ue h8l`7n>{Ps*d k_5`~r EOp-k_xq'T%|ݐalmdqSibd~NH no[u?,fb쥳B=Fq& weT„|dLS^P6-[B&wg.޹ʛCf76&'W,a8drALrAƺ tft o.Y5O)5ݿU)(npɂx|/JBkɂ`>Xg>s_Ϭ g/Z>l Fq nW)/Xo'\B 'WAc/vнGi]ӯ+^#$w}OɂA,>cp2|(?nP6mooY"sKbPd3Fmk}OɂA N'YBq7͵k~~b/*$k~t!YQOWs!`8ZeVce m0FhWR1pCqWD]-鑊VX킣h͛7rNJ:~1,ŒYhǰ81d邢=*B~} kc)3*$|fa_jKeoARKnOV+MBqe\qCs#!I?n]Qɠ GQڳ6fW01c@VXfIN[K$dC-9#1n}HNK?(ÇmeSgٵ6{YGWdb>$w87BT^V7(!pSQ,H|(?n}MzdNR^gmkG}I n'7lNqĩvB:Տq\q͏`lBG Eۏm߻w+QG}I PH.9 ݭ7#nJ!<{(n} =B0~j % hmP6XD];YqĵFq[ 1jt1W08q)Y{ (?8ďn`8[-j~S\q?n ћnQ>ࠞF3`7|pގ8}Ԧ=`0CD Ɖ+`qS\G",辍Jhh{#NkvA`ӏ'j؋2#TCmK`}QD>$h~;l=@3mEa|06'ևʏODeឞsĸ}!nq";~ܴ~e`1ڞЏSpcQ>``VB:@w-cə!iR}Ͳ7\qӏ -L`Ɨlӏچ{yy(Nw\)KRo'e˖-i=WP?~>!mt76X{f Ca;A%ڒN[zxUA VeM$b''pT:>x{W5܉xTPguǥH$C6";~lHgvQ`흝] ǠP]"oF/`zZ& #Ln Z\BJ揔y\> qٻE-]wo k~v.3wIWn  _|%Li2*h&U/Q.dl6Zq/.\ hSsnS} ɉjuOJ^=B><|+a۷oE\;)CqÌ*aebA7 awl{XhLrVznu%q۶?o\ťPz5wQlz SVʕ(~_78bvffsk;JfYlD-P9z<{(hGl!J~K7|sfB*GLSi܅ z"b[U9 G(ݖf4Kpwf.)Oǔ $b@y \L2*eP Es)RNvel" E,QV\7?, ԥy4)8q="'~܂7`=DZz8PQ>`q4|g}F.2;˻dri}!4E+,:WV[_}].⼙L{$D _WyǷoac\f$㠏vK4.U%X.)$w _7+>θpS'EPF^۝~s&qIYLONj FqCyկ~_Bi剉3ͬB[jdğ璵Id2 bڔ[j]ihOJq t)<s_V V@Fr7  N&S$KT- {c8XXFidk*?dT79Q(mcR-Aռ >[p }1dzTN9^Q Ɓsت'O*cDyG  ۪S;w+ XNMO}B& e;\ɢb@op1J:jŧw?U#>EIUU]bϒ`U얤l*=m$Kj`te TŋK@hF3VLtlºuTmUǀO4IFU{Ui xur~mw@``=SCD@ԏ{?gMVQ>`ʐ_}~V CrNH <}# D0Fp9 h]~0 CrP,a-[-9U'$NPn>@. 6uDⷱXBŸ˖UF㮹BT MN~^]]Hmfy!'.҇ۗ%MVFqZv3_ws8?L,9)P씨ᰥ}xԞ!zv'dy T <8ϳW:یlj(R }0Z+BX,愛3w+ɀzOiif G8RXۛ64鎨uWxh@뺒-=m>KTs5tzx|?n2ٹ͕3_t>S9w[AެW$o ZIFlRMNK} YJ~cL҆;ډDL}r7~s~g ZpEeƳo} ;P~D+<Ț}{Q{d3NÌ*Pv9޵޽MQPi凉dr2 NJLl d39J F=Ou%v S$]ipW"0~y]auuzȦH&Q>`v}l6MtXoLH0mGQommMQ$ * mEKuSI.YO[ek{bFוշdul(-:x*M]:Y;Py j&Q٭6}H\qCǭ m܌30ݱ<ۦ}>Ç1B9Ng6z-6SɬCnfZfEx4djH:(6e2lnmLcuٰ+/X2_=3r2[ko.s%wKׅzt8V%4}X_q`qD+7豃$hJrzdI}@0կ~ױ_BXxq835(o}cB2{[o~ ulyYQIρAiJlour-,/K2@Be)~p!evfF\_a$'ҏCEnhqpwX.;[*oʶZZ~ܵh5Lq 2Msrk?r};p, }J/bn\zvI0puq@j^Z{5Pl6'Cޅfߦ+:uC.8*%+!Y^Yu227DC/Ż_db8|~J#vɶc0 ǝNrc#鰊gXMQ|N7zq[<}IyKRq<{A`g)l "i Yf=' ܎,,\v*!o(3jr<([Q`7or> <?`K+w6\^?`b>`l)C}sA_~;wLMMcшwPxmG^o03-cܒ76R) `>CֆdvT\EhےZ9D6+Sٙ,<ՋS0Bop.p1Bu3F. pMReF3o,-]ǣt+q댑mܢPan+cўUv9 WӁE+es矯|Wulz#.a OV]ͼ^Qbrƍk\$#X_fr`7'%N$Vac LN,%4=N!n24a|?Us`xuI\j|r\ T*11QkjXmv [ ^W[W^p0:}ʲ^TڜkoIrN9rM9T fZΝO!B/^xjۺ^6S(l#+'%Xl ű쓈N'3dr?XqKϿ:+g;N"b;B=ˍF];LO 5{ W 2ꭆb׌ Y ÔzdgjלD-m%=:͞F`pEUQ=$dzm8OW- lS8kŏ{k9N[Vy[ۤDzY*QZG#O (ߏ{P8kPǏIMx>8ٳgENիWˢgQ>.3' S؅k.]F6n]-](%DL/Ox, >8??Nk<=zDU }!nq"O?nnS)h9p[CK,w8ȶz63%*E8*(n``ُ[>v֗/_859( !2$he|4~.:WWW5q3Hjܼy\F7!i7*~ܡB]o TjmzhW,6Kno( l&gxt^#Fqo~{l ?n͛TݺZrCs;;6by]voBs_ZYIg|UAsh"bXy,=(npPɯv?gov`UH]%ܻwOHw%7ǟp;OJ Eyԯ3a#Ѕ z9Dx{\4}ǸiT2.>IǭOQzZm흀i-Z¹O=>VFXsWG>K ^6CM{,cq's&*bT4 GLm z#5+r~܄)wտT:s[z h縓e&$4uIޔOM˶DȌN%n>$kCJc4n[vmz灭_w3Զe/&wk.NbҢ[L~{{?ʴm9UtEʏᰅ$2ܶ#mPȪToߕJ3 '1ahB%dmҰXvj#A?u8]p=ЁG=v'-'ICBgU ⓞN5ڤR!Ǯ}p]?fyp֘Q@&*Po뺵zM4#v>a8MF`pOG=od >^ǭSϳ/qȤHAN/ ry7\d )W*Aq8YN-&Te_Jw?۶PrΪeNgm6ϒm7WcƉ@hwBc[ڶP>cɩ7^oIʵA?vqMv#]wP)2lVs׶P,f3m&f&<,c1$p,7tw"~t \k "O?nmJz6Kn6g IzhnoTcݽu2bĭ#-Ѩm['둊Zw߮oqU6K{˟vCwW>qSnmAS qS %7D ,Z\׆cQ,N̽{ zp _ `,9ןA vfy!ʠIsρ?}KED"0߃7ggւ-Fq!/\o/ꯨ w@8?kYqwVQ2}[Cbn|uN? ?#+(ѣW>~,^̮֟؟s,ii|fm@#2r''MJu5ֱ%8QN>pAo\qC|㮴҉O]NLL4B}Oh5V@2ɓ'4Ny'P-x&쥤r'ӃJWvr*(|KpWa'"nna۠'_~dCf4C딢mu&h͒݌ڽS84(m~X\aWjg(\CrwBrw6;IqS~Ę w+nYݻwuX)C>I=-zeBz*"Œ0cnCAa/<=D}OʽR[fYQocX1B֢[6WqaJR0 },Cfw"&)s ]XytZAeݍLf<U<~^nb(dvWhlꌜ_V\9U6bT.Pn݃^]ӏ+܊^qjjd nDk(׌K0oW#omMz|uI⣭l(r&6tv|Td3;zͭvww3HOFHܐ.6>~nR)zvU +-w7멩TRFefggZ*9#-G$idzݮTXg ^ᐺh.Cr|>KD8- J .[a+,5uV渌HV͚so߮j~١a\ j[/FEdmιbd@wN@nhe(r/PU*8ۑHP|6 g%%f>Uesُ>hwgsz:si=q& ݭmnaZ}nvTl;ĠW!/тW~iDž e / - Ne}k-eUķJJvvv/b IJ^j|lW$P_f&6qѽX9nׯ_Xq刚1 0\ ;({u ~X~[Ԥm!ղ|UAJB9 \z.=vn[BqLI/q7ݷ.FgBzt3oiFgGHA؞7[rJ|wRTZ[w|sk>Uj>\Sq {a9jT[PKKׄ;Vc`^|O_>z… /^Kx䞛v}Ͷ?wo"ռ5Xk_+^e/WoRK)_Po/e/]v_X om?m'g.G ;Lf Q<ͪ9ͪsz=[[`jϒħ@U oi|c~- r9۶z`词_Q2L٭cxoX'eYOW85mj@QϦZIXmŸX6Tpz[p z[8KQ}q0/PxjXr"wmV%gtm*Zw̔x vom*~se2E.+yj[a_$$ W8D '֝<ŧw?aqzD:Q,|Ѐ|X΢&%rm8v?j+YRIzjGr61P=rm W@X 2TaTrifsR;IuĶ͐t@68x_(:ӂ-W3lnQfjDk:Ymu.Z#cW/?Q%_7 L$PMOZ/ՐٝGM$S>;#JL8 Mf^{^/Ɲ]V% MI(fdܜ(} WEBYd:;3iQ$K!v:C-۰Do߾Ÿ433EfxOt(Gn BulOwI@@et`\`628v_ϹNU<] jn _X N4 `Rr .T%m<'L?e !jxHu8j}B PS1].]ob' n:hFuivyHj8#KOٙmlD%S.1Jmu*NYUջ5rшeCvmgr[yW WW&ȊIfwB!P(Ew?fBTC/}wbr_RnJAZPɻӣo_v*R3zMp@54CrpH&@L b|rm'҇mmP/ rtcut^ s?5Oh=t{:a8@Z;7;+^Ewv_]tiH/Z}ūg&3u2fvwdBڹ\kWff>" \V,~ǁ7#RgNz,qtdTrө| 7B1*֓-VKL2#ڭs3E:)x1NT]mM’'U,kN_ƯuZ$va4H}r],:/7 M,fgfpn5D/l}ay_P-Dr9A3OV B#$n FT+ZG$*}8ʼnGXd޾Y ݿ\쒳q[Gz?UƢW>B4L77j.ց_z$*.'>>ٗQ"D=$ RD!RESP[m!642Q_52dtS}8ʼnCd;Ú/U=<>h$}bYVbxڱX̄tjH"pJ$%q#D|!+ M.>{/25|}x0D6??l!8Ag ! m)Z`sGKZQ;~>u cP!k*6 5p#Ţ x-s _#-^mqq3ƝR!Od۠/EH 7.ӌnl;L(nAp!2vx"8Ib^x cYvL͆ ƍެ-1q(n` ֶ0cZq[J5m\V8d2xZ{\4у qѵZ-X[k9/z#!:X;ns(lZ-J/qn3000*lTs7TsuhmKV+Sicö=f```?@u9eT\XR-lW3<4Y6wTKAp!Y^wk bJIENDB`analog-6.0/how-to/startwin/zip.content.004.png0000644000175000017500000010372010161303533021307 0ustar sret1sret100000000000000PNG  IHDR;$tIME99al pHYs  ~gAMA a_IDATxsGz0-P")LknT%Gj|f\H.G>$YW")"$D8C)?ãAO;3->$b@A\T u] DQpGQ # F*PmM/p7 -gS߿=LN4oHϳI&;*Qdf4,{m/;};O{,fn)bDLͨhsѫ;( r)0\<*ݎbhS}Ymp>鴧Ex]J%9uȳl[( ^ςjXiHr>p(q5ȲKk:&Oi8Lk.J\3ZFDfR} BEڥ[BAt?D6r,:6f4nirsKniF2)_P1熆DT V|hr8ᵛ-vڝIqNꚘ蜈ϞY|C&j)E*oC:\-&;;/V4wit)?@tJv0'-Lr%$rbMВ6"x!VԺ(*,+0Av~q]1,rZu:w.VP}?lu`A;O$?  uJ[2큊N3Mjv*Zi0\vn{2s un*J\T.yիոˇyiYU5MU٥vrݪ,)o.]VA^ zcɨJA^YUUƼ˶"Kw3jR[y-MQy ABUrYj ++m9ev;=IL%u]pEI{wwPtЭTt\-˄вhyUzv[oѪs`V=$r\^a펡2NVco A49[ E2\3T{mUvFӗwvt 슢y; KJ:. oU =;tn o(CΛ'y=Տ(oi; f5?+˥;bK{ݽ$>/ϰ_CC}<^Ke;^cA5{AD"X BsLrk%QtI 1k.*?xb\^k"~ :l_{ WKo޺mE RE7 ؏c)M5.q{A\N RisRju 0\`#[aiKjx)J/z#[sxm7Lq ֗BĮ[ OkxUjAI>-hvB+9TD߃Fc-qQMPHy ./2gYm/\sQ G*hh4Mfp!-U OAUO~^sg i޸̌v$4{an9Sm8ݽ.wlfrTPx8H|8IE1-KQu )|&~Stv󋓘Y_[EaUVxn!.{\pA9J E9H<*L~08&{ Jt j>N >'8E#yO!~2Cy 3ͅoiTI+d0<_Q'JY?`3[sA|@]5NbCWyW o޼1Qo ȕR<-Bja>݇'"4zRfZչs!FMO ~~s3!e!흶:@%[ח O8I" C?۵,ɶAv/"YfҊζ8dwFz0*3m4MP,-3q):܀{d77W3W{nԁ6⾀G}ȏ3sE' Dg;B}؂87v{Z,]X:a]۱6ZyqM&R7x!J;ELx8g͒'\ VA^GHwͣ]jqypݰݶwJ%m&ܬw܋[`w TA+:qH 9=Jp8 ˼7Le{AE4煢:2}x+"2(3pqq(܊"i9VѺXדkǺ&ZzȖX1Tue5^s`j0tW!];w{]/RP4]R[R![屭B&@ A)$:>S @)L0D1[EQ9q,!IaVPL?&ܰr_RL6rSgS3٪9HvR:mg8Z-Lsl#ꍲ3Y6xJt]*\΍ow <g_ ˜~ό6~~>suN(*,8 d;2q˒$(6Ul 1ᖦEAn K 7A% AMq &d(Ӈ 8oe8-zsfL4>)Aնl7ՙLf6nEQf?( $A|kC>zFM(Z-3'Bv(՗wdE#*L KP퍍[иCx?zowv޼~u]0*R_E2A|ൡL@wh4ṮeI2b q?lu8A|d2]ᵡk<ϝ>±,6NR,+BILӏR%A\00:KIՋmqlL}EϴL;dBh>A\~jw;n,)CuX53#4sќ,:9 yʔB! p#6jU]67os?:񳵚is\R># 1BWVxRk0|G/[__ELVZ׎ZYb!r9!|ޫ#ϲVR)M/ϙeAo5QLQk7t|/Ģ_Xڹ˴=Y'!8'b+KER%|'Oew_],qY7!&(ċ_D矵76n\An!' A6/Ȧ`) /E(jdv[h' Ių}?B$IŒ(\V Ojeu|Rhaj%n%q.\Ւ:!L sћ@\tdI$! Qĵ_̟iaA`N*2|O`dCu89VE}h4v ąFV\6EIfT=:ڪi«;+0P,/8ˆ[e'-x#v*K$_]7 \b`JʰQvYG7+3X~9vvwb`Ob <0.Hֱvۏ8?Y>8`=ϋ¤$u~wX&s% x.Fqc\ !dz^ +g 23FիGNK@'pTU CiBx׎Gj4JpPmtAYR$i"U7,zܻwoћ@̕ڦы۟G׾>`:h;~!1SO>,yቑkFx ?zؿ}a#"bo6nb?iB!б*Weǟi9]i QN9ь ǽ<vڢ 1W|υ^$I ydӲDQeX 6vm+v=Rk9| ~ b#ЙY4of3u]u҇0X0_SPJ%';>Y]]]1 ) ^W)g{<$F]U_,B'ĄM72ߗ:DPdZ)=]ϠLJzvل^?xۍnw^}f2hW_1`m;،0 AK$_EZtd(%7g;vy]8Ԅ<whatjߒMO4?t~_ [ /?ߕkKt#U[C!vZ|A D?vr=/ "W*$_:yzOJdLUy =J29#|~@Hvt-8nW^oQ]pgՂ(B5[b[tՍ 7>f}muݭw/'r^$ӦJH bnQ[lxC+rﲪF_]QntR52x}Mk#RP$+=n׶[O~}_ ?_to\>z|W_~X[[ M{`$":E/N|R᩿"29Ck_#?aFzkߴR{Mu9h^k_ҔǿT^VW@mEK'?*{Wz[,6$e3dvi&S~1|ۿ|ۉ%’(御'=1DŽx[RC{Zj][sHvq!u<֒ז,{,O8U[[[*i_*J1ySG!I7Sחe,{$ےl]u)JDQ,CT ?K+1$n&Bt̥vV]j\G^)FpZɭvUӽ~kLƙeݯj^;l?l-Ol0tE'?}6={>E?xG{:LA|q*?k< ttHm^`+ (Vlɕںuh,6>RjjS;3Щ1;ՕT-Eyx7߹{|ܩ=pDrH(|k[tRu"+8,@9]gGkHb=L [_KY1C*-?MV0TrpnԁS#PU4$`[p.8DD4#sF >lM\[2p^}ޠOgvE˂{5Z72;7HαZ$UBթv \s_&&$CZNiZ3[ k,+.)̣'Oq 8:ireիcَf>n=AZf5==6G#p460UdzI6X[Są"NI[[V;6qzYfp-bEƅKŵu|ɶPPrea7]?{GNOOmos3JYDB־ 3"E]^= !k! g]{djiV+ @m ,G^8.>`$Ge/Q tÄ[L`ph憏BeyO'*s9Y/À[s75!ky`6]"hq~R|$OT0>>`d 6 `{ȶ{>Pq@ U0s835UBg{q> TEQJBU2 #\p.Ofd2]$7@֖dmp0˩6-e:h ,Wl/T.T˃<$mul=77ϋ $8MV[Ԡr*F7W*۷(B\ƥi|r91 7!! Ea$n\F5A!%EO{ \q dJr0 'еDv wc9 cJ-B瑼4Dؙ ^Tbtf +ϡŤ\_ h-bÉc8TG*8 GdXU&8ŧ@_?'s9+A SThWI*El8q Mjko+[B_~cӶ4]d۵?{Uhf'㘊PQl@.X;nzHDmGl`Q<Ɩ23Xr-[;,I,Sp02HKڦ666Y $>^NG޸6U#- 8ŝ8$n0@wÂ/,Nߝ0oKf3EVXXK4XiŖ_-wnοx C\Z[_Dz0EdEi4o9p壆``S]3 DlI*K.,3IAb2qx2@`ǖli +9+/0k{̓GORSh ;0f񄷰0$]XnhUgmmljGO ֕B2,߽~]796 lh˧(]eFD^Q&mJ,P/n\&wW^/.^E v*~}:" E軳=8w⩩(UY |XknnIRp xnv TӃ'a5j/qdY{2%E6kn9JT.6 Q=977q~v [HB^aq#݌OLD-O$a [l͸|ѻ,'O,o,$,*<Ţ;NSFGQ6$VSL?tf9b5*''p>T aJrqN6;e>Sp_]}RƖe9 &t{zũ_Xq琵q B; ;r뱚^1d @Ng煅yrMxB=~!Tg߫rGYQ'íjGc2 0lҬreޑHWbDmiM溆'=718D09D^aq,V%,:;*d00͌q6,DQSpOMihq'`^VdgxRPx `K򛵷}9ФO: 6/p[jh b;$UF~c;0(d| 5J[&^[C~[t7YA pܖkyő4>AAAA$R D  zQ)@藸YTU9Nzs~$Uz6MɊ֤ch/''nl,~j5{O5-i]O {3X{scq0SzQ)T( 絣@hCptev X[J SnqܪÜyh=` FGYSJ@2VEbbw'ٜ$wl? 0t-# \4ܞڻ{xu8kM3'euŞQiTЋ"_1Ӛ崬OC? OaCbA7I$ *V>:a )^᱿C^)4 .Q^J|y޲p?~<]1U~ 5 nYpwg'NZpDv\Y,VGX? tci"Te Tw:.X\$)rZcκ΅i%+,|kf+G|> :UT.wP#?<.=Ͻڱv$~&-iL1_}Ժ}̚Z#5]񺸵/&e0Ь>TBlH `nn>|V%&OAJ<.[o ʈ+L%g I';mi:Nlgg'yީ͸>G[ /opcp&n;Ơ^j,i=@{pm$]%F_uj|!x3l^KQY:cP' **ضBtf޽{9W(&HZ, |[e,0찷ShaKuW.۹;adprWM^5)L& G,-n$.17Vў$)QT*oW@ޡ3v)~öJE-sOP 80IHF݁q!;>0QX5@jEEgZ6lI"AbŶ;Reody>el[( Hܾb&)GdR 4Oܾ}.*)_O+q>3A:%UYFySםX+&G:wIMTl(N s<>W%2Tdowѐƛ,P?r "hV &.*U; 8jU*CVJnXlA^-WfОv `Cprl:{6Ɲ*']OK;tm,9ࠥ#jI_>/P$NGx7eIKjĵÇbܳ&Ũax7aF e]]]6.]1ū 6#>/q'DB. Qq*&jo|~7=|5wUDe;܇͖˕-..0,SRAε+ X;c<xnpg/gZ΃z+É |SY> >8/.3q}u&]eC@m\ Wiq]Nώ<jq"˗|Ϳ}+'on~ZY-< :dvbu5YFNJ6y#jGI"q(EYZ._)jLbH@ʠU Eea8 "72%%L qSr5 I:ϫ*Oøu<3!4{-^qB-<ΆfX6+$%v+ U$s^k#Ẋ)nhlCsNx"P68r=7A_Оm@q3 k g? >}~089nrکLIz|0dVt;;Q}ɖJ7^n!oÑ@C=# 6Zp<tﷅ ì Inw@ǎ-[ܜ V/7s\vS xkR^h U'dҙ!PI*?Nx9.Rʆ"|&ψq>Rk'2Jlс8atkR{ U4RQVlt˾%=㧻2Ͻ8#/!QF$! t~F@9Ct)]4%4>o%ۨi6tD.% 9KwvwpHeN8/cës)&>?a7!aJ);Q,z` NنER7MJEdݲYZv5{RgqduMf*^ݠc4j Zd^E4Mgu!ud)ѥzY~>agƸ)J1n^9݋ۢ?v-{R/(M^Lݥ_L˼+N0II`č1f6.duՠԓu4xfɗFGМ2?U`mm /"8ss?qZҝ7к fxٝ(ӻ jh|48` ݛ(F}5''!^Mn5I\[R|Y2RZ#A2(+2E\S"E$;A!H4qzW3vxCK}䆚糷0nyM@T -U4P0L]ߋ̒׹%EW 쐧;z{֛~/^8T+s 0 GP#tFXX1@̟ZK }AWAݽ=87|A_Ѓʩ 縎샣s3DVmmF~[7ZrH0/0&+#jL_;R~p!_ vM$?qizO4-1hr>q?h_EL2yVN|~Oø;Z-PqM zP8[n{WF,Oø3Z]r18+Z\? o ,^l3vscMхB9쥾hl8_cp'8<ٶ3TY/$EtMgk^Bۀ\ߡ,psIPdB'~Ua>n!;{zGv?zb~b9x)T:.]b@)bf+MbY5\֞?}#HfƩ,2%_87w^Z{ڷ.l!svU%`! qOk^ zyq8Q{"{jﷺ,;sꩠ@ׯ}hHij66]ђ j Z%lURs7MH83Sz.]f,u8d5<1$EaG1CO6:N8fiZ2́nXVXcF6\n.-9Ff C!uRiƲs`Pt SǭWx'> B}V[f*Z(?=x7L7ʲm-KT֝OHc7QmHhR9(mcF@jwa~>hol!@5܌}^~_6Ig#xý3ʨE;Y%I D3I(2J%ۭ{:F8*Ro̦47nnŋv˝Ȳ:XUMWpK޾}SyK A~hH ݿb`+o"!%b S3AqnnrdGvA*I<2F [փ`n~ -@˖J>p]=Rct9G/)p͆f#ח._8p04sRl^8>fvXޥOЂIvx ̤vq-)4YNbgqَ1G]U*yb^]vKu=#Du,kXDQxGQ{oo(E|P8m-X+RUw%7?wi5)zR #A~{'},xjsĸkwwv~(0|\4LW^C*gF;$ɴ7PX@?~xuu:L7n6%E[/_=T%V\~(}Ti$ktlZFTU) vZ._ˣFFx@ś@VjUhR@^V"vL, }>|OUhovj:%e,2 5^Oĸ<<'b,\Ztdϋـڔ·gi6P_i5]|;ɂnxI<1Y[/_\esO>c;o bKP٘sǸY Itd7BBb>vdJeFZ&ǽɋɂABEot)+%kkZkLܾ Hέ[46;6P{~xW :GQ{)6° v}vd%۷eMaS#IYf+bY\D, @|Nΐ1֪䬯!(׸\p@QsG)1p#;Upۅ4-el)< 69~dSL*ebYe@t_ot@֦}D;i`X`x }!.PDy,L&<t3HOdq*y 57ok6- *DYbbimɶlljLɹw][5u[ug-v2I -$@HF$>l"q0jj~#oMfti~B@ɂ{Of@wD*gW8,-'GZ2 hn ` ɂ |p`[:YĄNVɱgB0x[,T6E*9#2&8B R脓333\FuK4|F~s7Y͛7+9!nq"䊛oQq0da*nljuvۺ [<Ϗ]GTxdy?0m0N_qLD"2 3sڽrߏ{-D۞p`^vUHcdy?׸wʟu^"vŲ8Ww 䊛ֆƒ5qooos %Ţ fBx9zhxg7l5}-¬7gV@ޛv^k\dLPUeu`;"N$dّx, 8_+nAgӞ+pF~ܴs"b/ií`3,M)l޽b}->} X_*TJV͛վO\"$ c,le'mΥyNOVLM B!PLJpt@RBVc[01/u=!0 o `yXx4rׯ3ާ&7nyԕ,])K ʡekJest.`ٍɅA7 0dW_lmn9#?nɐڏ[p˳{ o'=vQɂ$vRMw"'"B|,XtLZ~Y!+2L/~\^nK^_q{";^W ګȏpk}Fq@1wvܴ!+$7qcX 䊛co}Ŧ&'MlVVk)[F>3!$ &KK7@B 8IJ} N !WhQ܁ɂ6-5])E"?YЊ̄8&CP=^aw8dZY)& kc]d9'IfL,=h.Y5/)5=U)(p ɂ^iKBk=ɂ`>Xgs/., y9yBG9#wXǘ(P`*0-$T~\PӮ2ک3YgWdb"m[dZFV9nyÂZ?p΂TWܡ֧ʩ˝$h\ #t;k~o 8.qDr=ԁcOQOyneQ&|qjA`r'p g=F^!n)Ąjj1W08hq)Y{ C(?9ď{p`w8[#jA!S\q?n 7>FqzH;Dw烄3hvigm}f8rN?nh4%/)宅~}Qr7qDYݷ{Q[{TSmq Ɖ+n}H:;cz&!mOt&nhmNf[|lIj[irm;7`CvDN**_ORUv"U.Wp|܊T*y¦_\qߏ̜gm}(nhmή84 KnDbervXrwc i+?URqlHI*bgt4s\%B=ïυ~Q`xn>re_~#Ni2*ng*U@vX|n`}ZEJ)ry>FDV5Ν k76{-4jg,~d>/~ܡQ`Q%VV&&Dtv|f_˷ⓓ6ИJv޹}8K,>Qlz SV=*W*p/y܎*WX3#<U\q{C7Dizi>XLHy]C:it m?A^@O>U {+@pQ"d*)ꍮ'Y]/j1egO$SIJ@y \L2UT|2Ǣry]SSLrKT-E]S&!WCxF~z^?nnsız8PQ`q4|7|CO.{˻^N:=IO}ehW~F$ ұ$...lZ\XHlp<\n~}s9Թs6;3{{_] pBȽ pF j t\?[2łcDPW![V͸"_ApQ8 l\Daa[柜3oaWbzr ^T&m0;ȫ_7o/JîNL\jfWːR#%|8Mi+֦RW럔p]R,9X:B Tk3L%*1,y,4n} H^x{h?nmM?n,Zjn,E"X̥^?6WPkJ$ P|'Zwۻp K]2_g^|s ={ p!|%ͷAg肤fAU|~C/ĵ+Y\ + ʻwܾ祥[)UT<]wEհթ*bTQCs" 9"EƯ|x m%ΛIOb7;яN`p¡Uo Xe"9_U>F2knr]3 ;0 gdg(nwđVsWx X;*ʘ :zThpiX oXʃ B~B–/1P`7q2 J9I)Ejsk . q T*({qvc)!ilV)[o!ee‹fgPکwP؅3\nnߓBwɉBlSj uOނfg sQI.dzF ,@fa?@[[;++PܳsFq&-glիW_4-dJ+Gtp7(-HWR}Q2F_|+P5[SYU0[0)VwgY`U_~qOR Hbz%Y Yr 5@U02h*y^{-XG[| $Yb<_* uP!:xMsF1Vʗ=># MώdvhT>~ mU-?q V'WIKr`uڛآt-z;񒝹<Y'iF:*{4FFB.Gy;nmW E\ 8Wb~ SҢP]<;6>{L E~'3 y6A`m|:Tř`jmMm2N}F-KHϿkZܨXJjTI;תi't:="Qj|zO& =^Qc`o'x7CA\fR|7c;ĺZeB<H85QR ݍ(L+m[D"(n30# ?D1vj5IT%Dw&)c?v>l g*,A$k}"W:17c| j[p,^Ɯ+FqL2q";?n }ykV宮 ]y)QNۦ2dmuN$"QgCD7+rl~LgsZ{fլ{u-Pg(``⾜~]w`` =SwCDPaǚ(9'ו!!C"vĶ-9UR/߈@N?n$Dq_#wV/Wr&#L순cK8`@P8 k?vS=:󺮤wˑv%\%9=7x͙/zNFqቻWA~Y-t_ ZIvf*jղ>BTr drEiuT*EfI޽EWһcZ^2IJ} ;T~D+"Ț}{Q{d3L*iҶeA}ڮ^o/k(tbĜ21,8drL^XUv\a%t?[ۨG 8XWi_ Q>I3Е\Ǿ r-B?ߕשǙ jl: n"xrFD~ǡi+? R*LQ[[*e{17?)ף*LY%wVvn&=% lmo\2֖L-CBT+S3#S*[%} 5ۻG"[2v?nlrf4i5=F;/^|7=}T#btlJ'Xjwϳ,I$Ӊ.uȅQr%dlڒTyٰWkY2_=3J2[?,/]JTwVn 4Zñ*1a"[Ï $\F$AS#~AvN +^‹ĕ'v Dws~WnlD6V|%k)J`Q`t]//^`nQb[ugO ,mYQ=?1캧ry :h*2c&w|͗k?P2kki 1q?y+\]{9gG;wđ27?w?\bƅf6\;A3++h3gwr?n1˕[s*pepCwĖ3ӓl^z_KXNLKn*ܫnP,B_Uodcqa[@{}WuZ(c76gaAF0(J` 7W%NL%2vXB_3Ju Cn7۷eh%mg'EwHW1/)~LC(`~C"Vʸkzjz(3Ljb>oNFO^jCk㱳2xhlnmCwZ{$ t]3\eb/ث9rN3rΤM;R /w{n׮];y]]|CoDjuX))•`X<>XHD _? Ld*bo6{vO 5{ W 2ꭆbWV,pZi]=i m8^h/UvHUJf!{/aw>˻%_˵hZn~e,&yW/at2r? =Uy_Cp? Ɖ+ Mn 7s. Y qmHAmh===gKTNpqUQ8rO>v7o859( !2$he\ DzuM t7Ɓwޥ*!0 @7;d &9~uRKpz.#vۨ"ٳg`UP9X%k.sxUad XqѣGʦbm~cIOcowy},kcY/RWZͦ`0Lwq"[M[m3$20O[-t8' S' b- YTƘLwq"1n}H~{ڦiE­{i{- zuP<3T>M61\).%t?l G7a~ܬZq[m-&eJk' sTRmӫD{gwYrCo`67^|ɛԽ][6; 2P"v jq,V>Tw1";x?nݻT^@n}-|!7!P*Y{0ҏ{j2 af#ssL&yMr3%n jSlt]m0v4{'f/{T H?B}/sJ<7oT2 J%$.MkSCpYuvݮ4.ny*::8H\|]i$z޴,,M;$T2N\!&IBG~::DGΡL~n|9RF}rV-WUbZT",:;rS..,n_>Xֿ] a=;3&zO:I&z RufABp%|'AXq"(Z`av-XrꍟrrmPK.NrO>(q4j6νC m&f&¬zD"ƝtD }]j[Lqx,zf<0 w e\Bx2~]QŠ%+}V&z_\֕[%j94!T[PJ慗SnR]RO6l}~76Lk=Z{dsc%zf؉ $u=_FC77|:icKɟb?YS?/5 zDGFx,\uRu-M#r{wh+)0A>Kn42Yx\׆cQ,˱̣G {p _ `,9ןA vf4i~*h/I~چ[ˢ ~FFqPdy SOnF8?nߵ(Q2}[,..Bbny󆤹uN? To޼3<Y[_]%?X҄P?ڀF2eL|P׉2#l +C:͛7(O{ 3z QQ=gy_2;x,6"׸uW>xRVk5Mep4 q!WAqsE^[q"+N2VĆ}:͸iT[mjc>pf-Dfxȓ'OY} OrZ/vaڻ2  *$n^U.>:VHެ3z5[g[5;m5]$mKV*iz={*6Z2%m߷);(hR]qYN[yv"$W''$xO&R)b߻ja١2u"}P6)Zv Q*߃kvHD<~Ֆ677ggg9`K9ВO+ٙG<%!*iLL'_~?J{~ܠ2qSݝzc1Br<n½~_$ʐYu.ӓWض!-{ %Ε]r>׎K]g>D@mT+{{%O'M:/kQ |C0JI@è 6} -Ѩe%袀]/MI[Re2qcs<DtըWjGB+Ǣx5+Y[*6ȼY|2^vˍ93uA&gB7]m͛Jg3[^:@ge>0{D2U)]-wڛ7og31Ǿ:;s{֞L_Q3<&{`kz9UWW<='&&,;"XD. : v/ˉU AN !<2}E*T_[ /+zٵ7e<Б#>t\8 =HT*ɈрTO&8V _ixr>7=)Zm+35-ZxA:M>uWˁg48iϴgΫ-^IxV}bN?>ryj*]`F̗K{bglLf0-'6>MFHWg܇h,8EqCC",,;'Ob^Qn\&jQN2׌6$Gf.6 6 Metܧ.^g#cSeߚg-p D]kPD~T|uƇX+CV NkٸEnパz-tnldV-dbe*E?kW++(8 ߽eiFuNXp0>5.v ŕbҙIDZ!ղ|CAKB9|nLݵ2sna?:|ã3!}-FUVZ=77)VQIu[+,TL%Օ vD nOD_дu+  Tō+<𠶨CLf|'؆jI1F''xQe/|#^'7߀,BTb~N&h5kU-G v~2#v>Ae㾏 #tNҶ׮]תx)u>N$u9KMr N9+kF4W3XnI|eQeS,%g{m`rH-1wD~%302qwGWr\W"cAE$VxVXRK'>m8*? wVnTmBrb~xE׆Oɡ @p9~odDžARxі|CŠ ˬc l(:>20Cr6@fgP8mY[6UzxUk^Kz o%}*NV:/ >gA%k2[ΠkxW0;S!SJS]2z"JΌX.|.Aӊd[BE}Գ)mcy->tq]KԆjU'R)WF|/sV]K*§n3vCg ^lg6?c ⚢QF+ec^Ks#$KK7́ Bu|NpBR?Nu@=‹J2pyו۷^t1?Wl3TH=*OpQNn#)B6so c~C)nԚ/寭s[@.K:F9KK7@X 2VapMub2 IcŽJ@VI2%<ېL%Euw2^~mvR:qZ:Ym,Tٙ528w1n|Ub(Z6=lz:S6GG*oW|_I*力W`n^/ƝUBM&0,DIc&xbէ fxRd:MvyCSD߿Ǹ4lEY?8ӡY(v_%Aש=9'!+' 9ΝGhO\'k.^. M[hmM|`vi!i;]! }}+7Z76А_?I'yh4ߐɹ4LSnu+ } <kax8|tllp>3&ʪ.6tX4ҕl v'f3f>] c ߀BT0Ny-y4-NzZnۉD8]vY[-Uހ]Ý N;)h*>b|㇀.}sPD'UTRprDVLJT+g2Dz @Pk*=yJrz9(U?^s 6߻r򩫡q#fN$w T*^SpY!G1Hu"}8[ Gw{i.^5Og=1)/,]YαV;E?<7=Dǐzq۷o./߼2;Sw-XawgO&l]*WR6;=Ԕ~O;)Fvvv#i28W@Cȶё%3I_b絚9;f o 2qҼ^f߫ )2֑^"aD ޷ $,yRұ|X<_x7$ʁ;FDa4'>j% Q[ǖ]‡k[Jyo6…ϲvyA>tۖvk!c843thV/8Jw.6rxDDGVDeTj?wvwDV9,5]r3-x6ѣ_N.ɛK}y,ry/yԊ/T`l{GzXSpC-%9O,M$t&L@UȾJܱ,ZZ/K 8Mxh,FvMGHtks7Y|-?{/025|}r0D8##@%wqL B;\#ҟ5ûZ*OY;;*6E& $b,㇅ NV+m/HׁsWpu:n|pV,) q {C>ͯtIp2kېMdPx2`vv"* DB$1/!8Q֙ qGlI Xۉ،qkmbcmGjF4ȑ`BO$W*bQ=8l6c#7㱨68qr+6VQDl0x-}|ݺtej:ol8Nlo8wKN`mF{,֨7ZXrBqiͬ ZV9KAx!Yr@IENDB`analog-6.0/how-to/startwin/zip.content.005.png0000644000175000017500000005213310161303533021311 0ustar sret1sret100000000000000PNG  IHDRb.tIME)i pHYs  ~gAMA aSIDATxpd}٣2CKѐIXL#GqG]9rN't9&V$ $Z @r]\"XeRe.BE"ٍΚbyA}j^LDYb6ߛ藺oݯ]xg ƅoY pyj3 ^u0 y P!& y`wXqQ;;"dQ?G-?O/_uDԎgШ3ko|Eݩu}xl֍/K;UPbτ܇,~<x_i_J;z晣R}O5>3 \EoF/$_/֡v|G=/WLڙޛeIpOA|!~}5@ [xfٱ au ML }jc=JLݲ@MTכyO=Yyio88 ĸ;Ϝ9?K%0(Ua<!]IwAlZr:Z4{?4uO^;l"K; RИЦ6Xn( ?P^س$Eh۝TpS,twlP񑅙h&菝9nSjeqwjdzp|gOjժIdG @DQwCŋZ4~8~ O8T\p#lƟI`XX0M2}l /~"D\g^)⾴8s挥ᾰzC|gCԁK=Sa`?_eHLJ 4w(?;.aC*^՘;$QYg^ N.H;xf3g w}k>BE,CM^,Q=ngb;/OiT (~vjӖG_LĘGT1 gPvzeMC/BTB;o%G!3i䨴@M&h4,ޗdf@8cż0҄*?lmRUk$ƏYXihCK_6O~o!e4SJ2&}1C8 0ZRa/lwAM 8j\0޳ܲBguv* g#/2#G&2f@/o"?gK|-%#zLLR\%|bSFCU1tlM d`$P_D^c$bLM%ފErN݅D`͎Đ7~hrvWzPpPozN5R~.[7U!&D&&[lXNjL _x3L8reZ"X!N%)-yFaw&0]9G@~F1ڵk1R'N aJ@Fg8? _/_h;v02~6qV={gr2@v_o>0up=7{^5:xff~>47[ۺ\8u*p +u6z-~TkxNg{kk| ~zA?k Nnכkk[];S*asBx2Rd &NELŝrizb E+USSOA>hlO3Bt1EX*ùW|la;ʍ*iߘ.ӳg73U~֩ ~+(f`ZOC&'a#`Y&Jy6O3G|>⣵Oo6./o]*zK^\v{Jn}RQ̧4XQ ο߮l+(`1mYLH޷9vp*PJ'ԐFFBaIey2:G1S,^o:!T.y^x\ZC *ZHeΕ(Z&.LIrl1Ni݆R_eT̑ Bl(N;[l=^ųKs[g;kJ[B: `$P6H 5BҮ4 fhRdStWGvw:aIrl)ˉJ7 !褸z*[SA;N}𥶰uy|zna흥Ev2+ w` G)Ԋ6~ IaJVJڕU.U i7څN|^~t 51rNrs#7WYZf.;4=xeS+,󁣧62mwoWvV)/y7~ezLuK^W^(.Tl6e ҳab͜PFS"TB=w7KHidK {6C8_AdRP3cdnY'%#-y^Q$EϥKKYȀ73!]r yDžt7VNfv_o>0u&c fkw`4|hnup>qdSKeIK5Z5Gzyme>Ƅmӛ 2X)=zsÍk[];S*ylX2ʰ-S~HvN4pjf*ͩʩ{K^#A$QVFDzg&ɢa*u\]"IT9o,c_m`7E/p>R\g-6^sgVT%Rwz6t<$/l)U#W:FQ4!Tɲ6Ѕ[4UM-0DOqZiokfm~4M\OmJJۛݾWCGYgrԃr5THFaW'5G2ʱUD&BnlǰH0JBUa]6 UKI]@(rڞy&퍙wfz}֩!`Y"M8kUAk AAZ؝ao'96yw_<![ UEyr^6u|#sdHqܝJ{wzXӯg*R5owz{ҭSƚC,?TkT]i[94_dm/_7B~ovm6#gM_NlyRw/ܳ'rڵWa|X[db|znq+t{gii\.u:zesu;eS7FAwpe~f1WD_z}Х.Hvo**^(Μ$څN|jXOoPE9~3ϟ'AjgȑsTm^cޛ*^{ǏW*Iw*sφpn(:c3ӷZ_pȤ81_Y&Ztw29-y^J{P>C>lgOQwb_I?Qh8f!#/,bfO!jy7C_xMeW]P&HkQglnk`~p2\3r)=8qfڵE *&ià=tk`9'D*0~nήd_ 2:v ujCǘNj5oX_qvpo?|pp//oseA։ ct&λ%s\hwT! Iůcvv~7#tLΝS9L!퓆qw%Zbdo_}ig|,֐u:;R#.Aٌ ,lO/uX_fέ>V{#%S٬ @ݍ'3,#.Ɂ CiqлRf|?0P8uB+n;v0Ƽ g_K kseMܳN(PG;\qpfn}yx6 #xy׆iㅬit Iv0'v|659jHv W[\+ FsS 8nΪ#cHx%;\awUu83hWٷ;NDtnjܺgwǿO߈; lWe^mr'\umPzTv/0}ܰ`g? a0%f r%]v?Y[[ju$34QYĉsF rbA^YP٘1I64FJ%{a~f0nS +`b]L\N8Rb>PvS,TKm2\ .lT찙 ?PQ'N*pIZlVݾY0>V,~ŸN[6w'{=⨴{%kZPX]]+@d;Ol6'#Z`IR;âO{N@12 y dD\>@`oQ6|6JĚLClw & a+ee5EH|~k8~KKV6*h;J`1fXʕ9#۝Z}c.:a&~PCO'|.XTv4l;V >3kġ :~xՙT™>h jfԋpq@Cxt(jμԲVM,uW)G̟ǡ6L9PzՇ<'9Laq|)>k̪n% WwʺQt3`|paZ 4qR#nuu"(G\Iv7oIv'z oZT!@nj֑qaV Ӯ<@_ك3oz;yq rGysu[zcֱcS۝lPԙ7Z3I-z/kTTv=}KK =ԝ06g;۽M[]Yr;~m`MOʿ4STr\ /^An{G! sw=+sϷoA?uS/6≗7e0JʉDp8XlΫ*"#4+:Ģ)۬ 2W'C MG 2J{֩cxsʿnyauz9.lJyh<670R@'/x&ST_{)qw~ ǏbR*ڬW<vvl:1.>_80͋JG\>D^e? ia'ϡxKzQ{ծ0j㼑26F3 g \HyG=p_\\=_>!<>n_ב1?Y'3ֶƏOiWvv}wa]Vq̠/!;xgeOO}:`IJ~R2(FÏ(Nmwa #L M* [.^(,Ju?+WK-]s= {ԩMwO7Jd5ĺZu:t3cH뎉f= ?Їfc}^|1(vMh4l˦ncjlhyqa&9f h43HO) #ø;Hl?/..jُ"u}uu5Ffzh=aWˣ>JDyVA$(!ݓgHvcId:YU mv#J5~1~qwLlO}ȷEmUqw*7n|' 0J3Bpv^V,fqw*oַgC/; ]]zM$~iABa.,Lzy,݁'dDAnHwz3?g`4V~W¤}QwHvb{i{{ [dR_,>Eϑ/OL rESTY|h] 3ϖ<v+/ r^>QӎMݘu[\>yp'u~q}~$2'#t“ Bapxjg207'旟WE83ORAm9#HG.Rirf:/+b?}G?ëq QR40TdIv'>h'}K.Xg/mt7!/ÿ! m-Q]V>|#[0ķMÐR 7 |9Orbq@}rjԩSԅ3Sg1 9BammMy^j5@? !Zz%9TWVVZVJ Ywg Sj |.5*b|-]qZuTʩ7v{k[V"pн:0:,WZu UBZNL-2u2:qB$ 2wG 7\0`ejg`Pda qnaoL'ݭ2(c۫V{ݫpU(O]\wҿpUO ¦]P?l;t8}T=xᒷHnڸUӒw y@ߏͮq6կP8ݏ]m[x^66Qٲx ݜ1Alw6*N2_YYQ*M ;pÉ~.cowLeMh nO:~tu~xw9);%h8+!vկG;>2y#N{XG)젠]y| ,{$` ՠ]P&HƶMv___םZ[[cgjJ) +uC(hμnWD j+OuyVbN]gZ-;H{BaUwZ2:ŜzM)u/a5`p1gPJ9Nqqϻ8C{6[.d8_ WnF]1#qwr{ɝLy~et -w}gӸE`Kku.nE[! JD3{o ~,R*M^w!`ѭuBrLx>|ẹKa8ٿ &æ_Gd(dwl Ri_ `gl5ɗR\8sFKcptD=>lf]X7;dn=ʚо>ɎZuu6|q`x;H&|gxӈ\=ge 7_ cJvz/(rt}MW4'S"qpYqq@ (݅c9~RP=A)[- n=+lg\y |`PUkh(b$h9 }}}]wjmmV)0HC'eDkQ2_ȐHc'^(㇋9Tʩ7v{kZu$A>;#5}Ņ*!K'w2u2:X" 2/a 2C0`ejg`P:>pJa٬S38ߝmylq{Yjwuu+:64ߐwi@Vl _թy0osRy YyhBTMKEG/*)bV]\T׆*8ݏ]m[x^66ӃUX/ |wWVӞhU=}KTˏ-lT.d2|6M34=r?_-qa}[.cowlIl:~t~xw';%h8+ u/!DJínΏRAAqnXIP=A)4kTdl;@"M;[VSJaRRq\Fיm H}B@ tz.Ϫ@LRݩV6w vUW(NUU&Y0>}>}_:64w}oQH{6(0߽PJ9Nqqϻ8C{6[.d{L,ZO8qڵc*Fo>ܽu`swB~qvr2W]NY#9<䕬0ȫ<K؂Lp1N~@_uBصG}n=[Uwl }fy=S\yVl[Spk˻c> `BЭe?泖1`;ՙ39-# !\9#Gvâu~g,w;d+`O8.Y'P=Ty7tDX.[m @'ZqaNj5*%Qx#X^$F BTJRuۿrHu*-.lw6Au0scUv%u۝I@(Xp򅆫.Iv%<{EHk%[xcX><Ѐ ֪bCtS`!֪3,O^: `L0¾/X38ZN~21l,o$76.I8ĉYGLBƴ8[V_jx(@' ׮]: `|1Z\ &[!8ݛ&z45`UY`_PA Al74 դp4g0i~>'{ ;l}_ |]Hz5AϙRw}~v'xGIP6E}e헸uDp=N ک?A#0L _# >10fDb,[+dLhW H72@cJ4Tzz5ARS]k4 b3[-r!7QG#9Adb={gr2 Gsgd[-f Xt͞xͽ=ֶn6ev6z-~TkxNg{kk|Y 7Pv`Fյ3RK;6oBcm ,pT!];©FW4*VZy޼Hb.X(dz "r:fܨF{+^^]]o?T=vjczޝ=0?Ux~uN$zjnxU"7w$G&Õ~0s< C:ȖE%&ryn7R|fRJҬ7=sS<++nojvf_eeH>  $BJPx|X|M6w 7 .i"AɊZ1]BU\6o&ݙ7f[:kcr0Ў>yG!&!d1?t{l IuaM$d~ 6M=)(3ٜFݩwgNj:xvir,UvWW*:^qg{7J*qcޟý1d9|M#}EQ6I?s{i1c܅3 ARww/;sksn,--sLS*l /B)GҍAj7/Fa#mdBRX)Mϐvc^]NWJ1|XTG7U\eie[@6[l1,/iipgA|sZ$V7=U,.U=M^U=Wfhd;7 Wpx# |g Gd?@<r"DҦ pPA%9)oWvV)/y7~ezLuK^W^(.umt ?p,BGNe*ɆU~JX!H)2Oh6Nfw"՜6(*N~9A?^,O-[%Ɣh\3rG )lɶqk &놳+++Y0nujCdI}w{%j`uu0vgK4ͰJuƔBdɤB%gD=6oʛs<ǹQd!L庪lR7 dh+C=;]<#>w=əp\߈LX)Gtvh.BiҔ02q-\ks5Ig;ڄ OM|&iAaIz8$k/&xV6SemVTnu!'J|6w5 bgؕh [EH  [@VnPD{GUgY 46OSvt[ Ց;$RgȑmZl] .lmjzRj y]jqK{}EAz H#4Δ(M 'tꦑh)7Ǐ|CT#n63 pVd !vb&@3} f}#$p`A a2hI3\"1W$lw+ug?Zl6#熜W \!\v Ɯ.]YH<椢Z&2bgmlH`#\EZ3h) GE˝<2i WpkHy2GHBюھ~lR7sB%2X $,*Ձ0 pڸ۔P7 U0/7G)0H6QndTlPٝh GݘC\V+Ц`,5dD5$JR#բr~JF4[ܼV%9vdbμ?H dIvgRO<8UKxg.֪_c>ӛNL,֪K#9$ΰu[gw(]"l]U8sEv 3A|3![ 3]&i K5VYgHl8I1üEn7"83!pѶv)$OݳUe7QgknӜ7Xi`*CAw*qjCټ3h7 :9y#3a׵͉d;96b`=)t+ [!L/W Y޽voZ~mji`G2 +pX*=I.ǑR83&ٜYnmjEzR%vF|MBIqj3i ,Ӷf1 &8RvaGW{ֿ20lVn#zF9zwE\!{QN3j |BFnXaKx~iI?ΦVtSsJTH;|;I0;I%\h RE;R\vȇ,Z<0Z1]ijP!wZTuоƧ!f)UBq{Ad~lÓ#to0u&c97{^5:xff~>47[ۺ\8u>#۝^\*OR}:9BVk+Yg0&nlBS${ڃaVΔJ.il///oll$6lX2ʰ-S~HvN4pjf*ͩʩ{7I-[1wys.B6 ́8/{p?%Vȣj!3-6^sgVT%Rwz6t:@aun-WEQ4!,Õ ?"\\?[2y0tgB@u~zqyxRi֛)ʕn75]iwI}2څ J|9qP]@6ZcN6cEqUz6|l6r t 48Τ1S,^o:!T.y^xVP2(ybe TExjݹ& L);07!ggᾁIޏ 1VeGdb]gk92P8N;[l=^ųKs[g;vR֩ Ą?TkT]i[͗ʝφDEO嵂(-T1TؔgyRh_;鹵F9Lw}ݿܮq7jU#O$wԊak1!)LiD} mw{Ti.VJ3tWj:zRll?4_, MS% )=eaLD+'4e&{ tDHvͥjm[TR;~V.7Mz#W峡21/=ہ7R0-N9H0T3\ySC-\wUzeMeM1!TO4]Q`w%)oWvV)/y7~ezLuK^W^(.4O C(4ҳD`Q ?%MT<̧ͧ-6eX6cfIw:*̙ Bbqp27Ǚ '%#-E'_TQp~wJF4[ܼV&G{%<tnήdvIxբ%mn6t3S 8-dN{–;h6cXGd2-G(cF;v2"a^XI尥|J8bF[du聹ԑ$JDHu܁H|8IwɤY+p5N!hLK!T[:*O=Čv`23~E%JuW;- }%bʹQ֮in"N%(w*,X,ߝ*J)M&7gT2r$ }W:?hu͆ECEp88w-u7raH[\hpfw`OHṵaS˹ ~x{R"R×R3fO9U^5_ee0@51zw5:w#7Wz4?M;|ْO3Q-J; u~Jׁ3 =ēW>Y' ڵkGlse=刺J9!J!Gl'u|tΝ;e&8s1#9?_c?VΏ|kׯ+zs?x$Goy&/N'>h T+=vݸqhskoKOw>l<1XAz3uj}>Y,I2;vlk\0>pF 枝˿ܙ>\UO~zzs?/wv{{b_fg﷘0vyܽ@=oZmT;l|#V +_+ { pzo|Wu}K:{{ا Automating Analog and Report Magic for Windows

HOW-TO
Automate
Analog and Report Magic for Windows

by Troy Janisch, Online Arts
original document at Online Arts site

Analog may be the most popular Web stats analyzer in the world, but it isn't the most intuitive program for Windows users to automate. These step-by-step instructions will get the program working on your server, like magic.

For the sake of brevity, I'll assume that you can download and install Analog and Report Magic. If you can't do that, you probably shouldn't be writing scheduled batch files anyway.

Step 1 - Your Analog CFG file
There is nothing magical about setting up a good CFG file for Analog. Since CFG files are roughly the same for each platform, I won't waste your time here. Instead, I'll provide you with a few useful links:

  1. Analog documentation - which tells you how to create a CFG file.
  2. The RixWeb CFG file creator - which will create a CFG file for you.
  3. This example CFG file - which you can use for inspiration
When creating your CFG file, there are just a couple of things to keep in mind. First, that you'll be overriding the LOGFILE setting when the program is run. And, second, that you only need to output a .DAT file if you're going to run Report Magic.

Report Magic is a tool that makes Analog reports look prettier. Like Analog, its free, so there is no reason not to use it.

Step 2 - Your Report Magic INI file
Report Magic INI files need to know where to find your DAT file and where to write the HTML files for the Web Stats report. In this case, here are the relevant links:

  1. Report Magic Settings Documentation - where you can read about creating an INI file.
  2. This example INI file which you can use for inspiration.
Report Magic can dynamically create file names that include date information. You'll probably want different INI files for monthly and yearly reports. It's not uncommon to have multiple Report Magic INI files for a single Analog CFG file.

Step 3 - Your Manual Batch File
If you're setting up Analog or Report Magic for the first time, you'll want to create a batch file that generates historical reports - those for previous month/years that you'll want to view statistics for.

The manual batch file needs to include two lines for each report generated. The first is the Analog command. The command above specifies: 1) the location of analog.exe; 2) the log files to be included in the report; and 3) the .CFG file to be executed. For example:

call c:\analog\analog.exe c:\LogFiles\W3SVC9\ex0203*.log +g"c:\stats\config\my.cfg" -G
The second line for each report is the Report Magic command. This command specifies: 1) the location of the rmagic.exe; and 2) the location of the .INI file. For example:
call c:\analog\rmagic.exe c:\stats\config\my.ini
This example generates monthly reports for 2002.

Step 4- The Automated Batch File
The automated batch file takes the same format as a manual batch file. However, at the beginning of the batch file you must first fetch the current month/year:

@ echo off
set yy%date:~12,2%
set mm=%date:~4,2%
Then, use the same commands, replacing the appropriate portion of the log file name:

call c:\analog\analog.exe c:\LogFiles\W3SVC9\ex%yy%%mm%*.log +g"c:\stats\config\my.cfg" -G

call c:\analog\rmagic.exe c:\stats\config\my.ini
This example generates a monthly Web stats report.

Step 5 - Use Windows Task Scheduler
Using Windows Task Scheduler, specify a time when you want the batch file to run. For detailed instruction, visit the Analog web site

Ta da! You're automatically generating Analog web stats report. analog-6.0/how-to/anrmwin/task1.jpg0000644000175000017500000003670310161303533017357 0ustar sret1sret100000000000000JFIFC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO>"O !1"AQ2STadq4BRUrs#35b6c$t%u$1Q!2A"#aq ?g LN*ZHi]!2GssRv}wB}hueN|/gzFf6<tkp-txdTIY#3kvh}oz"3S3R CP6)o{XvywB}ʎeu X* kHM!Qap0mCuLNgp9n|L'(i 2Em;e73fl44e;N fCGIRf 2PR: /isZ< ~+<0b-}M?ԝCПj2ƤIYEH袶_'Ȱ8eЉ]I@n-!CCGM6Sw;.A&:_ ͻhCПj8mwB}. c[:ٰlFۚ[x+)%,uQ 8f]r.ZyͧcGnc .'c٦']p2gdT2FOq ÎR/6r%='R<3jOTSmͱ.ʥvl`G+]ʿa3nѳ8|tq;u"DzGQ_ޮbM=vMɱ[z)K~kGWwN\Ytλ:ªI~eUƓUYڧFv좿tK=wqYڧFv욻RK-orYڧFv쒷KduʗTdڧFv"T8CYܩ5NA6Ѯݮ+;7FStj,mS][ukj?F&:5۵_*?FWsXYڧFvOs_zS¬ z5۵*{YuڣхZA6ѮݬzQJFxY6Ѯݷ?Ї \ahMkm޸! ]ZAdnw1ta}~]ZadnoetaeՒ0BۧFv>}_zOYۯFvێY$7 YxY)?EdMuQ zCc5y˛e]y"2ꪫjg9 mESgyͿwqV*YiӱH}O <ꓰ\SnWMۏPQWcHޏw#~ߢבsnp'~ՐV'=7{E"y6U!b0:@sjTH|ز-OӇ}~T}fqyϱ}=GӋ}~Tiqyϱ}MGӋ}~T >s(حMUU 6цbD߹U`Qϱ} ~<ج7mU_2&yޢ3η7mU(L󯢒Nvy&,󯢙[h6j 8[6BpzZ4Ud@>֩4XU?!K3t6:ꕟ"^Vlpq[ sKOVMFGin}GnR7ph%?QXħ#8MHV 5lK.vڷ-Ƅkkjd;祩Letg% ׏+pLYiaih0YR9:9K7w=nuކLen~r~.[jV^0^gzdL, 6wp:]y|L tG SL#{AlvjFk6ZN.ۛz -Ekæ.q#f$2 Z`GkǎSMDr94Ih:˝8]A(pUVITM4|4V4FŸ~k~R-ʣfYIG-7`7r߲&AېZGP"s-sA-u`_.$h{,ad'\#ݦܵGQ l!;.˺H*LrM(-k36ѺQk<(7摑6G#Y,Ovv) m8}FL{NS|ń u֋*llsÓhpÅIE;G=8$Mpvw 汵/krNZ8 Ĉvb]MAk[)*,jQ+jf9#f8ص {71eT/k-#l3=g$4:ƣeEieyqklHJnA1j-]0sH7A w;P>i*f *'vϩH6n$kI[3qpP: `} = 1z54:ѻ󺒦5FT=o25uA5ƭ%$npc#.,CmUS,BI[3Me >fO/gHSH [)k]#ĹO 9+dou0m7n8 ISG ,h&/qXߑѱG_^%Rs8fʋ Mwd>,7kˡFg|ÛynZo3i|v82W qgsZF2j-}IY^) jw9#Y$p$5y[o"`ώ~:2&JY|K[0&Pok+&Y:jg5[I^nTbNsf$ Hp,qqNRɈKnHP6cSiSfcQ UUQx(Z#@q7NU[YQK3͌H\:;#uۉAU{6l簸$- ;iTgmNhw.cr$80L#5#{ k/zZODs}׈\sT>jـd8i6h$.m`5G)M-8Ǵ;MohDŽGU%kk\i2dsr9o`76 \6G 3̶ctbz&A6c+r8vlmmeΦH&OB&P,]}Z7Ʊ-V " ""k>E?ݻԼzgȧz=zn}>p&o*~~G9f[uxvճ,vzr+:mbZ  pPe#۹V[;siz ILdx~>92[<_r!Kjw/_lo?!K7v~aۙml+0rL :~6z7ݦlg>=66X~F\_W꓁./+]¿|Áe) \kC#R\SUKL,qc}öߦFctrckpwmeSO j2PM ̢e+YRigvwg涆My<7Z0㘬JimxFHK}iX]xS+m\Ɨ3fʑqGI+-A)'2: lrd(`iQc}@*Ɨt6O]MAGQzH%9~G ]NClcϟ>l志.~ ]3T̀5uԌhe%326!esy" """ """ """ """ """ """ ""k>E?ݻԼzgȧz=zn}·exCj7yBG)<<[1(-Wfl1x\+?s7-DžY7]Ur몴 oR-ﯗKrTL2Ó/KΙ4D£ דen: =^y0e o%25 M2Fv".&ڀf`-=G>j2f˿[fSG__5s>08;EWUaΚDS%ٞalj-豋f$Ag˝|>ܨ:DU}qa=V[x62feڝ9Iv3X*S}Iv3)`s^"{ʈ oHeχ3S O N;λ'+P\"یk"n.Y2\m_}q)=E-s 3u ;iK :Uxof!I V39h9tmEDPI%\M]J$KFx-6Ӌ+ ?67YKM%d@126f;!).."˚5cS>8#l5s{B;atHVf{.lql䑲/cmtM+S,f.oi͌\mlCΜ[*ZʚlZe#K6k |=9G-G50axl_Q}AUp%Wfo*O εki]Vl|>U0ܽ0~ 9<͌S0 ܭ,.>oV"8_C__2l4\r2I:MTA\yWYǭ߯儱wʄUnTmnM:K:#cc}ܿipBǁ0F0|-7zJ $d $A⏏E,=,Kc )ηD|:7* 4 y %k=p8:$jU rYwX/ SIKԲSpvN`,2G4|@ƽ\nxT8fV4VLle`!,lָ͐UUAO FF[OvM9Ga}| ]SBblφH^X~F<_}ڋ*87VRU9Ѹl󴸜!l.J%d9Ĭ`5xpEA GPQifu$YWwu MeSO j2PM ̹WN2CWl$ +82N ͗*hpz:7>4Œ\qׂl n.c$E?##kFab ._Xh06B$6ť0 ͔9u$ha2X0^ӻx\fut1N 6VbT5--U,T '2+@w[yU#Ĝ.Qe Q-Hr/i}as'dAI{ qf~q7nls~ԑF#.8HYPA$Om-11hǓ?7r7tԸEL6Fi-y_ot&Zk0%83-㐇f/|5T1TҺ3Bv4mN[cROIMQ$RTS+9sXy;2h'mK]Q!:k26}εp1TM "T8[0ܜr;{cJ IL*P)9L1  !+' M1j̒]nq:xJvRdT:6q n͐f9˙Xe[xۄaspΤh`AO)Ys2zH$;dmŎSfb ,mvۛA*V&1E;䧨fu8 t `P$iI9YSi3BH׵mv 8Lֿ#ե0C n򣠅앎2ٿz E\!UuYf͌EM)B{b;Rte.v5ԳT ؗ0IpЌPԽPi{Xm>\yx<'εi"*\6s.XFp^__æehN ^,m`g&|gQDrS # # =۲fH27M0<b))p:eͦ.vlbSñ vevcsZc`UL*c vFf,l٭n7A6Aa,}1vmq6))Xe9&XwkrE/}Ps|(ie=Y 3N&4+a5"^VRS۽K7n>}ATL (m7n>}AT]RxpkuӦ|U_ |ߏcxv^0 ʕ[w Jo|.-ϟؾ7ƫ9wU7[ȾۈOQ:`Ѩet٣çDcê.ܭ*q# bVu/JI1‘}ųOI6D4R?jbGEk0s. 3rڕT,\#{gx[U]mᶄo*żV5OL׵5e: lں-[C7 Yվ'^}`EO X'@N IZŨfyݡX\ W6ȣ:jij'vXa{krT`h $ug,.hE?ݻԼzgȧz=zn}' ݸ-Q?5z_G#:ʶcZ: zaa;jVM}z-F9:_U-ͻ->m޿/6ЭWAs@`q!\B{p%:o&:ewSP0;kf%ٵ|^PG6Ԓ.0դ$Nxph f$9r}s#yDG -|J̍/$r{TuQv{}e3dQpx$)#[mrcY xw f=yn_ƢnhDl>5d]KƋ:+`FY:~[ğxOTᣌF CEVJ:×FU]DK_{p&e3\ģ{1־:<~xvk7mVӇs<ŜX[.mo|DCUHy:Yy:"܁vZ:Fb́}E[fVO /6Dx4 ĤlWӆB?ܗ)ӕkӒʦ׶U>QNe';.B[.SugZpuv6ݛg2:ٻe;7|2kl{ɿ\Dm#.0=T=+c"l@.guSAOSU. -ff;up= i13G*buTJ\B$#xnITW>zdq6P) h8mche6WD""" """ """ """ """ S۽KתV|wyZצo*ݸ-S$520iq i55"k<6DžvJ<.7 UH tr˳sMw'ȖDB }Bllyye cÎ)Z}BƙDآ}2uro<zrJѸ5;ybS#u>un|kȤ6&|~ j-mE|&Әp]~~|nӛ~{iE8wlqӟyV7iUj!l wÿUpc9Kiw",(!vRꕟ"^Vq[ *|ݸ-U_dz .6 ZI<7fy FGStEF\sM*Y)-dT+R| ph9˻sLpkoh vKWqإdW6F Y>>4R6=|||sbanodԘ|x~5_y?/_yF3cJX;Fܛ )ӺqFɩ: ;qVpp;yˤp""ʈϑOn/+^Y)ޥj^e|a n}v8;_ Xq[ugMJ2Ӈmoʕ܁gYĩqYpՊx寏}n?$[}&oSoȭ6b\F:[ @)!o7ekydVLj?%3><}y>)L&Au;)=2@9E+;ֵ&k\-WGmE4`ۊgwfvoˆjXZD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA gȧzTvRGMۏPU-ݶ􂱛ea|>@~?$r)cսܦhob4 e kɰ ٢|RF  H<݅NG,q-ӑGo4e9ry.F0Ah Fpods}Z<$kɆV3|sj1zG]n+]-E즒$ј>]s[11U$sCӔɼ,mʸW> a6nw47-\76s3ǐʚfV <\ :9Ilp>̺9fh$ۈRaaזdXǕKg[7U+"5n(0WzY@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD|wyZJϑOn/+Tzݸ-mݸ- ё{qٯa W(ˤ6hau*[c%<+bb-UM] Urs.좬袻X\(Ur6] &f` vƫ2;V*|SlΩ¥:y,_Nĸ?7ַluʴS),+t/sXwd9@B [rG9vJj,Ȗ9pHWxg$/h<7C.u}T4Յ#PtFLɰ6en8Xkv ߀EOK+ퟵqsokZdwuLp浙 }˝øo%DWE(OuUwrtHAd/S.ʼnQD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDA gȧzTvRGMۏPZ ߛe`G"wX  ɜf>e쪋k/Cs[̻`g5ֵvK[ld)?D s9MmM,. 0 Ii\sDMVUƫ7j-<*ǃ{א4>_S)$Y1΍ #®}aY3ٹXbҼd#U\ԉ N O034PsYW+ fTDECY)ޥk+>E?ݻԼQvOXVvOwd#tN_t4"0>?%/v-Zp˪Dx-PUSke}Ulclq EZ`f.mFzѫ7-;p} Of?s3Q9F@VM#tr syQuYytQUb_^UЩ}G2iul)7/;'F%DDP5"^VRS۽K7n>}ASpx7\hq[ ?}AF""" """ """ """ """ "")\Zɧ ]>Zs2+o{SwfC^tB3.k]>˚3ŽOݛ {C .oRb+O3&lV0XF.7A]")\Zɧ E?ݻԼMۏPQ&o(D@DDD@DDD@DDD@DDD@DDDA$ݸ-QS%k[pwUw>TI##s9o ?dnvw}n R>3TB֝\S8ld(xE .$~U7Lk sfqnm9/"œP7Fژ;{3D|_L%p2^G qٳ&l(M]+i7l{:a 7?ȕUw>\DTFȝ@Z]9s>d{͛4L9fN`Mc2 :Vۍ#AM5k~3HU^TWvž.eٗJKZZ=$-:\R y\-:95vSG%\bnPn.aq;ͳۆl]6!K} 7XokᦻR|U h%#hɯ5Aە\bM'f%:~F8Xk^fIahn9\HZAS,pEA&nYƱ㘁y󠯥1Z젂vDc^Fml6b m[: pZg~2fr<&J(-7}+|Ù%E3YD%"x  N(]]KLV Ln@Ŧq~m4XuKEc|Lt0y:ߝlu]7|*O؏؇t &7id6-79gȧzTvR7n>}AF8kLݴsZp ̩_L&NʟveOra0:t\fT/*~ Ӣ;29}0SL1ٕ?yʟ`t蹎̩_L'fT/EveOra;29}0:.c*~ ٕ?ysSN̩_L&NʟveOra0:t\fT/*~ Ӣ;29}0SL =} 3rDI/jþ[T}SN̩_L V}/BbuoQeOra;29}0Xw }֬;^Gٕ?yʟ εaW-'ZzfT/*~/:Շ}_Kзذ~ ImDnOTݙSN̩_L  Ef{X7USN̩_L  Ef{X7USN̩_L  Ef{X7USN̩_L  Ef{X7USN̩_L ¢EQ1ps\v7l1ٕ?yʟ`^ {i:&O|V}/BbʟveOraZzXw }*~ ٕ?yjþ[NaW-*>̩_L'fT/^uo:Շ}_Kзب29}0SAy֬;^,ٺ(so=ٕ?yʟS۽K_7 u$;Koiu"?analog-6.0/how-to/analogo.gif0000644000175000017500000000106710161303533016261 0ustar sret1sret100000000000000GIF89a66ٿ!,66X0JԼ82`p'YzEp,` `/E. P $SR}l(# 9}q7ڸ<.پ["HExvhv@z#QaVFCYwhxAPUaS}Qk7OTc>xu7]<}Gsi:cB~LYwn|lmSƙ䘼GMpLjޟռ⍚ߠSjCl%TK>wE'f\#aH(aPuuGkk%!E&*&+`9Up R8wShsKd ;^]*YjLb(m`vآM"B+n@9i1RUc )LW}sv.}(Wy"OH [g_О':ߧ.vXm{Ц7hR ~Lg'L2RMZwUwO7Tx@Ͼ{$FO</;analog-6.0/how-to/anlghow.css0000644000175000017500000000022510161303533016316 0ustar sret1sret100000000000000body { background-color: #D0E0FF; color: black } h1, h2, h3, h4, h5, h6 { font-family: Arial, Helvetica, sans-serif } /* Last updated 28-Apr-2001 */ analog-6.0/how-to/favicon.ico0000644000175000017500000000206610161303533016273 0ustar sret1sret100000000000000 &(( @pww ww w ww wwwpww wwww www w w w ww w ww wpwwwwwwwwwwwwwwwwwwwwwwwwwwwwp(     ϟanalog-6.0/how-to/index.html0000644000175000017500000000272110161303533016145 0ustar sret1sret100000000000000 Analog How-To's

How-To's for analog


Here is a collection of "How-To's" for analog. They're meant to be complementary to the program documentation by describing how to use analog in particular situations. They're not written by me, but by other people who've faced these situations themselves, and who've found these methods to work. Thanks to all the authors for sharing their experience!
Stephen Turner
19 December 2004
analog-6.0/Licence.txt0000644000175000017500000004615310161303532015044 0ustar sret1sret100000000000000Analog is copyright (c) Stephen R. E. Turner and other authors 1995 - 2004. This copyright and licence apply to all source code, compiled code, documentation, graphics and auxiliary files, except where otherwise stated. Analog is free software. You can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License, published by the Free Software Foundation. This licence can be found below. Note that the program is distributed without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. If you modify analog, you are encouraged to submit your changes to me for possible inclusion in subsequent versions. If you distribute analog with a book or a magazine or something like that, I'd be pleased to receive a copy. Analog includes code from the bzip2, gd, pcre, png, unzip & zlib libraries, and from FreeBSD. These portions of code are also subject to their own copyrights and licensing conditions, which can be found in the analog docs directory in files with names beginning with "Lic". If you like analog, please consider making a donation towards its development at http://www.analog.cx/donations/ . Thank you. Stephen R. E. Turner Cambridge, England analog-author@lists.meer.net http://www.analog.cx/ 19 December 2004 ====== GNU GENERAL PUBLIC LICENSE STARTS HERE ====== GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. analog-6.0/Makefile0000644000175000017500000000037610161303532014376 0ustar sret1sret100000000000000# This Makefile is only provided for convenience if no options need to # be passed. You should usually edit src/Makefile and run make from the # src/ directory. PROGRAM = analog $(PROGRAM): ALWAYS cd src && make clean: cd src && make clean ALWAYS: analog-6.0/README.txt0000644000175000017500000000015410161303532014426 0ustar sret1sret100000000000000The Readme for analog can be found in the file docs/Readme.html or at http://www.analog.cx/docs/Readme.html analog-6.0/analog-data.dtd0000644000175000017500000000563210161303532015603 0ustar sret1sret100000000000000 analog-6.0/analog.cfg0000644000175000017500000000734610161303532014664 0ustar sret1sret100000000000000# Configuration file for analog 6.0 # See http://www.analog.cx/ # # Here are a couple of configuration commands to get you started. Add any more # you like from the Readme. # # Lines starting with # are comments. # # There is a much more extensive configuration file in examples/big.cfg # # If you need a LOGFORMAT command (most people don't -- try it without first!), # it must go here, above the LOGFILE commands. LOGFILE logfile.log # LOGFILE /old/logs/access_log.* # OUTFILE Report.html # HOSTNAME "[my organisation]" # # You probably don't need to change anything below this until you are # experienced. # # ERRFILE errors.txt # REQINCLUDE pages REQLINKINCLUDE pages REFLINKINCLUDE * REDIRREFLINKINCLUDE * FAILREFLINKINCLUDE * SUBBROW */* SUBTYPE *.gz,*.Z # OSCHARTEXPAND Windows # Add whichever of these types of pages you have on your server, or others. # PAGEINCLUDE *.shtml # PAGEINCLUDE *.asp # PAGEINCLUDE *.jsp # PAGEINCLUDE *.cfm # PAGEINCLUDE *.pl # PAGEINCLUDE *.php # More SEARCHENGINE commands can be found at # http://www.analog.cx/helpers/#conffiles SEARCHENGINE http://*google.*/* q,as_q,as_epq,as_oq SEARCHENGINE http://*altavista.*/* q SEARCHENGINE http://*yahoo.*/* p SEARCHENGINE http://*lycos.*/* query,wfq SEARCHENGINE http://*aol.*/* query SEARCHENGINE http://*excite.*/* search SEARCHENGINE http://*go2net.*/* general SEARCHENGINE http://*metacrawler.*/* general SEARCHENGINE http://*msn.*/* q,MT SEARCHENGINE http://*netscape.*/* search SEARCHENGINE http://*looksmart.*/* key SEARCHENGINE http://*webcrawler.*/* qkw,search,searchText SEARCHENGINE http://*overture.*/* Keywords SEARCHENGINE http://*teoma.*/* q SEARCHENGINE http://*infospace.*/* qkw SEARCHENGINE http://*alltheweb.*/* q SEARCHENGINE http://*dogpile.*/* q SEARCHENGINE http://*ask.*/* q,ask SEARCHENGINE http://*alltheweb.*/* query SEARCHENGINE http://*northernlight.*/* qr SEARCHENGINE http://*nlsearch.*/* qr SEARCHENGINE http://*dmoz.*/* search SEARCHENGINE http://*/netfind* query SEARCHENGINE http://*/pursuit query ROBOTINCLUDE REGEXPI:robot ROBOTINCLUDE REGEXPI:spider ROBOTINCLUDE REGEXPI:crawler ROBOTINCLUDE Googlebot* ROBOTINCLUDE msnbot* ROBOTINCLUDE Infoseek* ROBOTINCLUDE Scooter* ROBOTINCLUDE *Slurp* ROBOTINCLUDE *Validator* ROBOTINCLUDE Ultraseek* TYPEALIAS .html ".html [Hypertext Markup Language]" TYPEALIAS .htm ".htm [Hypertext Markup Language]" TYPEALIAS .shtml ".shtml [Server-parsed HTML]" TYPEALIAS .ps ".ps [PostScript]" TYPEALIAS .gz ".gz [Gzip compressed files]" TYPEALIAS .tar.gz ".tar.gz [Compressed archives]" TYPEALIAS .jpg ".jpg [JPEG graphics]" TYPEALIAS .jpeg ".jpeg [JPEG graphics]" TYPEALIAS .gif ".gif [GIF graphics]" TYPEALIAS .png ".png [PNG graphics]" TYPEALIAS .txt ".txt [Plain text]" TYPEALIAS .cgi ".cgi [CGI scripts]" TYPEALIAS .pl ".pl [Perl scripts]" TYPEALIAS .css ".css [Cascading Style Sheets]" TYPEALIAS .class ".class [Java class files]" TYPEALIAS .pdf ".pdf [Adobe Portable Document Format]" TYPEALIAS .zip ".zip [Zip archives]" TYPEALIAS .hqx ".hqx [Macintosh BinHex files]" TYPEALIAS .exe ".exe [Executables]" TYPEALIAS .wav ".wav [WAV sound files]" TYPEALIAS .avi ".avi [AVI movies]" TYPEALIAS .arc ".arc [Compressed archives]" TYPEALIAS .mid ".mid [MIDI sound files]" TYPEALIAS .mp3 ".mp3 [MP3 sound files]" TYPEALIAS .doc ".doc [Microsoft Word document]" TYPEALIAS .rtf ".rtf [Rich Text Format]" TYPEALIAS .mov ".mov [Quick Time movie]" TYPEALIAS .mpg ".mpg [MPEG movie]" TYPEALIAS .mpeg ".mpeg [MPEG movie]" TYPEALIAS .asp ".asp [Active Server Pages]" TYPEALIAS .jsp ".jsp [Java Server Pages]" TYPEALIAS .cfm ".cfm [Cold Fusion]" TYPEALIAS .php ".php [PHP]" TYPEALIAS .js ".js [JavaScript code]" analog-6.0/analog.man0000644000175000017500000002141710161303532014673 0ustar sret1sret100000000000000.\" .\" Analog by Stephen R. E. Turner, copyright (c) 1995 - 2004. .\" .\" See http://www.analog.cx/docs/Licence.txt or Licence.txt in your .\" analog docs directory for the full licence information. .\" .TH analog 1 "Version 6.0 19 December 2004" "Analog" .SH NAME analog \- web server logfile analyser .SH SYNOPSIS \fBanalog \-\-help .br analog\fP [(\fB\-\fP|\fB+\fP)\fB1\fP] [(\fB\-\fP|\fB+\fP)\fB4\fP] [(\fB\-\fP|\fB+\fP)\fB5\fP] [(\fB\-\fP|\fB+\fP)\fB6\fP] [(\fB\-\fP|\fB+\fP)\fB7\fP] [(\fB\-\fP|\fB+\fP)\fBA\fP] [(\fB\-\fP|\fB+\fP)\fBa\fP] [\fB\-B\fP|\fB+B\fP[\fIoptions\fP]] [\fB\-b\fP|\fB+b\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBC\fP'\fIconfiguration-line\fP'] [\fB\-c\fP|\fB+c\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBD\fP] [(\fB\-\fP|\fB+\fP)\fBd\fP] [\fB\-E\fP|\fB+E\fP[\fIoptions\fP]] [\fB\-F\fP|\fB+F\fP\fIdate\fP] [\fB\-f\fP|\fB+f\fP[\fIoptions\fP]] [\fB\-G\fP] [\fB+g\fP\fIfilename\fP] [(\fB\-\fP|\fB+\fP)\fBH\fP] [(\fB\-\fP|\fB+\fP)\fBh\fP] [\fB\-I\fP|\fB+I\fP[\fIoptions\fP]] [\fB\-i\fP|\fB+i\fP[\fIoptions\fP]] [\fB\-J\fP|\fB+J\fP[\fIoptions\fP]] [\fB\-j\fP|\fB+j\fP[\fIoptions\fP]] [\fB\-K\fP|\fB+K\fP[\fIoptions\fP]] [\fB\-k\fP|\fB+k\fP[\fIoptions\fP]] [\fB\-L\fP|\fB+L\fP[\fIoptions\fP]] [\fB\-l\fP|\fB+l\fP[\fIoptions\fP]] [\fB\-M\fP|\fB+M\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBm\fP] [\fB\-N\fP|\fB+N\fP[\fIoptions\fP]] [\fB\-n\fP|\fB+n\fP[\fIoptions\fP]] [\fB+O\fP\fIoutput-file\fP] [\fB\-o\fP|\fB+o\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBP\fP] [\fB\-p\fP|\fB+p\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBQ\fP] [\fB\-q\fP|\fB+q\fP[[\fB\-\fP|\fB+\fP]\fItypes\fP]] [\fB\-R\fP|\fB+R\fP[\fIoptions\fP]] [\fB\-r\fP|\fB+r\fP[\fIoptions\fP]] [\fB\-S\fP|\fB+S\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBS\fP] [\fB\-T\fP|\fB+T\fP\fIdate\fP] [\fB\-t\fP|\fB+t\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBU\fP\fIcache\fP] [\fB\-u\fP|\fB+u\fP[\fIoptions\fP]] [\fB\-V\fP|\fB+V\fP[[\fB\-\fP|\fB+\fP]\fItypes\fP]] [\fB\-v\fP|\fB+v\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBW\fP] [(\fB\-\fP|\fB+\fP)\fBw\fP] [(\fB\-\fP|\fB+\fP)\fBX\fP] [(\fB\-\fP|\fB+\fP)\fBx\fP] [\fB\-Y\fP|\fB+Y\fP[\fIoptions\fP]] [\fB\-y\fP|\fB+y\fP[\fIoptions\fP]] [\fB\-Z\fP|\fB+Z\fP[\fIoptions\fP]] [(\fB\-\fP|\fB+\fP)\fBz\fP] [\fB\-\-settings\fP] [\fIlogfile\fP...] .TP but normally just .TP .B analog\fP [\fB-G\fP] [\fB+g\fP\fIfilename\fP] .SH DESCRIPTION \fBAnalog\fP is a program for analyzing log files, and is designed to be fast and to produce attractive statistics. The usual (and easier) way of configuring \fBanalog\fP is through a configuration file, not command line options. For more information about writing a configuration file or about the command line options see \fIReadme.html\fP in the \fBanalog\fP documentation. A description of what \fIoptions\fP are available for the non-time reports is available in \fIothreps.html#othclarg\fP in the \fBanalog\fP documentation. .SH OPTIONS .TP .B \-\-help Display version and help information and exit. .TP (\fB-\fP|\fB+\fP)\fB1 Toggle the Yearly Report. .TP (\fB-\fP|\fB+\fP)\fB4 Toggle the Quarter-Hour Report. .TP (\fB-\fP|\fB+\fP)\fB5 Toggle the Five-Minute Report. .TP (\fB-\fP|\fB+\fP)\fB6 Toggle the Quarter-Hour Summary. .TP (\fB-\fP|\fB+\fP)\fB7 Toggle the Five-Minute Summary. .TP (\fB-\fP|\fB+\fP)\fBA Turn all the reports (except the General Summary) off or on. .TP (\fB-\fP|\fB+\fP)\fBa Toggle output style between \fIHTML\fP and \fIPLAIN\fP formats, respectively. .TP .B -B\fP|\fB+B\fP[\fIoptions\fP] Turn the Browser Report off or on, possibly setting \fIoptions\fP. .TP .B -b\fP|\fB+b\fP[\fIoptions\fP] Turn the Browser Summary off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBC\fP'\fIconfiguration-line\fP' Include \fIconfiguration-line\fP in the configuration commands. .TP .B -c\fP|\fB+c\fP[\fIoptions\fP] Turn the Status Code Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBD Toggle the Daily Report. .TP (\fB-\fP|\fB+\fP)\fBd Toggle the Daily Summary. .TP .B -E\fP|\fB+E\fP[\fIoptions\fP] Turn the Redirection Report off or on, possibly setting \fIoptions\fP. .TP .B \-F\fP|\fB+F\fP\fIdate\fP Toggle or set the \fIFROM\fP date. Use \fB-F\fP to turn the \fIFROM\fP date off, and use \fB+F\fP\fIdate\fP to set the \fIFROM\fP date. .TP .B -f\fP|\fB+f\fP[\fIoptions\fP] Turn the Referrer Report off or on, possibly setting \fIoptions\fP. .TP .B \-G Do not use the default configuration file. .TP \fB+g\fP\fIfilename\fP Add \fIfilename\fP to the list of configuration files. .TP (\fB-\fP|\fB+\fP)\fBH Turn the Hourly Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBh Toggle the Hourly Summary. .TP .B -I\fP|\fB+I\fP[\fIoptions\fP] Turn the Failure Report off or on, possibly setting \fIoptions\fP. .TP .B -i\fP|\fB+i\fP[\fIoptions\fP] Turn the Directory Report off or on, possibly setting \fIoptions\fP. .TP .B -J\fP|\fB+J\fP[\fIoptions\fP] Turn the User Failure Report off or on, possibly setting \fIoptions\fP. .TP .B -j\fP|\fB+j\fP[\fIoptions\fP] Turn the User Redirection Report off or on, possibly setting \fIoptions\fP. .TP .B -K\fP|\fB+K\fP[\fIoptions\fP] Turn the Failed Referrer Report off or on, possibly setting \fIoptions\fP. .TP .B -k\fP|\fB+k\fP[\fIoptions\fP] Turn the Redirected Referrer Report off or on, possibly setting \fIoptions\fP. .TP .B -L\fP|\fB+L\fP[\fIoptions\fP] Turn the Host Failure Report off or on, possibly setting \fIoptions\fP. .TP .B -l\fP|\fB+l\fP[\fIoptions\fP] Turn the Host Redirection Report off or on, possibly setting \fIoptions\fP. .TP .B -M\fP|\fB+M\fP[\fIoptions\fP] Turn the Virtual Host Failure Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBm Toggle the Monthly Report. .TP .B -N\fP|\fB+N\fP[\fIoptions\fP] Turn the Search Query Report off or on, possibly setting \fIoptions\fP. .TP .B -n\fP|\fB+n\fP[\fIoptions\fP] Turn the Search Word Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBO\fP\fIoutput-file\fP Write output to \fIoutput-file\fP. Use - for stdout. .TP .B -o\fP|\fB+o\fP[\fIoptions\fP] Turn the Domain Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBP Toggle the Processing Time Report. .TP (\fB-\fP|\fB+\fP)\fBp Toggle the Operating System Report. .TP (\fB-\fP|\fB+\fP)\fBQ Toggle the Quarterly Report. .TP .B \-q\fP|\fB+q\fP[[\fB\-\fP|\fB+\fP]\fItypes\fP] Turn all warnings off/on, or remove/add/use exactly specified \fItypes\fP of warnings. .TP .B -R\fP|\fB+R\fP[\fIoptions\fP] Turn the Virtual Host Redirection Report off or on, possibly setting \fIoptions\fP. .TP .B -r\fP|\fB+r\fP[\fIoptions\fP] Turn the Request Report off or on, possibly setting \fIoptions\fP. .TP .B -S\fP|\fB+S\fP[\fIoptions\fP] Turn the Host Report off or on, possibly setting \fIoptions\fP. .TP .B -s\fP|\fB+s\fP[\fIoptions\fP] Turn the Referring Site Report off or on, possibly setting \fIoptions\fP. .TP .B \-T\fP|\fB+T\fP\fIdate\fP Toggle or set the \fITO\fP date. Use \fB-T\fP to turn the \fITO\fP date off, and use \fB+T\fP\fIdate\fP to set the \fITO\fP date. .TP .B -t\fP|\fB+t\fP[\fIoptions\fP] Turn the File Type Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBU\fP\fIcache\fP Use file \fIcache\fP for cache output. .TP .B -u\fP|\fB+u\fP[\fIoptions\fP] Turn the User Report off or on, possibly setting \fIoptions\fP. .TP .B \-V\fP|\fB+V\fP[[\fB\-\fP|\fB+\fP]\fItypes\fP] Turn all debugging off/on, or remove/add/use exactly specified \fItypes\fP of debugging messages. .TP .B -v\fP|\fB+v\fP[\fIoptions\fP] Turn the Virtual Host Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBW Toggle the Weekly Report. .TP (\fB-\fP|\fB+\fP)\fBw Toggle the Hour of the Week Report. .TP (\fB-\fP|\fB+\fP)\fBX Toggle GOTOS (on and off only). .TP (\fB-\fP|\fB+\fP)\fBx Toggle the General Summary. .TP .B -Y\fP|\fB+Y\fP[\fIoptions\fP] Turn the Internal Search Query Report off or on, possibly setting \fIoptions\fP. .TP .B -y\fP|\fB+y\fP[\fIoptions\fP] Turn the Internal Search Word Report off or on, possibly setting \fIoptions\fP. .TP .B -Z\fP|\fB+Z\fP[\fIoptions\fP] Turn the Organization Report off or on, possibly setting \fIoptions\fP. .TP (\fB-\fP|\fB+\fP)\fBz Toggle the File Size Report. .TP \fB\-\-settings Instead of processing any files, display in English the settings \fBanalog\fP would use if it ran normally. This is useful for troubleshooting. .TP \fIlogfile\fP... The logfiles to be analysed. Use \- for stdin. .SH "SEE ALSO" The analog home page at \fIhttp://www.analog.cx/\fP .br The analog documentation on your local machine, or from the analog home page. .SH BUGS An up to date list of known bugs and bug fixes can be found at \fIhttp://www.analog.cx/bugs.html\fP .SH AUTHORS .B Analog\fP and related documentation was written by Stephen Turner <\fIanalog-author@lists.meer.net\fP>, with contributions from other authors. (See \fIacknow.html\fP in the \fBanalog\fP documentation.) This man page was written by Alexander Toth <\fIalex@purificator.net\fP>. analog-6.0/anlgform.html0000644000175000017500000002014410161303532015424 0ustar sret1sret100000000000000 Analog form interface

Analog form interface


1. Report choices

N.B. This form will not work - e.g. the buttons may not even appear - until you've configured it according to the instructions. When you've configured it, you should remove this paragraph.
See the analog home page for the meanings of the various reports.

Which reports do you want to see?


[On] [Off] General Summary
[On] [Off] Monthly Report
[On] [Off] Weekly Report
[On] [Off] Daily Summary
[On] [Off] Daily Report
[On] [Off] Hourly Summary
[On] [Off] Domain Report
[On] [Off] Organisation Report
[On] [Off] Directory Report
[On] [Off] File Type Report
[On] [Off] Request Report
[On] [Off] File Size Report
[On] [Off] Referrer Report
[On] [Off] Search Query Report
[On] [Off] Search Word Report
[On] [Off] Browser Summary
[On] [Off] Operating System Report
[On] [Off] Status Code Report

You can now run the program:
Or you can fill in the options below for individual reports. You can use bytes to mean 10 Megabytes; also to mean the 50 items with the most bytes.


2. Detailed report options

Domain Report options

Sort the Domain Report
Include all domains with at least

Organisation Report options

Sort the Organisation Report
Include all organisations with at least

Directory Report options

Sort the Directory Report
Include all directories with at least

Request Report options

Sort the Request Report
Include all files with at least
Show

Referrer Report options

Sort the Referrer Report
Include all referrers with at least

3. Analysing only part of the logfile

Only certain dates
You can analyse only the requests from certain dates. Enter the range of dates below in the from yymmdd; e.g., 980301 for 1st March 1998 (or fill in just one box to limit the range of dates on just one side).
From to

Only certain files
Only look at the following files (list, separated by commas; can contain wild character *)

Ignore the following files


4. Layout

Your organisation's name (for the title of the page)

Your organisation's home page
URL:


analog-6.0/anlgform.pl0000755000175000017500000001747110161303532015107 0ustar sret1sret100000000000000#!/usr/bin/perl -T ### ### analog 6.0 http://www.analog.cx/ ### This program is copyright (c) Stephen R. E. Turner 1995 - 2004 except as ### stated otherwise. ### ### This program is free software. You can redistribute it and/or modify it ### under the terms of version 2 of the GNU General Public License, which you ### should have received with it. ### ### This program is distributed in the hope that it will be useful, but ### without any warranty, expressed or implied. ### Remember: Even the most carefully-designed CGI programs can accidentally ### have serious security bugs! See docs/form.html for notes on security ### design. ### ### anlgform.pl; the cgi front end for analog # 1) uncomment (remove everything before $analog) and edit one of the next two # lines to give the location (full pathname) of the analog executable. # Unix: $analog = '/usr/local/etc/httpd/analog-6.0/analog'; # Windows: $analog = 'C:\program files\analog 6.0\analog.exe'; # 2) If you're on Unix, edit the first line in this file to give the location # of Perl (don't remove the #! though). # 3) You also need to edit anlgform.html if you want to use the form. # 4) Add to the forbidden commands below if you want. @forbidden = qw(LOGFORMAT APACHELOGFORMAT DEFAULTLOGFORMAT APACHEDEFAULTLOGFORMAT HEADERFILE FOOTERFILE UNCOMPRESS OUTFILE CACHEOUTFILE LOCALCHARTDIR ERRFILE DNS CGI SETTINGS PROGRESSFREQ LANGFILE DESCFILE); # Forbidden commands: sysadmin can add more (must be in upper case!) # Other commands you might consider adding, because they allow users to # specify which files to use for the analysis, are LOGFILE and DOMAINSFILE. # If you add a command, you must also add any aliases it possesses. # There is a discussion of all this in docs/form.html. @allowed = qw(); # Allowed commands. If there are _any_ commands listed here, then _only_ # commands which are in @allowed, and not in @forbidden, can be used. require 5.001; use CGI; # 1) INITIALISATION # delete all dangerous environment variables $ENV{PATH} = ''; # blank, not deleted, so that UNCOMPRESS doesn't get a path delete @ENV{qw/IFS CDPATH ENV BASH_ENV/}; $query = new CGI; $|=1; $lt = localtime; $progname = $0 || 'anlgform.pl'; if (($^O =~ /win32/i || $^O =~ /^win/i) && Win32::GetShortPathName($analog)) { $analog = Win32::GetShortPathName($analog); } # coerce query keys to caps in a new (key, pointer to array) hash called args # also remember the order the keys arrived in, as far as possible foreach $p ($query->param) { foreach $a ($query->param($p)) { checkchars($a); push(@order, "\U$p") unless ($args{"\U$p"}); push(@{$args{"\U$p"}}, $a); } } # check LOGFILE and CACHEFILE only contain safe chars (see comments below) checkfilechars("LOGFILE"); checkfilechars("CACHEFILE"); # 2) OPEN THE ANALOG PROCESS # qv=1 causes args to go straight to stdout, not program if (${$args{'QV'}}[-1] && !forbidden('QV')) { print "Content-Type: text/plain\n\n"; open(ANALOG, ">-"); } elsif (!$analog) { badreq(500, "Program Incorrectly Configured", "Can't run analog because anlgform.pl not set up properly.\n", "See the server's error log for more details."); print STDERR "[$lt] $progname: Can't run analog because the variable \$analog was not set: read the setup instructions!\n"; die; } elsif (!(-x $analog)) { badreq(500, "Program Incorrectly Configured", "Can't run analog.", "See the server's error log for more details."); print STDERR "[$lt] $progname: Can't run analog because \"$analog\" not found or not executable"; print STDERR ": $!" if ($!); print STDERR ".\n"; die; } else { open (ANALOG, "|$analog +g-"); # errors here will get caught on close } # 3) PRINT ALL THE COMMANDS # Special cases: must come first printargs('CG', 'CONFIGFILE') unless forbidden('CG'); # both 'CG' and 'CONFIGFILE' must be allowed for this to happen. print ANALOG "CGI ON\nDNS NONE\nWARNINGS FL\n"; printargs('WARNINGS'); printargs('LOGTIMEOFFSET'); foreach $k (@order) { printargs($k) unless($k eq 'QV' || $k eq 'CG' || $k eq 'CM' || $k =~ /FLOORB$/ || $k =~ /2$/ || $k =~ '^LOGTIMEOFFSET' || $k =~ '^WARNINGS' || # commands dealt with elsewhere $k =~ /[^A-Z12]/ || $k eq '' || $k =~ /^IGNORE/); # other stuff not wanted } # Special cases: must come last print ANALOG "DEBUG -C\n"; printargs('CM', 'CONFIGFILE') unless forbidden('CM'); # again, both 'CM' and 'CONFIGFILE' must be allowed for this to happen. print ANALOG "OUTFILE stdout\n"; # 4) WAIT FOR PROCESS TO FINISH. THAT'S IT. unless (close(ANALOG)) { badreq(500, "Program Failure", "Analog failed to run or returned an error code.", "Maybe your server's error log will give a clue why."); print STDERR "[$lt] $progname: \"$analog\" failed to run or returned an error code"; print STDERR ": $!" if ($!); print STDERR ".\n"; die; } ### SUBROUTINES # A) IS A GIVEN COMMAND FORBIDDEN? sub forbidden { return (grep($_[0] eq $_, @forbidden) || (@allowed && !grep($_[0] eq $_, @allowed))); } # B) PRINT ONE COMMAND sub printargs { my($is_floora) = 0; my($is_12) = 0; my($name) = $_[1] || $_[0]; if ($name =~ /FLOORA$/) { chop($name); $is_floora = 1; } elsif ($name =~ /1$/) { chop($name); $is_12 = 1; } return if forbidden($name); if ($is_floora) { $a = ${$args{$name . 'A'}}[-1]; # last "FLOORA=$a" form arg specified $b = ${$args{$name . 'B'}}[-1]; print ANALOG ("$name $a$b\n") if ($b ne '' && $b !~ /\\$/); # could bracket $a$b, but no help because any special character in a # FLOOR command is junk anyway. } elsif ($is_12) { $a = ${$args{$name . '1'}}[-1]; $b = ${$args{$name . '2'}}[-1]; print ANALOG ("$name ", bracket($a), " ", bracket($b), "\n") if ($b ne ''); } else { foreach $a (@{$args{$_[0]}}) { # run through all "NAME=$a" form args if ($a ne '') { print ANALOG ("$name ", bracket($a), "\n"); print ANALOG ("DNS READ\n") if ($name eq 'DNSFILE'); } } } } # C) PUT APPROPRIATE DELIMITERS ROUND AN ARGUMENT CONTAINING SPACES sub bracket { local $_ = $_[0]; return $_ unless (/[\s\#]/ || /^['"\(]/ || /\\$/); return "\"$_\"" unless (/"/); return "'$_'" unless (/'/); return "($_)"; # analog has no syntax if string contains ) as well as space, ' and " } # D) CHECK ONLY SAFE CHARACTERS in LOGFILEs and CACHEFILEs. See docs/form.html. sub checkfilechars { local ($_); foreach (@{$args{$_[0]}}, @{$args{$_[0] . '1'}}) { if (m([^\w\. /\\:\-\*\?]) || m(\B-|-\B)) { # i.e. contains a non-approved character, or a dash not # between \w's. NB \w includes underscore. badreq(403, "Illegal Request", "Unsafe characters in $_[0]."); printf STDERR "[$lt] $progname: Unsafe characters in \"$_[0] $_\" on request from %s\n", $ENV{REMOTE_HOST}?$ENV{REMOTE_HOST}:($ENV{REMOTE_ADDR}?$ENV{REMOTE_ADDR}:"unknown host"); die; } } } # E) CHECK NO UNSAFE CHARACTERS IN OTHER COMMANDS. Again, see docs/form.html. sub checkchars { local $_ = $_[0]; if (/[\x00-\x1F\x7F-\x9F]/) { printf STDERR "[$lt] $progname: Unsafe characters in \"\U$p\E $_\" on request from %s\n", $ENV{REMOTE_HOST}?$ENV{REMOTE_HOST}:($ENV{REMOTE_ADDR}?$ENV{REMOTE_ADDR}:"unknown host"); # Translate dangerous characters to avoid cross-site scripting $p =~ s/&/&/; $p =~ s//>/; $p =~ s/"/"/; badreq(403, "Illegal Request", "Unsafe characters in \U$p."); die; } } # F) PRINT OUT ERROR MESSAGE sub badreq { my($i); print "Content-Type: text/html\n"; print "Status: $_[0] $_[1]\n\n"; print ''; print "\n$_[0] $_[1]\n"; print "

$_[1]

\n"; for ($i = 2; defined($_[$i]); $i++) { print "
" if ($i >= 3); print "$_[$i]\n"; } print "\n"; } analog-6.0/logfile.log0000644000175000017500000002034410161303532015057 0ustar sret1sret100000000000000statslab.cam.ac.uk - - [31/Dec/1999:10:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:11:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:12:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:14:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:15:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:17:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:18:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:20:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" statslab.cam.ac.uk - - [31/Dec/1999:21:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [31/Dec/1999:22:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [31/Dec/1999:23:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://referrer.com/" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:02:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:03:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:04:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:05:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:06:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:07:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:08:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:09:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:10:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [01/Jan/2000:12:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)" host.analog.cx - - [02/Jan/2000:10:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" host.analog.cx - - [02/Jan/2000:11:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" host.analog.cx - - [02/Jan/2000:12:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" host.analog.cx - - [02/Jan/2000:14:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:15:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:17:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:18:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:20:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:21:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:22:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [02/Jan/2000:23:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:02:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:03:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:04:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:05:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:06:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:07:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:08:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:09:11:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:09:41:12 +0000] "GET /sample2.html HTTP/1.0" 200 1010 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:10:11:12 +0000] "GET /dir/sample3.html HTTP/1.0" 200 987 "http://google.com/search?q=another%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:10:11:12 +0000] "GET /images/sample3.jpg HTTP/1.0" 200 298 "http://www.statslab.cam.ac.uk/dir/sample3.html" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:12:11:12 +0000] "GET /dir/sample3.html HTTP/1.0" 200 987 "http://google.com/search?q=another%20search" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [03/Jan/2000:10:11:12 +0000] "GET /images/sample3.jpg HTTP/1.0" 200 298 "http://www.statslab.cam.ac.uk/dir/sample3.html" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [04/Jan/2000:11:11:12 +0000] "GET /notfound.html HTTP/1.0" 404 0 "http://badreferrer.com/" "Mozilla/4.0 [en] (X11; I; Linux)" host.analog.cx - - [04/Jan/2000:11:21:12 +0000] "GET /failed.html HTTP/1.0" 404 0 "http://failedreferrer.com/" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [04/Jan/2000:12:01:12 +0000] "GET /redirected.html HTTP/1.0" 301 0 "http://redirectedref.com/" "Mozilla/4.0 [en] (X11; I; Linux)" host.analog.cx - - [04/Jan/2000:12:11:12 +0000] "GET /redir.html HTTP/1.0" 301 0 "http://redirref.com/" "Mozilla/4.0 [en] (X11; I; Linux)" statslab.cam.ac.uk - - [04/Jan/2000:13:11:12 +0000] "GET /sample.html HTTP/1.0" 200 1234 "http://google.com/search?q=sample%20search" "Mozilla/4.0 [en] (X11; I; Linux)"